Exemple #1
0
		public void StCreate()
		{
			SerializedType st = new PrimitiveType_v1(Domain.SignedInt, 4);
			Assert.AreEqual("prim(SignedInt,4)", st.ToString());
			st = new PointerType_v1(new PrimitiveType_v1(Domain.UnsignedInt, 4));
			Assert.AreEqual("ptr(prim(UnsignedInt,4))", st.ToString());
		}
        public void MacTi_PtrChain()
        {
            var decls = new List <Declaration>
            {
                new TypeDeclaration("GrafPort", new Record {
                    Fields = new List <Field>
                    {
                        new Field(new List <string> {
                            "test"
                        }, new Primitive(PrimitiveType_v1.Int32()))
                    }
                }),
                new TypeDeclaration("DialogPtr", new TypeReference("WindowPtr")),
                new TypeDeclaration("GrafPtr", new Pointer(new TypeReference("GrafPort"))),
                new TypeDeclaration("WindowPtr", new TypeReference("GrafPtr"))
            };

            Given_TypeImporter();

            typeimporter.LoadTypes(decls);

            Assert.AreEqual(32, typelib.Types["GrafPtr"].BitSize);
            Assert.AreEqual(32, typelib.Types["WindowPtr"].BitSize);
            Assert.AreEqual(32, typelib.Types["DialogPtr"].BitSize);
        }
        public void Ici_load_do_with_16bit_load()
        {
            var ici  = new InlineCodeInterpreter(constants);
            var ssig = new SerializedSignature
            {
                Arguments = new[]
                {
                    new Argument_v1
                    {
                        Name = "d",
                        Type = new ReferenceType_v1 {
                            Referent = PrimitiveType_v1.Int32(),
                            Size     = 4,
                        }
                    },
                },
            };

            var svc = ici.BuildSystemCallFromMachineCode(
                "GetTime", ssig, Opcodes(0x205F, 0x2038, 0x020c, 0xa9c6));

            Assert.AreEqual("A9C6", svc.SyscallInfo.Vector);
            var reg = (Register_v1)svc.Signature.Arguments[0].Kind;

            Assert.AreEqual("a0", reg.Name);
        }
        public void Ici_Push_Zero_Constant()
        {
            var ici  = new InlineCodeInterpreter(constants);
            var ssig = new SerializedSignature
            {
                Arguments = new[]
                {
                    new Argument_v1
                    {
                        Name = "act",
                        Type = PrimitiveType_v1.Bool(),
                    },
                    new Argument_v1
                    {
                        Name = "lHandle",
                        Type = new PrimitiveType_v1 {
                            Domain = Domain.Pointer, ByteSize = 4
                        },
                    },
                },
            };

            var svc = ici.BuildSystemCallFromMachineCode(
                "LActivate", ssig, Opcodes(0x4267, 0xA9E7));

            Assert.AreEqual("A9E7", svc.SyscallInfo.Vector);
            Assert.AreEqual("4", svc.SyscallInfo.StackValues[0].Offset);
            Assert.AreEqual("0000", svc.SyscallInfo.StackValues[0].Value);
        }
