From ccee69ba3b27f298c6d2cd5daa4b8976a571582e Mon Sep 17 00:00:00 2001 From: Fabrice Desclaux Date: Sun, 19 Aug 2018 14:43:14 +0200 Subject: Expression: add simp cond --- miasm2/expression/simplifications_common.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'miasm2/expression/simplifications_common.py') diff --git a/miasm2/expression/simplifications_common.py b/miasm2/expression/simplifications_common.py index b01b1d1d..2bdccdbd 100644 --- a/miasm2/expression/simplifications_common.py +++ b/miasm2/expression/simplifications_common.py @@ -1021,3 +1021,15 @@ def simp_zeroext_eq_cst(expr_s, expr): # Always false return ExprInt(0, 1) return ExprOp("==", src, ExprInt(int(arg2), src.size)) + + +def simp_cond_eq_zero(expr_s, expr): + # (X == 0)?(A:B) => X?(B:A) + cond = expr.cond + if not cond.is_op('=='): + return expr + arg1, arg2 = cond.args + if not arg2.is_int(0): + return expr + new_expr = ExprCond(arg1, expr.src2, expr.src1) + return new_expr -- cgit 1.4.1 From caec47dc1871782ca445ea34229cd2a5ee600a7f Mon Sep 17 00:00:00 2001 From: Fabrice Desclaux Date: Wed, 29 Aug 2018 18:09:52 +0200 Subject: Expr: use TOK define instead of strings --- miasm2/arch/mips32/sem.py | 28 ++++--- miasm2/expression/expression.py | 14 +++- miasm2/expression/expression_helper.py | 2 +- miasm2/expression/simplifications_common.py | 101 ++++++++++++++++---------- miasm2/expression/simplifications_explicit.py | 5 +- miasm2/ir/translators/C.py | 5 +- test/ir/ir2C.py | 4 +- 7 files changed, 98 insertions(+), 61 deletions(-) (limited to 'miasm2/expression/simplifications_common.py') diff --git a/miasm2/arch/mips32/sem.py b/miasm2/arch/mips32/sem.py index 695e26a4..92001280 100644 --- a/miasm2/arch/mips32/sem.py +++ b/miasm2/arch/mips32/sem.py @@ -7,10 +7,14 @@ from miasm2.jitter.csts import EXCEPT_DIV_BY_ZERO # SemBuilder context -ctx = {"R_LO": R_LO, - "R_HI": R_HI, - "PC": PC, - "RA": RA} +ctx = { + "R_LO": R_LO, + "R_HI": R_HI, + "PC": PC, + "RA": RA, + "m2_expr": m2_expr +} + sbuild = SemBuilder(ctx) @@ -76,7 +80,7 @@ def lb(arg1, arg2): @sbuild.parse def beq(arg1, arg2, arg3): "Branches on @arg3 if the quantities of two registers @arg1, @arg2 are eq" - dst = arg3 if ExprOp("==", arg1, arg2) else ExprLoc(ir.get_next_break_loc_key(instr), ir.IRDst.size) + dst = arg3 if ExprOp(m2_expr.TOK_EQUAL, arg1, arg2) else ExprLoc(ir.get_next_break_loc_key(instr), ir.IRDst.size) PC = dst ir.IRDst = dst @@ -84,7 +88,7 @@ def beq(arg1, arg2, arg3): def bgez(arg1, arg2): """Branches on @arg2 if the quantities of register @arg1 is greater than or equal to zero""" - dst = ExprLoc(ir.get_next_break_loc_key(instr), ir.IRDst.size) if ExprOp('>', '<<', - 'a>>', '>>>', '<<<', '/', '%', '**', - '>', '<<', + 'a>>', '>>>', '<<<', '/', '%', '**', + TOK_INF_UNSIGNED, + TOK_INF_SIGNED, + TOK_INF_EQUAL_UNSIGNED, + TOK_INF_EQUAL_SIGNED, + TOK_EQUAL + ] def is_associative(self): "Return True iff current operation is associative" diff --git a/miasm2/expression/expression_helper.py b/miasm2/expression/expression_helper.py index bb0d5adf..5de9e04f 100644 --- a/miasm2/expression/expression_helper.py +++ b/miasm2/expression/expression_helper.py @@ -512,7 +512,7 @@ class CondConstraint(object): class CondConstraintZero(CondConstraint): """Stand for a constraint like 'A == 0'""" - operator = "==" + operator = m2_expr.TOK_EQUAL def to_constraint(self): return m2_expr.ExprAff(self.expr, m2_expr.ExprInt(0, self.expr.size)) diff --git a/miasm2/expression/simplifications_common.py b/miasm2/expression/simplifications_common.py index 2bdccdbd..e7dacc91 100644 --- a/miasm2/expression/simplifications_common.py +++ b/miasm2/expression/simplifications_common.py @@ -4,8 +4,11 @@ from miasm2.expression.modint import mod_size2int, mod_size2uint -from miasm2.expression.expression import ExprInt, ExprSlice, ExprMem, ExprCond, ExprOp, ExprCompose -from miasm2.expression.expression_helper import parity, op_propag_cst, merge_sliceto_slice +from miasm2.expression.expression import ExprInt, ExprSlice, ExprMem, \ + ExprCond, ExprOp, ExprCompose, TOK_INF_SIGNED, TOK_INF_UNSIGNED, \ + TOK_INF_EQUAL_SIGNED, TOK_INF_EQUAL_UNSIGNED, TOK_EQUAL +from miasm2.expression.expression_helper import parity, op_propag_cst, \ + merge_sliceto_slice def simp_cst_propagation(e_s, expr): @@ -692,7 +695,7 @@ def simp_cc_conds(expr_simp, expr): "FLAG_SUB_CF" )): expr = ExprCond( - ExprOp("") and test_cc_eq_args( @@ -855,7 +858,7 @@ def simp_cc_conds(expr_simp, expr): "FLAG_EQ_CMP", )): expr = ExprCond( - ExprOp("<=u", *expr.args[0].args), + ExprOp(TOK_INF_EQUAL_UNSIGNED, *expr.args[0].args), ExprInt(0, 1), ExprInt(1, 1) ) @@ -867,7 +870,7 @@ def simp_cc_conds(expr_simp, expr): "FLAG_ADD_OF" )): arg0, arg1 = expr.args[0].args - expr = ExprOp(" (X == Y)?A:B cond = expr.cond if cond.is_op("FLAG_EQ_CMP"): - return ExprCond(ExprOp("==", *cond.args), expr.src1, expr.src2) + return ExprCond(ExprOp(TOK_EQUAL, *cond.args), expr.src1, expr.src2) return expr def simp_cond_int(expr_simp, expr): - if (expr.cond.is_op('==') and + if (expr.cond.is_op(TOK_EQUAL) and expr.cond.args[1].is_int() and expr.cond.args[0].is_compose() and len(expr.cond.args[0].args) == 2 and @@ -891,9 +894,20 @@ def simp_cond_int(expr_simp, expr): src = expr.cond.args[0].args[0] int_val = int(expr.cond.args[1]) new_int = ExprInt(int_val, src.size) - expr = expr_simp(ExprCond(ExprOp("==", src, new_int), expr.src1, expr.src2)) + expr = expr_simp( + ExprCond( + ExprOp(TOK_EQUAL, src, new_int), + expr.src1, + expr.src2) + ) elif (expr.cond.is_op() and - expr.cond.op in ['==', ' A == int[:A.size] - if not expr.is_op("=="): + if not expr.is_op(TOK_EQUAL): return expr arg1, arg2 = expr.args if not arg2.is_int(): @@ -1020,13 +1045,13 @@ def simp_zeroext_eq_cst(expr_s, expr): if int(arg2) > (1 << src.size): # Always false return ExprInt(0, 1) - return ExprOp("==", src, ExprInt(int(arg2), src.size)) + return ExprOp(TOK_EQUAL, src, ExprInt(int(arg2), src.size)) def simp_cond_eq_zero(expr_s, expr): # (X == 0)?(A:B) => X?(B:A) cond = expr.cond - if not cond.is_op('=='): + if not cond.is_op(TOK_EQUAL): return expr arg1, arg2 = cond.args if not arg2.is_int(0): diff --git a/miasm2/expression/simplifications_explicit.py b/miasm2/expression/simplifications_explicit.py index 34ba287e..4c5dde3e 100644 --- a/miasm2/expression/simplifications_explicit.py +++ b/miasm2/expression/simplifications_explicit.py @@ -1,5 +1,6 @@ from miasm2.expression.modint import size2mask -from miasm2.expression.expression import ExprInt, ExprCond, ExprCompose +from miasm2.expression.expression import ExprInt, ExprCond, ExprCompose, \ + TOK_EQUAL def simp_ext(_, expr): @@ -154,7 +155,7 @@ def simp_flags(_, expr): op_nf, = args return ~op_nf - elif expr.is_op("=="): + elif expr.is_op(TOK_EQUAL): arg1, arg2 = args return ExprCond( arg1 - arg2, diff --git a/miasm2/ir/translators/C.py b/miasm2/ir/translators/C.py index 89a2ac84..01aa7d7a 100644 --- a/miasm2/ir/translators/C.py +++ b/miasm2/ir/translators/C.py @@ -1,6 +1,7 @@ from miasm2.ir.translators.translator import Translator from miasm2.expression.modint import size2mask -from miasm2.expression.expression import ExprInt, ExprCond, ExprCompose +from miasm2.expression.expression import ExprInt, ExprCond, ExprCompose, \ + TOK_EQUAL def int_size_to_bn(value, size): if size < 32: @@ -243,7 +244,7 @@ class TranslatorC(Translator): raise NotImplementedError('Unknown op: %r' % expr.op) elif len(expr.args) == 2: - if expr.op == "==": + if expr.op == TOK_EQUAL: return '(((%s&%s) == (%s&%s))?1:0)' % ( self.from_expr(expr.args[0]), self._size2mask(expr.args[0].size), diff --git a/test/ir/ir2C.py b/test/ir/ir2C.py index 375dedb8..6df439c2 100755 --- a/test/ir/ir2C.py +++ b/test/ir/ir2C.py @@ -2,7 +2,7 @@ #-*- coding:utf-8 -*- import unittest - +from miasm2.expression.expression import TOK_EQUAL class TestIrIr2C(unittest.TestCase): @@ -32,7 +32,7 @@ class TestIrIr2C(unittest.TestCase): # Binary operators self.translationTest( - ExprOp('==', *args[:2]), r'(((0x0&0xffffffff) == (0x1&0xffffffff))?1:0)') + ExprOp(TOK_EQUAL, *args[:2]), r'(((0x0&0xffffffff) == (0x1&0xffffffff))?1:0)') self.translationTest( ExprOp('%', *args[:2]), r'(((0x0&0xffffffff)%(0x1&0xffffffff))&0xffffffff)') self.translationTest( -- cgit 1.4.1