Inheritance: EvaluationContext
        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.Emit(new AliasAssignment(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);
            var rule = new ConstDivisionImplementedByMultiplication(ssa);
            ctx.Statement = proc.EntryBlock.Succ[0].Statements[0];
            Assert.IsTrue(rule.Match(ass));
            ass = rule.TransformInstruction();
            Assert.AreEqual(sExp, ass.Src.ToString());
        }
Exemplo n.º 2
0
 public ValuePropagator(SsaIdentifierCollection ssaIds, Procedure proc)
 {
     this.ssaIds  = ssaIds;
     this.proc    = proc;
     this.evalCtx = new SsaEvaluationContext(ssaIds);
     this.eval    = new ExpressionSimplifier(evalCtx);
 }
Exemplo n.º 3
0
 public ValuePropagator(
     IProcessorArchitecture arch,
     SsaState ssa,
     DecompilerEventListener eventListener)
 {
     this.arch             = arch;
     this.ssa              = ssa;
     this.ssaIdTransformer = new SsaIdentifierTransformer(ssa);
     this.evalCtx          = new SsaEvaluationContext(arch, ssa.Identifiers);
     this.eval             = new ExpressionSimplifier(evalCtx, eventListener);
     this.eventListener    = eventListener;
 }
Exemplo n.º 4
0
 public ValuePropagator(
     SegmentMap segmentMap,
     SsaState ssa,
     DecompilerEventListener eventListener)
 {
     this.ssa              = ssa;
     this.arch             = ssa.Procedure.Architecture;
     this.eventListener    = eventListener;
     this.ssaIdTransformer = new SsaIdentifierTransformer(ssa);
     this.evalCtx          = new SsaEvaluationContext(arch, ssa.Identifiers);
     this.eval             = new ExpressionSimplifier(segmentMap, evalCtx, eventListener);
 }
Exemplo n.º 5
0
        private Statement?stmCur;       //$REFACTOR: try to make this a context paramter.

        public ValuePropagator(
            SegmentMap segmentMap,
            SsaState ssa,
            CallGraph callGraph,
            IDynamicLinker dynamicLinker,
            DecompilerEventListener eventListener)
        {
            this.ssa           = ssa;
            this.callGraph     = callGraph;
            this.arch          = ssa.Procedure.Architecture;
            this.eventListener = eventListener;
            this.ssam          = new SsaMutator(ssa);
            this.evalCtx       = new SsaEvaluationContext(arch, ssa.Identifiers, dynamicLinker);
            this.eval          = new ExpressionSimplifier(segmentMap, evalCtx, eventListener);
        }
        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());
        }
Exemplo n.º 7
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);
 }
 public ConstDivisionImplementedByMultiplication(SsaEvaluationContext ctx)
 {
     this.ctx = ctx;
 }
Exemplo n.º 9
0
 public void SetUp()
 {
     m = new ProcedureBuilder();
     id = m.Local32("id");
     x = m.Local32("x");
     ssaIds = new SsaIdentifierCollection();
     foreach (Identifier i in m.Procedure.Frame.Identifiers)
     {
         ssaIds.Add(i, null, null, false);
     }
     ctx = new SsaEvaluationContext(ssaIds);
 }