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()); }
public ValuePropagator(SsaIdentifierCollection ssaIds, Procedure proc) { this.ssaIds = ssaIds; this.proc = proc; this.evalCtx = new SsaEvaluationContext(ssaIds); this.eval = new ExpressionSimplifier(evalCtx); }
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; }
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); }
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()); }
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; }
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); }