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.py49
1 files changed, 33 insertions, 16 deletions
diff --git a/miasm2/ir/ir.py b/miasm2/ir/ir.py
index 5d77c5a1..32c97661 100644
--- a/miasm2/ir/ir.py
+++ b/miasm2/ir/ir.py
@@ -73,27 +73,40 @@ class irbloc(object):
         """Line number of the IRDst setting statement in the current irs"""
         return self._dst_linenb
 
-    def get_rw(self):
+    def get_rw(self, regs_ids):
+        """
+        Computes the variables read and written by each instructions
+        Initialize attributes needed for in/out and reach computation.
+        @regs_ids : ids of registers used in IR
+        """
         self.r = []
         self.w = []
-        self.c_out = []
-        self.c_in = []
-        self.l_out = []
-        self.l_in = []
-        for ir in self.irs:
+        self.cur_reach = [{reg: set() for reg in regs_ids}
+                          for _ in xrange(len(self.irs))]
+        self.prev_reach = [{reg: set() for reg in regs_ids}
+                           for _ in xrange(len(self.irs))]
+        self.cur_kill = [{reg: set() for reg in regs_ids}
+                         for _ in xrange(len(self.irs))]
+        self.prev_kill = [{reg: set() for reg in regs_ids}
+                          for _ in xrange(len(self.irs))]
+        self.defout = [{reg: set() for reg in regs_ids}
+                       for _ in xrange(len(self.irs))]
+
+        for k, ir in enumerate(self.irs):
             r, w = set(), set()
             for i in ir:
-                r.update([x for x in i.get_r(True) if isinstance(x, m2_expr.ExprId)])
-                w.update([x for x in i.get_w() if isinstance(x, m2_expr.ExprId)])
+                r.update(x for x in i.get_r(True)
+                         if isinstance(x, m2_expr.ExprId))
+                w.update(x for x in i.get_w()
+                         if isinstance(x, m2_expr.ExprId))
                 if isinstance(i.dst, m2_expr.ExprMem):
-                    r.update([x for x in i.dst.arg.get_r(True)
-                    if isinstance(x, m2_expr.ExprId)])
+                    r.update(x for x in i.dst.arg.get_r(True)
+                             if isinstance(x, m2_expr.ExprId))
+                self.defout[k].update((x, {(self.label, k, i)})
+                                      for x in i.get_w()
+                                      if isinstance(x, m2_expr.ExprId))
             self.r.append(r)
             self.w.append(w)
-            self.c_out.append(set())
-            self.c_in.append(set())
-            self.l_out.append(set())
-            self.l_in.append(set())
 
     def __str__(self):
         o = []
@@ -301,9 +314,13 @@ class ir(object):
             for i, l in enumerate(irs):
                 irs[i] = l.replace_expr(rep)
 
-    def get_rw(self):
+    def get_rw(self, regs_ids = []):
+        """
+        Calls get_rw(irb) for each bloc
+        @regs_ids : ids of registers used in IR
+        """
         for b in self.blocs.values():
-            b.get_rw()
+            b.get_rw(regs_ids)
 
     def ExprIsLabel(self, l):
         return isinstance(l, m2_expr.ExprId) and isinstance(l.name,