private void PerformTest(FileUnitTester fut) { 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; 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("===================="); } }
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 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 program, TextWriter writer) { var importResolver = MockRepository.GenerateStub<IImportResolver>(); importResolver.Replay(); var dfa = new DataFlowAnalysis(program, importResolver, 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, importResolver, proc.CreateBlockDominatorGraph(), new HashSet<RegisterStorage>()); 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 Build(Program prog) { var eventListener = new FakeDecompilerEventListener(); DataFlowAnalysis dfa = new DataFlowAnalysis(prog, null, eventListener); 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, null, gr, new HashSet<RegisterStorage>()); SsaState ssa = sst.SsaState; ConditionCodeEliminator cce = new ConditionCodeEliminator(ssa, prog.Platform); cce.Transform(); DeadCode.Eliminate(proc, ssa); var vp = new ValuePropagator(prog.Architecture, ssa); 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 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); } }
protected override void RunTest(Program program, TextWriter writer) { var importResolver = MockRepository.GenerateStub<IImportResolver>(); DataFlowAnalysis dfa = new DataFlowAnalysis(program, importResolver, new FakeDecompilerEventListener()); dfa.UntangleProcedures(); foreach (Procedure proc in program.Procedures.Values) { var larw = new LongAddRewriter(proc, program.Architecture); larw.Transform(); Aliases alias = new Aliases(proc, program.Architecture, 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.Architecture, ssa); vp.Transform(); DeadCode.Eliminate(proc, ssa); ssa.Write(writer); proc.Write(false, writer); writer.WriteLine(); } }
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(); } }
///<summary> /// Determines the signature of the procedures, /// the locations and types of all the values in the program. ///</summary> public virtual void AnalyzeDataFlow() { foreach (var program in project.Programs) { eventListener.ShowStatus("Performing interprocedural analysis."); var dfa = new DataFlowAnalysis(program, eventListener); dfa.UntangleProcedures(); dfa.BuildExpressionTrees(); host.WriteIntermediateCode(program, writer => { EmitProgram(program, dfa, writer); }); } eventListener.ShowStatus("Interprocedural analysis complete."); }
protected override void RunTest(Program program, TextWriter fut) { InitProgram(program); IImportResolver importResolver = null; var eventListener = new FakeDecompilerEventListener(); DataFlowAnalysis dfa = new DataFlowAnalysis( program, importResolver, eventListener); dfa.UntangleProcedures(); foreach (Procedure proc in program.Procedures.Values) { SsaTransform sst = new SsaTransform( dfa.ProgramDataFlow, proc, importResolver, proc.CreateBlockDominatorGraph(), new HashSet<RegisterStorage>()); SsaState ssa = sst.SsaState; var icrw = new IndirectCallRewriter( program, ssa, eventListener); icrw.Rewrite(); ssa.Write(fut); proc.Write(false, fut); fut.WriteLine(); } }
///<summary> /// Determines the signature of the procedures, /// the locations and types of all the values in the program. ///</summary> public virtual void AnalyzeDataFlow() { var eventListener = services.RequireService<DecompilerEventListener>(); foreach (var program in project.Programs) { eventListener.ShowStatus("Performing interprocedural analysis."); var ir = new ImportResolver(project, program, eventListener); var dfa = new DataFlowAnalysis(program, ir, eventListener); dfa.UntangleProcedures(); dfa.BuildExpressionTrees(); host.WriteIntermediateCode(program, writer => { EmitProgram(program, dfa, writer); }); } eventListener.ShowStatus("Interprocedural analysis complete."); }
protected override void RunTest(Program prog, TextWriter writer) { dfa = new DataFlowAnalysis(prog, null, new FakeDecompilerEventListener()); dfa.UntangleProcedures(); foreach (Procedure proc in prog.Procedures.Values) { ProcedureFlow flow = dfa.ProgramDataFlow[proc]; proc.Signature.Emit(proc.Name, FunctionType.EmitFlags.ArgumentKind, new TextFormatter(writer)); writer.WriteLine(); flow.Emit(prog.Architecture, writer); proc.Write(true, writer); writer.Flush(); } }