Exemple #5
0
        public void Tlldr_LoadGlobalByOrdinal()
        {
            var typelib = new TypeLibrary();

            platform = new Mock <IPlatform>();
            platform.Setup(p => p.DefaultCallingConvention).Returns("__cdecl");
            platform.Setup(p => p.Architecture).Returns(new FakeArchitecture(new ServiceContainer()));

            var tlldr = new TypeLibraryDeserializer(platform.Object, true, typelib);

            tlldr.Load(new SerializedLibrary
            {
                ModuleName = "stdlib",
                Globals    = new List <GlobalVariable_v1>
                {
                    new GlobalVariable_v1
                    {
                        Name    = "errno",
                        Ordinal = 42,
                        Type    = PrimitiveType_v1.Int32(),
                    }
                }
            });
            var stdlib          = typelib.Modules["stdlib"];
            var globalByName    = stdlib.GlobalsByName["errno"];
            var globalByOrdinal = stdlib.GlobalsByOrdinal[42];

            Assert.AreSame(globalByName, globalByOrdinal);
        }
 public List <ImageSymbol> GetAllSymbols()
 {
     return(new List <ImageSymbol>
     {
         ImageSymbol.Procedure(
             arch.Object,
             Address.Ptr64(0x12340000),
             "MyFunction",
             signature: new SerializedSignature
         {
             Arguments = new Argument_v1[]
             {
                 new Argument_v1("arg1", PrimitiveType_v1.Int32(), new StackVariable_v1(), false),
                 new Argument_v1("arg2", new PointerType_v1(PrimitiveType_v1.Char8())
                 {
                     PointerSize = 4
                 }, new StackVariable_v1(), false),
             },
             ReturnValue = new Argument_v1
             {
                 Type = PrimitiveType_v1.Int32()
             }
         })
     });
 }
        public void X86_64Psig_MixedIntsFloats()
        {
            var pser = Given_ProcedureSerializer();
            var ssig = new SerializedSignature
            {
                ReturnValue = new Argument_v1 {
                    Type = PrimitiveType_v1.Int32()
                },
                Arguments = new Argument_v1[]
                {
                    new Argument_v1 {
                        Type = PrimitiveType_v1.Int32(), Name = "a"
                    },
                    new Argument_v1 {
                        Type = PrimitiveType_v1.Real64(), Name = "b"
                    },
                    new Argument_v1 {
                        Type = PointerType_v1.Create(PrimitiveType_v1.Char8(), 8), Name = "c"
                    },
                    new Argument_v1 {
                        Type = PrimitiveType_v1.Real64(), Name = "d"
                    },
                    new Argument_v1 {
                        Type = PrimitiveType_v1.Real32(), Name = "e"
                    },
                }
            };

            var sig = pser.Deserialize(ssig, frame);

            Assert.AreEqual("rax", sig.ReturnValue.Storage.ToString());
            ExpectArgs(sig, "rcx", "xmm1", "r8", "xmm3", "Stack +0008");
        }
Exemple #8
0
        public void ProcSer_Deserialize_thiscall_function()
        {
            var ssig = new SerializedSignature
            {
                Convention = "__thiscall",
                Arguments  = new Argument_v1[]
                {
                    new Argument_v1
                    {
                        Name = "self",
                        Type = new PointerType_v1 {
                            DataType = PrimitiveType_v1.Int32(), PointerSize = 4
                        }
                    },
                    new Argument_v1
                    {
                        Name = "arg1",
                        Type = new PointerType_v1 {
                            DataType = PrimitiveType_v1.Int32(), PointerSize = 4
                        }
                    },
                }
            };

            Given_ProcedureSerializer("__thiscall");
            mr.ReplayAll();

            var sig  = ser.Deserialize(ssig, arch.CreateFrame());
            var sExp =
                @"void foo(Register (ptr32 int32) self, Stack (ptr32 int32) arg1)
// stackDelta: 8; fpuStackDelta: 0; fpuMaxParam: -1
";

            Assert.AreEqual(sExp, sig.ToString("foo", FunctionType.EmitFlags.AllDetails));
        }
        public void Ici_Two_Register_Arguments()
        {
            var ici  = new InlineCodeInterpreter(constants);
            var ssig = new SerializedSignature
            {
                Arguments = new[] {
                    new Argument_v1
                    {
                        Name = "vblBlockPtr",
                        Type = new PrimitiveType_v1 {
                            Domain = Domain.Pointer, ByteSize = 4
                        }
                    },
                    new Argument_v1
                    {
                        Name = "theSlot",
                        Type = PrimitiveType_v1.Int16()
                    },
                },
                ReturnValue = new Argument_v1
                {
                    Type = PrimitiveType_v1.Int16()
                }
            };

            var svc = ici.BuildSystemCallFromMachineCode(
                "SlotVInstall", ssig, Opcodes(0x301F, 0x205F, 0xA06F, 0x3E80));

            Assert.AreEqual("A06F", svc.SyscallInfo.Vector);
            Assert.AreEqual("a0", ((Register_v1)svc.Signature.Arguments[0].Kind).Name);
            Assert.AreEqual("d0", ((Register_v1)svc.Signature.Arguments[1].Kind).Name);
            Assert.AreEqual("d0", ((Register_v1)svc.Signature.ReturnValue.Kind).Name);
        }
        public void Ici_Push_Register_Constant()
        {
            var ici  = new InlineCodeInterpreter(constants);
            var ssig = new SerializedSignature
            {
                Arguments = new[]
                {
                    new Argument_v1
                    {
                        Name = "act",
                        Type = new ReferenceType_v1 {
                            Referent = PrimitiveType_v1.Int16(),
                            Size     = 4,
                        }
                    },
                },
                ReturnValue = new Argument_v1
                {
                    Type = PrimitiveType_v1.Int16(),
                }
            };

            var svc = ici.BuildSystemCallFromMachineCode(
                "GetFrontProcess", ssig, Opcodes(0x70FF, 0x2F00, 0x3F3C, 0x0039, 0xA88F));

            Assert.AreEqual("A88F", svc.SyscallInfo.Vector);
            Assert.AreEqual("4", svc.SyscallInfo.StackValues[0].Offset);
            Assert.AreEqual("0039", svc.SyscallInfo.StackValues[0].Value);
            Assert.AreEqual("6", svc.SyscallInfo.StackValues[1].Offset);
            Assert.AreEqual("ffffffff", svc.SyscallInfo.StackValues[1].Value);
        }
