Beispiel #1
0
        /// <summary>
        /// Attributes named [[reko::reg(&lt;tokens&gt;)]] expect a single register
        /// in &lt;tokens&gt;. Remaining tokens are ignored
        /// </summary>
        /// <param name="attrs"></param>
        /// <returns></returns>
        public SerializedKind GetArgumentKindFromAttributes(string paramType, List <CAttribute> attrs)
        {
            if (attrs == null)
            {
                return(null);
            }
            SerializedKind kind = null;

            foreach (var attr in attrs)
            {
                if (attr.Name.Components == null || attr.Name.Components.Length != 2 ||
                    attr.Name.Components[0] != "reko" || attr.Name.Components[1] != paramType)
                {
                    continue;
                }
                if (attr.Tokens[0].Type != CTokenType.Register ||
                    attr.Tokens[1].Type != CTokenType.Comma)
                {
                    continue;
                }
                // We have a reko::arg(register, prefix; get the register.
                if (attr.Tokens.Count < 1 || attr.Tokens[2].Type != CTokenType.StringLiteral)
                {
                    throw new FormatException("[[reko::arg(register,<name>)]] attribute expects a register name.");
                }
                kind = new Register_v1 {
                    Name = (string)attr.Tokens[2].Value
                };
            }
            return(kind);
        }
Beispiel #2
0
 /// <summary>
 /// Attributes named [[reko::reg(&lt;tokens&gt;)]] expect a single register
 /// in &lt;tokens&gt;. Remaining tokens are ignored
 /// </summary>
 /// <param name="attrs"></param>
 /// <returns></returns>
 public SerializedKind GetArgumentKindFromAttributes(string paramType, List<CAttribute> attrs)
 {
     if (attrs == null)
         return null;
     SerializedKind kind = null;
     foreach (var attr in attrs)
     {
         if (attr.Name.Components == null || attr.Name.Components.Length != 2 ||
             attr.Name.Components[0] != "reko" || attr.Name.Components[1] != paramType)
             continue;
         if (attr.Tokens[0].Type == CTokenType.Register &&
             attr.Tokens[1].Type == CTokenType.Comma)
         {
             // We have a reko::arg(register, prefix; get the register.
             if (attr.Tokens.Count < 1 || attr.Tokens[2].Type != CTokenType.StringLiteral)
                 throw new FormatException("[[reko::arg(register,<name>)]] attribute expects a register name.");
             kind = new Register_v1 { Name = (string)attr.Tokens[2].Value };
         } else if (attr.Tokens[0].Type == CTokenType.Id &&
                    (string)attr.Tokens[0].Value == "fpu")
         {
             // We have a reko::fpu prefix; mark as FPU
             kind = new FpuStackVariable_v1();
         }
     }
     return kind;
 }
        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);
        }
        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);
        }
Beispiel #5
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);
        }
Beispiel #6
0
        public void PpcPs_Serialize()
        {
            Given_ProcedureSerializer();
            ProcedureSignature sig = new ProcedureSignature(
                new Identifier("qax", PrimitiveType.Word32, arch.Registers[3]),
                new Identifier[] {
                new Identifier("qbx", PrimitiveType.Word32, arch.Registers[3])
            });

            SerializedSignature ssig = ser.Serialize(sig);

            Assert.IsNotNull(ssig.ReturnValue);
            Assert.AreEqual("qax", ssig.ReturnValue.Name);
            Register_v1 sreg = (Register_v1)ssig.ReturnValue.Kind;

            Assert.AreEqual("r3", sreg.Name);
        }
Beispiel #7
0
        public void X86ps_Test()
        {
            Given_ProcedureSerializer("stdapi");
            FunctionType sig = new FunctionType(
                new Identifier("qax", PrimitiveType.Word32, Registers.eax),
                new Identifier[] {
                new Identifier("qbx", PrimitiveType.Word32, Registers.ebx)
            });

            SerializedSignature ssig = ser.Serialize(sig);

            Assert.IsNotNull(ssig.ReturnValue);
            Assert.AreEqual("qax", ssig.ReturnValue.Name);
            Register_v1 sreg = (Register_v1)ssig.ReturnValue.Kind;

            Assert.AreEqual("eax", sreg.Name);
        }
        public void SvAmdPs_Serialize()
        {
            Given_ProcedureSerializer();

            mr.ReplayAll();

            var sig = new ProcedureSignature(
                new Identifier("rbx", PrimitiveType.Word32, arch.GetRegister("rbx")),
                new Identifier[] {
                new Identifier("rbx", PrimitiveType.Word32, arch.GetRegister("rbx"))
            });

            SerializedSignature ssig = ser.Serialize(sig);

            Assert.IsNotNull(ssig.ReturnValue);
            Assert.AreEqual("rbx", ssig.ReturnValue.Name);
            Register_v1 sreg = (Register_v1)ssig.ReturnValue.Kind;

            Assert.AreEqual("rbx", sreg.Name);
        }