Пример #1
0
        public void WriteProcedureConstant()
        {
            var proc = new Procedure("proc", new Frame(PrimitiveType.Word32));
            var pc = new ProcedureConstant(PrimitiveType.Word32, proc);
            map.Add(Address.Ptr32(0x42), proc);

            pc.Accept(hcf);

            Assert.AreEqual("<a href=\"00000042\">proc</a>", sb.ToString());
        }
Пример #2
0
 public override void VisitProcedureConstant(ProcedureConstant pc)
 {
     //$REVIEW: this may be very slow, in which case we will need to add an Address 
     // field to the Procedure class.
     foreach (var de in procedureMap)
     {
         if (de.Value == pc.Procedure)
         {
             formatter.WriteHyperlink(pc.Procedure.Name, de.Key.ToString());
             return;
         }
     }
     base.VisitProcedureConstant(pc);
 }
Пример #3
0
		/// <summary>
		/// Rewrites CALL instructions to function applications.
		/// </summary>
		/// <remarks>
		/// Converts an opcode:
		/// <code>
		///   call procExpr 
		/// </code>
		/// to one of:
		/// <code>
		///	 ax = procExpr(bindings);
		///  procEexpr(bindings);
		/// </code>
		/// </remarks>
		/// <param name="proc">Procedure in which the CALL instruction exists</param>
		/// <param name="stm">The particular statement of the call instruction</param>
		/// <param name="call">The actuall CALL instruction.</param>
		/// <returns>True if the conversion was possible, false if the procedure didn't have
		/// a signature yet.</returns>
		public bool RewriteCall(Procedure proc, Statement stm, CallInstruction call)
		{
            var callee = call.Callee as ProcedureConstant;
            if (callee == null)
                return false;          //$REVIEW: what happens with indirect calls?
			var procCallee = callee.Procedure;
			var sigCallee = GetProcedureSignature(procCallee);
			var fn = new ProcedureConstant(Program.Platform.PointerType, procCallee);
            if (sigCallee == null || !sigCallee.ParametersValid)
                return false;

            var ab = new ApplicationBuilder(Program.Architecture, proc.Frame, call.CallSite, fn, sigCallee, true);
			stm.Instruction = ab.CreateInstruction();
            return true;
		}
Пример #4
0
 public void ExtpBind()
 {
     var sig = new ProcedureSignature(
         new Identifier(Registers.ax.Name, PrimitiveType.Word16, Registers.ax),
         new Identifier [] {
             new Identifier(Registers.bx.Name, PrimitiveType.Word16, Registers.bx),
             new Identifier(Registers.cl.Name, PrimitiveType.Byte, Registers.cl) } );
     var ep = new ExternalProcedure("foo", sig);
     Assert.AreEqual("Register word16 foo(Register word16 bx, Register byte cl)", ep.ToString());
     var fn = new ProcedureConstant(PrimitiveType.Pointer32, ep);
     var arch = new FakeArchitecture();
     var frame = arch.CreateFrame();
     var ab = new ApplicationBuilder(new FakeArchitecture(), frame, new CallSite(0, 0), fn, ep.Signature, false);
     var instr = ab.CreateInstruction();
     Assert.AreEqual("ax = foo(bx, cl)", instr.ToString());
 }