Exemple #11
0
        public SerializedType VisitRangeType(RangeType rangeType)
        {
            var low   = rangeType.Low.Accept(ceval).ToInt64();
            var hi    = rangeType.High.Accept(ceval).ToInt64();
            var delta = hi - low + 1;

            if (delta < 0)
            {
                throw new NotImplementedException("Range overflow.");
            }
            if (delta < 256)
            {
                return(low < 0
                    ? PrimitiveType_v1.SChar8()
                    : PrimitiveType_v1.UChar8());
            }
            if (delta < 65536)
            {
                return(low <= 0
                    ? PrimitiveType_v1.Int16()
                    : PrimitiveType_v1.UInt16());
            }
            if (delta < (1L << 32))
            {
                return(low <= 0
                    ? PrimitiveType_v1.Int32()
                    : PrimitiveType_v1.UInt32());
            }
            return(PrimitiveType_v1.Int64());
        }
Exemple #12
0
        public void TycoUserSegmentedData()
        {
            var addrUserData = Address.SegPtr(0xC30, 0x0042);
            var addrSeg      = Address.SegPtr(0xC30, 0);
            var seg          = new ImageSegment("seg0C30", addrSeg, new ByteMemoryArea(addrSeg, new byte[0x100]), AccessMode.ReadWriteExecute);

            seg.Identifier = new Identifier("seg0C30", PrimitiveType.SegmentSelector, MemoryStorage.Instance);
            var program = new ProgramBuilder().BuildProgram();

            program.SegmentMap.AddSegment(seg);
            program.User = new UserData
            {
                Globals =
                {
                    {
                        addrUserData, new GlobalDataItem_v2
                        {
                            Name     = "myGlobal",
                            DataType = PrimitiveType_v1.Real32(),
                        }
                    }
                }
            };
            var eqb = new EquivalenceClassBuilder(program.TypeFactory, program.TypeStore, eventListener);

            eqb.EnsureSegmentTypeVariables(program.SegmentMap.Segments.Values);
            var tyco = Given_TypeCollector(program);

            tyco.CollectUserGlobalVariableTypes();

            Assert.AreEqual("42: myGlobal: real32", program.TypeStore.SegmentTypes[seg].Fields.First().ToString());
        }
