public void ProcStr_While() { var r1 = m.Reg32("r1"); var r2 = m.Reg32("r2"); m.Label("head"); m.BranchIf(m.Eq(r1, r2), "done"); m.Label("loop"); m.Store(r1, m.LoadDw(r2)); m.Assign(r1, m.IAdd(r1, 4)); m.Assign(r2, m.IAdd(r2, 4)); m.Jump("head"); m.Label("done"); m.Return(r2); var sExp = @" while (r1 != r2) { Mem0[r1:word32] = Mem0[r2:word32]; r1 = r1 + 0x00000004; r2 = r2 + 0x00000004; } return r2; "; RunTest(sExp, m.Procedure); }
public void VpEquality2() { // Makes sure that // y = x - 2 // if (y == 0) ... // doesn't get munged into // y = x - 2 // if (x == 2) Identifier x = Reg32("x"); Identifier y = Reg32("y"); ProcedureBuilder m = new ProcedureBuilder(); var stmX = m.Assign(x, m.LoadDw(Constant.Word32(0x1000300))); ssaIds[x].DefStatement = m.Block.Statements.Last; var stmY = m.Assign(y, m.ISub(x, 2)); ssaIds[y].DefStatement = m.Block.Statements.Last; var stm = m.BranchIf(m.Eq(y, 0), "test"); Assert.AreEqual("x = Mem0[0x01000300:word32]", stmX.ToString()); Assert.AreEqual("y = x - 0x00000002", stmY.ToString()); Assert.AreEqual("branch y == 0x00000000 test", stm.ToString()); var vp = new ValuePropagator(arch, ssaIds, null); vp.Transform(stm); Assert.AreEqual("branch x == 0x00000002 test", stm.Instruction.ToString()); }
/// <summary> /// Mutually recursive functions that jump into each other's bodies. /// </summary> /// <returns></returns> public static Program BuildProgram() { var prog = new ProgramBuilder(); var m = new ProcedureBuilder("even"); var r1 = m.Register(1); m.BranchIf(m.Eq0(r1), "done"); m.Assign(r1, m.ISub(r1, 1)); m.Call("odd", 4); m.Assign(r1, m.Not(r1)); m.Return(); m.Label("done"); m.Assign(r1, true); m.Return(); prog.Add(m); m = new ProcedureBuilder("odd"); r1 = m.Register(1); m.BranchIf(m.Eq(r1, 1), "done"); m.Assign(r1, m.ISub(r1, 1)); m.Call("event", 4); m.Assign(r1, m.Not(r1)); m.Return(); m.Label("done"); m.Assign(r1, true); m.Return(); prog.Add(m); return(prog.BuildProgram()); }
public void Pdg_LoopWithIfElse() { var m = new ProcedureBuilder(); var c = m.Declare(PrimitiveType.Word32, "c"); var f = m.Declare(PrimitiveType.Bool, "f"); m.Label("loopHead"); m.BranchIf(m.Eq(c, 0), "done"); m.BranchIf(f, "then"); m.Label("else"); m.SideEffect(m.Fn("CallElse")); m.Jump("loopHead"); m.Label("then"); m.SideEffect(m.Fn("CallThen")); m.Jump("loopHead"); m.Label("done"); m.Return(); FindPostDominators(m); string sExp = "done (6): idom ProcedureBuilder_exit (7)" + nl + "else (4): idom loopHead (2)" + nl + "l1 (3): idom loopHead (2)" + nl + "loopHead (2): idom done (6)" + nl + "ProcedureBuilder_entry (1): idom loopHead (2)" + nl + "ProcedureBuilder_exit (7): idom " + nl + "then (5): idom loopHead (2)" + nl; Assert.AreEqual(sExp, sw.ToString()); }
public void Exs_ReduceNegComparedToZero() { Given_ExpressionSimplifier(); var expr = m.Eq0(m.Neg(foo)); Assert.AreEqual("-foo_1 == 0<32>", expr.ToString()); Assert.AreEqual("foo_1 == 0<32>", expr.Accept(simplifier).ToString()); expr = m.Eq(m.Word32(0), m.Neg(foo)); Assert.AreEqual("0<32> == -foo_1", expr.ToString()); Assert.AreEqual("foo_1 == 0<32>", expr.Accept(simplifier).ToString()); }
public void Pdg_InfiniteLoop() { ProcedureBuilder m = new ProcedureBuilder(); m.Label("Infinity"); m.BranchIf(m.Eq(m.LoadW(m.Word16(0x1234)), 0), "hop"); m.SideEffect(m.Fn("foo")); m.Label("hop"); m.BranchIf(m.Eq(m.LoadW(m.Word16(0x5123)), 1), "Infinity"); m.SideEffect(m.Fn("bar")); m.Jump("Infinity"); m.Return(); FindPostDominators(m); string sExp = "hop (4): idom ProcedureBuilder_exit (6)" + nl + "Infinity (2): idom hop (4)" + nl + "l1 (3): idom hop (4)" + nl + "l2 (5): idom ProcedureBuilder_exit (6)" + nl + "ProcedureBuilder_entry (1): idom Infinity (2)" + nl + "ProcedureBuilder_exit (6): idom " + nl; Assert.AreEqual(sExp, sw.ToString()); }
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.Store(m.IAdd(p, 0x3000), m.Int32(0)); m.Assign(p, m.IAdd(p, 4)); m.Jump("loop"); m.Label("done"); m.Return(); return(m.Procedure); }
public void StrAnls_While() { var r1 = m.Reg32("r1", 1); var r2 = m.Reg32("r2", 2); m.Label("head"); m.BranchIf(m.Eq(r1, r2), "done"); m.Label("loop"); m.MStore(r1, m.Mem32(r2)); m.Assign(r1, m.IAdd(r1, 4)); m.Assign(r2, m.IAdd(r2, 4)); m.Goto("head"); m.Label("done"); m.Return(r2); var sExp = @" while (r1 != r2) { Mem0[r1:word32] = Mem0[r2:word32]; r1 = r1 + 0x04; r2 = r2 + 0x04; } return r2; "; RunTest(sExp, m.Procedure); }