(Ada/AArch64) fix fixed point argument passing in inferior funcall
authorXavier Roirand <roirand@adacore.com>
Fri, 12 May 2017 13:02:28 +0000 (15:02 +0200)
committerTom Tromey <tromey@adacore.com>
Thu, 2 Dec 2021 16:08:50 +0000 (09:08 -0700)
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.

gdb/aarch64-tdep.c
gdb/testsuite/gdb.ada/fixed_points_function.exp [new file with mode: 0644]
gdb/testsuite/gdb.ada/fixed_points_function/fixed_points_function.adb [new file with mode: 0644]
gdb/testsuite/gdb.ada/fixed_points_function/pck.adb [new file with mode: 0644]
gdb/testsuite/gdb.ada/fixed_points_function/pck.ads [new file with mode: 0644]

index 31d239bc34fb86ec999b5588a50a48cdc82f2dbb..3287499ab05944984eb63a1549978226b782a79d 100644 (file)
@@ -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 (file)
index 0000000..5a721fd
--- /dev/null
@@ -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 (file)
index 0000000..4f82a27
--- /dev/null
@@ -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 (file)
index 0000000..d8766fe
--- /dev/null
@@ -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 (file)
index 0000000..4ef29a8
--- /dev/null
@@ -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;