about summary refs log tree commit diff stats
path: root/miasm2/ir/ir.py
diff options
context:
space:
mode:
Diffstat (limited to 'miasm2/ir/ir.py')
-rw-r--r--miasm2/ir/ir.py52
1 files changed, 26 insertions, 26 deletions
diff --git a/miasm2/ir/ir.py b/miasm2/ir/ir.py
index 2f718e25..0995b86a 100644
--- a/miasm2/ir/ir.py
+++ b/miasm2/ir/ir.py
@@ -30,12 +30,13 @@ from miasm2.core.graph import DiGraph
 
 
 class AssignBlock(object):
-    __slots__ = ["_assigns"]
+    __slots__ = ["_assigns", "_instr"]
 
-    def __init__(self, irs=None):
+    def __init__(self, irs=None, instr=None):
         """@irs seq"""
         if irs is None:
             irs = []
+        self._instr = instr
         self._assigns = {} # ExprAff.dst -> ExprAff.src
 
         # Concurrent assignments are handled in _set
@@ -46,6 +47,10 @@ class AssignBlock(object):
             for expraff in irs:
                 self._set(expraff.dst, expraff.src)
 
+    @property
+    def instr(self):
+        return self._instr
+
     def _set(self, dst, src):
         """
         Special cases:
@@ -201,7 +206,7 @@ class AssignBlock(object):
 
     def __str__(self):
         out = []
-        for dst, src in sorted(self.iteritems()):
+        for dst, src in sorted(self._assigns.iteritems()):
             out.append("%s = %s" % (dst, src))
         return "\n".join(out)
 
@@ -217,19 +222,15 @@ class IRBlock(object):
     Stand for an intermediate representation  basic block.
     """
 
-    def __init__(self, label, irs, lines=None):
+    def __init__(self, label, irs):
         """
         @label: AsmLabel of the IR basic block
         @irs: list of AssignBlock
-        @lines: list of native instructions
         """
 
         assert isinstance(label, AsmLabel)
-        if lines is None:
-            lines = []
         self.label = label
         self.irs = irs
-        self.lines = lines
         self.except_automod = True
         self._dst = None
         self._dst_linenb = None
@@ -263,7 +264,8 @@ class IRBlock(object):
                 # Sanity check is already done in _get_dst
                 break
         self._dst = value
-        self.irs[self._dst_linenb] = AssignBlock(new_assignblk)
+        instr = self.irs[self._dst_linenb].instr
+        self.irs[self._dst_linenb] = AssignBlock(new_assignblk, instr)
     dst = property(_get_dst, _set_dst)
 
     @property
@@ -310,7 +312,7 @@ class irbloc(IRBlock):
 
     def __init__(self, label, irs, lines=None):
         warnings.warn('DEPRECATION WARNING: use "IRBlock" instead of "irblock"')
-        super(irbloc, self).__init__(label, irs, lines)
+        super(irbloc, self).__init__(label, irs)
 
 
 class DiGraphIR(DiGraph):
@@ -399,9 +401,12 @@ class IntermediateRepresentation(object):
 
     def instr2ir(self, instr):
         ir_bloc_cur, extra_assignblk = self.get_ir(instr)
-        assignblk = AssignBlock(ir_bloc_cur)
         for irb in extra_assignblk:
-            irb.irs = map(AssignBlock, irb.irs)
+            irs = []
+            for assignblk in irb.irs:
+                irs.append(AssignBlock(assignblk, instr))
+            irb.irs = irs
+        assignblk = AssignBlock(ir_bloc_cur, instr)
         return assignblk, extra_assignblk
 
     def get_label(self, addr):
@@ -434,17 +439,15 @@ class IntermediateRepresentation(object):
     def getby_offset(self, offset):
         out = set()
         for irb in self.blocks.values():
-            for line in irb.lines:
-                if line.offset <= offset < line.offset + line.l:
+            for assignblk in irb.irs:
+                instr = assignblk.instr
+                if instr.offset <= offset < instr.offset + instr.l:
                     out.add(irb)
         return out
 
-    def gen_pc_update(self, irblock, line):
-        irblock.irs.append(AssignBlock([m2_expr.ExprAff(self.pc,
-                                                        m2_expr.ExprInt(line.offset,
-                                                                        self.pc.size)
-                                                       )]))
-        irblock.lines.append(line)
+    def gen_pc_update(self, irblock, instr):
+        irblock.irs.append(AssignBlock({self.pc: m2_expr.ExprInt(instr.offset, self.pc.size)},
+                                       instr))
 
     def pre_add_instr(self, block, instr, irb_cur, ir_blocks_all, gen_pc_updt):
         """Function called before adding an instruction from the the native @block to
@@ -487,11 +490,8 @@ class IntermediateRepresentation(object):
             self.gen_pc_update(irb_cur, instr)
 
         irb_cur.irs.append(assignblk)
-        irb_cur.lines.append(instr)
 
         if ir_blocks_extra:
-            for irblock in ir_blocks_extra:
-                irblock.lines = [instr] * len(irblock.irs)
             ir_blocks_all += ir_blocks_extra
             irb_cur = None
         return irb_cur
@@ -508,7 +508,7 @@ class IntermediateRepresentation(object):
         for instr in block.lines:
             if irb_cur is None:
                 label = self.get_instr_label(instr)
-                irb_cur = IRBlock(label, [], [])
+                irb_cur = IRBlock(label, [])
                 ir_blocks_all.append(irb_cur)
             irb_cur = self.add_instr_to_irblock(block, instr, irb_cur,
                                                 ir_blocks_all, gen_pc_updt)
@@ -543,8 +543,8 @@ class IntermediateRepresentation(object):
             else:
                 dst = m2_expr.ExprId(next_lbl,
                                      self.pc.size)
-            irblock.irs.append(AssignBlock([m2_expr.ExprAff(self.IRDst, dst)]))
-            irblock.lines.append(irblock.lines[-1])
+            irblock.irs.append(AssignBlock({self.IRDst: dst},
+                                           irblock.irs[-1].instr))
 
     def post_add_bloc(self, block, ir_blocks):
         self.set_empty_dst_to_next(block, ir_blocks)