diff options
-rw-r--r-- | gdb/ChangeLog | 17 | ||||
-rw-r--r-- | gdb/dwarf2/read.c | 32 | ||||
-rw-r--r-- | gdb/linespec.c | 2 | ||||
-rw-r--r-- | gdb/psymtab.c | 10 | ||||
-rw-r--r-- | gdb/symfile-debug.c | 2 | ||||
-rw-r--r-- | gdb/symfile.c | 2 | ||||
-rw-r--r-- | gdb/symfile.h | 13 | ||||
-rw-r--r-- | gdb/symmisc.c | 8 | ||||
-rw-r--r-- | gdb/symtab.c | 2 | ||||
-rw-r--r-- | gdb/testsuite/ChangeLog | 7 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/maint-expand-symbols-header-file.c | 26 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/maint-expand-symbols-header-file.exp | 46 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/maint-expand-symbols-header-file.h | 22 |
13 files changed, 165 insertions, 24 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index f624c15..8c9fbe3 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,20 @@ +2020-04-14 Tom de Vries <tdevries@suse.de> + + PR symtab/25720 + * symmisc.c (maintenance_expand_symtabs): Call expand_symtabs_matching + with NULL symbol_matcher and lookup_name. + * psymtab.c (psym_expand_symtabs_matching): Handle NULL symbol_matcher + and lookup_name. + * dwarf2/read.c (dw2_expand_symtabs_matching) + (dw2_debug_names_expand_symtabs_matching): Same. + * symfile.h (struct quick_symbol_functions::expand_symtabs_matching): + Make lookup_name a pointer. Update comment. + * symtab.c (global_symbol_searcher::expand_symtabs): Handle + lookup_name being a pointer. + * symfile.c (expand_symtabs_matching): Same. + * symfile-debug.c (debug_qf_expand_symtabs_matching): Same. + * linespec.c (iterate_over_all_matching_symtabs): Same. + 2020-04-13 Tom Tromey <tom@tromey.com> * run-on-main-thread.c: Update include. diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c index da70220..9fa4970 100644 --- a/gdb/dwarf2/read.c +++ b/gdb/dwarf2/read.c @@ -4603,7 +4603,7 @@ static void dw2_expand_symtabs_matching (struct objfile *objfile, gdb::function_view<expand_symtabs_file_matcher_ftype> file_matcher, - const lookup_name_info &lookup_name, + const lookup_name_info *lookup_name, gdb::function_view<expand_symtabs_symbol_matcher_ftype> symbol_matcher, gdb::function_view<expand_symtabs_exp_notify_ftype> expansion_notify, enum search_domain kind) @@ -4617,9 +4617,21 @@ dw2_expand_symtabs_matching dw_expand_symtabs_matching_file_matcher (dwarf2_per_objfile, file_matcher); + if (symbol_matcher == NULL && lookup_name == NULL) + { + for (dwarf2_per_cu_data *per_cu : dwarf2_per_objfile->all_comp_units) + { + QUIT; + + dw2_expand_symtabs_matching_one (per_cu, file_matcher, + expansion_notify); + } + return; + } + mapped_index &index = *dwarf2_per_objfile->index_table; - dw2_expand_symtabs_matching_symbol (index, lookup_name, + dw2_expand_symtabs_matching_symbol (index, *lookup_name, symbol_matcher, kind, [&] (offset_type idx) { @@ -5612,7 +5624,7 @@ static void dw2_debug_names_expand_symtabs_matching (struct objfile *objfile, gdb::function_view<expand_symtabs_file_matcher_ftype> file_matcher, - const lookup_name_info &lookup_name, + const lookup_name_info *lookup_name, gdb::function_view<expand_symtabs_symbol_matcher_ftype> symbol_matcher, gdb::function_view<expand_symtabs_exp_notify_ftype> expansion_notify, enum search_domain kind) @@ -5626,9 +5638,21 @@ dw2_debug_names_expand_symtabs_matching dw_expand_symtabs_matching_file_matcher (dwarf2_per_objfile, file_matcher); + if (symbol_matcher == NULL && lookup_name == NULL) + { + for (dwarf2_per_cu_data *per_cu : dwarf2_per_objfile->all_comp_units) + { + QUIT; + + dw2_expand_symtabs_matching_one (per_cu, file_matcher, + expansion_notify); + } + return; + } + mapped_debug_names &map = *dwarf2_per_objfile->debug_names_table; - dw2_expand_symtabs_matching_symbol (map, lookup_name, + dw2_expand_symtabs_matching_symbol (map, *lookup_name, symbol_matcher, kind, [&] (offset_type namei) { diff --git a/gdb/linespec.c b/gdb/linespec.c index d853e02..e1349e7 100644 --- a/gdb/linespec.c +++ b/gdb/linespec.c @@ -1149,7 +1149,7 @@ iterate_over_all_matching_symtabs if (objfile->sf) objfile->sf->qf->expand_symtabs_matching (objfile, NULL, - lookup_name, + &lookup_name, NULL, NULL, search_domain); diff --git a/gdb/psymtab.c b/gdb/psymtab.c index 44d4978..d952f45 100644 --- a/gdb/psymtab.c +++ b/gdb/psymtab.c @@ -1304,13 +1304,11 @@ static void psym_expand_symtabs_matching (struct objfile *objfile, gdb::function_view<expand_symtabs_file_matcher_ftype> file_matcher, - const lookup_name_info &lookup_name_in, + const lookup_name_info *lookup_name, gdb::function_view<expand_symtabs_symbol_matcher_ftype> symbol_matcher, gdb::function_view<expand_symtabs_exp_notify_ftype> expansion_notify, enum search_domain domain) { - lookup_name_info lookup_name = lookup_name_in.make_ignore_params (); - /* Clear the search flags. */ for (partial_symtab *ps : require_partial_symbols (objfile, true)) ps->searched_flag = PST_NOT_SEARCHED; @@ -1347,8 +1345,10 @@ psym_expand_symtabs_matching continue; } - if (recursively_search_psymtabs (ps, objfile, domain, - lookup_name, symbol_matcher)) + if ((symbol_matcher == NULL && lookup_name == NULL) + || recursively_search_psymtabs (ps, objfile, domain, + lookup_name->make_ignore_params (), + symbol_matcher)) { struct compunit_symtab *symtab = psymtab_to_symtab (objfile, ps); diff --git a/gdb/symfile-debug.c b/gdb/symfile-debug.c index 19dc83a..75e6f2d 100644 --- a/gdb/symfile-debug.c +++ b/gdb/symfile-debug.c @@ -254,7 +254,7 @@ static void debug_qf_expand_symtabs_matching (struct objfile *objfile, gdb::function_view<expand_symtabs_file_matcher_ftype> file_matcher, - const lookup_name_info &lookup_name, + const lookup_name_info *lookup_name, gdb::function_view<expand_symtabs_symbol_matcher_ftype> symbol_matcher, gdb::function_view<expand_symtabs_exp_notify_ftype> expansion_notify, enum search_domain kind) diff --git a/gdb/symfile.c b/gdb/symfile.c index 6105329..8c002eb 100644 --- a/gdb/symfile.c +++ b/gdb/symfile.c @@ -3777,7 +3777,7 @@ expand_symtabs_matching { if (objfile->sf) objfile->sf->qf->expand_symtabs_matching (objfile, file_matcher, - lookup_name, + &lookup_name, symbol_matcher, expansion_notify, kind); } diff --git a/gdb/symfile.h b/gdb/symfile.h index 84fa283..5ada6c3 100644 --- a/gdb/symfile.h +++ b/gdb/symfile.h @@ -253,11 +253,14 @@ struct quick_symbol_functions names (the passed file name is already only the lbasename'd part). - Otherwise, if KIND does not match, this symbol is skipped. + If the file is not skipped, and SYMBOL_MATCHER and LOOKUP_NAME are NULL, + the symbol table is expanded. - If even KIND matches, SYMBOL_MATCHER is called for each symbol - defined in the file. The symbol "search" name is passed to - SYMBOL_MATCHER. + Otherwise, individual symbols are considered. + + If KIND does not match, the symbol is skipped. + + If the symbol name does not match LOOKUP_NAME, the symbol is skipped. If SYMBOL_MATCHER returns false, then the symbol is skipped. @@ -265,7 +268,7 @@ struct quick_symbol_functions void (*expand_symtabs_matching) (struct objfile *objfile, gdb::function_view<expand_symtabs_file_matcher_ftype> file_matcher, - const lookup_name_info &lookup_name, + const lookup_name_info *lookup_name, gdb::function_view<expand_symtabs_symbol_matcher_ftype> symbol_matcher, gdb::function_view<expand_symtabs_exp_notify_ftype> expansion_notify, enum search_domain kind); diff --git a/gdb/symmisc.c b/gdb/symmisc.c index bee136e..1076a0b 100644 --- a/gdb/symmisc.c +++ b/gdb/symmisc.c @@ -977,12 +977,8 @@ maintenance_expand_symtabs (const char *args, int from_tty) return (!basenames && (regexp == NULL || re_exec (filename))); }, - lookup_name_info::match_any (), - [] (const char *symname) - { - /* Since we're not searching on symbols, just return true. */ - return true; - }, + NULL, + NULL, NULL, ALL_DOMAIN); } diff --git a/gdb/symtab.c b/gdb/symtab.c index 13a5a10..45d75a3 100644 --- a/gdb/symtab.c +++ b/gdb/symtab.c @@ -4540,7 +4540,7 @@ global_symbol_searcher::expand_symtabs { return file_matches (filename, filenames, basenames); }, - lookup_name_info::match_any (), + &lookup_name_info::match_any (), [&] (const char *symname) { return (!preg.has_value () diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 0afe9d0..73931c5 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2020-04-14 Tom de Vries <tdevries@suse.de> + + PR symtab/25720 + * gdb.base/maint-expand-symbols-header-file.c: New test. + * gdb.base/maint-expand-symbols-header-file.exp: New file. + * gdb.base/maint-expand-symbols-header-file.h: New test. + 2020-04-14 Andrew Burgess <andrew.burgess@embecosm.com> * gdb.dwarf2/dw2-inline-many-frames.exp (get_func_info): Delete. diff --git a/gdb/testsuite/gdb.base/maint-expand-symbols-header-file.c b/gdb/testsuite/gdb.base/maint-expand-symbols-header-file.c new file mode 100644 index 0000000..649c5b9 --- /dev/null +++ b/gdb/testsuite/gdb.base/maint-expand-symbols-header-file.c @@ -0,0 +1,26 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2020 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/>. */ + +#include <stdio.h> +#include "maint-expand-symbols-header-file.h" + +int +main (void) +{ + printf ("hello: %s\n", foo ()); + return 0; +} diff --git a/gdb/testsuite/gdb.base/maint-expand-symbols-header-file.exp b/gdb/testsuite/gdb.base/maint-expand-symbols-header-file.exp new file mode 100644 index 0000000..f73be40 --- /dev/null +++ b/gdb/testsuite/gdb.base/maint-expand-symbols-header-file.exp @@ -0,0 +1,46 @@ +# Copyright 2020 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-case to verify that symbol-less symtabs are expanded by +# "maint expand-symtabs". + +standard_testfile .c + +if {[prepare_for_testing "failed to prepare" $testfile \ + $srcfile {debug nowarnings}]} { + return -1 +} + +set test "verify no symtabs are expanded" +if { [readnow] } { + unsupported $test + return -1 +} +gdb_test_no_output "maint info symtabs" $test + +# Expand the header file symtab. +gdb_test_no_output "maint expand-symtabs maint-expand-symbols-header-file.h" + +# Check that the include symtab was in fact expanded. +set file_re "\[^\r\n\]*/maint-expand-symbols-header-file.h" +gdb_test "maint info symtabs" \ + "\r\n\t{ symtab $file_re \\(\\(struct symtab \\*\\) $hex\\)\r\n.*" \ + "check header file psymtab expansion" + +# Check that the symtab the include symtab was referring to was expanded. +set file_re "\[^\r\n\]*/maint-expand-symbols-header-file.c" +gdb_test "maint info symtabs" \ + "\r\n\t{ symtab $file_re \\(\\(struct symtab \\*\\) $hex\\)\r\n.*" \ + "check source file psymtab expansion" diff --git a/gdb/testsuite/gdb.base/maint-expand-symbols-header-file.h b/gdb/testsuite/gdb.base/maint-expand-symbols-header-file.h new file mode 100644 index 0000000..d8d2517 --- /dev/null +++ b/gdb/testsuite/gdb.base/maint-expand-symbols-header-file.h @@ -0,0 +1,22 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2020 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/>. */ + +inline static const char* +foo (void) +{ + return "foo"; +} |