コード例 #1
0
 /// <summary>
 /// Deserializes an argument.
 /// </summary>
 /// <param name="arg"></param>
 /// <param name="idx"></param>
 /// <param name="convention"></param>
 /// <returns></returns>
 public Identifier DeserializeArgument(Argument_v1 arg, int idx, string convention)
 {
     if (arg.Kind != null)
     {
         return(argDeser.Deserialize(arg, arg.Kind));
     }
     Debug.Assert(iregs.Length == fregs.Length);
     if (idx < fregs.Length)
     {
         var reg = (IsReal(arg.Type) ? fregs : iregs)[idx];
         return(argDeser.Deserialize(arg, new Register_v1(reg)));
     }
     if (convention == null)
     {
         return(argDeser.Deserialize(arg, new StackVariable_v1()));
     }
     switch (convention)
     {
     case "":
     case "stdapi":
     case "cdecl":
     case "__cdecl":
     case "__stdcall":
     case "pascal":
     case "__thiscall":
         return(argDeser.Deserialize(arg, new StackVariable_v1 {
         }));
     }
     throw new NotSupportedException(string.Format("Unsupported calling convention '{0}'.", convention));
 }
コード例 #2
0
 /// <summary>
 /// This hack loops through all the registers in a <see cref="SerializedService"/> loaded
 /// from the realmodeintservices.xml file and replaces sequences that look like segmented
 /// 32-bit pointers with their flat 32-bit equivalents.
 /// It's a placeholder and should be replaced by a "protectedmodeintservices.xml" that should
 /// generated from realmodeintservices.xml.
 /// </summary>
 private SerializedService ExtendRegisters(SerializedService svc)
 {
     if (svc.Signature != null && svc.Signature.Arguments != null)
     {
         var args = new List <Argument_v1>();
         foreach (var arg in svc.Signature.Arguments)
         {
             if (arg.Type is PointerType_v1 ptr &&
                 arg.Kind is SerializedSequence seq &&
                 seq.Registers != null &&
                 seq.Registers.Length == 2 &&
                 seq.Registers[1].Name != null)
             {
                 var off    = seq.Registers[1].Name;
                 var eoff   = "e" + off;
                 var argNew = new Argument_v1
                 {
                     Name = arg.Name,
                     Kind = new Register_v1 {
                         Name = eoff
                     },
                     OutParameter = arg.OutParameter,
                     Type         = arg.Type,
                 };
                 args.Add(argNew);
             }
             else
             {
                 args.Add(arg);
             }
         }
コード例 #3
0
        public void ArgSer_DeserializeTwoNamedStackVariables()
        {
            var argA = new Argument_v1
            {
                Name = "a",
                Kind = new StackVariable_v1(),
                Type = new PrimitiveType_v1 {
                    ByteSize = 4, Domain = Domain.SignedInt
                }
            };
            var argB = new Argument_v1
            {
                Name = "b",
                Kind = new StackVariable_v1(),
                Type = new PrimitiveType_v1 {
                    ByteSize = 4, Domain = Domain.Real
                }
            };
            var a = argser.Deserialize(argA);
            var b = argser.Deserialize(argB);

            Assert.AreEqual("a", a.Name);
            Assert.AreEqual("int32", a.DataType.ToString());
            Assert.AreEqual("Stack +000D", a.Storage.ToString());
            Assert.AreEqual("b", b.Name);
            Assert.AreEqual("real32", b.DataType.ToString());
            Assert.AreEqual("Stack +0011", b.Storage.ToString());
        }
コード例 #4
0
        public Identifier DeserializeArgument(Argument_v1 sArg, int idx, string convention)
        {
            if (sArg.Kind != null)
            {
                return(argser.Deserialize(sArg, sArg.Kind));
            }
            Identifier arg;
            var        dtArg = sArg.Type.Accept(TypeLoader);
            var        prim  = dtArg as PrimitiveType;

            if (dtArg.Size <= 8)
            {
                if (this.ir >= iregs.Length)
                {
                    arg = argser.Deserialize(sArg, new StackVariable_v1());
                }
                else
                {
                    arg = argser.Deserialize(sArg, new Register_v1 {
                        Name = iregs[ir]
                    });
                }
                ++this.ir;
                return(arg);
            }
            //int regsNeeded = (dtArg.Size + 7) / 8;
            //if (regsNeeded > 4 || ir + regsNeeded >= iregs.Length)
            //{
            //    return argser.Deserialize(sArg, new StackVariable_v1());
            //}
            throw new NotImplementedException();
        }
コード例 #5
0
        public override Storage GetReturnRegister(Argument_v1 sArg, int bitSize)
        {
            var dtArg = sArg.Type.Accept(TypeLoader) as PrimitiveType;

            if (dtArg != null && dtArg.Domain == Domain.Real)
            {
                var xmm0 = Architecture.GetRegister("xmm0");
                if (bitSize <= 64)
                {
                    return(xmm0);
                }
                if (bitSize <= 128)
                {
                    var xmm1 = Architecture.GetRegister("xmm1");
                    return(new SequenceStorage(xmm1, xmm0));
                }
                throw new NotImplementedException();
            }
            var rax = Architecture.GetRegister("rax");

            if (bitSize <= 64)
            {
                return(rax);
            }
            if (bitSize <= 128)
            {
                var rdx = Architecture.GetRegister("rdx");
                return(new SequenceStorage(rdx, rax));
            }
            throw new NotImplementedException();
        }
コード例 #6
0
ファイル: X86ProcedureSerializer.cs プロジェクト: Godzil/reko
        public override Storage GetReturnRegister(Argument_v1 sArg, int bitSize)
        {
            var dtArg = sArg.Type.Accept(TypeLoader) as PrimitiveType;

            if (dtArg != null && dtArg.Domain == Domain.Real)
            {
                return(argser.Deserialize(new FpuStackVariable_v1 {
                    ByteSize = dtArg.Size
                }).Storage);
            }
            var eax = Architecture.GetRegister("eax");

            if (bitSize <= 32)
            {
                return(eax);
            }
            if (bitSize <= 64)
            {
                var edx = Architecture.GetRegister("edx");
                return(new SequenceStorage(
                           new Identifier(edx.Name, edx.DataType, edx),
                           new Identifier(eax.Name, eax.DataType, eax)));
            }
            throw new NotImplementedException();
        }
コード例 #7
0
        public override Storage GetReturnRegister(Argument_v1 sArg, int bitSize)
        {
            var dtArg = sArg.Type.Accept(TypeLoader);
            var ptArg = dtArg as PrimitiveType;

            if (ptArg != null)
            {
                if (ptArg.Domain == Domain.Real)
                {
                    var f0 = Architecture.GetRegister("f0");
                    if (ptArg.Size <= 4)
                    {
                        return(f0);
                    }
                    var f1 = Architecture.GetRegister("f1");
                    return(new SequenceStorage(f1, f0));
                }
                return(Architecture.GetRegister("o0"));
            }
            else if (dtArg is Pointer)
            {
                return(Architecture.GetRegister("o0"));
            }
            else if (dtArg.Size <= this.Architecture.WordWidth.Size)
            {
                return(Architecture.GetRegister("o0"));
            }
            throw new NotImplementedException();
        }
コード例 #8
0
        public override Storage GetReturnRegister(Argument_v1 sArg, int bitSize)
        {
            var dtArg = sArg.Type.Accept(TypeLoader) as PrimitiveType;

            if (dtArg != null && dtArg.Domain == Domain.Real)
            {
                var f0 = Architecture.GetRegister("f0");
                if (bitSize <= 64)
                {
                    return(f0);
                }
                throw new NotImplementedException();
            }
            var v0 = Architecture.GetRegister("r2");

            if (bitSize <= 32)
            {
                return(v0);
            }
            if (bitSize <= 64)
            {
                var v1 = Architecture.GetRegister("r3");
                return(new SequenceStorage(v1, v0));
            }
            throw new NotImplementedException();
        }
コード例 #9
0
        public Func<NamedDataType, NamedDataType> VisitFunction(FunctionDeclarator function)
        {
            var fn = function.Declarator.Accept(this);
            return (nt) =>
            {
                var parameters = function.Parameters
                    .Select(p => ConvertParameter(p))
                    .ToArray();

                // Special case for C, where foo(void) means a function with no parameters,
                // not a function with one parameter of type "void".
                if (FirstParameterVoid(parameters))
                    parameters = new Argument_v1[0];

                Argument_v1 ret = null;
                if (nt.DataType != null)
                {
                    ret = new Argument_v1
                    {
                        Type = nt.DataType,
                    };
                }
                nt.DataType = new SerializedSignature
                {
                    Convention = callingConvention != CTokenType.None
                        ? callingConvention.ToString().ToLower()
                        : null,
                    ReturnValue = ret,
                    Arguments = parameters.ToArray(),
                };
                return fn(nt);
            };
        }
コード例 #10
0
        public override Storage GetReturnRegister(Argument_v1 sArg, int bitSize)
        {
            if (bitSize == 0)
            {
                bitSize = Architecture.WordWidth.BitSize;
            }
            switch (bitSize)
            {
            case 32:
                if (Architecture.WordWidth.BitSize == 16)
                {
                    return(new SequenceStorage(
                               Architecture.GetRegister("dx"),
                               Architecture.GetRegister("ax")));
                }
                break;

            case 64: if (Architecture.WordWidth.BitSize == 32)
                {
                    return(new SequenceStorage(
                               Architecture.GetRegister("edx"),
                               Architecture.GetRegister("eax")));
                }
                break;
            }
            var reg = Architecture.GetRegister("rax");

            return(Architecture.GetSubregister(reg, 0, bitSize));
        }
コード例 #11
0
        /// <summary>
        /// Deserializes an argument.
        /// </summary>
        /// <param name="arg"></param>
        /// <param name="idx"></param>
        /// <param name="convention"></param>
        /// <returns></returns>
        public Identifier DeserializeArgument(Argument_v1 arg, int idx, string convention)
        {
            if (arg.Kind != null)
            {
                return(argser.Deserialize(arg, arg.Kind));
            }
            if (convention == null)
            {
                return(argser.Deserialize(arg, new StackVariable_v1()));
            }
            switch (convention)
            {
            case "":
            case "stdapi":
            case "__cdecl":
            case "__stdcall":
            case "pascal":
                return(argser.Deserialize(arg, new StackVariable_v1 {
                }));

            case "__thiscall":
                if (idx == 0)
                {
                    return(argser.Deserialize(arg, new Register_v1("ecx")));
                }
                else
                {
                    return(argser.Deserialize(arg, new StackVariable_v1()));
                }
            }
            throw new NotSupportedException(string.Format("Unsupported calling convention '{0}'.", convention));
        }
コード例 #12
0
 public override Storage GetReturnRegister(Argument_v1 sArg, int bitSize)
 {
     if (bitSize > 64)
     {
         throw new NotImplementedException("Large return values not implemented yet");
     }
     return(Architecture.GetRegister(IsReal(sArg.Type) ? "xmm0" : "rax"));
 }
コード例 #13
0
 public override Storage GetReturnRegister(Argument_v1 sArg, int bitSize)
 {
     if (bitSize <= 32)
     {
         return(Architecture.GetRegister("d0"));
     }
     throw new NotImplementedException();
 }
コード例 #14
0
 public Identifier DeserializeArgument(Argument_v1 sArg, int idx, string convention)
 {
     if (sArg.Kind != null)
     {
         return(argser.Deserialize(sArg, sArg.Kind));
     }
     return(argser.Deserialize(sArg, new StackVariable_v1()));
 }
コード例 #15
0
        public void SargSerializeFlag()
        {
            var         arg  = new Identifier("SZ", PrimitiveType.Byte, new FlagGroupStorage(3, "SZ", PrimitiveType.Byte));
            Argument_v1 sarg = argser.Serialize(arg);

            Assert.AreEqual("SZ", sarg.Name);
            FlagGroup_v1 sflag = (FlagGroup_v1)sarg.Kind;

            Assert.AreEqual("SZ", sflag.Name);
        }
コード例 #16
0
        public void SargWriteNamelessRegisterArgument()
        {
            Argument_v1 sarg = new Argument_v1
            {
                Type = new TypeReference_v1("int"),
                Kind = new Register_v1("eax"),
            };

            Verify(sarg, "Core/SargWriteNamelessRegisterArgument.txt");
        }
コード例 #17
0
ファイル: ArgumentTests.cs プロジェクト: mmyydd/reko
        public void SargWriteRegisterArgument()
        {
            Argument_v1 sarg = new Argument_v1 {
                Name = "foo",
                Type = new SerializedTypeReference("int"),
                Kind = new Register_v1("eax"),
            };

            Verify(sarg, "Core/SargWriteRegisterArgument.txt");
        }
コード例 #18
0
        public void SargWriteStackArgument()
        {
            Argument_v1 sarg = new Argument_v1
            {
                Name = "bar",
                Type = new TypeReference_v1("int"),
                Kind = new StackVariable_v1()
            };

            Verify(sarg, "Core/SargWriteStackArgument.txt");
        }
コード例 #19
0
        public void ArgSer_SerializeRegister()
        {
            var         arg  = new Identifier(Registers.ax.Name, Registers.ax.DataType, Registers.ax);
            Argument_v1 sarg = argser.Serialize(arg);

            Assert.AreEqual("ax", sarg.Name);
            Register_v1 sreg = (Register_v1)sarg.Kind;

            Assert.IsNotNull(sreg);
            Assert.AreEqual("ax", sreg.Name);
        }
コード例 #20
0
        private Identifier DeserializeImplicitThisArgument(SerializedSignature ss)
        {
            var sArg = new Argument_v1
            {
                Type = new PointerType_v1(ss.EnclosingType),
                Name = "this",
                Kind = new Register_v1("rcx")
            };
            var arg = argDeser.Deserialize(sArg);

            return(arg);
        }
コード例 #21
0
        public void SargWriteOutArgument()
        {
            Argument_v1 sarg = new Argument_v1
            {
                Name         = "bxOut",
                Type         = new TypeReference_v1("int"),
                OutParameter = true,
                Kind         = new Register_v1("bx")
            };

            Verify(sarg, "Core/SargWriteOutArgument.txt");
        }
コード例 #22
0
        private void Verify(Argument_v1 sarg, string outputFilename)
        {
            using (FileUnitTester fut = new FileUnitTester(outputFilename))
            {
                XmlTextWriter x = new FilteringXmlWriter(fut.TextWriter);
                x.Formatting = Formatting.Indented;
                XmlSerializer ser = SerializedLibrary.CreateSerializer_v1(sarg.GetType());
                ser.Serialize(x, sarg);

                fut.AssertFilesEqual();
            }
        }
コード例 #23
0
        public void ArgSer_SerializeOutArgument()
        {
            Identifier id = new Identifier("qOut", PrimitiveType.Word32,
                                           new OutArgumentStorage(new Identifier("q", PrimitiveType.Word32, new RegisterStorage("q", 4, 0, PrimitiveType.Word32))));
            Argument_v1 arg = argser.Serialize(id);

            Assert.AreEqual("qOut", arg.Name);
            Assert.IsTrue(arg.OutParameter);
            Register_v1 sr = (Register_v1)arg.Kind;

            Assert.AreEqual("q", sr.Name);
        }
コード例 #24
0
        public override Storage GetReturnRegister(Argument_v1 sArg, int bitSize)
        {
            var prim = sArg.Type as PrimitiveType_v1;

            if (prim != null)
            {
                if (prim.Domain == Domain.Real)
                {
                    return(Architecture.GetRegister("f1"));
                }
            }
            return(Architecture.GetRegister("r3"));
        }
コード例 #25
0
        public void ArgSer_DeserializeRegister()
        {
            Register_v1 reg = new Register_v1("eax");
            Argument_v1 arg = new Argument_v1
            {
                Name = "eax",
                Kind = reg,
            };
            Identifier id = argser.Deserialize(arg);

            Assert.AreEqual("eax", id.Name);
            Assert.AreEqual(32, id.DataType.BitSize);
        }
コード例 #26
0
ファイル: SignatureParser.cs プロジェクト: olivierh59500/reko
        private Argument_v1 ParseArg()
        {
            var w = GetNextWord();

            if (w == null)
            {
                return(null);
            }

            RegisterStorage reg;
            string          type = null;

            if (!arch.TryGetRegister(w, out reg))
            {
                type = w;
                w    = GetNextWord();
                if (w == null)
                {
                    return(null);
                }
                if (w.Contains("_"))
                {
                    var retval = ParseRegisterSequenceWithUnderscore(w);
                    if (retval != null)
                    {
                        return(retval);
                    }
                }
                if (!arch.TryGetRegister(w, out reg))
                {
                    return(ParseStackArgument(type, w));
                }
            }

            if (PeekChar(':') || PeekChar('_'))
            {
                return(ParseRegisterSequence(reg, type));
            }

            var arg = new Argument_v1()
            {
                Name         = reg.Name,
                Kind         = new Register_v1(reg.Name),
                OutParameter = false,
                Type         = new TypeReference_v1 {
                    TypeName = type
                },
            };

            return(arg);
        }
コード例 #27
0
        public override Storage GetReturnRegister(Argument_v1 sArg, int bitSize)
        {
            if (sArg.Kind == null)
            {
                throw new NotImplementedException();
            }
            var reg = sArg.Kind as Register_v1;

            if (reg != null)
            {
                return(Architecture.GetRegister(reg.Name));
            }
            throw new NotImplementedException();
        }
コード例 #28
0
        public void ArgSet_DerserializeReturnRegisterWithType()
        {
            var arg = new Argument_v1
            {
                Kind = new Register_v1("eax"),
                Type = new PointerType_v1 {
                    DataType = new PrimitiveType_v1 {
                        ByteSize = 1, Domain = Domain.Character
                    }
                }
            };
            var id = argser.DeserializeReturnValue(arg);

            Assert.AreEqual("(ptr char)", id.DataType.ToString());
        }
コード例 #29
0
        public void SsigDeserializeOutArgument()
        {
            Argument_v1 arg = new Argument_v1
            {
                Kind         = new Register_v1("bp"),
                OutParameter = true
            };
            SerializedSignature sig = new SerializedSignature();

            sig.Arguments = new Argument_v1[] { arg };
            Given_X86ProcedureSerializer();
            FunctionType ps = sser.Deserialize(sig, arch.CreateFrame());

            Assert.AreEqual("void foo(Register out ptr16 bpOut)", ps.ToString("foo"));
        }
コード例 #30
0
        public void ArgSer_DeserializeStackVariable()
        {
            var arg = new Argument_v1
            {
                Kind = new StackVariable_v1(),
                Type = new PointerType_v1 {
                    DataType = new PrimitiveType_v1 {
                        ByteSize = 1, Domain = Domain.Character
                    }
                }
            };
            var id = argser.Deserialize(arg);

            Assert.AreEqual("ptrArg04", id.Name);
            Assert.AreEqual("(ptr char)", id.DataType.ToString());
        }