Exemple #13
0
        public DataType VisitPrimitive(PrimitiveType_v1 primitive)
        {
            var pt = PrimitiveType.Create(primitive.Domain, primitive.ByteSize * DataType.BitsPerByte);

            pt.Qualifier = primitive.Qualifier;
            return(pt);
        }
Exemple #14
0
        public void MacTi_Point()
        {
            var decls = new List <Declaration>
            {
                new TypeDeclaration("Point", new Record {
                    Fields = new List <Field>
                    {
                        new Field(new List <string> {
                            "x"
                        }, new Primitive {
                            Type = PrimitiveType_v1.Int16()
                        }),
                        new Field(new List <string> {
                            "y"
                        }, new Primitive {
                            Type = PrimitiveType_v1.Int16()
                        })
                    }
                }),
            };

            Given_TypeImporter();

            typeimporter.LoadTypes(decls);

            Assert.AreEqual(32, typelib.Types["Point"].BitSize);
        }
Exemple #15
0
        public void TycoUserData()
        {
            var addrUserData = Address.Ptr32(0x00001400);
            var program      = new ProgramBuilder().BuildProgram();

            program.User = new UserData
            {
                Globals =
                {
                    {
                        addrUserData, new GlobalDataItem_v2
                        {
                            Name     = "xAcceleration",
                            DataType = PrimitiveType_v1.Real64()
                        }
                    }
                }
            };
            new EquivalenceClassBuilder(program.TypeFactory, program.TypeStore, eventListener).Build(program);
            var tyco = Given_TypeCollector(program);

            tyco.CollectGlobalType();
            tyco.CollectUserGlobalVariableTypes();

            Then_GlobalFieldsAre(program, "1400: xAcceleration: real64");
        }
Exemple #16
0
        public void Tlldr_typedef_forwarded_struct_size()
        {
            Given_ArchitectureStub();

            var typelib = new TypeLibrary();
            var tlldr   = new TypeLibraryDeserializer(platform.Object, true, typelib);

            new SerializedTypedef
            {
                Name     = "_sized_struct",
                DataType = new StructType_v1
                {
                    Name = "sized_struct",
                }
            }.Accept(tlldr);
            new StructType_v1
            {
                Name   = "sized_struct",
                Fields = new StructField_v1[]
                {
                    new StructField_v1 {
                        Name   = "foo",
                        Offset = 0,
                        Type   = PrimitiveType_v1.Int64(),
                    }
                },
                ByteSize = 8,
            }.Accept(tlldr);

            var str      = (StructureType)typelib.Types["_sized_struct"];
            var expected = @"(struct ""sized_struct"" 0008 (0 int64 foo))";

            Assert.AreEqual(expected, str.ToString());
        }
Exemple #17
0
 public SerializedType VisitStringType(Core.Pascal.StringType strType)
 {
     return(new StringType_v2
     {
         CharType = PrimitiveType_v1.Char8(),
         Termination = StringType_v2.MsbTermination,
     });
 }
Exemple #18
0
        public void StCreate()
        {
            SerializedType st = new PrimitiveType_v1(Domain.SignedInt, 4);

            Assert.AreEqual("prim(SignedInt,4)", st.ToString());
            st = new PointerType_v1(new PrimitiveType_v1(Domain.UnsignedInt, 4));
            Assert.AreEqual("ptr(prim(UnsignedInt,4))", st.ToString());
        }
        public DataType VisitPrimitive(PrimitiveType_v1 primitive)
        {
            var bitSize = primitive.Domain != Domain.Boolean
                ? DataType.BitsPerByte * primitive.ByteSize
                : 1;

            return(PrimitiveType.Create(primitive.Domain, bitSize));
        }
