'Recursive function, it branches in every possible path in the VFG.
@live_defs: a dict {addr:stmt} of live definitions at the start point
@node: the starting vfg node
Returns: the address of the block where the execution stops'

def _branch(self, live_defs, node, path=''):

    irsb = self._irsb(node.state)
    path = ((path + '    ->    ') + hex(irsb.addr))
    if isinstance(irsb, simuvex.SimProcedure):
        self._simproc_map[irsb.addr] = repr(irsb)
    l.debug(('-->    Branch:    running    block    0x%x' % irsb.addr))
    block = self._make_block(irsb, live_defs)
    self._imarks.update(block._imarks)
    if (block.stop == True):
        l.debug(('    ###    End    of    path    %s' % path))
        return irsb.addr
    succ = self._vfg._graph.successors(node)
    defer = []
    for s in succ:
        if (self._vfg._graph.edge[node][s]['jumpkind'] == 'Ijk_FakeRet'):
            defer.append(s)
            continue
        self._branch(dict(block.live_defs), s, path)
        for s in defer:
            self._branch(dict(block.live_defs), s, path)
