コード例 #1
0
        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");
        }
コード例 #2
0
        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");
        }
コード例 #3
0
        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");
        }
コード例 #4
0
		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");
		}
コード例 #5
0
		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");
		}
コード例 #6
0
        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");
        }