Пример #5
0
		public void Creation()
		{
			CallGraph g = new CallGraph();
			Procedure p1 = new Procedure("p1000", null);
			Procedure p2 = new Procedure("p2000", null);
			Procedure p3 = new Procedure("p3000", null);
			Procedure p4 = new Procedure("p4000", null);

            var pc1 = new ProcedureConstant(PrimitiveType.Pointer32, p1);
            var pc2 = new ProcedureConstant(PrimitiveType.Pointer32, p2);
            var pc3 = new ProcedureConstant(PrimitiveType.Pointer32, p3);
            var pc4 = new ProcedureConstant(PrimitiveType.Pointer32, p4);

            Statement s11 = new Statement(0, CreateCall(pc2), p1.EntryBlock);
            Statement s12 = new Statement(0, CreateCall(pc2), p1.EntryBlock);
            Statement s13 = new Statement(0, CreateCall(pc3), p1.EntryBlock);
			p1.EntryBlock.Statements.Add(s11);
			p1.EntryBlock.Statements.Add(s12);
			p1.EntryBlock.Statements.Add(s13);

            Statement s21 = new Statement(0, CreateCall(pc3), p2.EntryBlock);
            Statement s22 = new Statement(0, CreateCall(pc4), p2.EntryBlock);
			p2.EntryBlock.Statements.Add(s21);
			p2.EntryBlock.Statements.Add(s22);

            Statement s31 = new Statement(0, CreateCall(pc4), p3.EntryBlock);
			p3.EntryBlock.Statements.Add(s31);

            Statement s41 = new Statement(0, CreateCall(pc4), p4.EntryBlock);

			g.AddEntryPoint(p1);
			g.AddEdge(s11, p2);
			g.AddEdge(s12, p2);
			g.AddEdge(s13, p3);

			g.AddEdge(s21, p3);
			g.AddEdge(s22, p4);

			g.AddEdge(s31, p4);

			g.AddEdge(s41, p4);		// recursion!

            //$TODO: need Count
//			Assert.IsTrue(g.Callees(p1).Count == 3);
//			Assert.IsTrue(g.CallerStatements(p4).Count == 3);
		}
Пример #6
0
        public void FrBindMixedParameters()
        {
            Frame f = new Frame(PrimitiveType.Word16);
            Identifier ax = f.EnsureRegister(Registers.ax);
            Identifier cx = f.EnsureRegister(Registers.cx);
            int stack = PrimitiveType.Word16.Size;
            Identifier arg1 = f.EnsureStackLocal(-stack, PrimitiveType.Word16);

            ProcedureSignature sig = new ProcedureSignature(
                ax,
                cx,
                new Identifier("arg0", PrimitiveType.Word16, new StackArgumentStorage(0, PrimitiveType.Word16)));

            var cs = new CallSite(stack, 0);
            ProcedureConstant fn = new ProcedureConstant(PrimitiveType.Pointer32, new PseudoProcedure("bar", sig));
            ApplicationBuilder ab = new ApplicationBuilder(arch, f, cs, fn, sig, true);
            Instruction instr = ab.CreateInstruction();
            using (FileUnitTester fut = new FileUnitTester("Core/FrBindMixedParameters.txt"))
            {
                f.Write(fut.TextWriter);
                fut.TextWriter.WriteLine(instr.ToString());
                fut.AssertFilesEqual();
            }
        }
Пример #7
0
 public DataType VisitProcedureConstant(ProcedureConstant pc)
 {
     return(pc.DataType);
 }
Пример #8
0
 public void VisitProcedureConstant(ProcedureConstant pc)
 {
     handler.DataTypeTrait(pc, program.Platform.PointerType);
 }
