Example #1
0
        private ExpressionSimplifier CreatePropagatorWithDummyStatement()
        {
            var ctx = new SsaEvaluationContext(arch, ssaIds);

            ctx.Statement = new Statement(0, new SideEffect(Constant.Word32(32)), null);
            return(new ExpressionSimplifier(ctx));
        }
Example #2
0
        private ExpressionSimplifier CreatePropagatorWithDummyStatement()
        {
            var ctx = new SsaEvaluationContext(arch.Object, m.Ssa.Identifiers, dynamicLinker.Object);

            ctx.Statement = new Statement(0, new SideEffect(Constant.Word32(32)), null);
            return(new ExpressionSimplifier(segmentMap, ctx, listener));
        }
Example #3
0
        private void AssertSmallConst(string sExp, int shift, uint mult)
        {
            var m     = new ProcedureBuilder();
            var c     = Constant.Int32((int)mult);
            var r1    = m.Reg32("r1", 1);
            var r2    = m.Reg32("r2", 2);
            var r2_r1 = m.Frame.EnsureSequence(r2.Storage, r1.Storage, PrimitiveType.Word64);

            var ass = m.Assign(r2_r1, m.SMul(r1, c));

            m.Alias(r2, m.Slice(PrimitiveType.Word32, r2_r1, 32));
            if (shift != 0)
            {
                m.Assign(r2, m.Sar(r2, shift));
            }

            var proc = m.Procedure;
            var ssa  = new SsaTransform(
                null,
                proc,
                null,
                proc.CreateBlockDominatorGraph(),
                new HashSet <RegisterStorage>()).Transform();
            var ctx  = new SsaEvaluationContext(null, ssa.Identifiers, null);
            var rule = new ConstDivisionImplementedByMultiplication(ssa);

            ctx.Statement = proc.EntryBlock.Succ[0].Statements[0];
            Assert.IsTrue(rule.Match(ass));
            var instr = rule.TransformInstruction();

            Assert.AreEqual(sExp, instr.Src.ToString());
        }
Example #4
0
        private void Given_ExpressionSimplifier()
        {
            var ssaIds         = BuildSsaIdentifiers();
            var listener       = new FakeDecompilerEventListener();
            var segmentMap     = new SegmentMap(Address.Ptr32(0));
            var importResolver = new Mock <IImportResolver>();
            var ssaCtx         = new SsaEvaluationContext(arch?.Object, ssaIds, importResolver.Object);

            simplifier = new ExpressionSimplifier(segmentMap, ssaCtx, listener);
        }
Example #5
0
 public void SetUp()
 {
     m      = new ProcedureBuilder();
     id     = m.Local32("id");
     x      = m.Local32("x");
     ssaIds = new SsaIdentifierCollection();
     foreach (Identifier i in m.Frame.Identifiers)
     {
         ssaIds.Add(i, null, null, false);
     }
     ctx = new SsaEvaluationContext(null, ssaIds, null);
 }
Example #6
0
        private void Given_ExpressionSimplifier()
        {
            SsaIdentifierCollection ssaIds = BuildSsaIdentifiers();
            var listener       = new FakeDecompilerEventListener();
            var segmentMap     = new SegmentMap(Address.Ptr32(0));
            var importResolver = MockRepository.GenerateStub <IImportResolver>();

            importResolver.Replay();
            var ssaCtx = new SsaEvaluationContext(null, ssaIds, importResolver);

            simplifier = new ExpressionSimplifier(segmentMap, ssaCtx, listener);
        }
        private void AssertSmallConst(string sExp, int shift, uint mult)
        {
            var m     = new ProcedureBuilder();
            var c     = Constant.Int32((int)mult);
            var r1    = m.Reg32("r1", 1);
            var r2    = m.Reg32("r2", 2);
            var r2_r1 = m.Frame.EnsureSequence(PrimitiveType.Word64, r2.Storage, r1.Storage);

            var ass = m.Assign(r2_r1, m.SMul(r1, c));

            m.Alias(r2, m.Slice(PrimitiveType.Word32, r2_r1, 32));
            if (shift != 0)
            {
                m.Assign(r2, m.Sar(r2, shift));
            }
            m.MStore(m.Word32(0x0402000), r2);       // Force use of r2
            m.Return();

            var proc    = m.Procedure;
            var flow    = new ProgramDataFlow();
            var program = new Program()
            {
                Architecture = m.Architecture,
            };
            var sst = new SsaTransform(
                program,
                proc,
                new HashSet <Procedure>(),
                null,
                flow);

            sst.Transform();

            proc.Dump(true);

            var ctx  = new SsaEvaluationContext(m.Architecture, sst.SsaState.Identifiers, null);
            var rule = new ConstDivisionImplementedByMultiplication(sst.SsaState);

            ctx.Statement = proc.EntryBlock.Succ[0].Statements[0];
            Assert.IsTrue(rule.Match(ctx.Statement.Instruction));
            var instr = rule.TransformInstruction();

            Assert.AreEqual(sExp, instr.Src.ToString());
        }
        private void BuildTest(Action <ProcedureBuilder> bld)
        {
            var m = new ProcedureBuilder();

            bld(m);
            var proc    = m.Procedure;
            var flow    = new ProgramDataFlow();
            var program = new Program()
            {
                Architecture = m.Architecture,
            };
            var sst = new SsaTransform(
                program,
                proc,
                new HashSet <Procedure>(),
                null,
                flow);

            this.ssa = sst.Transform();
            this.ctx = new SsaEvaluationContext(m.Architecture, ssa.Identifiers, null);
        }
        public void Cdiv_3()
        {
            /*
             *   eax = ~0x33333332
             * edx_eax = esi *u eax
             * edx = edx >>u 0x03
             */
            var c     = Constant.UInt32(0x55555555);
            var r1    = m.Reg32("r1");
            var r2    = m.Reg32("r2");
            var r2_r1 = m.Frame.EnsureSequence(r2, r1, PrimitiveType.Word64);

            var ass = m.Assign(r2_r1, m.UMul(r1, c));

            var proc = m.Procedure;
            var ssa  = new SsaTransform(null, proc, proc.CreateBlockDominatorGraph()).Transform();
            var ctx  = new SsaEvaluationContext(null, ssa.Identifiers);
            var rule = new ConstDivisionImplementedByMultiplication(ctx);

            //ctx.Statement = proc.EntryBlock.Succ[0].Statements[0];
            //Assert.IsTrue(rule.Match((BinaryExpression) ass.Src));
            //ass.Src = rule.Transform();
            Assert.AreEqual("x = id /u 3", ass.ToString());
        }
 public ConstDivisionImplementedByMultiplication(SsaEvaluationContext ctx)
 {
     this.ctx = ctx;
 }