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, false); 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 prog, TextWriter writer) { var dfa = new DataFlowAnalysis(prog, new FakeDecompilerEventListener()); dfa.UntangleProcedures(); foreach (Procedure proc in prog.Procedures.Values) { writer.WriteLine("= {0} ========================", proc.Name); var gr = proc.CreateBlockDominatorGraph(); Aliases alias = new Aliases(proc, prog.Architecture); alias.Transform(); SsaTransform sst = new SsaTransform(dfa.ProgramDataFlow, proc, gr); SsaState ssa = sst.SsaState; var cce = new ConditionCodeEliminator(ssa.Identifiers, prog.Platform); cce.Transform(); ssa.Write(writer); proc.Write(false, writer); writer.WriteLine(); ValuePropagator vp = new ValuePropagator(ssa.Identifiers, proc); vp.Transform(); ssa.Write(writer); proc.Write(false, writer); } }
protected override void RunTest(Program prog, TextWriter writer) { DataFlowAnalysis dfa = new DataFlowAnalysis(prog, new FakeDecompilerEventListener()); dfa.UntangleProcedures(); foreach (Procedure proc in prog.Procedures.Values) { Aliases alias = new Aliases(proc, prog.Architecture); alias.Transform(); SsaTransform sst = new SsaTransform(dfa.ProgramDataFlow, proc, proc.CreateBlockDominatorGraph()); SsaState ssa = sst.SsaState; GrfDefinitionFinder grfd = new GrfDefinitionFinder(ssa.Identifiers); foreach (SsaIdentifier sid in ssa.Identifiers) { var id = sid.OriginalIdentifier as Identifier; if (id == null || !(id.Storage is FlagGroupStorage) || sid.Uses.Count == 0) continue; writer.Write("{0}: ", sid.DefStatement.Instruction); grfd.FindDefiningExpression(sid); string fmt = grfd.IsNegated ? "!{0};" : "{0}"; writer.WriteLine(fmt, grfd.DefiningExpression); } } }
private void PerformTest(FileUnitTester fut) { DataFlowAnalysis dfa = new DataFlowAnalysis(program, 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, proc.CreateBlockDominatorGraph()); SsaState ssa = sst.SsaState; proc.Write(false, fut.TextWriter); fut.TextWriter.WriteLine(); OutParameterTransformer opt = new OutParameterTransformer(proc, ssa.Identifiers); opt.Transform(); DeadCode.Eliminate(proc, ssa); proc.Write(false, fut.TextWriter); fut.TextWriter.WriteLine("===================="); } }
private void Build(Program prog) { DataFlowAnalysis dfa = new DataFlowAnalysis(prog, new FakeDecompilerEventListener()); dfa.UntangleProcedures(); foreach (Procedure proc in prog.Procedures.Values) { Aliases alias = new Aliases(proc, prog.Architecture); alias.Transform(); var gr = proc.CreateBlockDominatorGraph(); SsaTransform sst = new SsaTransform(dfa.ProgramDataFlow, proc, gr); SsaState ssa = sst.SsaState; ConditionCodeEliminator cce = new ConditionCodeEliminator(ssa.Identifiers, prog.Platform); cce.Transform(); DeadCode.Eliminate(proc, ssa); var vp = new ValuePropagator(ssa.Identifiers, proc); 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); } }
protected override void RunTest(Program prog, TextWriter fut) { DataFlowAnalysis dfa = new DataFlowAnalysis(prog, new FakeDecompilerEventListener()); dfa.UntangleProcedures(); foreach (Procedure proc in prog.Procedures.Values) { Aliases alias = new Aliases(proc, prog.Architecture); alias.Transform(); SsaTransform sst = new SsaTransform(dfa.ProgramDataFlow, proc, proc.CreateBlockDominatorGraph()); SsaState ssa = sst.SsaState; ConditionCodeEliminator cce = new ConditionCodeEliminator(ssa.Identifiers, prog.Platform); cce.Transform(); DeadCode.Eliminate(proc, ssa); ValuePropagator vp = new ValuePropagator(ssa.Identifiers, proc); vp.Transform(); DeadCode.Eliminate(proc, ssa); Coalescer co = new Coalescer(proc, ssa); co.Transform(); ssa.Write(fut); proc.Write(false, fut); fut.WriteLine(); } }
protected override void RunTest(Program prog, TextWriter writer) { dfa = new DataFlowAnalysis(prog, new FakeDecompilerEventListener()); dfa.UntangleProcedures(); foreach (Procedure proc in prog.Procedures.Values) { ProcedureFlow flow = dfa.ProgramDataFlow[proc]; proc.Signature.Emit(proc.Name, ProcedureSignature.EmitFlags.ArgumentKind, new TextFormatter(writer)); writer.WriteLine(); flow.Emit(prog.Architecture, writer); proc.Write(true, writer); writer.Flush(); } }