Пример #9
0
        public void VpReusedRegistersAtCall()
        {
            var sExp =
                #region Expected
                @"r2_1: orig: r2
    def:  r2_1 = Mem4[0x220200<32>:word32]
    uses: r4_1 = r2_1
          callee(r2_1)
r2_2: orig: r2
    def:  r2_2 = callee
r4_1: orig: r4
    def:  r4_1 = r2_1
r25_1: orig: r25
    def:  r25_1 = callee
Mem4: orig: Mem0
    uses: r2_1 = Mem4[0x220200<32>:word32]
Mem5: orig: Mem0
// SsaProcedureBuilder
// Return size: 0
define SsaProcedureBuilder
SsaProcedureBuilder_entry:
	// succ:  l1
l1:
	r2_1 = Mem4[0x220200<32>:word32]
	r4_1 = r2_1
	r2_2 = callee
	r25_1 = callee
	callee(r2_1)
	return
	// succ:  SsaProcedureBuilder_exit
SsaProcedureBuilder_exit:
";

            #endregion

            var uAddrGotSlot = m.Word32(0x0040000);
            var reg2         = new RegisterStorage("r2", 2, 0, PrimitiveType.Word32);
            var reg4         = new RegisterStorage("r4", 4, 0, PrimitiveType.Word32);
            var reg25        = new RegisterStorage("r25", 25, 0, PrimitiveType.Word32);
            var r2_1         = m.Reg("r2_1", reg2);
            var r2_2         = m.Reg("r2_2", reg2);
            var r4_1         = m.Reg("r4_1", reg4);
            var r25_1        = m.Reg("r25_1", reg25);
            m.Assign(r2_1, m.Mem32(m.Word32(0x0220200))); // fetch a string pointer perhaps
            m.Assign(r4_1, r2_1);
            m.Assign(r2_2, m.Mem32(uAddrGotSlot));        // pointer to a function in a lookup table.
            m.Assign(r25_1, r2_2);
            var stmCall = m.Call(r25_1, 0,
                                 new Identifier[] { r4_1, r2_2 },
                                 new Identifier[] { });
            m.Return();

            // Initially we don't know what r2_2 is pointing to.
            var vp = new ValuePropagator(segmentMap, m.Ssa, program.CallGraph, dynamicLinker.Object, listener);
            vp.Transform();

            // Later, Reko discovers information about the pointer in 0x400000<32>!

            var sigCallee = FunctionType.Action(
                new Identifier("r4", PrimitiveType.Word64, reg4));
            var callee = new ProcedureConstant(
                PrimitiveType.Ptr32,
                new ExternalProcedure("callee", sigCallee));
            // Add our new found knowledge to the import resolver.
            dynamicLinker.Setup(i => i.ResolveToImportedValue(
                                    It.IsNotNull <Statement>(),
                                    uAddrGotSlot)).
            Returns(callee);

            // Run Value propagation again with the newly gathered information.

            vp.Transform();

            m.Ssa.Validate(s => Assert.Fail(s));
            AssertStringsEqual(sExp, m.Ssa);
        }
Пример #10
0
 public virtual void VisitProcedureConstant(ProcedureConstant pc)
 {
     writer.WriteHyperlink(pc.Procedure.Name, pc.Procedure);
 }
Пример #11
0
 public virtual void VisitProcedureConstant(ProcedureConstant pc)
 {
 }
Пример #12
0
 public void VisitProcedureConstant(ProcedureConstant pc)
 {
     handler.DataTypeTrait(pc, program.Platform.PointerType);
 }
Пример #13
0
 public bool Match(Identifier id)
 {
     this.id = id;
     this.pc = ctx.GetValue(id) as ProcedureConstant;
     return pc != null;
 }
Пример #14
0
 public SlicerResult VisitProcedureConstant(ProcedureConstant pc, BackwardSlicerContext ctx)
 {
     throw new NotImplementedException();
 }
Пример #15
0
		public override void VisitProcedureConstant(ProcedureConstant pc)
		{
			EnsureTypeVariable(pc);
			VisitProcedure(pc.Procedure);
			if (pc.Procedure.Signature != null)
			{
				store.MergeClasses(pc.TypeVariable, pc.Procedure.Signature.TypeVariable);
				signature = pc.Procedure.Signature;
			}
		}
Пример #16
0
 public virtual Expression VisitProcedureConstant(ProcedureConstant pc)
 {
     return(pc);
 }
Пример #17
0
 public bool VisitProcedureConstant(ProcedureConstant pc) => false;
