예제 #1
0
        public void Cab_Sequence()
        {
            var m       = new SsaProcedureBuilder(nameof(Cab_Sequence));
            var r2_1    = m.Reg("r2_1", reg2);
            var r3_2    = m.Reg("r3_2", reg3);
            var r2_r3_4 = m.SeqId("r2_r3_4", PrimitiveType.Word64, reg2, reg3);

            m.Assign(r2_1, 0x0001234);
            m.Assign(r3_2, 0x5678ABCD);
            m.Assign(r2_r3_4, m.Seq(r2_1, r3_2));
            var sigCallee = FunctionType.Action(
                new Identifier("r2_r3", PrimitiveType.Word64,
                               new SequenceStorage(PrimitiveType.Word64, reg2, reg3)));
            var callee = new ProcedureConstant(
                PrimitiveType.Ptr32,
                new ExternalProcedure("callee", sigCallee));
            var stmCall = m.Call(callee, 0,
                                 new Identifier[] { r2_r3_4 },
                                 new Identifier[] { });

            m.Return();

            var cab = new CallApplicationBuilder(
                m.Ssa,
                stmCall,
                (CallInstruction)stmCall.Instruction,
                callee);
            var instr = cab.CreateInstruction(sigCallee, null);

            Assert.AreEqual("callee(r2_r3_4)", instr.ToString());
            m.Ssa.Validate(s => Assert.Fail(s));
        }