protected override void RunTest(Program program, TextWriter writer) { var listener = new FakeDecompilerEventListener(); var sc = new ServiceContainer(); sc.AddService <DecompilerEventListener>(listener); DataFlowAnalysis dfa = new DataFlowAnalysis(program, dynamicLinker.Object, sc); var ssts = dfa.UntangleProcedures(); foreach (var sst in ssts) { SsaState ssa = sst.SsaState; ConditionCodeEliminator cce = new ConditionCodeEliminator(program, ssa, listener); cce.Transform(); DeadCode.Eliminate(ssa); ssa.Write(writer); ssa.Validate(s => writer.WriteLine("*** SSA state invalid: {0}", s)); ssa.Procedure.Write(false, writer); } }
private void Build(Procedure proc, IProcessorArchitecture arch) { var platform = new DefaultPlatform(null, arch); var program = new Program() { Architecture = arch, Platform = platform, }; this.proc = proc; var dynamicLinker = new Mock<IDynamicLinker>().Object; var gr = proc.CreateBlockDominatorGraph(); SsaTransform sst = new SsaTransform( program, proc, new HashSet<Procedure>(), null, new ProgramDataFlow()); sst.Transform(); this.ssa = sst.SsaState; this.ssaIds = ssa.Identifiers; var listener = new FakeDecompilerEventListener(); ConditionCodeEliminator cce = new ConditionCodeEliminator(program, ssa, listener); cce.Transform(); DeadCode.Eliminate(ssa); var segmentMap = new SegmentMap(Address.Ptr32(0x00400000)); ValuePropagator vp = new ValuePropagator( segmentMap, ssa, program.CallGraph, null, listener); vp.Transform(); Coalescer coa = new Coalescer(ssa); coa.Transform(); DeadCode.Eliminate(ssa); }
private void Prepare(Procedure proc) { this.proc = proc; doms = proc.CreateBlockDominatorGraph(); SsaTransform sst = new SsaTransform(new ProgramDataFlow(), proc, doms); SsaState ssa = sst.SsaState; ssaIds = ssa.Identifiers; var arch = new FakeArchitecture(); var cce = new ConditionCodeEliminator(ssaIds, new DefaultPlatform(null, arch)); cce.Transform(); DeadCode.Eliminate(proc, ssa); var vp = new ValuePropagator(arch, ssa.Identifiers, proc); vp.Transform(); DeadCode.Eliminate(proc, ssa); }
private void Build(Procedure proc, IProcessorArchitecture arch) { var platform = new DefaultPlatform(null, arch); var program = new Program() { Architecture = arch, Platform = platform, }; this.proc = proc; var dynamicLinker = new Mock <IDynamicLinker>().Object; var listener = new FakeDecompilerEventListener(); var sst = new SsaTransform( program, proc, new HashSet <Procedure>(), dynamicLinker, new ProgramDataFlow()); sst.Transform(); ssa = sst.SsaState; ConditionCodeEliminator cce = new ConditionCodeEliminator(ssa, platform, listener); cce.Transform(); var segmentMap = new SegmentMap(Address.Ptr32(0x00123400)); ValuePropagator vp = new ValuePropagator(segmentMap, ssa, program.CallGraph, dynamicLinker, listener); vp.Transform(); DeadCode.Eliminate(ssa); Coalescer coa = new Coalescer(ssa); coa.Transform(); DeadCode.Eliminate(ssa); sla = new SsaLivenessAnalysis(ssa); sla2 = new SsaLivenessAnalysis2(ssa); sla2.Analyze(); }
private void Build(Program program) { var eventListener = new FakeDecompilerEventListener(); DataFlowAnalysis dfa = new DataFlowAnalysis(program, null, eventListener); dfa.UntangleProcedures(); foreach (Procedure proc in program.Procedures.Values) { Aliases alias = new Aliases(proc, program.Architecture); alias.Transform(); var gr = proc.CreateBlockDominatorGraph(); SsaTransform sst = new SsaTransform(dfa.ProgramDataFlow, proc, null, gr, new HashSet <RegisterStorage>()); SsaState ssa = sst.SsaState; ConditionCodeEliminator cce = new ConditionCodeEliminator(ssa, program.Platform); cce.Transform(); DeadCode.Eliminate(proc, ssa); var vp = new ValuePropagator(program.Architecture, ssa, eventListener); vp.Transform(); DeadCode.Eliminate(proc, ssa); Coalescer coa = new Coalescer(proc, ssa); coa.Transform(); DeadCode.Eliminate(proc, ssa); LiveCopyInserter lci = new LiveCopyInserter(proc, ssa.Identifiers); lci.Transform(); WebBuilder web = new WebBuilder(proc, ssa.Identifiers, new Dictionary <Identifier, LinearInductionVariable>()); web.Transform(); ssa.ConvertBack(false); } }
private void Build(Procedure proc, IProcessorArchitecture arch) { var platform = new DefaultPlatform(null, arch); this.proc = proc; var importResolver = MockRepository.GenerateStub <IImportResolver>(); importResolver.Replay(); Aliases alias = new Aliases(proc); alias.Transform(); var gr = proc.CreateBlockDominatorGraph(); SsaTransform sst = new SsaTransform( new ProgramDataFlow(), proc, null, gr, new HashSet <RegisterStorage>()); SsaState ssa = sst.SsaState; this.ssaIds = ssa.Identifiers; ConditionCodeEliminator cce = new ConditionCodeEliminator(ssa, platform); cce.Transform(); DeadCode.Eliminate(proc, ssa); var segmentMap = new SegmentMap(Address.Ptr32(0x00400000)); ValuePropagator vp = new ValuePropagator(segmentMap, ssa, new FakeDecompilerEventListener()); vp.Transform(); Coalescer coa = new Coalescer(proc, ssa); coa.Transform(); DeadCode.Eliminate(proc, ssa); }
public void CceEqId() { Identifier r = Reg32("r"); Identifier z = FlagGroup("z"); // is a condition code. Identifier y = FlagGroup("y"); // is a condition code. ProcedureBuilder m = new ProcedureBuilder(); m.Assign(z, new ConditionOf(r)); ssaIds[z].DefStatement = m.Block.Statements.Last; m.Assign(y, z); ssaIds[y].DefStatement = m.Block.Statements.Last; ssaIds[z].Uses.Add(m.Block.Statements.Last); var stmBr = m.BranchIf(m.Test(ConditionCode.EQ, y), "foo"); ssaIds[y].Uses.Add(stmBr); var arch = new FakeArchitecture(); var cce = new ConditionCodeEliminator(ssaIds, new DefaultPlatform(null, arch)); cce.Transform(); Assert.AreEqual("branch r == 0x00000000 foo", stmBr.Instruction.ToString()); }
protected override void RunTest(Program program, TextWriter writer) { DataFlowAnalysis dfa = new DataFlowAnalysis(program, null, new FakeDecompilerEventListener()); dfa.UntangleProcedures(); foreach (Procedure proc in program.Procedures.Values) { Aliases alias = new Aliases(proc, program.Architecture); alias.Transform(); SsaTransform sst = new SsaTransform( dfa.ProgramDataFlow, proc, null, proc.CreateBlockDominatorGraph(), program.Platform.CreateImplicitArgumentRegisters()); SsaState ssa = sst.SsaState; ConditionCodeEliminator cce = new ConditionCodeEliminator(ssa, program.Platform); cce.Transform(); DeadCode.Eliminate(proc, ssa); ssa.Write(writer); proc.Write(false, writer); } }
private void RunSsaTest(string sExpected, Action <SsaProcedureBuilder> generateCode) { var ssapb = new SsaProcedureBuilder(); generateCode(ssapb); var program = new Program { Platform = platform, }; var cce = new ConditionCodeEliminator(program, ssapb.Ssa, new FakeDecompilerEventListener()); cce.Transform(); var writer = new StringWriter(); ssapb.Ssa.Procedure.WriteBody(true, writer); var sActual = writer.ToString(); if (sActual != sExpected) { Console.WriteLine(sActual); Assert.AreEqual(sExpected, sActual); } ssapb.Ssa.Validate(s => { ssapb.Ssa.Dump(true); Assert.Fail(s); }); }
private void Given_ConditionCodeEliminator() { cce = new ConditionCodeEliminator(ssaState, new DefaultPlatform(null, new FakeArchitecture())); }
private void Given_ConditionCodeEliminator() { cce = new ConditionCodeEliminator(ssaState, new DefaultPlatform(null, new FakeArchitecture()), new FakeDecompilerEventListener()); }