diff options
Diffstat (limited to 'test')
| -rw-r--r-- | test/analysis/unssa.py | 52 | ||||
| -rw-r--r-- | test/ir/reduce_graph.py | 41 |
2 files changed, 52 insertions, 41 deletions
diff --git a/test/analysis/unssa.py b/test/analysis/unssa.py index ae9566ee..a796f3b6 100644 --- a/test/analysis/unssa.py +++ b/test/analysis/unssa.py @@ -1,14 +1,10 @@ """ Test cases for dead code elimination""" -from pdb import pm -from pprint import pprint as pp from miasm2.expression.expression import ExprId, ExprInt, ExprAssign, ExprMem, \ - ExprCond, ExprOp, ExprLoc + ExprCond, ExprLoc from miasm2.core.locationdb import LocationDB -from miasm2.analysis.data_flow import DiGraphLivenessSSA, dead_simp, PropagateExpr +from miasm2.analysis.simplifier import IRCFGSimplifierSSA from miasm2.ir.analysis import ira from miasm2.ir.ir import IRCFG, IRBlock, AssignBlock -from miasm2.analysis.ssa import SSADiGraph -from miasm2.analysis.outofssa import UnSSADiGraph loc_db = LocationDB() @@ -595,6 +591,18 @@ def add_out_reg_end(ir_arch_a, ircfg_a): ir_arch_a = IRAOutRegs(loc_db) +class CustomIRCFGSimplifierSSA(IRCFGSimplifierSSA): + def get_forbidden_regs(self): + """ + Return a set of immutable register during SSA transformation + """ + regs = set( + [ + self.ir_arch.pc, + self.ir_arch.IRDst, + ] + ) + return regs for test_nb, ircfg in enumerate( [ @@ -620,34 +628,8 @@ for test_nb, ircfg in enumerate( # SSA head = LBL0 - ssa = SSADiGraph(ircfg) - ssa.transform(head) - - ir_arch_a.ssa_var = ssa.ssa_variable_to_expr - dead_simp(ir_arch_a, ssa.graph) - - open("ssa_%d.dot" % test_nb, "wb").write(ssa.graph.dot()) - - - - # Un SSA - ir_arch_a.ssa_var = ssa.ssa_variable_to_expr - - propagate_expr = PropagateExpr() - modified = True - while modified: - modified = False - modified |= propagate_expr.propagate(ssa, head) - - open('tmp_%d.dot' % test_nb, 'w').write(ssa.graph.dot()) - - cfg_liveness = DiGraphLivenessSSA(ssa.graph) - cfg_liveness.init_var_info(ir_arch_a) - cfg_liveness.compute_liveness() - - open('liveness_%d.dot' % test_nb, 'w').write(cfg_liveness.dot()) - - unssa = UnSSADiGraph(ssa, head, cfg_liveness) - open('final_%d.dot' % test_nb, 'w').write(unssa.ssa.graph.dot()) + simplifier = CustomIRCFGSimplifierSSA(ir_arch_a) + ircfg = simplifier(ircfg, head) + open('final_%d.dot' % test_nb, 'w').write(ircfg.dot()) # XXX TODO: add real regression test diff --git a/test/ir/reduce_graph.py b/test/ir/reduce_graph.py index 29a3501f..75ff3410 100644 --- a/test/ir/reduce_graph.py +++ b/test/ir/reduce_graph.py @@ -321,17 +321,27 @@ G4_RES_IRB0 = gen_irblock( LBL0, [ [ + ExprAssign(IRDst, ExprLoc(LBL1, 32)), + ] + ] +) + + +G4_RES_IRB1 = gen_irblock( + LBL1, + [ + [ ExprAssign(A, C), ], [ ExprAssign(D, A), - ExprAssign(IRDst, ExprLoc(LBL0, 32)), + ExprAssign(IRDst, ExprLoc(LBL1, 32)), ] ] ) -for irb in [G4_RES_IRB0 ]: +for irb in [G4_RES_IRB0, G4_RES_IRB1 ]: G4_RES.add_irblock(irb) @@ -389,15 +399,25 @@ for irb in [G5_IRB0, G5_IRB1, G5_IRB2, G5_IRB3]: # Result G5_RES = IRA.new_ircfg() + G5_RES_IRB0 = gen_irblock( LBL0, [ [ + ExprAssign(IRDst, ExprLoc(LBL1, 32)), + ] + ] +) + +G5_RES_IRB1 = gen_irblock( + LBL1, + [ + [ ExprAssign(A, C), ], [ ExprAssign(D, A), - ExprAssign(IRDst, ExprCond(C, ExprLoc(LBL0, 32), ExprLoc(LBL3, 32))), + ExprAssign(IRDst, ExprCond(C, ExprLoc(LBL1, 32), ExprLoc(LBL3, 32))), ] ] ) @@ -413,7 +433,7 @@ G5_RES_IRB3 = gen_irblock( ] ) -for irb in [G5_RES_IRB0, G5_RES_IRB3 ]: +for irb in [G5_RES_IRB0, G5_RES_IRB1, G5_RES_IRB3 ]: G5_RES.add_irblock(irb) @@ -605,14 +625,23 @@ G8_RES_IRB0 = gen_irblock( LBL0, [ [ + ExprAssign(IRDst, ExprLoc(LBL1, 32)), + ] + ] +) + +G8_RES_IRB1 = gen_irblock( + LBL1, + [ + [ ExprAssign(A, C), - ExprAssign(IRDst, ExprLoc(LBL0, 32)), + ExprAssign(IRDst, ExprLoc(LBL1, 32)), ] ] ) -for irb in [G8_RES_IRB0]: +for irb in [G8_RES_IRB0, G8_RES_IRB1]: G8_RES.add_irblock(irb) |