about summary refs log tree commit diff stats
path: root/miasm2/ir/ir.py
diff options
context:
space:
mode:
authorCamille Mougey <commial@gmail.com>2018-02-09 15:25:25 +0100
committerGitHub <noreply@github.com>2018-02-09 15:25:25 +0100
commitc2e52be18ddd2eeb86b413e851a3ade0ceeca1dc (patch)
treeac0d8a4cc054b283f524846757344e556325a912 /miasm2/ir/ir.py
parent47811fe5a56c8071ab5064e1f84ca64389941eec (diff)
parent00a5a16d47a32f1a483ba625fa9bd5c6eb460542 (diff)
downloadmiasm-c2e52be18ddd2eeb86b413e851a3ade0ceeca1dc.tar.gz
miasm-c2e52be18ddd2eeb86b413e851a3ade0ceeca1dc.zip
Merge pull request #673 from serpilliere/fix_irs
irs => assignblks
Diffstat (limited to 'miasm2/ir/ir.py')
-rw-r--r--miasm2/ir/ir.py73
1 files changed, 46 insertions, 27 deletions
diff --git a/miasm2/ir/ir.py b/miasm2/ir/ir.py
index afb6b382..f31db76b 100644
--- a/miasm2/ir/ir.py
+++ b/miasm2/ir/ir.py
@@ -258,25 +258,43 @@ class IRBlock(object):
     Stand for an intermediate representation  basic block.
     """
 
-    __slots__ = ["label", "_assignments", "_dst", "_dst_linenb"]
+    __slots__ = ["label", "_assignblks", "_dst", "_dst_linenb"]
 
-    def __init__(self, label, irs):
+    def __init__(self, label, assignblks):
         """
         @label: AsmLabel of the IR basic block
-        @irs: list of AssignBlock
+        @assignblks: list of AssignBlock
         """
 
         assert isinstance(label, AsmLabel)
         self.label = label
-        for assignblk in irs:
+        for assignblk in assignblks:
             assert isinstance(assignblk, AssignBlock)
-        self._assignments = tuple(irs)
+        self._assignblks = tuple(assignblks)
         self._dst = None
         self._dst_linenb = None
 
+
+    @property
+    def assignblks(self):
+        return self._assignblks
+
     @property
     def irs(self):
-        return self._assignments
+        warnings.warn('DEPRECATION WARNING: use "irblock.assignblks" instead of "irblock.irs"')
+        return self._assignblks
+
+    def __iter__(self):
+        """Iterate on assignblks"""
+        return self._assignblks.__iter__()
+
+    def __getitem__(self, index):
+        """Getitem on assignblks"""
+        return self._assignblks.__getitem__(index)
+
+    def __len__(self):
+        """Length of assignblks"""
+        return self._assignblks.__len__()
 
     def is_dst_set(self):
         return self._dst is not None
@@ -284,7 +302,7 @@ class IRBlock(object):
     def cache_dst(self):
         final_dst = None
         final_linenb = None
-        for linenb, assignblk in enumerate(self.irs):
+        for linenb, assignblk in enumerate(self):
             for dst, src in assignblk.iteritems():
                 if dst.is_id("IRDst"):
                     if final_dst is not None:
@@ -306,7 +324,7 @@ class IRBlock(object):
         """Generate a new IRBlock with a dst (IRBlock) fixed to @value"""
         irs = []
         dst_found = False
-        for assignblk in self.irs:
+        for assignblk in self:
             new_assignblk = {}
             for dst, src in assignblk.iteritems():
                 if dst.is_id("IRDst"):
@@ -328,7 +346,7 @@ class IRBlock(object):
     def __str__(self):
         out = []
         out.append('%s' % self.label)
-        for assignblk in self.irs:
+        for assignblk in self:
             for dst, src in assignblk.iteritems():
                 out.append('\t%s = %s' % (dst, src))
             out.append("")
@@ -349,7 +367,7 @@ class IRBlock(object):
             mod_src = lambda expr:expr
 
         assignblks = []
-        for assignblk in self.irs:
+        for assignblk in self:
             new_assignblk = {}
             for dst, src in assignblk.iteritems():
                 new_assignblk[mod_dst(dst)] = mod_src(src)
@@ -387,7 +405,7 @@ class DiGraphIR(DiGraph):
         if node not in self._blocks:
             yield [self.DotCellDescription(text="NOT PRESENT", attr={})]
             raise StopIteration
-        for i, assignblk in enumerate(self._blocks[node].irs):
+        for i, assignblk in enumerate(self._blocks[node]):
             for dst, src in assignblk.iteritems():
                 line = "%s = %s" % (dst, src)
                 if self._dot_offset:
@@ -456,7 +474,7 @@ class IntermediateRepresentation(object):
         ir_bloc_cur, extra_irblocks = self.get_ir(instr)
         for index, irb in enumerate(extra_irblocks):
             irs = []
-            for assignblk in irb.irs:
+            for assignblk in irb:
                 irs.append(AssignBlock(assignblk, instr))
             extra_irblocks[index] = IRBlock(irb.label, irs)
         assignblk = AssignBlock(ir_bloc_cur, instr)
@@ -502,7 +520,7 @@ class IntermediateRepresentation(object):
     def getby_offset(self, offset):
         out = set()
         for irb in self.blocks.values():
-            for assignblk in irb.irs:
+            for assignblk in irb:
                 instr = assignblk.instr
                 if instr.offset <= offset < instr.offset + instr.l:
                     out.add(irb)
@@ -607,11 +625,12 @@ class IntermediateRepresentation(object):
         return irblock
 
     def is_pc_written(self, block):
+        """Return the first Assignblk of the @blockin which PC is written
+        @block: IRBlock instance"""
         all_pc = self.arch.pc.values()
-        for irs in block.irs:
-            for assignblk in irs:
-                if assignblk.dst in all_pc:
-                    return assignblk
+        for assignblk in block:
+            if assignblk.dst in all_pc:
+                return assignblk
         return None
 
     def set_empty_dst_to_next(self, block, ir_blocks):
@@ -625,8 +644,8 @@ class IntermediateRepresentation(object):
             else:
                 dst = m2_expr.ExprId(next_lbl,
                                      self.pc.size)
-            assignblk = AssignBlock({self.IRDst: dst}, irblock.irs[-1].instr)
-            ir_blocks[index] = IRBlock(irblock.label, list(irblock.irs) + [assignblk])
+            assignblk = AssignBlock({self.IRDst: dst}, irblock[-1].instr)
+            ir_blocks[index] = IRBlock(irblock.label, list(irblock.assignblks) + [assignblk])
 
     def post_add_block(self, block, ir_blocks):
         self.set_empty_dst_to_next(block, ir_blocks)
@@ -670,13 +689,13 @@ class IntermediateRepresentation(object):
         """
         for label, block in self.blocks.iteritems():
             assignblks = []