Пример #18
0
 public void Vafs_X86Sprintf()
 {
     Given_VaScanner(x86);
     Given_StackString(8, "%c");
     Assert.IsTrue(vafs.TryScan(addrInstr, x86SprintfSig, printfChr));
     var ep = new ExternalProcedure("sprintf", x86SprintfSig);
     var pc = new ProcedureConstant(new CodeType(), ep);
     var instr = vafs.BuildInstruction(pc, new CallSite(4, 0));
     Assert.AreEqual(
         "sprintf(Mem0[esp:(ptr char)], Mem0[esp + 4:(ptr char)], " +
                 "Mem0[esp + 8:char])",
         instr.ToString());
     var appl = (Application)((SideEffect)instr).Expression;
     var sig = ((ProcedureConstant)appl.Procedure).Procedure.Signature;
     Assert.AreEqual(
         "(fn void ((ptr char), (ptr char), char))",
         sig.ToString());
 }
Пример #19
0
 public void VisitProcedureConstant(ProcedureConstant pc)
 {
     js.Write(pc.Procedure.Name);
 }
Пример #20
0
 public Result VisitProcedureConstant(ProcedureConstant pc)
 {
     return(new Result {
         Value = pc, PropagatedExpression = pc
     });
 }
Пример #21
0
 public Expression VisitProcedureConstant(ProcedureConstant pc)
 {
     throw new NotImplementedException();
 }
Пример #22
0
 public BitRange VisitProcedureConstant(ProcedureConstant pc)
 {
     return(BitRange.Empty);
 }
Пример #23
0
 private CallInstruction CreateCall(ProcedureConstant pc)
 {
     return new CallInstruction(pc, new CallSite(4, 0));
 }
Пример #24
0
		public virtual void VisitProcedureConstant(ProcedureConstant pc)
		{
			writer.WriteHyperlink(pc.Procedure.Name, pc.Procedure);
		}
Пример #25
0
 public bool Match(Identifier id)
 {
     this.id = id;
     this.pc = ctx.GetValue(id) as ProcedureConstant;
     return(pc != null);
 }
Пример #26
0
        public void VpIndirectCall()
        {
            var callee = CreateExternalProcedure(
                "foo",
                12,
                RegArg(1, "r1"),
                StackArg(4),
                StackArg(8));
            var pc = new ProcedureConstant(PrimitiveType.Ptr32, callee);

            var m  = new ProcedureBuilder();
            var r1 = m.Reg32("r1", 1);
            var sp = m.Frame.EnsureRegister(m.Architecture.StackRegister);

            m.Assign(sp, m.Frame.FramePointer);
            m.Assign(r1, pc);
            m.Assign(sp, m.ISub(sp, 4));
            m.MStore(sp, m.Word32(3));
            m.Assign(sp, m.ISub(sp, 4));
            m.MStore(sp, m.Mem16(m.Word32(0x1231230)));
            m.Call(r1, 4);
            m.Return();

            arch.Setup(a => a.CreateStackAccess(
                           It.IsAny <IStorageBinder>(),
                           It.IsAny <int>(),
                           It.IsAny <DataType>()))
            .Returns((IStorageBinder f, int off, DataType dt) =>
                     m.Mem(dt, m.IAdd(f.EnsureRegister((RegisterStorage)sp.Storage), off)));
            arch.Setup(s => s.CreateFrameApplicationBuilder(
                           It.IsAny <IStorageBinder>(),
                           It.IsAny <CallSite>(),
                           It.IsAny <Expression>()))
            .Returns((IStorageBinder binder, CallSite site, Expression c) =>
                     new FrameApplicationBuilder(arch.Object, binder, site, c, false));

            var ssa  = RunTest(m);
            var sExp =
                #region Expected
                @"fp:fp
    def:  def fp
    uses: r63_2 = fp
          r63_4 = fp - 4<32>
          Mem5[fp - 4<32>:word32] = 3<32>
          r63_6 = fp - 8<32>
          Mem7[fp - 8<32>:word16] = Mem5[0x1231230<32>:word16]
          r1_8 = foo(Mem7[fp - 8<32>:word32], Mem7[fp - 4<32>:word32])
          r1_8 = foo(Mem7[fp - 8<32>:word32], Mem7[fp - 4<32>:word32])
r63_2: orig: r63
    def:  r63_2 = fp
r1_3: orig: r1
    def:  r1_3 = foo
r63_4: orig: r63
    def:  r63_4 = fp - 4<32>
Mem5: orig: Mem0
    def:  Mem5[fp - 4<32>:word32] = 3<32>
    uses: Mem7[fp - 8<32>:word16] = Mem5[0x1231230<32>:word16]
r63_6: orig: r63
    def:  r63_6 = fp - 8<32>
Mem7: orig: Mem0
    def:  Mem7[fp - 8<32>:word16] = Mem5[0x1231230<32>:word16]
    uses: r1_8 = foo(Mem7[fp - 8<32>:word32], Mem7[fp - 4<32>:word32])
          r1_8 = foo(Mem7[fp - 8<32>:word32], Mem7[fp - 4<32>:word32])
r1_8: orig: r1
    def:  r1_8 = foo(Mem7[fp - 8<32>:word32], Mem7[fp - 4<32>:word32])
// ProcedureBuilder
// Return size: 0
define ProcedureBuilder
ProcedureBuilder_entry:
	def fp
	// succ:  l1
l1:
	r63_2 = fp
	r1_3 = foo
	r63_4 = fp - 4<32>
	Mem5[fp - 4<32>:word32] = 3<32>
	r63_6 = fp - 8<32>
	Mem7[fp - 8<32>:word16] = Mem5[0x1231230<32>:word16]
	r1_8 = foo(Mem7[fp - 8<32>:word32], Mem7[fp - 4<32>:word32])
	return
	// succ:  ProcedureBuilder_exit
ProcedureBuilder_exit:
";

            #endregion
            AssertStringsEqual(sExp, ssa);
        }
