'For each returning function, create return edges in self.graph.
:return: None'

def _make_return_edges(self):

    for (func_addr, func) in self.functions.iteritems():
        if (func.returning is False):
            continue
        if (func.startpoint is None):
            l.warning('Function    %#x    does    not    have    a    startpoint    (yet).', func_addr)
            continue
        startpoint = self.get_any_node(func.startpoint.addr)
        if (startpoint is None):
            l.warning('No    CFGNode    is    found    for    function    %#x    in    _make_return_edges().', func_addr)
            continue
        endpoints = self._get_return_sources(func)
        callers = self.get_predecessors(startpoint, jumpkind='Ijk_Call')
        return_targets = itertools.chain.from_iterable((self.get_successors(caller, excluding_fakeret=False, jumpkind='Ijk_FakeRet') for caller in callers))
        return_targets = set(return_targets)
        for ep in endpoints:
            src = self.get_any_node(ep.addr)
            for rt in return_targets:
                if (not src.instruction_addrs):
                    ins_addr = None
                elif self.project.arch.branch_delay_slot:
                    if (len(src.instruction_addrs) > 1):
                        ins_addr = src.instruction_addrs[(-2)]
                    else:
                        l.error('At    %s:    expecting    more    than    one    instruction.    Only    got    one.', src)
                        ins_addr = None
                else:
                    ins_addr = src.instruction_addrs[(-1)]
                self._graph_add_edge(rt, src, 'Ijk_Ret', ins_addr, 'default')
