diff options
Diffstat (limited to 'miasm2/analysis/data_flow.py')
| -rw-r--r-- | miasm2/analysis/data_flow.py | 58 |
1 files changed, 29 insertions, 29 deletions
diff --git a/miasm2/analysis/data_flow.py b/miasm2/analysis/data_flow.py index 746c19cb..da79cf75 100644 --- a/miasm2/analysis/data_flow.py +++ b/miasm2/analysis/data_flow.py @@ -26,7 +26,7 @@ class ReachingDefinitions(dict): IBM Thomas J. Watson Research Division, Algorithm MK This class is usable as a dictionnary whose struture is - { (block, instr_index): { lvalue: set((block, instr_index)) } } + { (block, index): { lvalue: set((block, index)) } } """ ir_a = None @@ -36,12 +36,12 @@ class ReachingDefinitions(dict): self.ir_a = ir_a self.compute() - def get_definitions(self, block_lbl, instruction): - """Returns the dict { lvalue: set((def_block_lbl, def_instr_index)) } - associated with self.ir_a.@block.assignblks[@instruction] + def get_definitions(self, block_lbl, assignblk_index): + """Returns the dict { lvalue: set((def_block_lbl, def_index)) } + associated with self.ir_a.@block.assignblks[@assignblk_index] or {} if it is not yet computed """ - return self.get((block_lbl, instruction), {}) + return self.get((block_lbl, assignblk_index), {}) def compute(self): """This is the main fixpoint""" @@ -54,7 +54,7 @@ class ReachingDefinitions(dict): def process_block(self, block): """ Fetch reach definitions from predecessors and propagate it to - the instruction in block @block. + the assignblk in block @block. """ predecessor_state = {} for pred_lbl in self.ir_a.graph.predecessors(block.label): @@ -67,26 +67,26 @@ class ReachingDefinitions(dict): return False self[(block.label, 0)] = predecessor_state - for instr_index in xrange(len(block.assignblks)): - modified |= self.process_instruction(block, instr_index) + for index in xrange(len(block.assignblks)): + modified |= self.process_instruction(block, index) return modified - def process_instruction(self, block, instr_index): + def process_instruction(self, block, assignblk_index): """ Updates the reach definitions with values defined at - instruction @instr_index in block @block. - NB: the effect of instruction @instr_index in stored at index - (@block, @instr_index + 1). + instruction @assignblk_index in block @block. + NB: the effect of instruction @assignblk_index in stored at index + (@block, @assignblk_index + 1). """ - instr = block.assignblks[instr_index] - defs = self.get_definitions(block.label, instr_index).copy() + instr = block.assignblks[assignblk_index] + defs = self.get_definitions(block.label, assignblk_index).copy() for lval in instr: - defs.update({lval: set([(block.label, instr_index)])}) + defs.update({lval: set([(block.label, assignblk_index)])}) - modified = self.get((block.label, instr_index + 1)) != defs + modified = self.get((block.label, assignblk_index + 1)) != defs if modified: - self[(block.label, instr_index + 1)] = defs + self[(block.label, assignblk_index + 1)] = defs return modified @@ -148,10 +148,10 @@ class DiGraphDefUse(DiGraph): deref_mem=deref_mem) def _compute_def_use_block(self, block, reaching_defs, deref_mem=False): - for ind, instr in enumerate(block.assignblks): - instruction_reaching_defs = reaching_defs.get_definitions(block.label, ind) - for lval, expr in instr.iteritems(): - self.add_node(InstrNode(block.label, ind, lval)) + for index, assignblk in enumerate(block): + instruction_reaching_defs = reaching_defs.get_definitions(block.label, index) + for lval, expr in assignblk.iteritems(): + self.add_node(InstrNode(block.label, index, lval)) read_vars = expr.get_r(mem_read=deref_mem) if deref_mem and lval.is_mem(): @@ -159,7 +159,7 @@ class DiGraphDefUse(DiGraph): for read_var in read_vars: for reach in instruction_reaching_defs.get(read_var, set()): self.add_data_edge(InstrNode(reach[0], reach[1], read_var), - InstrNode(block.label, ind, lval)) + InstrNode(block.label, index, lval)) def del_edge(self, src, dst): super(DiGraphDefUse, self).del_edge(src, dst) @@ -178,12 +178,12 @@ class DiGraphDefUse(DiGraph): self.add_uniq_labeled_edge(src, dst, ATTR_DEP) def node2lines(self, node): - lbl, ind, reg = node - yield self.DotCellDescription(text="%s (%s)" % (lbl, ind), + lbl, index, reg = node + yield self.DotCellDescription(text="%s (%s)" % (lbl, index), attr={'align': 'center', 'colspan': 2, 'bgcolor': 'grey'}) - src = self._blocks[lbl].assignblks[ind][reg] + src = self._blocks[lbl].assignblks[index][reg] line = "%s = %s" % (reg, src) yield self.DotCellDescription(text=line, attr={}) yield self.DotCellDescription(text="", attr={}) @@ -223,12 +223,12 @@ def dead_simp_useful_instrs(defuse, reaching_defs): useful.add(InstrNode(definition[0], definition[1], lval)) # Force keeping of specific cases - for instr_index, instr in enumerate(block.assignblks): - for lval, rval in instr.iteritems(): + for index, assignblk in enumerate(block): + for lval, rval in assignblk.iteritems(): if (lval.is_mem() or ir_a.IRDst == lval or rval.is_function_call()): - useful.add(InstrNode(block_lbl, instr_index, lval)) + useful.add(InstrNode(block_lbl, index, lval)) # Useful nodes dependencies for node in useful: @@ -249,7 +249,7 @@ def dead_simp(ir_a): useful = set(dead_simp_useful_instrs(defuse, reaching_defs)) for block in ir_a.blocks.itervalues(): irs = [] - for idx, assignblk in enumerate(block.assignblks): + for idx, assignblk in enumerate(block): new_assignblk = dict(assignblk) for lval in assignblk: if InstrNode(block.label, idx, lval) not in useful: |