Пример #1
0
        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);
            }
        }
Пример #2
0
		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]));
		}
Пример #3
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());
        }
Пример #4
0
		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);
		}
Пример #5
0
		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);
		}
Пример #6
0
		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();
			}
		}
Пример #7
0
        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");
        }
Пример #8
0
        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();
            }
        }
Пример #9
0
		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();
			}
		}
Пример #10
0
        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));
        }
Пример #11
0
        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));
        }
Пример #12
0
        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);
            }
        }