Ejemplo n.º 1
0
        protected override void RunTest(Program program, TextWriter fut)
        {
            IDynamicLinker   dynamicLinker = null;
            var              listener      = sc.RequireService <DecompilerEventListener>();
            DataFlowAnalysis dfa           = new DataFlowAnalysis(program, dynamicLinker, sc);
            var              ssts          = dfa.UntangleProcedures();

            foreach (Procedure proc in program.Procedures.Values)
            {
                var      sst = ssts.Single(s => s.SsaState.Procedure == proc);
                SsaState ssa = sst.SsaState;

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

                ValuePropagator vp = new ValuePropagator(program.SegmentMap, ssa, program.CallGraph, dynamicLinker, listener);
                vp.Transform();
                DeadCode.Eliminate(ssa);
                Coalescer co = new Coalescer(ssa);
                co.Transform();

                ssa.Write(fut);
                proc.Write(false, fut);
                fut.WriteLine();

                ssa.Validate(s => { ssa.Dump(true); Assert.Fail(s); });
            }
        }
Ejemplo n.º 2
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);
            }
        }
Ejemplo n.º 3
0
        public void RunCoalescer()
        {
            var co = new Coalescer(m.Ssa);

            co.Transform();
            m.Ssa.Validate(s => Assert.Fail(s));
        }
Ejemplo n.º 4
0
        protected override void RunTest(Program program, TextWriter fut)
        {
            IImportResolver  importResolver = null;
            var              listener       = new FakeDecompilerEventListener();
            DataFlowAnalysis dfa            = new DataFlowAnalysis(program, importResolver, listener);

            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;

                ConditionCodeEliminator cce = new ConditionCodeEliminator(ssa, program.Platform);
                cce.Transform();
                DeadCode.Eliminate(proc, ssa);

                ValuePropagator vp = new ValuePropagator(program.Architecture, ssa, listener);
                vp.Transform();
                DeadCode.Eliminate(proc, ssa);
                Coalescer co = new Coalescer(proc, ssa);
                co.Transform();

                ssa.Write(fut);
                proc.Write(false, fut);
                fut.WriteLine();

                ssa.CheckUses(s => Assert.Fail(s));
            }
        }
Ejemplo n.º 5
0
        private void Build(Procedure proc, IProcessorArchitecture arch)
        {
            var platform = new DefaultPlatform(null, arch);

            this.proc = proc;
            Aliases alias = new Aliases(proc, arch);

            alias.Transform();
            SsaTransform sst = new SsaTransform(new ProgramDataFlow(), proc, proc.CreateBlockDominatorGraph());

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

            cce.Transform();
            ValuePropagator vp = new ValuePropagator(ssa.Identifiers, proc);

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

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

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

            this.proc = proc;
            Aliases alias = new Aliases(proc);

            alias.Transform();
            var          importResolver = new Mock <IImportResolver>().Object;
            SsaTransform sst            = new SsaTransform(
                new ProgramDataFlow(),
                proc,
                importResolver,
                proc.CreateBlockDominatorGraph(),
                new HashSet <RegisterStorage>());

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

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

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

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

            sla  = new SsaLivenessAnalysis(proc, ssa.Identifiers);
            sla2 = new SsaLivenessAnalysis2(proc, ssa.Identifiers);
            sla2.Analyze();
        }
Ejemplo n.º 8
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(ssa, platform, 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.º 9
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.º 10
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.º 11
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.º 12
0
        public void TestCoalescer_RampantNullness(DatabaseType type, bool useCustomNamer)
        {
            var db = GetCleanedServer(type, "TestCoalescer");

            int batchCount = 1000;

            DataTable dt = new DataTable("TestCoalescer_RampantNullness");

            dt.Columns.Add("pk");
            dt.Columns.Add("f1");
            dt.Columns.Add("f2");
            dt.Columns.Add("f3");
            dt.Columns.Add("f4");

            Random r = new Random();

            for (int i = 0; i < batchCount; i++)
            {
                int randInt          = r.Next(250);
                int randCompleteness = r.Next(4);

                dt.Rows.Add(new object[] { randInt, randInt, randInt, randInt, randInt });
                dt.Rows.Add(new object[] { randInt, DBNull.Value, DBNull.Value, DBNull.Value, randInt });
                dt.Rows.Add(new object[] { randInt, DBNull.Value, DBNull.Value, randInt, DBNull.Value });
                dt.Rows.Add(new object[] { randInt, DBNull.Value, DBNull.Value, randInt, randInt });

                if (randCompleteness >= 1)
                {
                    dt.Rows.Add(new object[] { randInt, DBNull.Value, randInt, DBNull.Value, DBNull.Value });
                    dt.Rows.Add(new object[] { randInt, DBNull.Value, randInt, DBNull.Value, randInt });
                    dt.Rows.Add(new object[] { randInt, DBNull.Value, randInt, randInt, DBNull.Value });
                    dt.Rows.Add(new object[] { randInt, DBNull.Value, randInt, randInt, randInt });
                }

                if (randCompleteness >= 2)
                {
                    dt.Rows.Add(new object[] { randInt, randInt, DBNull.Value, DBNull.Value, DBNull.Value });
                    dt.Rows.Add(new object[] { randInt, randInt, DBNull.Value, DBNull.Value, randInt });
                    dt.Rows.Add(new object[] { randInt, randInt, DBNull.Value, randInt, DBNull.Value });
                    dt.Rows.Add(new object[] { randInt, randInt, DBNull.Value, randInt, randInt });
                }


                if (randCompleteness >= 3)
                {
                    dt.Rows.Add(new object[] { randInt, randInt, randInt, DBNull.Value, DBNull.Value });
                    dt.Rows.Add(new object[] { randInt, randInt, randInt, DBNull.Value, randInt });
                    dt.Rows.Add(new object[] { randInt, randInt, randInt, randInt, DBNull.Value });
                    dt.Rows.Add(new object[] { randInt, DBNull.Value, DBNull.Value, DBNull.Value, DBNull.Value });
                }
            }

            var tbl = db.CreateTable(dt.TableName, dt);

            var importer = new TableInfoImporter(CatalogueRepository, tbl);

            importer.DoImport(out var tableInfo, out var colInfos);

            //lie about what hte primary key is because this component is designed to run in the RAW environment and we are simulating a LIVE TableInfo (correctly)
            var pk = colInfos.Single(c => c.GetRuntimeName().Equals("pk"));

            pk.IsPrimaryKey = true;
            pk.SaveToDatabase();

            INameDatabasesAndTablesDuringLoads namer = null;

            if (useCustomNamer)
            {
                tbl.Rename("AAAA");
                namer = RdmpMockFactory.Mock_INameDatabasesAndTablesDuringLoads(db, "AAAA");
            }

            HICDatabaseConfiguration configuration = new HICDatabaseConfiguration(db.Server, namer);

            var coalescer = new Coalescer();

            coalescer.TableRegexPattern = new Regex(".*");
            coalescer.CreateIndex       = true;
            coalescer.Initialize(db, LoadStage.AdjustRaw);


            var job = new ThrowImmediatelyDataLoadJob(configuration, tableInfo);

            coalescer.Mutilate(job);

            var dt2 = tbl.GetDataTable();

            foreach (DataRow row in dt2.Rows)
            {
                Assert.AreNotEqual(DBNull.Value, row["f1"]);
                Assert.AreNotEqual(DBNull.Value, row["f2"]);
                Assert.AreNotEqual(DBNull.Value, row["f3"]);
                Assert.AreNotEqual(DBNull.Value, row["f4"]);
            }

            db.Drop();
        }