public void LciFindCopyslots() { Build(new LiveLoopMock().Procedure, new FakeArchitecture()); var lci = new LiveCopyInserter(proc, ssaIds); 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 LciInsertAssignmentCopy() { Build(new LiveCopyMock().Procedure, new FakeArchitecture()); var lci = new LiveCopyInserter(proc, ssaIds); 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_4 = reg", proc.ControlGraph.Blocks[2].Statements[0].Instruction.ToString()); Assert.AreSame(proc.ControlGraph.Blocks[2].Statements[0], ssaIds[idNew].DefStatement); }
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 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 LciInsertAssignmentLiveLoop() { Build(new LiveLoopMock().Procedure, new FakeArchitecture()); var lci = new LiveCopyInserter(proc, ssaIds); var i_4 = ssaIds.Where(s => s.Identifier.Name == "i_1").Single(); var idNew = lci.InsertAssignmentNewId(i_4.Identifier, proc.ControlGraph.Blocks[2], 2); Assert.AreEqual("i_5 = i_1", proc.ControlGraph.Blocks[2].Statements[2].Instruction.ToString()); Assert.AreSame(proc.ControlGraph.Blocks[2].Statements[2], ssaIds[idNew].DefStatement); }
protected new void RunTest(string sourceFile, string outputFile) { Program prog = RewriteFile(sourceFile); Build(prog.Procedures.Values[0], prog.Architecture); LiveCopyInserter lci = new LiveCopyInserter(proc, ssaIds); lci.Transform(); using (FileUnitTester fut = new FileUnitTester(outputFile)) { proc.Write(false, fut.TextWriter); fut.AssertFilesEqual(); } }
public void LciLiveCopy() { Build(new LiveCopyMock().Procedure, new FakeArchitecture()); LiveCopyInserter lci = new LiveCopyInserter(proc, ssaIds); lci.Transform(); using (FileUnitTester fut = new FileUnitTester("Analysis/LciLiveCopy.txt")) { proc.Write(false, fut.TextWriter); fut.AssertFilesEqual(); } }
public void LciRenameDominatedIdentifiers() { Build(new LiveLoopMock().Procedure, new FakeArchitecture()); var lci = new LiveCopyInserter(proc, ssaIds); proc.ControlGraph.Blocks[1].Dump(); 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()); }
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); } }