From 28397ae781e0780259648991f981909c5a5045e7 Mon Sep 17 00:00:00 2001 From: Xavier Roirand Date: Fri, 12 May 2017 15:02:28 +0200 Subject: [PATCH] (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. --- gdb/aarch64-tdep.c | 2 +- .../gdb.ada/fixed_points_function.exp | 38 +++++++++++++++++++ .../fixed_points_function.adb | 30 +++++++++++++++ .../gdb.ada/fixed_points_function/pck.adb | 22 +++++++++++ .../gdb.ada/fixed_points_function/pck.ads | 21 ++++++++++ 5 files changed, 112 insertions(+), 1 deletion(-) create mode 100644 gdb/testsuite/gdb.ada/fixed_points_function.exp create mode 100644 gdb/testsuite/gdb.ada/fixed_points_function/fixed_points_function.adb create mode 100644 gdb/testsuite/gdb.ada/fixed_points_function/pck.adb create mode 100644 gdb/testsuite/gdb.ada/fixed_points_function/pck.ads diff --git a/gdb/aarch64-tdep.c b/gdb/aarch64-tdep.c index 31d239bc34f..3287499ab05 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 00000000000..5a721fdf4fc --- /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 . + +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 00000000000..4f82a277ff1 --- /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 . + +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 00000000000..d8766fe05f9 --- /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 . + +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 00000000000..4ef29a8f0d8 --- /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 . + +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; -- 2.30.2