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
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