'Add an exit representing calling another function via pointer.
:param addr:        The address of the function to call
:param args:        The list of arguments to call the function with
:param continue_at: Later, when the called function returns, execution of the current
procedure will continue in the named method.
:param cc:          Optional: use this calling convention for calling the new function.
Default is to use the current convention.'

def call(self, addr, args, continue_at, cc=None):

    if (not self.is_function):
        raise ValueError(('%s    called    self.call()    without    IS_FUNCTION    =    True' % self))
    if (cc is None):
        cc = self.cc
    call_state = self.state.copy()
    ret_addr = self.make_continuation(continue_at)
    saved_local_vars = zip(self.local_vars, map((lambda name: getattr(self, name)), self.local_vars))
    simcallstack_entry = (self.state.regs.sp, self.arguments, saved_local_vars)
    cc.setup_callsite(call_state, ret_addr, args)
    call_state.callstack.top.procedure_data = simcallstack_entry
    if (call_state.libc.ppc64_abiv == 'ppc64_1'):
        call_state.regs.r2 = self.state.mem[(addr + 8):].long.resolved
        addr = call_state.mem[addr:].long.resolved
    elif (call_state.arch.name in ('MIPS32', 'MIPS64')):
        call_state.regs.t9 = addr
    self._exit_action(call_state, addr)
    self.successors.add_successor(call_state, addr, call_state.se.true, 'Ijk_Call')
    if (o.DO_RET_EMULATION in self.state.options):
        ret_state = self.state.copy()
        cc.setup_callsite(ret_state, ret_addr, args)
        ret_state.callstack.top.procedure_data = simcallstack_entry
        guard = (ret_state.se.true if (o.TRUE_RET_EMULATION_GUARD in ret_state.options) else ret_state.se.false)
        self.successors.add_successor(ret_state, ret_addr, guard, 'Ijk_FakeRet')