-            for assignblk in block.irs:
+            for assignblk in block:
                 new_assignblk = assignblk.simplify(simplifier)
                 assignblks.append(new_assignblk)
             self.blocks[label] = IRBlock(label, assignblks)
 
     def replace_expr_in_ir(self, bloc, rep):
-        for assignblk in bloc.irs:
+        for assignblk in bloc:
             for dst, src in assignblk.items():
                 del assignblk[dst]
                 assignblk[dst.replace_expr(rep)] = src.replace_expr(rep)
@@ -720,7 +739,7 @@ class IntermediateRepresentation(object):
         todo = set([irb.dst])
         done = set()
 
-        for assignblk in reversed(irb.irs):
+        for assignblk in reversed(irb):
             if not todo:
                 break
             out = self._extract_dst(todo, done)
@@ -762,7 +781,7 @@ class IntermediateRepresentation(object):
         modified = False
         for label, block in self.blocks.iteritems():
             irs = []
-            for assignblk in block.irs:
+            for assignblk in block:
                 if len(assignblk):
                     irs.append(assignblk)
                 else:
@@ -779,9 +798,9 @@ class IntermediateRepresentation(object):
         # Find candidates
         jmp_blocks = set()
         for block in self.blocks.itervalues():
-            if len(block.irs) != 1:
+            if len(block) != 1:
                 continue
-            assignblk = block.irs[0]
+            assignblk = block[0]
             if len(assignblk) > 1:
                 continue
             assert set(assignblk.keys()) == set([self.IRDst])
@@ -860,7 +879,7 @@ class IntermediateRepresentation(object):
                 continue
             # Block has one son, son has one parent => merge
             assignblks =[]
-            for assignblk in self.blocks[block].irs:
+            for assignblk in self.blocks[block]:
                 if self.IRDst not in assignblk:
                     assignblks.append(assignblk)
                     continue
@@ -870,7 +889,7 @@ class IntermediateRepresentation(object):
                         affs[dst] = src
                 assignblks.append(AssignBlock(affs, assignblk.instr))
 
-            assignblks += self.blocks[son].irs
+            assignblks += self.blocks[son].assignblks
             new_block = IRBlock(block, assignblks)
 
             self.graph.discard_edge(block, son)