From 4de3d8d06673d130e256a6ad81e5df2e412934c1 Mon Sep 17 00:00:00 2001 From: Andrew Burgess Date: Tue, 4 Dec 2018 15:56:09 +0000 Subject: [PATCH] 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. --- gdb/ChangeLog | 6 ++++++ gdb/riscv-tdep.c | 5 +++-- 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 + + * 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 * 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; -- 2.30.2