Ejemplo n.º 1
0
def cfg(func):
    """
    Compute the control flow graph for `func`
    """
    cfg = Graph()

    for block in func.blocks:
        # Deduce CFG edges from block terminator
        op = block.terminator
        if op.opcode == ops.jump:
            targets = [op.args[0]]
        elif op.opcode == ops.cbranch:
            cond, ifbb, elbb = op.args
            targets = [ifbb, elbb]
        elif op.opcode == ops.ret:
            targets = []
        else:
            assert op.opcode == ops.exc_throw # exc_throw
            targets = [block.get_metadata('exc_target') or 'pykit.exit']

        # Add edges
        for target in targets:
            cfg.add_edge(block, target)

    return cfg
Ejemplo n.º 2
0
def makedag():
    dag = Graph()
    dag.add_edge("a", "b")
    dag.add_edge("b", "c")
    dag.add_edge("c", "d")
    dag.add_edge("d", "e")
    dag.add_edge("a", "d")
    dag.add_edge("d", "e")
    dag.add_edge("b", "e")
    return dag