def _set_current_basic_block(self, ctxt, block): try: if block: func = core.BNGetBasicBlockFunction(block) if func is None: block = None else: block = basicblock.BasicBlock(binaryview.BinaryView(handle = core.BNGetFunctionData(func)), core.BNNewBasicBlockReference(block)) core.BNFreeFunction(func) else: block = None self.perform_set_current_basic_block(block) except: log.log_error(traceback.format_exc())
def computeBasicBlocks(self): leaders = set([1, len(self.program)+1]) for instr in self.program: if instr.isIfGoto() or instr.isGoto(): leaders.add(instr.Target) leaders.add(instr.LineNo + 1) if instr.isCall() or instr.isReturn(): leaders.add(instr.LineNo + 1) if instr.isLabel(): leaders.add(instr.LineNo) if instr.isAssign() and instr.Op == tacinstr.TACInstr.CALLOP: leaders.add(instr.LineNo + 1) for leaderPair in pairwise(leaders): bb = basicblock.BasicBlock(self.program[leaderPair[0]-1:leaderPair[1]-1]) self.basicBlocks.append(bb) for basicBlock in self.basicBlocks: translate.translateBlock(basicBlock)
def find_basic_blocks(FILE_OPCODES, FILE_PC_OPCODES): separators = ['JUMPI', 'STOP', 'RETURN', 'SUICIDE', 'JUMP', 'JUMPDEST'] basic_blocks = [] init_pc = 0 for opc_number in range(len(FILE_OPCODES)): opc = FILE_OPCODES[opc_number] if (opc.name in separators and init_pc != FILE_PC_OPCODES[opc_number]): dest = [] if (opc.name == 'JUMPDEST'): dest.append(FILE_PC_OPCODES[opc_number] + 1) elif (opc.name == 'JUMP' and re.search('PUSH*', FILE_OPCODES[opc_number - 1].name)): dest.append(FILE_OPCODES[opc_number - 1].par) elif (opc.name == 'JUMPI' and re.search('PUSH*', FILE_OPCODES[opc_number - 1].name)): dest.append(FILE_PC_OPCODES[opc_number] + 1) dest.append(FILE_OPCODES[opc_number - 1].par) pc = FILE_PC_OPCODES[opc_number] basic_blocks.append( basicblock.BasicBlock(init_pc, pc, opc.name, dest)) init_pc = FILE_PC_OPCODES[opc_number + 1] return basic_blocks
def create_small_scope_graph() : #created after page 74 of "A modular tool architecure..." main=sg.ScopeGraph("main") foo = sg.ScopeGraph("foo") outer = sg.ScopeGraph('outer') inner = sg.ScopeGraph('inner') loop = sg.ScopeGraph('loop') #Create loop #Create basic blocks and add children main_bb = babl.BasicBlock("main", "H", 1) main_bb.add_children(["outer","foo"]) outer_bb = babl.BasicBlock("outer", "I", 10) outer_bb.add_children(["inner"]) inner_bb = babl.BasicBlock("inner", "J", 20) foo_bb = babl.BasicBlock("foo", "A", 1) foo_bb.add_children(["loop"]) loop_bb = babl.BasicBlock("loop", "C", 10) #Create loop loop.add_nodes(["start","B", "C","D", "E","F", "exit"]) loop.add_path(["B", "C","D", "E","F", "B"]) loop.add_edge("start", "C") loop.add_edge("C", "exit") loop.add_edge("D", "F") loop.add_edge("F", "exit") loop.report() #Create foo foo.add_nodes(["start","A", loop, "G", "exit"]) foo.add_path(["start","A", loop,"G", "exit"]) #foo.report() #Create inner inner.add_nodes(["start", "J", "K", "L", "M", "N", "O", "P", "Q", "exit"]) inner.add_path(["start", "J", "K", "M", "N", "P", "Q", "J"]) inner.add_edge("J", "exit") inner.add_edge("K", "L") inner.add_edge("N", "O") inner.report() #Creating main main.add_node("start") main.add_node("H",) main.add_scope(outer,"name", ) main.add_node("S") main.add_scope(foo) main.add_node("T") main.add_node("end") main.add_path([start,H,outer,S,foo,T,end]) loop = lg.create_simple_loop() #loop2 = lg.create_simple_loop() #simplebb = babl.BasicBlock("loop", "C", 10) #simplebb2 = babl.BasicBlock("foo", "A", 1) #simplebb.report() #SG.add_scope(loop, loop.name, simplebb) #SG.add_scope(loop2, loop2.name, simplebb2) #SG.add_edge(loop, loop2) #SG.add_bb_scope(loop, simplebb) #not sure if needed return SG