diff options
author | Tom Tromey <tromey@adacore.com> | 2023-04-12 09:30:21 -0600 |
---|---|---|
committer | Tom Tromey <tromey@adacore.com> | 2023-05-12 12:11:35 -0600 |
commit | 61f9fb1ea4aab3cd42bfcaaee2a05ac0dbe18a22 (patch) | |
tree | da773c5cdf0f520dd05803c61e25ff6980282db4 | |
parent | 6a667807390b7091b5ec088d979c779f65d3dfa5 (diff) | |
download | gdb-61f9fb1ea4aab3cd42bfcaaee2a05ac0dbe18a22.zip gdb-61f9fb1ea4aab3cd42bfcaaee2a05ac0dbe18a22.tar.gz gdb-61f9fb1ea4aab3cd42bfcaaee2a05ac0dbe18a22.tar.bz2 |
Fix calling debuginfo-less functions in Ada
A co-worker at AdaCore noticed that calling a function without
debuginfo yields:
(gdb) print plus_one(23)
'pck.plus_one' has unknown return type; cast the call to its declared return type
However, this also happens if you follow the directions and add the
cast.
This patch fixes the problem and adds a regression test.
-rw-r--r-- | gdb/ada-lang.c | 2 | ||||
-rw-r--r-- | gdb/testsuite/gdb.ada/call-no-debug.exp | 45 | ||||
-rw-r--r-- | gdb/testsuite/gdb.ada/call-no-debug/pck.adb | 21 | ||||
-rw-r--r-- | gdb/testsuite/gdb.ada/call-no-debug/pck.ads | 18 | ||||
-rw-r--r-- | gdb/testsuite/gdb.ada/call-no-debug/prog.adb | 22 | ||||
-rw-r--r-- | gdb/testsuite/lib/ada.exp | 7 |
6 files changed, 113 insertions, 2 deletions
diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c index 50d5c6f..df5fd80 100644 --- a/gdb/ada-lang.c +++ b/gdb/ada-lang.c @@ -11228,7 +11228,7 @@ ada_funcall_operation::evaluate (struct type *expect_type, error_call_unknown_return_type (NULL); return value::allocate (type->target_type ()); } - return call_function_by_hand (callee, NULL, argvec); + return call_function_by_hand (callee, expect_type, argvec); case TYPE_CODE_INTERNAL_FUNCTION: if (noside == EVAL_AVOID_SIDE_EFFECTS) /* We don't know anything about what the internal diff --git a/gdb/testsuite/gdb.ada/call-no-debug.exp b/gdb/testsuite/gdb.ada/call-no-debug.exp new file mode 100644 index 0000000..422b837 --- /dev/null +++ b/gdb/testsuite/gdb.ada/call-no-debug.exp @@ -0,0 +1,45 @@ +# Copyright 2023 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/>. + +# Test calling a function without debug info. + +load_lib "ada.exp" + +require allow_ada_tests + +standard_ada_testfile prog + +# Compile pck without debuginfo but prog with it. +if {[gdb_compile_ada $srcdir/$subdir/$testdir/pck.adb \ + [standard_output_file pck.o] object {}] != ""} { + return +} + +if {[gdb_compile_ada "${srcfile}" "${binfile}" executable \ + {debug no-force}] != ""} { + return -1 +} + +clean_restart ${testfile} + +set bp_location [gdb_get_line_number "STOP" ${testdir}/prog.adb] +runto "prog.adb:$bp_location" + +# Verify that the function was built without debuginfo. +gdb_test "print plus_one(23)" \ + "plus_one.* has unknown return type; cast the call to its declared return type" \ + "call function without debuginfo" +gdb_test "print integer (plus_one(23))" " = 24" \ + "use cast to call function without debuginfo" diff --git a/gdb/testsuite/gdb.ada/call-no-debug/pck.adb b/gdb/testsuite/gdb.ada/call-no-debug/pck.adb new file mode 100644 index 0000000..fb74d6c --- /dev/null +++ b/gdb/testsuite/gdb.ada/call-no-debug/pck.adb @@ -0,0 +1,21 @@ +-- Copyright 2023 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 Plus_One (A : Integer) return Integer is + begin + return A + 1; + end Plus_One; +end Pck; diff --git a/gdb/testsuite/gdb.ada/call-no-debug/pck.ads b/gdb/testsuite/gdb.ada/call-no-debug/pck.ads new file mode 100644 index 0000000..7b353de --- /dev/null +++ b/gdb/testsuite/gdb.ada/call-no-debug/pck.ads @@ -0,0 +1,18 @@ +-- Copyright 2023 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 + function Plus_One (A : Integer) return Integer; +end Pck; diff --git a/gdb/testsuite/gdb.ada/call-no-debug/prog.adb b/gdb/testsuite/gdb.ada/call-no-debug/prog.adb new file mode 100644 index 0000000..27b7a7f --- /dev/null +++ b/gdb/testsuite/gdb.ada/call-no-debug/prog.adb @@ -0,0 +1,22 @@ +-- Copyright 2023 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 Prog is + X : Integer := Plus_One (23); +begin + null; -- STOP +end Prog; diff --git a/gdb/testsuite/lib/ada.exp b/gdb/testsuite/lib/ada.exp index 4395f31..b728e3a 100644 --- a/gdb/testsuite/lib/ada.exp +++ b/gdb/testsuite/lib/ada.exp @@ -51,6 +51,9 @@ proc target_compile_ada_from_dir {builddir source dest type options} { } # Compile some Ada code. Return "" if the compile was successful. +# OPTIONS are as for target_compile, but with this addition: +# "no-force" - do not pass -f to gnatmake. By default -f is +# used, forcing a full recompilation. proc gdb_compile_ada_1 {source dest type options} { @@ -66,7 +69,9 @@ proc gdb_compile_ada_1 {source dest type options} { # and it avoids using a stray objfile file from a long-past # run, for instance. append options " ada" - append options " additional_flags=-f" + if {[lsearch -exact $options no-force] == -1} { + append options " additional_flags=-f" + } append options " additional_flags=-I$srcdir" set result [target_compile_ada_from_dir \ |