aboutsummaryrefslogtreecommitdiff
path: root/gdb
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
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')
-rw-r--r--gdb/aarch64-tdep.c2
-rw-r--r--gdb/testsuite/gdb.ada/fixed_points_function.exp38
-rw-r--r--gdb/testsuite/gdb.ada/fixed_points_function/fixed_points_function.adb30
-rw-r--r--gdb/testsuite/gdb.ada/fixed_points_function/pck.adb22
-rw-r--r--gdb/testsuite/gdb.ada/fixed_points_function/pck.ads21
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;