diff options
author | Xavier Roirand <roirand@adacore.com> | 2017-05-12 15:02:28 +0200 |
---|---|---|
committer | Tom Tromey <tromey@adacore.com> | 2021-12-02 09:08:50 -0700 |
commit | 28397ae781e0780259648991f981909c5a5045e7 (patch) | |
tree | 965ddb40bfaf93324d408a37c727baf02ef3b439 /gdb/aarch64-tdep.c | |
parent | bc75fb44c5693114b3dc654a2e4b39c9b5a9ca26 (diff) | |
download | binutils-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.c | 2 |
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 ()) |