Пример #27
0
 public bool VisitProcedureConstant(ProcedureConstant pc, TypeVariable tv)
 {
     //throw new NotImplementedException();
     return(false);
 }
Пример #28
0
        public void VpIndirectCall()
        {
            var callee = CreateExternalProcedure("foo", RegArg(1, "r1"), StackArg(4), StackArg(8));
            var pc = new ProcedureConstant(PrimitiveType.Pointer32, callee);

            var m = new ProcedureBuilder();
            var r1 = m.Reg32("r1", 1);
            var sp = m.Frame.EnsureRegister(m.Architecture.StackRegister);
            m.Assign(r1, pc);
            m.Assign(sp, m.ISub(sp, 4));
            m.Store(sp, 3);
            m.Assign(sp, m.ISub(sp, 4));
            m.Store(sp, m.LoadW(m.Word32(0x1231230)));
            m.Call(r1, 4);
            m.Return();

            arch.Stub(a => a.CreateStackAccess(null, 0, null))
                .IgnoreArguments()
                .Do(new Func<Frame, int, DataType, Expression>((f, off, dt) => m.Load(dt, m.IAdd(sp, off))));
            mr.ReplayAll();

            var ssa = RunTest(m);
            var sExp =
            #region Expected
@"r1_0: orig: r1
    def:  r1_0 = foo
r63:r63
    def:  def r63
    uses: r63_2 = r63 - 0x00000004
          Mem3[r63 - 0x00000004:word32] = 0x00000003
          r63_4 = r63 - 0x00000008
          Mem5[r63 - 0x00000008:word16] = Mem3[0x01231230:word16]
          r1_6 = foo(Mem8[r63 - 0x00000008:word32], Mem9[r63 - 0x00000004:word32])
          r1_6 = foo(Mem8[r63 - 0x00000008:word32], Mem9[r63 - 0x00000004:word32])
r63_2: orig: r63
    def:  r63_2 = r63 - 0x00000004
Mem3: orig: Mem0
    def:  Mem3[r63 - 0x00000004:word32] = 0x00000003
    uses: Mem5[r63 - 0x00000008:word16] = Mem3[0x01231230:word16]
r63_4: orig: r63
    def:  r63_4 = r63 - 0x00000008
Mem5: orig: Mem0
    def:  Mem5[r63 - 0x00000008:word16] = Mem3[0x01231230:word16]
r1_6: orig: r1
    def:  r1_6 = foo(Mem8[r63 - 0x00000008:word32], Mem9[r63 - 0x00000004:word32])
r63_7: orig: r63
Mem8: orig: Mem0
    uses: r1_6 = foo(Mem8[r63 - 0x00000008:word32], Mem9[r63 - 0x00000004:word32])
Mem9: orig: Mem0
    uses: r1_6 = foo(Mem8[r63 - 0x00000008:word32], Mem9[r63 - 0x00000004:word32])
// ProcedureBuilder
// Return size: 0
void ProcedureBuilder()
ProcedureBuilder_entry:
	def r63
	// succ:  l1
l1:
	r1_0 = foo
	r63_2 = r63 - 0x00000004
	Mem3[r63 - 0x00000004:word32] = 0x00000003
	r63_4 = r63 - 0x00000008
	Mem5[r63 - 0x00000008:word16] = Mem3[0x01231230:word16]
	r1_6 = foo(Mem8[r63 - 0x00000008:word32], Mem9[r63 - 0x00000004:word32])
	return
	// succ:  ProcedureBuilder_exit
ProcedureBuilder_exit:
";
            #endregion
            AssertStringsEqual(sExp, ssa);
        }