Exemple #20
0
        public void SvArm32Ps_mmap()
        {
            var ssig = new SerializedSignature
            {
                ReturnValue = new Argument_v1
                {
                    Type = new PointerType_v1
                    {
                        PointerSize = 4,
                        DataType    = new VoidType_v1(),
                    }
                },
                Arguments = new Argument_v1[]
                {
                    new Argument_v1
                    {
                        Name = "addr",
                        Type = new PointerType_v1
                        {
                            PointerSize = 4,
                            DataType    = new VoidType_v1(),
                        }
                    },
                    new Argument_v1
                    {
                        Name = "length",
                        Type = PrimitiveType_v1.UInt32(),
                    },
                    new Argument_v1
                    {
                        Name = "prot",
                        Type = PrimitiveType_v1.Int32(),
                    },
                    new Argument_v1
                    {
                        Name = "flags",
                        Type = PrimitiveType_v1.Int32(),
                    },
                    new Argument_v1
                    {
                        Name = "fd",
                        Type = PrimitiveType_v1.Int32(),
                    },
                    new Argument_v1
                    {
                        Name = "offset",
                        Type = PrimitiveType_v1.Int32(),
                    }
                }
            };

            Given_ProcedureSerializer();

            mr.ReplayAll();

            var sig  = ser.Deserialize(ssig, arch.CreateFrame());
            var args = sig.Parameters;
        }
        public void SvArm32Ps_Load_IntArgs()
        {
            var ssig = new SerializedSignature
            {
                Arguments = new Argument_v1[] {
                    new Argument_v1
                    {
                        Name = "dc",
                        Type = PrimitiveType_v1.Int16(),
                    },
                    new Argument_v1
                    {
                        Name = "b1",
                        Type = PrimitiveType_v1.SChar8(),
                    },
                    new Argument_v1
                    {
                        Name = "w2",
                        Type = PrimitiveType_v1.Int32(),
                    },
                    new Argument_v1
                    {
                        Name = "h3",
                        Type = PrimitiveType_v1.Int16(),
                    },
                    new Argument_v1
                    {
                        Name = "b4",
                        Type = PrimitiveType_v1.UChar8(),
                    },
                    new Argument_v1
                    {
                        Name = "w5",
                        Type = PrimitiveType_v1.Int32(),
                    },
                    new Argument_v1
                    {
                        Name = "foo",
                        Type = PrimitiveType_v1.Int32()
                    }
                }
            };

            Given_ProcedureSerializer();

            mr.ReplayAll();

            var sig  = ser.Deserialize(ssig, arch.CreateFrame());
            var args = sig.Parameters;

            Assert.AreEqual("r0", args[0].Storage.ToString());
            Assert.AreEqual("r1", args[1].Storage.ToString());
            Assert.AreEqual("r2", args[2].Storage.ToString());
            Assert.AreEqual("r3", args[3].Storage.ToString());
            Assert.AreEqual("Stack +0000", args[4].Storage.ToString());
            Assert.AreEqual("Stack +0004", args[5].Storage.ToString());
            Assert.AreEqual("Stack +0008", args[6].Storage.ToString());
        }
Exemple #22
0
            public StringBuilder VisitPrimitive(PrimitiveType_v1 primitive)
            {
                switch (primitive.Domain)
                {
                case Domain.None:
                    sb.Append("void");
                    break;

                case Domain.SignedInt:
                    switch (primitive.ByteSize)
                    {
                    case 4: sb.Append("int"); break;

                    case 8: sb.Append("__int64"); break;

                    default: throw new NotImplementedException();
                    }
                    break;

                case Domain.UnsignedInt:
                    switch (primitive.ByteSize)
                    {
                    case 4: sb.Append("unsigned int");
                        break;

                    default: throw new NotImplementedException();
                    }
                    break;

                case Domain.Character:
                    switch (primitive.ByteSize)
                    {
                    case 1: sb.Append("char"); break;

                    case 2: sb.Append("wchar_t"); break;
                    }
                    break;

                case Domain.Character | Domain.UnsignedInt:
                    switch (primitive.ByteSize)
                    {
                    case 1: sb.Append("char"); break;

                    default: throw new NotImplementedException();
                    }
                    break;

                default:
                    throw new NotSupportedException(string.Format("Domain {0} is not supported.", primitive.Domain));
                }
                if (name != null)
                {
                    sb.AppendFormat(" {0}", name);
                }
                return(sb);
            }
