'Creates a new call stack, and according to the jumpkind performs appropriate actions.
:param int addr:                          Address to create at.
:param Simsuccessors all_jobs:            Jobs to get stack pointer from or return address.
:param CFGJob job:                        CFGJob to copy current call stack from.
:param int exit_target:                   Address of exit target.
:param str jumpkind:                      The type of jump performed.
:returns:                                 New call stack for target block.
:rtype:                                   CallStack'

def _create_new_call_stack(self, addr, all_jobs, job, exit_target, jumpkind):

    if self._is_call_jumpkind(jumpkind):
        new_call_stack = job.call_stack_copy()
        if ((len(all_jobs) > 1) and (all_jobs[(-1)].history.jumpkind == 'Ijk_FakeRet')):
            se = all_jobs[(-1)].se
            retn_target_addr = se.exactly_int(all_jobs[(-1)].ip, default=0)
            sp = se.exactly_int(all_jobs[(-1)].regs.sp, default=0)
            new_call_stack = new_call_stack.call(addr, exit_target, retn_target=retn_target_addr, stack_pointer=sp)
        elif (jumpkind.startswith('Ijk_Sys') and (len(all_jobs) == 1)):
            retn_target_addr = exit_target
            se = all_jobs[0].se
            sp = se.exactly_int(all_jobs[0].regs.sp, default=0)
            new_call_stack = new_call_stack.call(addr, exit_target, retn_target=retn_target_addr, stack_pointer=sp)
        else:
            new_call_stack = CallStack()
            se = all_jobs[(-1)].se
            sp = se.exactly_int(all_jobs[(-1)].regs.sp, default=0)
            new_call_stack = new_call_stack.call(addr, exit_target, retn_target=None, stack_pointer=sp)
    elif (jumpkind == 'Ijk_Ret'):
        new_call_stack = job.call_stack_copy()
        try:
            new_call_stack = new_call_stack.ret(exit_target)
        except SimEmptyCallStackError:
            pass
        se = all_jobs[(-1)].se
        sp = se.exactly_int(all_jobs[(-1)].regs.sp, default=0)
        old_sp = job.current_stack_pointer
        if ((sp is not None) and (old_sp is not None)):
            delta = (sp - old_sp)
            func_addr = job.func_addr
            if (self.kb.functions.function(func_addr) is None):
                l.error(("Function    0x%x    doesn't    exist    in    function    manager    although    it    should    be    there." + 'Look    into    this    issue    later.'), func_addr)
                self.kb.functions.function(func_addr, create=True)
            self.kb.functions.function(func_addr, create=True).sp_delta = delta
    elif (jumpkind == 'Ijk_FakeRet'):
        new_call_stack = job.call_stack
    elif self.project.is_hooked(exit_target):
        hooker = self.project.hooked_by(exit_target)
        if (not (hooker is procedures.stubs.UserHook.UserHook)):
            new_call_stack = job.call_stack_copy()
            new_call_stack.current_function_address = exit_target
        else:
            new_call_stack = job.call_stack
    else:
        new_call_stack = job.call_stack
    return new_call_stack
