Пример #1
0
 public void Setup()
 {
     m     = new ProcedureBuilder(arch);
     frame = m.Frame;
     ax    = frame.EnsureRegister(new RegisterStorage("ax", 0, 0, PrimitiveType.Word16));
     bx    = frame.EnsureRegister(new RegisterStorage("bx", 3, 0, PrimitiveType.Word16));
     cx    = frame.EnsureRegister(new RegisterStorage("cx", 1, 0, PrimitiveType.Word16));
     dx    = frame.EnsureRegister(new RegisterStorage("dx", 2, 0, PrimitiveType.Word16));
     flags = new FlagRegister("flags", 4, PrimitiveType.Word16);
     SCZ   = frame.EnsureFlagGroup(flags, 7, "SCZ", PrimitiveType.Byte);
     CF    = frame.EnsureFlagGroup(flags, arch.CarryFlagMask, "C", PrimitiveType.Bool);
     rw    = new LongAddRewriter(m.Procedure, arch);
 }
Пример #2
0
        public void Setup()
        {
            m     = new ProcedureBuilder(arch);
            frame = m.Frame;
            ax    = frame.EnsureRegister(new RegisterStorage("ax", 0, PrimitiveType.Word16));
            bx    = frame.EnsureRegister(new RegisterStorage("bx", 3, PrimitiveType.Word16));
            cx    = frame.EnsureRegister(new RegisterStorage("cx", 1, PrimitiveType.Word16));
            dx    = frame.EnsureRegister(new RegisterStorage("dx", 2, PrimitiveType.Word16));
            SCZ   = frame.EnsureFlagGroup(7, "SCZ", PrimitiveType.Byte);
            CF    = frame.EnsureFlagGroup(arch.CarryFlagMask, "C", PrimitiveType.Bool);
            rw    = new LongAddRewriter(m.Procedure, arch);
            Procedure proc = new Procedure("test", frame);

            block = new Block(proc, "bloke");
        }
Пример #3
0
        protected override void RunTest(Program program, TextWriter writer)
        {
            var dynamicLinker = new Mock <IDynamicLinker>().Object;
            var listener      = new FakeDecompilerEventListener();
            var sc            = new ServiceContainer();

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

            foreach (var proc in program.Procedures.Values)
            {
                var sst = new SsaTransform(
                    program,
                    proc,
                    new HashSet <Procedure>(),
                    dynamicLinker,
                    new ProgramDataFlow());
                var ssa = sst.Transform();

                var larw = new LongAddRewriter(ssa, listener);
                larw.Transform();

                var cce = new ConditionCodeEliminator(program, ssa, listener);
                cce.Transform();
                ssa.Validate(s => { ssa.Dump(true); Assert.Fail(s); });

                var vp = new ValuePropagator(program.SegmentMap, ssa, program.CallGraph, dynamicLinker, listener);
                vp.Transform();
                ssa.Validate(s => { ssa.Dump(true); Assert.Fail(s); });

                sst.RenameFrameAccesses = true;
                sst.Transform();

                ssa.Validate(s => { ssa.Dump(true); Assert.Fail(s); });

                // We don't add uses to exit block on purpose. We
                // are not testing interprocedural effects here.
                DeadCode.Eliminate(ssa);

                ssa.Procedure.Write(false, writer);
                writer.WriteLine();

                ssa.Validate(s => { ssa.Dump(true); Assert.Fail(s); });
            }
        }
Пример #4
0
        protected override void RunTest(Program prog, TextWriter writer)
        {
            var eventListener = new FakeDecompilerEventListener();
            var dfa           = new DataFlowAnalysis(prog, null, eventListener);
            var trf           = new TrashedRegisterFinder(prog, prog.Procedures.Values, dfa.ProgramDataFlow, eventListener);

            trf.Compute();
            trf.RewriteBasicBlocks();
            RegisterLiveness rl = RegisterLiveness.Compute(prog, dfa.ProgramDataFlow, eventListener);

            foreach (Procedure proc in prog.Procedures.Values)
            {
                LongAddRewriter larw = new LongAddRewriter(proc, prog.Architecture);
                larw.Transform();
                proc.Write(false, writer);
                writer.WriteLine();
            }
        }
Пример #5
0
        private void RunTest(Action <ProcedureBuilder> builder)
        {
            builder(m);
            var dynamicLinker = new Mock <IDynamicLinker>();
            var sst           = new SsaTransform(
                program,
                m.Procedure,
                new HashSet <Procedure>(),
                dynamicLinker.Object,
                new ProgramDataFlow());

            sst.Transform();
            sst.RenameFrameAccesses = true;
            sst.Transform();
            sst.AddUsesToExitBlock();
            sst.RemoveDeadSsaIdentifiers();

            rw       = new LongAddRewriter(sst.SsaState, new FakeDecompilerEventListener());
            this.ssa = sst.SsaState;
        }
Пример #6
0
        private void RunTest(Action <ProcedureBuilder> builder)
        {
            builder(m);
            var importResolver = new Mock <IImportResolver>();
            var sst            = new SsaTransform(
                program,
                m.Procedure,
                new HashSet <Procedure>(),
                importResolver.Object,
                new ProgramDataFlow());

            sst.Transform();
            sst.RenameFrameAccesses = true;
            sst.Transform();
            sst.AddUsesToExitBlock();
            sst.RemoveDeadSsaIdentifiers();

            rw       = new LongAddRewriter(sst.SsaState);
            this.ssa = sst.SsaState;
        }