Exemple #23
0
 private void AddIntrinsicTypes(List <Declaration> declarations)
 {
     declarations.AddRange(new[] {
         new TypeDeclaration(
             "OBJECT",
             new Primitive(PrimitiveType_v1.Ptr32())),
         new TypeDeclaration(
             "Comp",
             new Primitive(PrimitiveType_v1.Ptr32()))
     });
 }
        public DataType VisitPrimitive(PrimitiveType_v1 primitive)
        {
            var bitSize = primitive.Domain != Domain.Boolean
                ? DataType.BitsPerByte * primitive.ByteSize
                : 1;

            var pt = PrimitiveType.Create(primitive.Domain, bitSize);

            pt.Qualifier = primitive.Qualifier;
            return(pt);
        }
        public void Ici_PostCallStackUpdate()
        {
            var ici  = new InlineCodeInterpreter(constants);
            var ssig = new SerializedSignature
            {
                Arguments   = new Argument_v1[0],
                ReturnValue = new Argument_v1 {
                    Type = PrimitiveType_v1.Int16()
                }
            };
            var svc = ici.BuildSystemCallFromMachineCode("CountADBs", ssig, Opcodes(0xA077, 0x3E80));

            Assert.AreEqual("A077", svc.SyscallInfo.Vector);
            Assert.AreEqual("d0", ((Register_v1)svc.Signature.ReturnValue.Kind).Name);
        }
Exemple #26
0
        public void SudSave_UserGlobal_issue_201()
        {
            var platform = new TestPlatform
            {
            };
            var program = new Program
            {
                Platform = platform,
                User     = new UserData
                {
                    ExtractResources = true,
                    Globals          =
                    {
                        {
                            Address.Ptr32(0x01234),
                            new GlobalDataItem_v2
                            {
                                DataType = PrimitiveType_v1.Real32(),
                                Name     = "pi"
                            }
                        }
                    }
                }
            };
            var sw = new StringWriter();

            When_SaveToTextWriter(program, sw);
            var sExp =
                @"<?xml version=""1.0"" encoding=""utf-16""?>
<project xmlns=""http://schemata.jklnet.org/Reko/v4"">
  <input>
    <user>
      <global>
        <Address>00001234</Address>
        <prim domain=""Real"" size=""4"" />
        <Name>pi</Name>
      </global>
      <registerValues />
    </user>
  </input>
</project>";

            if (sw.ToString() != sExp)
            {
                Debug.Print("{0}", sw.ToString());
            }
            Assert.AreEqual(sExp, sw.ToString());
        }
