public void BwInvertedCondition() { var ebx = m.Reg32("ebx", 3); var eax = m.Reg32("eax", 0); var CZ = m.Flags("CZ"); m.Assign(CZ, m.Cond(m.ISub(ebx, 0x30))); m.BranchIf(m.Test(ConditionCode.ULE, CZ), "do_switch"); m.Goto("default_case"); m.Label("do_switch"); m.Assign(eax, 0); var block = m.CurrentBlock; var xfer = new RtlGoto(m.Mem32(m.IAdd(Constant.Word32(0x00123400), m.IMul(ebx, 4))), RtlClass.Transfer); m.Label("default_case"); m.Return(); var bw = new Backwalker <Block, Instruction>(host, xfer, expSimp); Assert.IsTrue(bw.CanBackwalk()); var ops = bw.BackWalk(block); Assert.AreEqual(3, ops.Count); Assert.AreEqual("cmp 48", ops[0].ToString()); Assert.AreEqual("branch UGT", ops[1].ToString()); Assert.AreEqual("* 4", ops[2].ToString()); }
public void CfgcJmpToBranch() { var m = new ProcedureBuilder(); var c = m.Temp(PrimitiveType.Bool, "c"); var pfn = m.Temp(PrimitiveType.Ptr32, "pfn"); m.Label("m1"); m.BranchIf(c, "m3"); m.Label("m2"); m.Goto("m3"); m.Label("m3"); m.SideEffect(m.Fn(pfn)); m.Return(); var sExp = #region Expected @"// ProcedureBuilder // Return size: 0 void ProcedureBuilder() ProcedureBuilder_entry: pfn() return // succ: ProcedureBuilder_exit m1: m3: ProcedureBuilder_exit: "; #endregion var cfgc = new ControlFlowGraphCleaner(m.Procedure); cfgc.Transform(); var sw = new StringWriter(); m.Procedure.Write(false, sw); Assert.AreEqual(sExp, sw.ToString()); }
public void Larw_do_not_span_multiple_blocks() { var sExp = #region Expected @"l1: ax_2 = Mem0[0x0210<p16>:word16] dx_3 = Mem0[0x0212<p16>:word16] ax_4 = ax_2 + Mem0[0x0220<p16>:word16] SCZ_5 = cond(ax_4) C_6 = SLICE(SCZ_5, bool, 2) (alias) "; #endregion RunTest(sExp, m => { m.Assign(ax, m.Mem16(m.Ptr16(0x210))); block = m.Block; m.Assign(dx, m.Mem16(m.Ptr16(0x212))); m.Assign(ax, m.IAdd(ax, m.Mem16(m.Ptr16(0x0220)))); m.Assign(this.SCZ, m.Cond(ax)); m.Goto("m2"); m.Label("m2"); m.Assign(dx, m.IAdd(m.IAdd(dx, m.Mem16(m.Ptr16(0x0222))), this.CF)); }); }
public void StrAnls_Issue_529() { var m = new ProcedureBuilder(); var fp = m.Frame.FramePointer; var sp = m.Frame.EnsureRegister(m.Architecture.StackRegister); var puts = new ExternalProcedure("puts", new FunctionType()); m.Label("m4E2"); m.Goto("m4F7"); m.Label("m4E4"); m.SideEffect(m.Fn(puts, Constant.String("Hello", StringType.NullTerminated(PrimitiveType.Byte)))); m.Return(); m.Label("m4F7"); m.BranchIf(m.Eq0(m.Mem32(m.Word32(0x0808A0A4))), "m502"); m.Label("m500"); m.Goto("m50D"); m.Label("m502"); m.BranchIf(m.Eq0(m.Mem32(m.Word32(0x0808A0A8))), "m4E4"); m.Goto("m50D"); m.Label("m50D"); m.SideEffect(m.Fn(puts, Constant.String("Goodbye", StringType.NullTerminated(PrimitiveType.Byte)))); m.Goto("m4E4"); var sExp = #region Expected @" if (Mem0[0x0808A0A4:word32] != 0x00 || Mem0[0x0808A0A8:word32] != 0x00) puts(""Goodbye""); puts(""Hello""); return; "; #endregion Given_CompoundConditionCoalescer(m.Procedure); RunTest(sExp, m.Procedure); }
private Procedure BuildSimpleLoop() { ProcedureBuilder m = new ProcedureBuilder(); Identifier p = m.Local32("p"); m.Assign(p, 0); m.Label("loop"); m.BranchIf(m.Eq(p, 0x4000), "done"); m.MStore(m.IAdd(p, 0x3000), m.Int32(0)); m.Assign(p, m.IAdd(p, 4)); m.Goto("loop"); m.Label("done"); m.Return(); return(m.Procedure); }
public void ProcStr_IfThenElse() { var r1 = m.Reg32("r1"); m.Label("head"); m.BranchIf(m.Le(r1, 0), "thenn"); m.Label("elsee"); m.Assign(r1, 0); m.Goto("tail"); m.Label("thenn"); m.Assign(r1, 1); m.Label("tail"); m.Return(r1); var sExp = @" if (r1 > 0x00) r1 = 0x00; else r1 = 0x01; return r1; "; RunTest(sExp, m.Procedure); }
public void CceMultibitCcFromPhiNode() { var sExp = #region Expected @"// ProcedureBuilder // Return size: 0 define ProcedureBuilder ProcedureBuilder_entry: def r0 def r2 // succ: l1 l1: branch r0 <= r2 m1 // succ: m0 m1 m0: r0_5 = r0 + r2 v12_18 = r0_5 == 0<32> v9_15 = r0_5 <=u 0<32> v6_12 = r0_5 >u 0<32> goto m2 // succ: m2 m1: r0_3 = r2 - r0 v13_19 = r0_3 == 0<32> v10_16 = r0_3 <=u 0<32> v7_13 = r0_3 >u 0<32> // succ: m2 m2: v11_17 = PHI((v9_15, m0), (v10_16, m1)) v8_14 = PHI((v6_12, m0), (v7_13, m1)) v14_20 = PHI((v12_18, m0), (v13_19, m1)) Mem8[0x123400<32>:int8] = CONVERT(v8_14, bool, int8) Mem9[0x123402<32>:int8] = CONVERT(v11_17, bool, int8) Mem11[0x123404<32>:int8] = CONVERT(v14_20, bool, int8) return // succ: ProcedureBuilder_exit ProcedureBuilder_exit: "; #endregion RunStringTest(sExp, m => { var r0 = m.Reg32("r0", 0); var r2 = m.Reg32("r2", 2); var CZ = m.Flags("CZ"); var Z = m.Flags("Z"); m.BranchIf(m.Le(r0, r2), "m1"); m.Label("m0"); m.Assign(r0, m.IAdd(r0, r2)); m.Assign(CZ, m.Cond(r0)); m.Goto("m2"); m.Label("m1"); m.Assign(r0, m.ISub(r2, r0)); m.Assign(CZ, m.Cond(r0)); m.Label("m2"); //m.Assign(tmp, m.Convert(m.Test(ConditionCode.UGT, CZ), PrimitiveType.Bool, PrimitiveType.SByte)); m.MStore(m.Word32(0x00123400), m.Convert(m.Test(ConditionCode.UGT, CZ), PrimitiveType.Bool, PrimitiveType.SByte)); m.MStore(m.Word32(0x00123402), m.Convert(m.Test(ConditionCode.ULE, CZ), PrimitiveType.Bool, PrimitiveType.SByte)); m.MStore(m.Word32(0x00123404), m.Convert(m.Test(ConditionCode.EQ, Z), PrimitiveType.Bool, PrimitiveType.SByte)); m.Return(); }); }
public void StrAnls_DoNoCleanProcedureCall() { m.Label("head"); m.BranchIf(m.Fn("someCheck"), "failed"); m.Goto("exit"); m.Label("failed"); m.Label("exit"); m.Return(); var sExp = @" someCheck(); return; "; RunTest(sExp, m.Procedure); }