about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorFabrice Desclaux <fabrice.desclaux@cea.fr>2014-09-11 13:02:50 +0200
committerFabrice Desclaux <fabrice.desclaux@cea.fr>2014-09-11 13:02:50 +0200
commitcf9fedd09e8eaa0624f749d1a4437c3db2d0e444 (patch)
treea9363fb2667bbf15417258cab647ff9f10ae26f3
parent56161aa090cab52c38b961e8537adee3872a635d (diff)
downloadmiasm-cf9fedd09e8eaa0624f749d1a4437c3db2d0e444.tar.gz
miasm-cf9fedd09e8eaa0624f749d1a4437c3db2d0e444.zip
symbexec: add eval cache to expr_eval
-rw-r--r--miasm2/ir/symbexec.py11
1 files changed, 7 insertions, 4 deletions
diff --git a/miasm2/ir/symbexec.py b/miasm2/ir/symbexec.py
index 76bb65b6..c466cfed 100644
--- a/miasm2/ir/symbexec.py
+++ b/miasm2/ir/symbexec.py
@@ -201,6 +201,8 @@ class symbexec:
         # print 'visit', e, e.is_term
         if e.is_term:
             return e
+        if e in eval_cache:
+            return eval_cache[e]
         c = e.__class__
         deal_class = {ExprId: self.eval_ExprId,
                       ExprInt: self.eval_ExprInt,
@@ -346,7 +348,7 @@ class symbexec:
     def eval_ir_expr(self, exprs):
         pool_out = {}
 
-        eval_cache = {}
+        eval_cache = dict(self.symbols.items())
 
         for e in exprs:
             if not isinstance(e, ExprAff):
@@ -377,10 +379,10 @@ class symbexec:
         mem_dst = []
         # src_dst = [(x.src, x.dst) for x in ir]
         src_dst = self.eval_ir_expr(ir)
-
+        eval_cache = dict(self.symbols.items())
         for dst, src in src_dst:
             if isinstance(dst, ExprMem):
-                mem_overlap = self.get_mem_overlapping(dst)
+                mem_overlap = self.get_mem_overlapping(dst, eval_cache)
                 for _, base in mem_overlap:
                     diff_mem = self.substract_mems(base, dst)
                     del(self.symbols[base])
@@ -401,7 +403,8 @@ class symbexec:
             if step:
                 print '_' * 80
                 self.dump_id()
-        return self.eval_expr(self.ir_arch.IRDst)
+        eval_cache = dict(self.symbols.items())
+        return self.eval_expr(self.ir_arch.IRDst, eval_cache)
 
     def emul_ir_bloc(self, myir, ad, step = False):
         b = myir.get_bloc(ad)