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.
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 @@ } # 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 @@ # 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 \