[binutils-gdb] gdb/riscv: Handle passing variadic floating point arguments

Andrew Burgess aburgess@sourceware.org
Wed Dec 12 14:22:00 GMT 2018


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=4de3d8d06673d130e256a6ad81e5df2e412934c1

commit 4de3d8d06673d130e256a6ad81e5df2e412934c1
Author: Andrew Burgess <andrew.burgess@embecosm.com>
Date:   Tue Dec 4 15:56:09 2018 +0000

    gdb/riscv: Handle passing variadic floating point arguments
    
    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.

Diff:
---
 gdb/ChangeLog    | 6 ++++++
 gdb/riscv-tdep.c | 5 +++--
 2 files changed, 9 insertions(+), 2 deletions(-)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 3d35d3b..687c5ae 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -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.
diff --git a/gdb/riscv-tdep.c b/gdb/riscv-tdep.c
index 5ddec70..fc424fb 100644
--- a/gdb/riscv-tdep.c
+++ b/gdb/riscv-tdep.c
@@ -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;



More information about the Gdb-cvs mailing list