Exemple #27
0
        private SerializedType Type()
        {
            switch (str[i++])
            {
            case 'b': return(PrimitiveType_v1.Bool());

            case 'c': return(PrimitiveType_v1.Char8());

            case 'h': return(PrimitiveType_v1.UChar8());

            case 's': return(PrimitiveType_v1.Int16());

            case 'r': return(PrimitiveType_v1.UInt16());

            case 'i': return(PrimitiveType_v1.Int32());

            case 'j': return(PrimitiveType_v1.UInt32());

            case 'l': return(PrimitiveType_v1.Int64());

            case 'm': return(PrimitiveType_v1.UInt64());

            case 'w': return(PrimitiveType_v1.WChar16());

            case 'f': return(PrimitiveType_v1.Real32());

            case 'd': return(PrimitiveType_v1.Real64());

            case 'P': return(new PointerType_v1 {
                    DataType = Type(), PointerSize = ptrSize
                });

            case 'R': return(new ReferenceType_v1 {
                    Referent = Type(), Size = ptrSize
                });

            default:
                --i;
                if (char.IsDigit(str[i]))
                {
                    return(new TypeReference_v1
                    {
                        TypeName = SimpleName(),
                    });
                }
                throw new NotImplementedException(string.Format("Unknown GCC type code '{0}'.", str[i]));
            }
        }
        public void SvArm32Ps_DeserializeFpuReturnValue()
        {
            var ssig = new SerializedSignature
            {
                ReturnValue = new Argument_v1
                {
                    Type = PrimitiveType_v1.Real64(),
                }
            };

            Given_ProcedureSerializer();

            mr.ReplayAll();

            var sig = ser.Deserialize(ssig, arch.CreateFrame());

            Assert.AreEqual("Sequence r1:r0", sig.ReturnValue.Storage.ToString());
        }
        public void Ici_Load_Word_Constant_To_Register()
        {
            var ici  = new InlineCodeInterpreter(constants);
            var ssig = new SerializedSignature
            {
                Arguments = new []
                {
                    new Argument_v1
                    {
                        Name = "typecode",
                        Type = PrimitiveType_v1.Int32(),
                    },
                    new Argument_v1
                    {
                        Name = "dataPtr",
                        Type = new PrimitiveType_v1 {
                            Domain = Domain.Pointer, ByteSize = 4
                        },
                    },
                    new Argument_v1
                    {
                        Name = "result",
                        Type = new ReferenceType_v1
                        {
                            Referent = new TypeReference_v1 {
                                TypeName = "AEDesc"
                            }
                        }
                    }
                },
                ReturnValue = new Argument_v1
                {
                    Type = PrimitiveType_v1.Int16()
                }
            };

            var svc = ici.BuildSystemCallFromMachineCode(
                "AECreateDesc", ssig, Opcodes(0x303C, 0x0825, 0xA816));

            Assert.AreEqual("A816", svc.SyscallInfo.Vector);
            Assert.AreEqual("d0", svc.SyscallInfo.RegisterValues[0].Register);
            Assert.AreEqual("0825", svc.SyscallInfo.RegisterValues[0].Value);
        }
Exemple #30
0
        public void SvX86Ps_DeserializeFpuArgument()
        {
            var ssig = new SerializedSignature
            {
                Convention  = "stdapi",
                ReturnValue = RegArg(PrimitiveType_v1.Int32(), "eax"),
                Arguments   = new Argument_v1[] {
                    StackArg(PrimitiveType_v1.Real64(), "rArg04")
                }
            };

            Given_ProcedureSerializer();

            mr.ReplayAll();

            var sig = ser.Deserialize(ssig, arch.CreateFrame());

            Assert.AreEqual("Register int32 test(Stack real64 rArg04)", sig.ToString("test"));
        }
        public void SvArm32Ps_Load_cdecl()
        {
            var ssig = new SerializedSignature
            {
                Arguments = new Argument_v1[] {
                    new Argument_v1
                    {
                        Name = "foo",
                        Type = PrimitiveType_v1.Int32(),
                    }
                }
            };

            Given_ProcedureSerializer();
            mr.ReplayAll();

            var sig = ser.Deserialize(ssig, arch.CreateFrame());

            Assert.AreEqual(0, sig.StackDelta);
        }
 public SerializedType ParseDataTypeCode(List<Argument_v1> compoundArgs)
 {
     if (PeekAndDiscard('?'))
     {
         switch (str[i++])
         {
         case 'A': break;
         case 'B': /* const */ break;
         default: Error("Expected 'A' or 'B', but saw '{0}'.", str[i - 1]); break;
         }
     }
     switch (str[i++])
     {
     case '0': return compoundArgs[0].Type;
     case '1': return compoundArgs[1].Type;
     case '2': return compoundArgs[2].Type;
     case '3': return compoundArgs[3].Type;
     case '4': return compoundArgs[4].Type;
     case '5': return compoundArgs[5].Type;
     case '6': return compoundArgs[6].Type;
     case '7': return compoundArgs[7].Type;
     case '8': return compoundArgs[8].Type;
     case '9': return compoundArgs[9].Type;
     case 'A': return ParsePointer(compoundArgs);        //$TODO: really is a reference but is implemented as a pointer on Win32...
     case 'C': return new PrimitiveType_v1(Domain.Character | Domain.SignedInt, 1);
     case 'D': return new PrimitiveType_v1(Domain.Character, 1);
     case 'E': return new PrimitiveType_v1(Domain.Character | Domain.UnsignedInt, 1);
     case 'F': return new PrimitiveType_v1(Domain.SignedInt, 2);
     case 'G': return new PrimitiveType_v1(Domain.UnsignedInt, 2);
     case 'H': return new PrimitiveType_v1(Domain.SignedInt, 4);
     case 'I': return new PrimitiveType_v1(Domain.UnsignedInt, 4);
     case 'J': return new PrimitiveType_v1(Domain.SignedInt, 4);      // 'long' on Win32 is actually 4 bytes
     case 'K': return new PrimitiveType_v1(Domain.UnsignedInt, 4);  // 'long' on Win32 is actually 4 bytes
     case 'M': return new PrimitiveType_v1(Domain.Real, 4);
     case 'N': return new PrimitiveType_v1(Domain.Real, 8);
     case 'O': return new PrimitiveType_v1(Domain.Real, 10);
     case 'P': return ParsePointer(compoundArgs);    // pointer
     case 'Q': return ParsePointer(compoundArgs);    // const pointer
     case 'R': return ParsePointer(compoundArgs);    // volatile pointer
     case 'T': return ParseStructure(compoundArgs);  // union 
     case 'U': return ParseStructure(compoundArgs); // struct (see below)
     case 'V': return ParseStructure(compoundArgs); // class (see below)
     case 'W': return ParseEnum(compoundArgs);
     case 'X': return new VoidType_v1();      // void (as in 'void return value', 'X' terminates argument list)
     case '_':
         PrimitiveType_v1 prim;
         switch (str[i++])
         {
         case 'J': prim = new PrimitiveType_v1(Domain.SignedInt, 8); break;   // __int64
         case 'K': prim = new PrimitiveType_v1(Domain.UnsignedInt, 8); break; // unsigned __int64
         case 'N': prim = new PrimitiveType_v1(Domain.Boolean, 1); break;     // bool
         case 'W': prim = new PrimitiveType_v1(Domain.Character, 2); break;   // wchar_t
         default: Error("Unsupported type code '_{0}'.", str[i - 1]); return null;
         }
         compoundArgs.Add(new Argument_v1 { Type = prim });
         return prim;
     default: Error("Unsupported type code '{0}'.", str[i - 1]); return null;
     }
 }
