/// <summary> /// Attributes named [[reko::reg(<tokens>)]] expect a single register /// in <tokens>. 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); }
/// <summary> /// Attributes named [[reko::reg(<tokens>)]] expect a single register /// in <tokens>. 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); }
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); }
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); }
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); }