private void Build(Program program) { var eventListener = new FakeDecompilerEventListener(); var sc = new ServiceContainer(); sc.AddService <DecompilerEventListener>(eventListener); var dfa = new DataFlowAnalysis(program, null, sc); var ssts = dfa.UntangleProcedures(); foreach (Procedure proc in program.Procedures.Values) { var sst = ssts.Single(s => s.SsaState.Procedure == proc); var ssa = sst.SsaState; Coalescer coa = new Coalescer(ssa); coa.Transform(); DeadCode.Eliminate(ssa); LiveCopyInserter lci = new LiveCopyInserter(ssa); lci.Transform(); WebBuilder web = new WebBuilder(program, ssa, new Dictionary <Identifier, LinearInductionVariable>(), eventListener); web.Transform(); ssa.ConvertBack(false); } }
public void LciFindCopyslots() { Build(new LiveLoopMock().Procedure, MkArch()); var lci = new LiveCopyInserter(ssa); Assert.AreEqual(2, lci.IndexOfInsertedCopy(proc.ControlGraph.Blocks[0])); Assert.AreEqual(0, lci.IndexOfInsertedCopy(proc.ControlGraph.Blocks[2].Succ[0])); Assert.AreEqual(0, lci.IndexOfInsertedCopy(proc.ControlGraph.Blocks[2].Succ[0].Succ[0])); }
public void LciRenameDominatedIdentifiers() { Build(new LiveLoopMock().Procedure, new FakeArchitecture()); var lci = new LiveCopyInserter(proc, ssaIds); var i_1 = ssaIds.Where(s => s.Identifier.Name == "i_1").Single(); var idNew = lci.InsertAssignmentNewId(i_1.Identifier, proc.ControlGraph.Blocks[2], 2); lci.RenameDominatedIdentifiers(i_1, ssaIds[idNew]); Assert.AreEqual("return i_5", proc.ControlGraph.Blocks[2].ElseBlock.Statements[0].Instruction.ToString()); }
public void LciInsertAssignmentLiveLoop() { Build(new LiveLoopMock().Procedure, MkArch()); var lci = new LiveCopyInserter(ssa); var i_3 = ssaIds.Where(s => s.Identifier.Name == "i_3").Single(); var idNew = lci.InsertAssignmentNewId(i_3.Identifier, proc.ControlGraph.Blocks[2], 2); Assert.AreEqual("i_7 = i_3", proc.ControlGraph.Blocks[2].Statements[2].Instruction.ToString()); Assert.AreSame(proc.ControlGraph.Blocks[2].Statements[2], ssaIds[idNew].DefStatement); }
public void LciInsertAssignmentCopy() { Build(new LiveCopyMock().Procedure, MkArch()); var lci = new LiveCopyInserter(ssa); int i = lci.IndexOfInsertedCopy(proc.ControlGraph.Blocks[2]); Assert.AreEqual(i, 0); var idNew = lci.InsertAssignmentNewId(ssaIds.Where(s => s.Identifier.Name == "reg").Single().Identifier, proc.ControlGraph.Blocks[2], i); Assert.AreEqual("reg_6 = reg", proc.ControlGraph.Blocks[2].Statements[0].Instruction.ToString()); Assert.AreSame(proc.ControlGraph.Blocks[2].Statements[0], ssaIds[idNew].DefStatement); }
public void LciLiveCopy() { Build(new LiveCopyMock().Procedure, MkArch()); LiveCopyInserter lci = new LiveCopyInserter(ssa); lci.Transform(); using (FileUnitTester fut = new FileUnitTester("Analysis/LciLiveCopy.txt")) { proc.Write(false, fut.TextWriter); fut.AssertFilesEqual(); } }
public void LciLiveAtLoop() { Build(new LiveLoopMock().Procedure, new FakeArchitecture()); var lci = new LiveCopyInserter(proc, ssaIds); var i = ssaIds.Where(s => s.Identifier.Name == "i").Single().Identifier; var i_3 = ssaIds.Where(s => s.Identifier.Name == "i_3").Single().Identifier; var loopHdr = proc.ControlGraph.Blocks[2]; Assert.IsFalse(lci.IsLiveAtCopyPoint(i, loopHdr)); Assert.IsTrue(lci.IsLiveAtCopyPoint(i_3, loopHdr), "i_3 should be live"); }
public void LciLiveLoop() { Build(new LiveLoopMock().Procedure, new FakeArchitecture()); LiveCopyInserter lci = new LiveCopyInserter(proc, ssaIds); lci.Transform(); using (FileUnitTester fut = new FileUnitTester("Analysis/LciLiveLoop.txt")) { proc.Write(false, fut.TextWriter); fut.AssertFilesEqual(); } }
protected void RunTest(string sourceFile, string outputFile) { Program program = RewriteFile(sourceFile); Build(program.Procedures.Values[0], program.Architecture); LiveCopyInserter lci = new LiveCopyInserter(ssa); lci.Transform(); using (FileUnitTester fut = new FileUnitTester(outputFile)) { proc.Write(false, fut.TextWriter); fut.AssertFilesEqual(); } }
public void LciLiveAtCopy() { Build(new LiveCopyMock().Procedure, new FakeArchitecture()); var lci = new LiveCopyInserter(proc, ssaIds); var reg = ssaIds.Where(s => s.Identifier.Name == "reg").Single(); var reg_5 = ssaIds.Where(s => s.Identifier.Name == "reg_2").Single(); var reg_6 = ssaIds.Where(s => s.Identifier.Name == "reg_3").Single(); Assert.AreEqual("reg_2 = PHI(reg, reg_3)", reg_5.DefStatement.Instruction.ToString()); Assert.IsTrue(lci.IsLiveOut(reg.Identifier, reg_5.DefStatement)); }
public void LciLiveAtCopy() { Build(new LiveCopyMock().Procedure, new FakeArchitecture()); var lci = new LiveCopyInserter(ssa); var reg = ssaIds.Where(s => s.Identifier.Name == "reg").Single(); var reg_3 = ssaIds.Where(s => s.Identifier.Name == "reg_3").Single(); var reg_4 = ssaIds.Where(s => s.Identifier.Name == "reg_4").Single(); ssa.Dump(true); Assert.AreEqual("reg_4 = PHI((reg, l1), (reg_3, l2))", reg_4.DefStatement.Instruction.ToString()); Assert.IsTrue(lci.IsLiveOut(reg.Identifier, reg_4.DefStatement)); }
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); } }