aboutsummaryrefslogtreecommitdiff
path: root/gdb/aarch64-tdep.c
diff options
context:
space:
mode:
authorXavier Roirand <roirand@adacore.com>2017-05-12 15:02:28 +0200
committerTom Tromey <tromey@adacore.com>2021-12-02 09:08:50 -0700
commit28397ae781e0780259648991f981909c5a5045e7 (patch)
tree965ddb40bfaf93324d408a37c727baf02ef3b439 /gdb/aarch64-tdep.c
parentbc75fb44c5693114b3dc654a2e4b39c9b5a9ca26 (diff)
downloadbinutils-28397ae781e0780259648991f981909c5a5045e7.zip
binutils-28397ae781e0780259648991f981909c5a5045e7.tar.gz
binutils-28397ae781e0780259648991f981909c5a5045e7.tar.bz2
(Ada/AArch64) fix fixed point argument passing in inferior funcall
Consider the following code: type FP1_Type is delta 0.1 range -1.0 .. +1.0; -- Ordinary function Call_FP1 (F : FP1_Type) return FP1_Type is begin return F; end Call_FP1; When the default in GCC is to generate proper DWARF info for fixed point types, then in gdb, printing the result of a call to call_fp1 with a decimal parameter leads to: (gdb) p call_fp1(0.5) $1 = 0 The displayed value is wrong, and we actually expected: (gdb) p call_fp1(0.5) $1 = 0.5 What happened is that our fixed point type parameter got promoted to a 32bit integer because we detected that the length of that object was less than 4 bytes. The compiler does not perform this promotion and therefore GDB should not either. This patch fixes the behavior described above.
Diffstat (limited to 'gdb/aarch64-tdep.c')
-rw-r--r--gdb/aarch64-tdep.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/gdb/aarch64-tdep.c b/gdb/aarch64-tdep.c
index 31d239b..3287499 100644
--- a/gdb/aarch64-tdep.c
+++ b/gdb/aarch64-tdep.c
@@ -1917,7 +1917,7 @@ aarch64_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
case TYPE_CODE_CHAR:
case TYPE_CODE_RANGE:
case TYPE_CODE_ENUM:
- if (len < 4)
+ if (len < 4 && !is_fixed_point_type (arg_type))
{
/* Promote to 32 bit integer. */
if (arg_type->is_unsigned ())