def build_blocks_arb(block_links, code=None): block_list = BlockList() as_tree_string = "" current_line_number = 1 for i in range(len(block_links)): basic_block = RawBasicBlock(current_line_number, current_line_number, None) current_line_number += 1 basic_block.name = chr(65 + i) block_list.append(basic_block) if code is not None: ast_stmts = code.get(basic_block.name) as_tree_string += ast_stmts basic_block.end_line += (ast_stmts.count("\n") - 1) current_line_number = basic_block.end_line + 1 for key, value in block_links.items(): key_block = block_list.get_block_by_name(key) for value_block_str in value: Cfg.connect_2_blocks(key_block, block_list.get_block_by_name(value_block_str)) if code is None: return block_list else: return block_list, as_tree_string
def build_tree(self): # TODO: clarify the code below for block_in_cfg in self.cfg.walk_block(self.cfg.root): block_in_dom_list = RawBasicBlock(block_in_cfg.start_line, block_in_cfg.end_line) self.dominator_nodes.append(block_in_dom_list) for dom_block in block_in_cfg.dominates_list: dom_block_in_list = self.dominator_nodes.get_block(dom_block) if not dom_block_in_list.prev_block_list: Cfg.connect_2_blocks(block_in_dom_list, dom_block_in_list) self.dominator_root = self.dominator_nodes[-1]
def build_blocks_arb(self, block_links): block_list = BlockList() for i in range(len(block_links)): basic_block = RawBasicBlock(i, i, None) basic_block.name = chr(65 + i) block_list.append(basic_block) for key, value in block_links.items(): key_block = block_list.get_block_by_name(key) for value_block_str in value: Cfg.connect_2_blocks( key_block, block_list.get_block_by_name(value_block_str)) return block_list