Пример #29
0
		public void FrBindStackParameters()
		{
			Frame f = new Frame(PrimitiveType.Word16);
			f.ReturnAddressSize = 4;						// far call.
			int stack = 2;
			Identifier loc02 = f.EnsureStackLocal(-stack, PrimitiveType.Word16, "wLoc02");
			stack += loc02.DataType.Size;
			Identifier loc04 = f.EnsureStackLocal(-stack, PrimitiveType.Word16, "wLoc04");

			ProcedureSignature sig = new ProcedureSignature(
				null, new Identifier[] {
					new Identifier("arg0", PrimitiveType.Word16, new StackArgumentStorage(4, PrimitiveType.Word16)),
					new Identifier("arg1", PrimitiveType.Word16, new StackArgumentStorage(6, PrimitiveType.Word16)) });

			var cs = new CallSite(f.ReturnAddressSize + 2 * 4, 0);
			var fn = new ProcedureConstant(PrimitiveType.Pointer32, new PseudoProcedure("foo", sig));
			ApplicationBuilder ab = new ApplicationBuilder(arch, f, cs, fn, sig, true);
            Instruction instr = ab.CreateInstruction(); 
			using (FileUnitTester fut = new FileUnitTester("Core/FrBindStackParameters.txt"))
			{
				f.Write(fut.TextWriter);
				fut.TextWriter.WriteLine(instr.ToString());
				fut.AssertFilesEqual();
			}
		}