Exemple #33
0
        private bool LoadParameter(SerializedSignature ssig, List<Argument_v1> args)
        {
            if (PeekAndDiscard(TokenType.NUMBER))
                return true;
            Token tok = Peek();
            if (tok.Type != TokenType.ID)
                return false;
            Get();
            SerializedType type = null;
            switch (tok.Value)
            {
            case "word":
            case "s_word":
                type = new PrimitiveType_v1(PrimitiveType.Word16.Domain, 2);
                break;
            case "long":
                type = new PrimitiveType_v1(PrimitiveType.Word32.Domain, 4);
                break;
            //$TODO: need SegmentedPointerType 
            case "segptr":
            case "segstr":
                type = new PrimitiveType_v1(Domain.SegPointer, 4);
                break;
            case "ptr":
                type = new PrimitiveType_v1(Domain.Pointer, 4);
                break;
            case "str":
                type = PointerType_v1.Create(PrimitiveType_v1.Char8(), 4);
                break;
            case "wstr":
                type = PointerType_v1.Create(PrimitiveType_v1.WChar16(), 4);
                break;
			case "uint16":
				type = PrimitiveType_v1.UInt16();
				break;
			case "uint32":
				type = PrimitiveType_v1.UInt32();
				break;
			case "uint64":
				type = PrimitiveType_v1.UInt64();
				break;
			case "int16":
				type = PrimitiveType_v1.Int16();
				break;
			case "int32":
				type = PrimitiveType_v1.Int32();
				break;
			case "int64":
				type = PrimitiveType_v1.Int64();
				break;
            default: throw new Exception("Unknown: " + tok.Value);
            }
            args.Add(new Argument_v1 { Type = type });
            return true;
        }