about summary refs log tree commit diff stats
path: root/miasm2/ir
diff options
context:
space:
mode:
Diffstat (limited to 'miasm2/ir')
-rw-r--r--miasm2/ir/ir.py15
-rw-r--r--miasm2/ir/symbexec.py16
-rw-r--r--miasm2/ir/translators/C.py24
-rw-r--r--miasm2/ir/translators/z3_ir.py6
4 files changed, 52 insertions, 9 deletions
diff --git a/miasm2/ir/ir.py b/miasm2/ir/ir.py
index 721101e2..38a24263 100644
--- a/miasm2/ir/ir.py
+++ b/miasm2/ir/ir.py
@@ -440,6 +440,21 @@ class IRBlock(object):
         return '\n'.join(out)
 
 
+    def simplify(self, simplifier):
+        """
+        Simplify expressions in each assignblock
+        @simplifier: ExpressionSimplifier instance
+        """
+        modified = False
+        assignblks = []
+        for assignblk in self:
+            new_assignblk = assignblk.simplify(simplifier)
+            if assignblk != new_assignblk:
+                modified = True
+            assignblks.append(new_assignblk)
+        return modified, IRBlock(self.loc_key, assignblks)
+
+
 class irbloc(IRBlock):
     """
     DEPRECATED object
diff --git a/miasm2/ir/symbexec.py b/miasm2/ir/symbexec.py
index 9ab455da..1a077de5 100644
--- a/miasm2/ir/symbexec.py
+++ b/miasm2/ir/symbexec.py
@@ -4,7 +4,7 @@ from collections import MutableMapping
 
 from miasm2.expression.expression import ExprOp, ExprId, ExprLoc, ExprInt, \
     ExprMem, ExprCompose, ExprSlice, ExprCond
-from miasm2.expression.simplifications import expr_simp
+from miasm2.expression.simplifications import expr_simp_explicit
 from miasm2.ir.ir import AssignBlock
 
 log = logging.getLogger("symbexec")
@@ -138,7 +138,7 @@ class MemArray(MutableMapping):
 
     """
 
-    def __init__(self, base, expr_simp=expr_simp):
+    def __init__(self, base, expr_simp=expr_simp_explicit):
         self._base = base
         self.expr_simp = expr_simp
         self._mask = int(base.mask)
@@ -461,7 +461,7 @@ class MemSparse(object):
 
     """
 
-    def __init__(self, addrsize, expr_simp=expr_simp):
+    def __init__(self, addrsize, expr_simp=expr_simp_explicit):
         """
         @addrsize: size (in bits) of the addresses manipulated by the MemSparse
         @expr_simp: an ExpressionSimplifier instance
@@ -604,7 +604,7 @@ class MemSparse(object):
 class SymbolMngr(object):
     """Symbolic store manager (IDs and MEMs)"""
 
-    def __init__(self, init=None, addrsize=None, expr_simp=expr_simp):
+    def __init__(self, init=None, addrsize=None, expr_simp=expr_simp_explicit):
         assert addrsize is not None
         if init is None:
             init = {}
@@ -807,7 +807,7 @@ class SymbolicExecutionEngine(object):
     def __init__(self, ir_arch, state=None,
                  func_read=None,
                  func_write=None,
-                 sb_expr_simp=expr_simp):
+                 sb_expr_simp=expr_simp_explicit):
 
         self.expr_to_visitor = {
             ExprInt: self.eval_exprint,
@@ -823,7 +823,7 @@ class SymbolicExecutionEngine(object):
         if state is None:
             state = {}
 
-        self.symbols = SymbolMngr(addrsize=ir_arch.addrsize, expr_simp=expr_simp)
+        self.symbols = SymbolMngr(addrsize=ir_arch.addrsize, expr_simp=sb_expr_simp)
 
         for dst, src in state.iteritems():
             self.symbols.write(dst, src)
@@ -1270,9 +1270,9 @@ class symbexec(SymbolicExecutionEngine):
     def __init__(self, ir_arch, known_symbols,
                  func_read=None,
                  func_write=None,
-                 sb_expr_simp=expr_simp):
+                 sb_expr_simp=expr_simp_explicit):
         warnings.warn("Deprecated API: use SymbolicExecutionEngine")
         super(symbexec, self).__init__(ir_arch, known_symbols,
                                        func_read,
                                        func_write,
-                                       sb_expr_simp=expr_simp)
+                                       sb_expr_simp=sb_expr_simp)
diff --git a/miasm2/ir/translators/C.py b/miasm2/ir/translators/C.py
index 11ccf137..33c21049 100644
--- a/miasm2/ir/translators/C.py
+++ b/miasm2/ir/translators/C.py
@@ -1,7 +1,7 @@
 from miasm2.ir.translators.translator import Translator
 from miasm2.core import asmblock
 from miasm2.expression.modint import size2mask
-
+from miasm2.expression.expression import ExprInt, ExprCond, ExprCompose
 
 def int_size_to_bn(value, size):
     if size < 32:
@@ -125,6 +125,28 @@ class TranslatorC(Translator):
                 out = 'parity(%s)' % out
                 return out
 
+            elif expr.op.startswith("zeroExt_"):
+                arg = expr.args[0]
+                if expr.size == arg.size:
+                    return arg
+                return self.from_expr(ExprCompose(arg, ExprInt(0, expr.size - arg.size)))
+
+            elif expr.op.startswith("signExt_"):
+                arg = expr.args[0]
+                if expr.size == arg.size:
+                    return arg
+                add_size = expr.size - arg.size
+                new_expr = ExprCompose(
+                    arg,
+                    ExprCond(
+                        arg.msb(),
+                        ExprInt(size2mask(add_size), add_size),
+                        ExprInt(0, add_size)
+                    )
+                )
+                return self.from_expr(new_expr)
+
+
             elif expr.op in ['cntleadzeros', 'cnttrailzeros']:
                 arg = expr.args[0]
                 out = self.from_expr(arg)
diff --git a/miasm2/ir/translators/z3_ir.py b/miasm2/ir/translators/z3_ir.py
index 887c68d0..1b0578b7 100644
--- a/miasm2/ir/translators/z3_ir.py
+++ b/miasm2/ir/translators/z3_ir.py
@@ -229,6 +229,12 @@ class TranslatorZ3(Translator):
                 index = - i % size
                 out = size - (index + 1)
                 res = z3.If((src & (1 << index)) != 0, out, res)
+        elif expr.op.startswith("zeroExt"):
+            arg, = expr.args
+            res = z3.ZeroExt(expr.size - arg.size, self.from_expr(arg))
+        elif expr.op.startswith("signExt"):
+            arg, = expr.args
+            res = z3.SignExt(expr.size - arg.size, self.from_expr(arg))
         else:
             raise NotImplementedError("Unsupported OP yet: %s" % expr.op)