gdb/riscv: Handle passing variadic floating point arguments
authorAndrew Burgess <andrew.burgess@embecosm.com>
Tue, 4 Dec 2018 15:56:09 +0000 (15:56 +0000)
committerAndrew Burgess <andrew.burgess@embecosm.com>
Wed, 12 Dec 2018 14:21:31 +0000 (14:21 +0000)
This commit fixes some test failures in gdb.base/varargs.exp when
running on targets with floating point hardware.  Floating point
unnamed (variadic) arguments should be passed in integer registers
according to the abi.

After this commit I see no failures in gdb.base/varargs.exp on 32 or
64 bit targets with floating point hardware.

gdb/ChangeLog:

* riscv-tdep.c (riscv_call_arg_scalar_float): Unnamed (variadic)
arguments are passed in integer registers.
(riscv_call_arg_complex_float): Likewise.

gdb/ChangeLog
gdb/riscv-tdep.c

index 3d35d3b..687c5ae 100644 (file)
@@ -1,3 +1,9 @@
+2018-12-12  Andrew Burgess  <andrew.burgess@embecosm.com>
+
+       * riscv-tdep.c (riscv_call_arg_scalar_float): Unnamed (variadic)
+       arguments are passed in integer registers.
+       (riscv_call_arg_complex_float): Likewise.
+
 2018-12-11  Philippe Waroquiers  <philippe.waroquiers@skynet.be>
 
        * nat/linux-osdata.c (common_getter): New function.
index 5ddec70..fc424fb 100644 (file)
@@ -1935,7 +1935,7 @@ static void
 riscv_call_arg_scalar_float (struct riscv_arg_info *ainfo,
                             struct riscv_call_info *cinfo)
 {
-  if (ainfo->length > cinfo->flen)
+  if (ainfo->length > cinfo->flen || ainfo->is_unnamed)
     return riscv_call_arg_scalar_int (ainfo, cinfo);
   else
     {
@@ -1955,7 +1955,8 @@ riscv_call_arg_complex_float (struct riscv_arg_info *ainfo,
                              struct riscv_call_info *cinfo)
 {
   if (ainfo->length <= (2 * cinfo->flen)
-      && riscv_arg_regs_available (&cinfo->float_regs) >= 2)
+      && riscv_arg_regs_available (&cinfo->float_regs) >= 2
+      && !ainfo->is_unnamed)
     {
       bool result;
       int len = ainfo->length / 2;