From 61f9fb1ea4aab3cd42bfcaaee2a05ac0dbe18a22 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Wed, 12 Apr 2023 09:30:21 -0600 Subject: [PATCH] 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. --- gdb/ada-lang.c | 2 +- gdb/testsuite/gdb.ada/call-no-debug.exp | 45 ++++++++++++++++++++ gdb/testsuite/gdb.ada/call-no-debug/pck.adb | 21 +++++++++ gdb/testsuite/gdb.ada/call-no-debug/pck.ads | 18 ++++++++ gdb/testsuite/gdb.ada/call-no-debug/prog.adb | 22 ++++++++++ gdb/testsuite/lib/ada.exp | 7 ++- 6 files changed, 113 insertions(+), 2 deletions(-) create mode 100644 gdb/testsuite/gdb.ada/call-no-debug.exp create mode 100644 gdb/testsuite/gdb.ada/call-no-debug/pck.adb create mode 100644 gdb/testsuite/gdb.ada/call-no-debug/pck.ads create mode 100644 gdb/testsuite/gdb.ada/call-no-debug/prog.adb diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c index 50d5c6f9697..df5fd80414d 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 00000000000..422b83761d9 --- /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 . + +# 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 00000000000..fb74d6c464e --- /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 . + +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 00000000000..7b353de765c --- /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 . + +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 00000000000..27b7a7f02bf --- /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 . + +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 4395f31ad94..b728e3a2aba 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 \ -- 2.30.2