protected override void RunTest(Program program, TextWriter writer) { var importResolver = new Mock <IImportResolver>().Object; var listener = new FakeDecompilerEventListener(); var dfa = new DataFlowAnalysis(program, importResolver, listener); dfa.UntangleProcedures(); foreach (Procedure proc in program.Procedures.Values) { var larw = new LongAddRewriter(proc); larw.Transform(); Aliases alias = new Aliases(proc, dfa.ProgramDataFlow); alias.Transform(); var sst = new SsaTransform(dfa.ProgramDataFlow, proc, importResolver, proc.CreateBlockDominatorGraph(), new HashSet <RegisterStorage>()); SsaState ssa = sst.SsaState; var cce = new ConditionCodeEliminator(ssa, program.Platform); cce.Transform(); var vp = new ValuePropagator(program.SegmentMap, ssa, importResolver, listener); vp.Transform(); DeadCode.Eliminate(proc, ssa); ssa.Write(writer); proc.Write(false, writer); writer.WriteLine(); ssa.Validate(s => Assert.Fail(s)); } }
public void Avoid() { m.Assign(SCZ, m.Cond(m.ISub(cx, 0x0030))); m.Assign(ax, m.IAdd(m.Word16(0x0000), CF)); m.Assign(SCZ, m.Cond(ax)); m.Assign(SCZ, m.Cond(m.ISub(cx, 0x003A))); m.Assign(CF, m.Not(CF)); m.Assign(ax, m.IAdd(m.IAdd(ax, ax), CF)); m.Assign(SCZ, m.Cond(ax)); var block = m.Block; m.Return(); rw.Transform(); var sExp = @"l1: SCZ = cond(cx - 0x0030) ax = 0x0000 + C SCZ = cond(ax) SCZ = cond(cx - 0x003A) C = !C ax = ax + ax + C SCZ = cond(ax) return "; var sb = new StringWriter(); block.Write(sb); Assert.AreEqual(sExp, sb.ToString()); }
private void RunTest(string sExp, Action <ProcedureBuilder> builder) { builder(m); var dynamicLinker = new Mock <IDynamicLinker>(); var sst = new SsaTransform( program, m.Procedure, new HashSet <Procedure>(), dynamicLinker.Object, new ProgramDataFlow()); sst.Transform(); sst.RenameFrameAccesses = true; sst.Transform(); sst.AddUsesToExitBlock(); sst.RemoveDeadSsaIdentifiers(); rw = new LongAddRewriter(sst.SsaState, new FakeDecompilerEventListener()); this.ssa = sst.SsaState; rw.Transform(); var sb = new StringWriter(); block.Write(sb); var sActual = sb.ToString(); if (sExp != sActual) { Console.WriteLine(sActual); Assert.AreEqual(sExp, sActual); } }
protected override void RunTest(Program program, TextWriter writer) { var eventListener = new FakeDecompilerEventListener(); foreach (var proc in program.Procedures.Values) { var sst = new SsaTransform( program, proc, new HashSet <Procedure>(), null, new ProgramDataFlow()); sst.Transform(); var vp = new ValuePropagator( program.SegmentMap, sst.SsaState, program.CallGraph, null, eventListener); vp.Transform(); sst.RenameFrameAccesses = true; sst.Transform(); sst.AddUsesToExitBlock(); sst.RemoveDeadSsaIdentifiers(); var larw = new LongAddRewriter(sst.SsaState, eventListener); larw.Transform(); proc.Write(false, writer); writer.WriteLine(); } }
protected override void RunTest(Program prog, TextWriter writer) { DataFlowAnalysis dfa = new DataFlowAnalysis(prog, new FakeDecompilerEventListener()); dfa.UntangleProcedures(); foreach (Procedure proc in prog.Procedures.Values) { var larw = new LongAddRewriter(proc, prog.Architecture); larw.Transform(); Aliases alias = new Aliases(proc, prog.Architecture, dfa.ProgramDataFlow); alias.Transform(); var sst = new SsaTransform(dfa.ProgramDataFlow, proc, proc.CreateBlockDominatorGraph()); SsaState ssa = sst.SsaState; proc.Dump(true); var vp = new ValuePropagator(ssa.Identifiers, proc); vp.Transform(); var cce = new ConditionCodeEliminator(ssa.Identifiers, prog.Platform); cce.Transform(); DeadCode.Eliminate(proc, ssa); ssa.Write(writer); proc.Write(false, writer); writer.WriteLine(); } }
protected override void RunTest(Program program, TextWriter writer) { var dynamicLinker = new Mock <IDynamicLinker>().Object; var listener = new FakeDecompilerEventListener(); var sc = new ServiceContainer(); sc.AddService <DecompilerEventListener>(listener); var dfa = new DataFlowAnalysis(program, dynamicLinker, sc); foreach (var proc in program.Procedures.Values) { var sst = new SsaTransform( program, proc, new HashSet <Procedure>(), dynamicLinker, new ProgramDataFlow()); var ssa = sst.Transform(); var larw = new LongAddRewriter(ssa, listener); larw.Transform(); var cce = new ConditionCodeEliminator(program, ssa, listener); cce.Transform(); ssa.Validate(s => { ssa.Dump(true); Assert.Fail(s); }); var vp = new ValuePropagator(program.SegmentMap, ssa, program.CallGraph, dynamicLinker, listener); vp.Transform(); ssa.Validate(s => { ssa.Dump(true); Assert.Fail(s); }); sst.RenameFrameAccesses = true; sst.Transform(); ssa.Validate(s => { ssa.Dump(true); Assert.Fail(s); }); // We don't add uses to exit block on purpose. We // are not testing interprocedural effects here. DeadCode.Eliminate(ssa); ssa.Procedure.Write(false, writer); writer.WriteLine(); ssa.Validate(s => { ssa.Dump(true); Assert.Fail(s); }); } }
protected override void RunTest(Program prog, TextWriter writer) { var eventListener = new FakeDecompilerEventListener(); var dfa = new DataFlowAnalysis(prog, null, eventListener); var trf = new TrashedRegisterFinder(prog, prog.Procedures.Values, dfa.ProgramDataFlow, eventListener); trf.Compute(); trf.RewriteBasicBlocks(); RegisterLiveness rl = RegisterLiveness.Compute(prog, dfa.ProgramDataFlow, eventListener); foreach (Procedure proc in prog.Procedures.Values) { LongAddRewriter larw = new LongAddRewriter(proc, prog.Architecture); larw.Transform(); proc.Write(false, writer); writer.WriteLine(); } }
public void Larw_Avoid() { RunTest(m => { m.Assign(SCZ, m.Cond(m.ISub(cx, 0x0030))); m.Assign(ax, m.IAdd(m.Word16(0x0000), CF)); m.Assign(SCZ, m.Cond(ax)); m.Assign(SCZ, m.Cond(m.ISub(cx, 0x003A))); m.Assign(CF, m.Not(CF)); m.Assign(ax, m.IAdd(m.IAdd(ax, ax), CF)); m.Assign(SCZ, m.Cond(ax)); block = m.Block; m.Return(); }); rw.Transform(); var sExp = @"l1: SCZ_2 = cond(cx - 0x30<16>) C_3 = SLICE(SCZ_2, bool, 2) (alias) ax_4 = 0<16> + C_3 SCZ_5 = cond(ax_4) SCZ_6 = cond(cx - 0x3A<16>) C_7 = SLICE(SCZ_6, bool, 2) (alias) C_8 = !C_7 ax_9 = ax_4 + ax_4 + C_8 SCZ_10 = cond(ax_9) C_11 = SLICE(SCZ_10, bool, 2) (alias) S_12 = SLICE(SCZ_10, bool, 0) (alias) Z_13 = SLICE(SCZ_10, bool, 1) (alias) return "; var sb = new StringWriter(); block.Write(sb); Assert.AreEqual(sExp, sb.ToString()); }