forked from Imagelibrary/binutils-gdb
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:
@@ -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
|
||||
|
||||
45
gdb/testsuite/gdb.ada/call-no-debug.exp
Normal file
45
gdb/testsuite/gdb.ada/call-no-debug.exp
Normal 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"
|
||||
21
gdb/testsuite/gdb.ada/call-no-debug/pck.adb
Normal file
21
gdb/testsuite/gdb.ada/call-no-debug/pck.adb
Normal 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;
|
||||
18
gdb/testsuite/gdb.ada/call-no-debug/pck.ads
Normal file
18
gdb/testsuite/gdb.ada/call-no-debug/pck.ads
Normal 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;
|
||||
22
gdb/testsuite/gdb.ada/call-no-debug/prog.adb
Normal file
22
gdb/testsuite/gdb.ada/call-no-debug/prog.adb
Normal 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;
|
||||
@@ -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 \
|
||||
|
||||
Reference in New Issue
Block a user