Ejemplo n.º 1
0
        protected override void RunTest(Program program, TextWriter writer)
        {
            var listener = new FakeDecompilerEventListener();
            var sc       = new ServiceContainer();

            sc.AddService <DecompilerEventListener>(listener);
            DataFlowAnalysis dfa = new DataFlowAnalysis(program, dynamicLinker.Object, sc);
            var ssts             = dfa.UntangleProcedures();

            foreach (var sst in ssts)
            {
                SsaState ssa = sst.SsaState;
                ConditionCodeEliminator cce = new ConditionCodeEliminator(program, ssa, listener);
                cce.Transform();

                DeadCode.Eliminate(ssa);
                ssa.Write(writer);
                ssa.Validate(s => writer.WriteLine("*** SSA state invalid: {0}", s));
                ssa.Procedure.Write(false, writer);
            }
        }
Ejemplo n.º 2
0
		private void Build(Procedure proc, IProcessorArchitecture arch)
		{
            var platform = new DefaultPlatform(null, arch);
            var program = new Program()
            {
                Architecture = arch,
                Platform = platform,
            };
            this.proc = proc;
            var dynamicLinker = new Mock<IDynamicLinker>().Object;
			var gr = proc.CreateBlockDominatorGraph();
            SsaTransform sst = new SsaTransform(
                program,
                proc,
                new HashSet<Procedure>(),
                null,
                new ProgramDataFlow());
            sst.Transform();
            this.ssa = sst.SsaState;
			this.ssaIds = ssa.Identifiers;

            var listener = new FakeDecompilerEventListener();
			ConditionCodeEliminator cce = new ConditionCodeEliminator(program, ssa, listener);
			cce.Transform();
			DeadCode.Eliminate(ssa);

            var segmentMap = new SegmentMap(Address.Ptr32(0x00400000));
            ValuePropagator vp = new ValuePropagator(
                segmentMap,
                ssa,
                program.CallGraph,
                null,
                listener);
			vp.Transform();

			Coalescer coa = new Coalescer(ssa);
			coa.Transform();

			DeadCode.Eliminate(ssa);
		}
Ejemplo n.º 3
0
        private void Prepare(Procedure proc)
        {
            this.proc = proc;
            doms      = proc.CreateBlockDominatorGraph();
            SsaTransform sst = new SsaTransform(new ProgramDataFlow(), proc, doms);
            SsaState     ssa = sst.SsaState;

            ssaIds = ssa.Identifiers;

            var arch = new FakeArchitecture();
            var cce  = new ConditionCodeEliminator(ssaIds, new DefaultPlatform(null, arch));

            cce.Transform();

            DeadCode.Eliminate(proc, ssa);

            var vp = new ValuePropagator(arch, ssa.Identifiers, proc);

            vp.Transform();

            DeadCode.Eliminate(proc, ssa);
        }
Ejemplo n.º 4
0
        private void Build(Procedure proc, IProcessorArchitecture arch)
        {
            var platform = new DefaultPlatform(null, arch);
            var program  = new Program()
            {
                Architecture = arch,
                Platform     = platform,
            };

            this.proc = proc;
            var dynamicLinker = new Mock <IDynamicLinker>().Object;
            var listener      = new FakeDecompilerEventListener();
            var sst           = new SsaTransform(
                program,
                proc,
                new HashSet <Procedure>(),
                dynamicLinker,
                new ProgramDataFlow());

            sst.Transform();
            ssa = sst.SsaState;
            ConditionCodeEliminator cce = new ConditionCodeEliminator(ssa, platform, listener);

            cce.Transform();
            var             segmentMap = new SegmentMap(Address.Ptr32(0x00123400));
            ValuePropagator vp         = new ValuePropagator(segmentMap, ssa, program.CallGraph, dynamicLinker, listener);

            vp.Transform();
            DeadCode.Eliminate(ssa);
            Coalescer coa = new Coalescer(ssa);

            coa.Transform();
            DeadCode.Eliminate(ssa);

            sla  = new SsaLivenessAnalysis(ssa);
            sla2 = new SsaLivenessAnalysis2(ssa);
            sla2.Analyze();
        }
Ejemplo n.º 5
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);
            }
        }
Ejemplo n.º 6
0
        private void Build(Procedure proc, IProcessorArchitecture arch)
        {
            var platform = new DefaultPlatform(null, arch);

            this.proc = proc;
            var importResolver = MockRepository.GenerateStub <IImportResolver>();

            importResolver.Replay();
            Aliases alias = new Aliases(proc);

            alias.Transform();
            var          gr  = proc.CreateBlockDominatorGraph();
            SsaTransform sst = new SsaTransform(
                new ProgramDataFlow(),
                proc,
                null,
                gr,
                new HashSet <RegisterStorage>());
            SsaState ssa = sst.SsaState;

            this.ssaIds = ssa.Identifiers;

            ConditionCodeEliminator cce = new ConditionCodeEliminator(ssa, platform);

            cce.Transform();
            DeadCode.Eliminate(proc, ssa);

            var             segmentMap = new SegmentMap(Address.Ptr32(0x00400000));
            ValuePropagator vp         = new ValuePropagator(segmentMap, ssa, new FakeDecompilerEventListener());

            vp.Transform();

            Coalescer coa = new Coalescer(proc, ssa);

            coa.Transform();

            DeadCode.Eliminate(proc, ssa);
        }
Ejemplo n.º 7
0
        public void CceEqId()
        {
            Identifier r = Reg32("r");
            Identifier z = FlagGroup("z");  // is a condition code.
            Identifier y = FlagGroup("y");  // is a condition code.

            ProcedureBuilder m = new ProcedureBuilder();

            m.Assign(z, new ConditionOf(r));
            ssaIds[z].DefStatement = m.Block.Statements.Last;
            m.Assign(y, z);
            ssaIds[y].DefStatement = m.Block.Statements.Last;
            ssaIds[z].Uses.Add(m.Block.Statements.Last);
            var stmBr = m.BranchIf(m.Test(ConditionCode.EQ, y), "foo");

            ssaIds[y].Uses.Add(stmBr);

            var arch = new FakeArchitecture();
            var cce  = new ConditionCodeEliminator(ssaIds, new DefaultPlatform(null, arch));

            cce.Transform();
            Assert.AreEqual("branch r == 0x00000000 foo", stmBr.Instruction.ToString());
        }
Ejemplo n.º 8
0
        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);
            }
        }
        private void RunSsaTest(string sExpected, Action <SsaProcedureBuilder> generateCode)
        {
            var ssapb = new SsaProcedureBuilder();

            generateCode(ssapb);
            var program = new Program
            {
                Platform = platform,
            };
            var cce = new ConditionCodeEliminator(program, ssapb.Ssa, new FakeDecompilerEventListener());

            cce.Transform();
            var writer = new StringWriter();

            ssapb.Ssa.Procedure.WriteBody(true, writer);
            var sActual = writer.ToString();

            if (sActual != sExpected)
            {
                Console.WriteLine(sActual);
                Assert.AreEqual(sExpected, sActual);
            }
            ssapb.Ssa.Validate(s => { ssapb.Ssa.Dump(true); Assert.Fail(s); });
        }
Ejemplo n.º 10
0
 private void Given_ConditionCodeEliminator()
 {
     cce = new ConditionCodeEliminator(ssaState, new DefaultPlatform(null, new FakeArchitecture()));
 }
Ejemplo n.º 11
0
 private void Given_ConditionCodeEliminator()
 {
     cce = new ConditionCodeEliminator(ssaState, new DefaultPlatform(null, new FakeArchitecture()), new FakeDecompilerEventListener());
 }