[Ada] Add support for subprogram renamings
Consider the following declaration: function Foo (I : Integer) return Integer renames Pack.Bar; As Foo is not materialized as a routine whose name is derived from Foo, GDB currently cannot use it: (gdb) print foo(0) No definition of "foo" in current context. However, compilers can emit DW_TAG_imported_declaration in order to materialize the fact that Foo is actually another name for Pack.Bar. This commit enhances the DWARF reader to record global renamings (it used to put global ones in a static block) and enhances the Ada engine to leverage this information during symbol lookup. gdb/ChangeLog: * ada-lang.c: Include namespace.h (aux_add_nonlocal_symbols): Fix a function name in comment. (ada_add_block_renamings): New. (add_nonlocal_symbols): Add global renamings handling. (ada_lookup_symbol_list_worker): Move the symbol lookup part to... (ada_add_all_symbols): ... this new function. (ada_add_block_symbols): Try to match the input name against the "using directives list", perform a recursive symbol lookup on the matched declarations. * block.h (struct block): Move the_namespace to top-level as namespace_info. Remove the language_specific field. (BLOCK_NAMESPACE): Update access to the namespace_info field. * buildsym.h (using_directives): Rename into... (local_using_directives): ... this. (global_using_directives): New. (struct context_stack): Rename the using_directives field into local_using_directives. * buildsym.c (finish_block_internal): Deal with the proper using directives repository (local or global). (prepare_for_building): Reset local_using_directives. Assert that there is no pending global using directive. (reset_symtab_globals): Reset global_using_directives and local_using_directives. (end_symtab_get_static_block): Don't ignore symtabs that have only using directives. (push_context): Update references to local_using_directives. (buildsym_init): Do not reset using_directives. * cp-support.c: Include namespace.h. * cp-support.h (struct using_direct): Move to namespace.h. (cp_add_using_directives): Move to namespace.h. * cp-namespace.c: Include namespace.h (cp_add_using_directive): Move to namespace.c, rename it to add_using_directive, add a "using_directives" argument and use it as the pending using directives repository. All callers updated. * dwarf2read.c (using_directives): New. (read_import_statement): Call using_directives. (read_func_scope): Update references to local_using_directives. (read_lexical_block_scope): Likewise. (read_namespace): Update the heading comment, call using_directives. * namespace.h: New file. * namespace.c: New file. * Makefile.in (SFILES): Add namespace.c. (COMMON_OBS): Add namespace.o gdb/testsuite/ChangeLog: * gdb.ada/fun_renaming.exp: New testcase. * gdb.ada/fun_renaming/fun_renaming.adb: New file. * gdb.ada/fun_renaming/pack.adb: New file. * gdb.ada/fun_renaming/pack.ads: New file. Tested on x86_64-linux. Support for this in GCC is in the pipeline: see <https://gcc.gnu.org/ml/gcc-patches/2015-07/msg02166.html>.
This commit is contained in:
parent
19c2883a9b
commit
22cee43f9a
15 changed files with 608 additions and 278 deletions
83
gdb/testsuite/gdb.ada/fun_renaming.exp
Normal file
83
gdb/testsuite/gdb.ada/fun_renaming.exp
Normal file
|
@ -0,0 +1,83 @@
|
|||
# Copyright 2015 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/>.
|
||||
|
||||
load_lib "ada.exp"
|
||||
|
||||
standard_ada_testfile fun_renaming
|
||||
|
||||
if {[gdb_compile_ada "${srcfile}" "${binfile}" executable [list debug]] != "" } {
|
||||
return -1
|
||||
}
|
||||
|
||||
clean_restart ${testfile}
|
||||
|
||||
set bp_location [gdb_get_line_number "BREAK" ${testdir}/fun_renaming.adb]
|
||||
runto "fun_renaming.adb:$bp_location"
|
||||
|
||||
# Sanity check: make sure we can call a regular global function.
|
||||
gdb_test "print next(1)" " = 2"
|
||||
|
||||
# Starting with GCC 6, renamed subprograms are materialized in the debugging
|
||||
# information: make sure we can call the regular global function using its
|
||||
# multiple names.
|
||||
|
||||
set test "print n(1)"
|
||||
gdb_test_multiple $test $test {
|
||||
-re " = 2\..*$gdb_prompt $" {
|
||||
pass $test
|
||||
}
|
||||
-re "No definition of \"n\" in current context\..*$gdb_prompt $" {
|
||||
if {[test_compiler_info {gcc-6*}]} {
|
||||
fail $test
|
||||
} else {
|
||||
xfail $test
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
set test "print renamed_next(1)"
|
||||
gdb_test_multiple $test $test {
|
||||
-re " = 2\..*$gdb_prompt $" {
|
||||
pass $test
|
||||
}
|
||||
-re "No definition of \"renamed_next\" in current context\..*$gdb_prompt $" {
|
||||
if {[test_compiler_info {gcc-6*}]} {
|
||||
fail $test
|
||||
} else {
|
||||
xfail $test
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
set test "print pack.renamed_next(1)"
|
||||
gdb_test_multiple $test $test {
|
||||
-re " = 2\..*$gdb_prompt $" {
|
||||
pass $test
|
||||
}
|
||||
-re "No definition of \"pack\.renamed_next\" in current context\..*$gdb_prompt $" {
|
||||
if {[test_compiler_info {gcc-6*}]} {
|
||||
fail $test
|
||||
} else {
|
||||
xfail $test
|
||||
}
|
||||
}
|
||||
-re "Type <data variable, no debug info> is not a structure or union type\..*$gdb_prompt $" {
|
||||
if {[test_compiler_info {gcc-6*}]} {
|
||||
fail $test
|
||||
} else {
|
||||
xfail $test
|
||||
}
|
||||
}
|
||||
}
|
23
gdb/testsuite/gdb.ada/fun_renaming/fun_renaming.adb
Normal file
23
gdb/testsuite/gdb.ada/fun_renaming/fun_renaming.adb
Normal file
|
@ -0,0 +1,23 @@
|
|||
-- Copyright 2015 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 Pack;
|
||||
|
||||
procedure Fun_Renaming is
|
||||
function N (I : Integer) return Integer renames Pack.Next;
|
||||
begin
|
||||
Pack.Discard (N (1)); -- BREAK
|
||||
Pack.Discard (Pack.Renamed_Next (1)); -- BREAK
|
||||
end Fun_Renaming;
|
26
gdb/testsuite/gdb.ada/fun_renaming/pack.adb
Normal file
26
gdb/testsuite/gdb.ada/fun_renaming/pack.adb
Normal file
|
@ -0,0 +1,26 @@
|
|||
-- Copyright 2015 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 Pack is
|
||||
function Next (I : Integer) return Integer is
|
||||
begin
|
||||
return I + 1;
|
||||
end Next;
|
||||
|
||||
procedure Discard (I : Integer) is
|
||||
begin
|
||||
null;
|
||||
end Discard;
|
||||
end Pack;
|
22
gdb/testsuite/gdb.ada/fun_renaming/pack.ads
Normal file
22
gdb/testsuite/gdb.ada/fun_renaming/pack.ads
Normal file
|
@ -0,0 +1,22 @@
|
|||
-- Copyright 2015 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 Pack is
|
||||
|
||||
function Next (I : Integer) return Integer;
|
||||
function Renamed_Next (I : Integer) return Integer renames Next;
|
||||
procedure Discard (I : Integer);
|
||||
|
||||
end Pack;
|
Loading…
Add table
Add a link
Reference in a new issue