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 | |
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')
-rw-r--r-- | gdb/aarch64-tdep.c | 2 | ||||
-rw-r--r-- | gdb/testsuite/gdb.ada/fixed_points_function.exp | 38 | ||||
-rw-r--r-- | gdb/testsuite/gdb.ada/fixed_points_function/fixed_points_function.adb | 30 | ||||
-rw-r--r-- | gdb/testsuite/gdb.ada/fixed_points_function/pck.adb | 22 | ||||
-rw-r--r-- | gdb/testsuite/gdb.ada/fixed_points_function/pck.ads | 21 |
5 files changed, 112 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 ()) diff --git a/gdb/testsuite/gdb.ada/fixed_points_function.exp b/gdb/testsuite/gdb.ada/fixed_points_function.exp new file mode 100644 index 0000000..5a721fd --- /dev/null +++ b/gdb/testsuite/gdb.ada/fixed_points_function.exp @@ -0,0 +1,38 @@ +# Copyright 2021 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +load_lib "ada.exp" + +if { [skip_ada_tests] } { return -1 } + +standard_ada_testfile fixed_points_function + +if {[gdb_compile_ada "${srcfile}" "${binfile}" executable [list debug]] != "" } { + return -1 +} + +clean_restart ${testfile} + +set bp_location [gdb_get_line_number "STOP" ${testdir}/fixed_points_function.adb] +runto "fixed_points_function.adb:$bp_location" + +gdb_test "print call_fp1(1)" \ + " = 1" + +gdb_test "print call_fp1(0.5)" \ + " = 0.5" + +gdb_test "print call_fp1(-0.5)" \ + " = -0.5" diff --git a/gdb/testsuite/gdb.ada/fixed_points_function/fixed_points_function.adb b/gdb/testsuite/gdb.ada/fixed_points_function/fixed_points_function.adb new file mode 100644 index 0000000..4f82a27 --- /dev/null +++ b/gdb/testsuite/gdb.ada/fixed_points_function/fixed_points_function.adb @@ -0,0 +1,30 @@ +-- Copyright 2021 Free Software Foundation, Inc. +-- +-- This program is free software; you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation; either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see <http://www.gnu.org/licenses/>. + +with Pck; use Pck; + +procedure Fixed_Points_Function is + + ------------ + -- Test 1 -- + ------------ + + -- Fixed point funcall + + F1 : FP1_Type := 1.0; + +begin + F1 := Call_FP1 (F1); -- STOP +end Fixed_Points_Function; diff --git a/gdb/testsuite/gdb.ada/fixed_points_function/pck.adb b/gdb/testsuite/gdb.ada/fixed_points_function/pck.adb new file mode 100644 index 0000000..d8766fe --- /dev/null +++ b/gdb/testsuite/gdb.ada/fixed_points_function/pck.adb @@ -0,0 +1,22 @@ +-- Copyright 2021 Free Software Foundation, Inc. +-- +-- This program is free software; you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation; either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see <http://www.gnu.org/licenses/>. + +package body Pck is + + function Call_FP1 (F : FP1_Type) return FP1_Type is + begin + return F; + end Call_FP1; +end pck; diff --git a/gdb/testsuite/gdb.ada/fixed_points_function/pck.ads b/gdb/testsuite/gdb.ada/fixed_points_function/pck.ads new file mode 100644 index 0000000..4ef29a8 --- /dev/null +++ b/gdb/testsuite/gdb.ada/fixed_points_function/pck.ads @@ -0,0 +1,21 @@ +-- Copyright 2021 Free Software Foundation, Inc. +-- +-- This program is free software; you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation; either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see <http://www.gnu.org/licenses/>. + +package Pck is + + type FP1_Type is delta 0.1 range -1.0 .. +1.0; -- Ordinary + + function Call_FP1 (F : FP1_Type) return FP1_Type; +end pck; |