16 """Wrapper on expression simplification passes.
18 Instance handle passes lists.
20 Available passes lists are:
21 - commons: common passes such as constant folding
22 - heavy : rare passes (for instance, in case of obfuscation)
27 m2_expr.ExprOp: [simplifications_common.simp_cst_propagation,
28 simplifications_common.simp_cond_op_int,
29 simplifications_common.simp_cond_factor],
30 m2_expr.ExprSlice: [simplifications_common.simp_slice],
31 m2_expr.ExprCompose: [simplifications_common.simp_compose],
32 m2_expr.ExprCond: [simplifications_common.simp_cond],
39 PASS_COND = {m2_expr.ExprSlice: [simplifications_cond.expr_simp_inf_signed,
40 simplifications_cond.expr_simp_inf_unsigned_inversed],
41 m2_expr.ExprOp: [simplifications_cond.exec_inf_unsigned,
42 simplifications_cond.exec_inf_signed,
43 simplifications_cond.expr_simp_inverse,
44 simplifications_cond.exec_equal],
45 m2_expr.ExprCond: [simplifications_cond.expr_simp_equal]
53 """Add passes from @passes
54 @passes: dict(Expr class : list(callback))
56 Callback signature: Expr callback(ExpressionSimplifier, Expr)
59 for k, v
in passes.items():
63 """Apply enabled simplifications on expression
64 @expression: Expr instance
65 Return an Expr instance"""
67 cls = expression.__class__
68 for simp_func
in self.expr_simp_cb.get(cls, []):
70 expression = simp_func(self, expression)
73 if expression.__class__
is not cls:
79 """Apply enabled simplifications on expression and find a stable state
80 @expression: Expr instance
81 Return an Expr instance"""
83 if expression.is_simp:
90 if e_new == expression:
95 expression.is_simp =
True
102 """Apply enabled simplifications on expression
103 @expression: Expr instance
104 @manual_callback: If set, call this function instead of normal one
105 Return an Expr instance"""
107 if expression.is_simp:
113 return expression.visit(callback,
lambda e: not(e.is_simp))
116 "Wrapper on expr_simp_wrapper"
122 expr_simp.enable_passes(ExpressionSimplifier.PASS_COMMONS)