public void Rl_ProcedureWithTrashedAndPreservedRegisters() { var proc = new Procedure(program.Architecture, "test", program.Architecture.CreateFrame()); var pf = new ProcedureFlow(proc, program.Architecture); mpprocflow[proc] = pf; pf.TrashedRegisters.Add(Registers.eax); pf.TrashedRegisters.Add(Registers.ebx); pf.PreservedRegisters.Add(Registers.ebp); pf.PreservedRegisters.Add(Registers.bp); RegisterLiveness.State st = new RegisterLiveness.ByPassState(program.Architecture); var bf = CreateBlockFlow(proc.ExitBlock, proc.Frame); mpprocflow[proc.ExitBlock] = bf; st.InitializeBlockFlow(proc.ExitBlock, mpprocflow, true); Assert.IsFalse(bf.DataOut.Contains(Registers.ebp), "preserved registers cannot be live out"); Assert.IsFalse(bf.DataOut.Contains(Registers.bp), "preserved registers cannot be live out"); Assert.IsTrue(bf.DataOut.Contains(Registers.eax), "trashed registers may be live out"); Assert.IsTrue(bf.DataOut.Contains(Registers.esi), "Unmentioned registers may be live out"); }
public void Rl_ProcedureWithTrashedAndPreservedRegisters() { Procedure proc = new Procedure("test", prog.Architecture.CreateFrame()); ProcedureFlow pf = new ProcedureFlow(proc, prog.Architecture); mpprocflow[proc] = pf; pf.TrashedRegisters[Registers.eax.Number] = true; pf.TrashedRegisters[Registers.ebx.Number] = true; pf.PreservedRegisters[Registers.ebp.Number] = true; pf.PreservedRegisters[Registers.bp.Number] = true; RegisterLiveness.State st = new RegisterLiveness.ByPassState(); BlockFlow bf = CreateBlockFlow(proc.ExitBlock, proc.Frame); mpprocflow[proc.ExitBlock] = bf; st.InitializeBlockFlow(proc.ExitBlock, mpprocflow, true); Assert.IsFalse(bf.DataOut[Registers.ebp.Number], "preserved registers cannot be live out"); Assert.IsFalse(bf.DataOut[Registers.bp.Number], "preserved registers cannot be live out"); Assert.IsTrue(bf.DataOut[Registers.eax.Number], "trashed registers may be live out"); Assert.IsTrue(bf.DataOut[Registers.esi.Number], "Unmentioned registers may be live out"); }
public void Rl_PredefinedSignature() { Procedure callee = new Procedure(program.Architecture, "callee", null); Identifier edx = new Identifier("edx", PrimitiveType.Word32, Registers.edx); callee.Signature = new FunctionType( new Identifier("eax", PrimitiveType.Word32, Registers.eax), new Identifier[] { new Identifier("ecx", PrimitiveType.Word32, Registers.ecx), new Identifier("arg04", PrimitiveType.Word16, new StackArgumentStorage(4, PrimitiveType.Word16)), new Identifier("edxOut", PrimitiveType.Word32, new OutArgumentStorage(edx)) }); RegisterLiveness.State st = new RegisterLiveness.ByPassState(program.Architecture); BlockFlow bf = CreateBlockFlow(callee.ExitBlock, null); mpprocflow[callee.ExitBlock] = bf; st.InitializeBlockFlow(callee.ExitBlock, mpprocflow, true); Assert.IsTrue(bf.DataOut.Contains(Registers.eax), "eax is a return register"); Assert.IsTrue(bf.DataOut.Contains(Registers.edx), "edx is an out register"); Assert.IsTrue(bf.DataOut.Contains(Registers.ax), "ax is aliased by eax"); Assert.IsFalse(bf.DataOut.Contains(Registers.ecx), "ecx is an in register"); Assert.IsFalse(bf.DataOut.Contains(Registers.esi), "esi is not present in signature"); }
public void Rl_ProcedureWithTrashedAndPreservedRegisters() { var proc = new Procedure("test", program.Architecture.CreateFrame()); var pf = new ProcedureFlow(proc, program.Architecture); mpprocflow[proc] = pf; pf.TrashedRegisters.Add(Registers.eax); pf.TrashedRegisters.Add(Registers.ebx); pf.PreservedRegisters.Add(Registers.ebp); pf.PreservedRegisters.Add(Registers.bp); RegisterLiveness.State st = new RegisterLiveness.ByPassState(program.Architecture); var bf = CreateBlockFlow(proc.ExitBlock, proc.Frame); mpprocflow[proc.ExitBlock] = bf; st.InitializeBlockFlow(proc.ExitBlock, mpprocflow, true); Assert.IsFalse(bf.DataOut.Contains(Registers.ebp), "preserved registers cannot be live out"); Assert.IsFalse(bf.DataOut.Contains(Registers.bp), "preserved registers cannot be live out"); Assert.IsTrue(bf.DataOut.Contains(Registers.eax), "trashed registers may be live out"); Assert.IsTrue(bf.DataOut.Contains(Registers.esi), "Unmentioned registers may be live out"); }
public void Rl_PredefinedSignature() { Procedure callee = new Procedure("callee", null); Identifier edx = new Identifier("edx", PrimitiveType.Word32, Registers.edx); callee.Signature = new ProcedureSignature( new Identifier("eax", PrimitiveType.Word32, Registers.eax), new Identifier[] { new Identifier("ecx", PrimitiveType.Word32, Registers.ecx), new Identifier("arg04", PrimitiveType.Word16, new StackArgumentStorage(4, PrimitiveType.Word16)), new Identifier("edxOut", PrimitiveType.Word32, new OutArgumentStorage(edx))}); RegisterLiveness.State st = new RegisterLiveness.ByPassState(program.Architecture); BlockFlow bf = CreateBlockFlow(callee.ExitBlock, null); mpprocflow[callee.ExitBlock] = bf; st.InitializeBlockFlow(callee.ExitBlock, mpprocflow, true); Assert.IsTrue(bf.DataOut.Contains(Registers.eax),"eax is a return register"); Assert.IsTrue(bf.DataOut.Contains(Registers.edx),"edx is an out register"); Assert.IsTrue(bf.DataOut.Contains(Registers.ax), "ax is aliased by eax"); Assert.IsFalse(bf.DataOut.Contains(Registers.ecx), "ecx is an in register"); Assert.IsFalse(bf.DataOut.Contains(Registers.esi), "esi is not present in signature"); }
public void Rl_ProcedureWithTrashedAndPreservedRegisters() { Procedure proc = new Procedure("test", program.Architecture.CreateFrame()); ProcedureFlow pf = new ProcedureFlow(proc, program.Architecture); mpprocflow[proc] = pf; pf.TrashedRegisters[Registers.eax.Number] = true; pf.TrashedRegisters[Registers.ebx.Number] = true; pf.PreservedRegisters[Registers.ebp.Number] = true; pf.PreservedRegisters[Registers.bp.Number] = true; RegisterLiveness.State st = new RegisterLiveness.ByPassState(); BlockFlow bf = CreateBlockFlow(proc.ExitBlock, proc.Frame); mpprocflow[proc.ExitBlock] = bf; st.InitializeBlockFlow(proc.ExitBlock, mpprocflow, true); Assert.IsFalse(bf.DataOut[Registers.ebp.Number], "preserved registers cannot be live out"); Assert.IsFalse(bf.DataOut[Registers.bp.Number], "preserved registers cannot be live out"); Assert.IsTrue(bf.DataOut[Registers.eax.Number], "trashed registers may be live out"); Assert.IsTrue(bf.DataOut[Registers.esi.Number], "Unmentioned registers may be live out"); }