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.
This commit is contained in:
Tom Tromey
2023-04-12 09:30:21 -06:00
parent 6a66780739
commit 61f9fb1ea4
6 changed files with 113 additions and 2 deletions

View File

@@ -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

View File

@@ -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"

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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 \