Пример #30
0
        public void VpIndirectCall()
        {
            var callee = CreateExternalProcedure("foo", RegArg(1, "r1"), StackArg(4), StackArg(8));
            var pc     = new ProcedureConstant(PrimitiveType.Ptr32, callee);

            var m  = new ProcedureBuilder();
            var r1 = m.Reg32("r1", 1);
            var sp = m.Frame.EnsureRegister(m.Architecture.StackRegister);

            m.Assign(r1, pc);
            m.Assign(sp, m.ISub(sp, 4));
            m.MStore(sp, m.Word32(3));
            m.Assign(sp, m.ISub(sp, 4));
            m.MStore(sp, m.Mem16(m.Word32(0x1231230)));
            m.Call(r1, 4);
            m.Return();

            arch.Stub(a => a.CreateStackAccess(null, 0, null))
            .IgnoreArguments()
            .Do(new Func <IStorageBinder, int, DataType, Expression>((f, off, dt) => m.Mem(dt, m.IAdd(sp, off))));
            mr.ReplayAll();

            var ssa  = RunTest(m);
            var sExp =
                #region Expected
                @"r1_0: orig: r1
    def:  r1_0 = foo
r63:r63
    def:  def r63
    uses: r63_2 = r63 - 0x00000004
          Mem3[r63 - 0x00000004:word32] = 0x00000003
          r63_4 = r63 - 0x00000008
          Mem5[r63 - 0x00000008:word16] = Mem3[0x01231230:word16]
          r1_6 = foo(Mem8[r63 - 0x00000008:word32], Mem9[r63 - 0x00000004:word32])
          r1_6 = foo(Mem8[r63 - 0x00000008:word32], Mem9[r63 - 0x00000004:word32])
r63_2: orig: r63
    def:  r63_2 = r63 - 0x00000004
Mem3: orig: Mem0
    def:  Mem3[r63 - 0x00000004:word32] = 0x00000003
    uses: Mem5[r63 - 0x00000008:word16] = Mem3[0x01231230:word16]
r63_4: orig: r63
    def:  r63_4 = r63 - 0x00000008
Mem5: orig: Mem0
    def:  Mem5[r63 - 0x00000008:word16] = Mem3[0x01231230:word16]
r1_6: orig: r1
    def:  r1_6 = foo(Mem8[r63 - 0x00000008:word32], Mem9[r63 - 0x00000004:word32])
r63_7: orig: r63
Mem8: orig: Mem0
    uses: r1_6 = foo(Mem8[r63 - 0x00000008:word32], Mem9[r63 - 0x00000004:word32])
Mem9: orig: Mem0
    uses: r1_6 = foo(Mem8[r63 - 0x00000008:word32], Mem9[r63 - 0x00000004:word32])
// ProcedureBuilder
// Return size: 0
void ProcedureBuilder()
ProcedureBuilder_entry:
	def r63
	// succ:  l1
l1:
	r1_0 = foo
	r63_2 = r63 - 0x00000004
	Mem3[r63 - 0x00000004:word32] = 0x00000003
	r63_4 = r63 - 0x00000008
	Mem5[r63 - 0x00000008:word16] = Mem3[0x01231230:word16]
	r1_6 = foo(Mem8[r63 - 0x00000008:word32], Mem9[r63 - 0x00000004:word32])
	return
	// succ:  ProcedureBuilder_exit
ProcedureBuilder_exit:
";

            #endregion
            AssertStringsEqual(sExp, ssa);
        }
Пример #31
0
 private CallInstruction CreateCall(ProcedureConstant pc)
 {
     return(new CallInstruction(pc, new CallSite(4, 0)));
 }
Пример #32
0
 public bool VisitProcedureConstant(ProcedureConstant pc)
 {
     return(false);
 }
Пример #33
0
 public Expression VisitProcedureConstant(ProcedureConstant pc)
 {
     return(new ProcedureConstant(pc.DataType, pc.Procedure));
 }
Пример #34
0
 public Statement Call(ProcedureBase callee, int retSizeOnStack)
 {
     ProcedureConstant c = new ProcedureConstant(PrimitiveType.Pointer32, callee);
     CallInstruction ci = new CallInstruction(c, new CallSite(retSizeOnStack, 0));  
     return Emit(ci);
 }
Пример #35
0
 void IExpressionVisitor.VisitProcedureConstant(ProcedureConstant pc)
 {
     writer.Write("\"");
     writer.Write(pc.Procedure.Name);
     writer.Write("\"");
 }
Пример #36
0
		public virtual void VisitProcedureConstant(ProcedureConstant pc)
		{
		}
Пример #37
0
 public ValueSet VisitProcedureConstant(ProcedureConstant pc)
 {
     throw new NotImplementedException();
 }