public void EarInsertFrameReference() { Procedure proc = new Procedure("foo", new Frame(PrimitiveType.Word32)); Block b = new Block(proc, "foo_1"); proc.ControlGraph.AddEdge(proc.EntryBlock, b); proc.ControlGraph.AddEdge(b, proc.ExitBlock); EscapedAccessRewriter ear = new EscapedAccessRewriter(proc); ear.InsertFramePointerAssignment(new Mocks.FakeArchitecture()); Block x = proc.EntryBlock.Succ[0]; Assert.AreEqual(1, x.Statements.Count); Assert.AreEqual("fp = &foo_frame", x.Statements[0].Instruction.ToString()); }
private void RunTest(string sourceFile, Address addr, string outputFile) { Program prog = AssembleFile(sourceFile, addr); using (FileUnitTester fut = new FileUnitTester(outputFile)) { foreach (Procedure proc in prog.Procedures.Values) { fut.TextWriter.WriteLine("= Before =========="); proc.Write(true, fut.TextWriter); if (proc.Frame.Escapes) { fut.TextWriter.WriteLine("The frame of procedure {0} escapes", proc.Name); EscapedAccessRewriter ear = new EscapedAccessRewriter(proc); ear.Transform(); fut.TextWriter.WriteLine("= After =========="); proc.Write(true, fut.TextWriter); } else fut.TextWriter.WriteLine("The frame of procedure {0} doesn't escape", proc.Name); fut.TextWriter.WriteLine(); } fut.AssertFilesEqual(); } }