summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Burgess <andrew.burgess@embecosm.com>2018-12-04 15:56:09 +0000
committerAndrew Burgess <andrew.burgess@embecosm.com>2018-12-12 14:21:31 +0000
commit4de3d8d06673d130e256a6ad81e5df2e412934c1 (patch)
tree042cceb76e5a824b6b97adfea68570a0c85a6a2c
parent13dc50ee16e1ff4180da61bdbd86e4a3c304b283 (diff)
downloadbinutils-gdb-4de3d8d06673d130e256a6ad81e5df2e412934c1.tar.gz
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.
-rw-r--r--gdb/ChangeLog6
-rw-r--r--gdb/riscv-tdep.c5
2 files changed, 9 insertions, 2 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 3d35d3b4b8f..687c5ae961e 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 5ddec703071..fc424fb042c 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;