From 3bfa51a75fc18775ea043efb248d0e2c35103202 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Sat, 17 Apr 2021 09:35:04 -0600 Subject: [PATCH] Add 'domain' parameter to expand_symtabs_matching Currently, expand_symtabs_matching only accepts a search_domain parameter. However, lookup_symbol uses a domain_enum instead, and the two, confusingly, do quite different things -- one cannot emulate the other. So, this patch adds a domain_enum parameter to expand_symtabs_matching, with UNDEF_DOMAIN used as a wildcard. This is another step toward replacing lookup_symbol with expand_symtabs_matching. gdb/ChangeLog 2021-04-17 Tom Tromey * symtab.c (global_symbol_searcher::expand_symtabs): Update. * symmisc.c (maintenance_expand_symtabs): Update. * symfile.c (expand_symtabs_matching): Update. * symfile-debug.c (objfile::expand_symtabs_matching): Add 'domain' parameter. * quick-symbol.h (struct quick_symbol_functions) : Add 'domain' parameter. * psymtab.c (recursively_search_psymtabs) (psymbol_functions::expand_symtabs_matching): Add 'domain' parameter. * psympriv.h (struct psymbol_functions) : Add 'domain' parameter. * objfiles.h (struct objfile) : Add 'domain' parameter. * linespec.c (iterate_over_all_matching_symtabs): Update. * dwarf2/read.c (struct dwarf2_gdb_index) : Add 'domain' parameter. (struct dwarf2_debug_names_index) : Add 'domain' parameter. (dw2_expand_symtabs_matching) (dwarf2_gdb_index::expand_symtabs_matching) (dw2_debug_names_iterator) (dwarf2_debug_names_index::expand_symtabs_matching): Add 'domain' parameter. --- gdb/ChangeLog | 27 +++++++++++++++++++++++++++ gdb/dwarf2/read.c | 10 ++++++++-- gdb/linespec.c | 1 + gdb/objfiles.h | 1 + gdb/psympriv.h | 1 + gdb/psymtab.c | 34 ++++++++++++++++++++-------------- gdb/quick-symbol.h | 4 +++- gdb/symfile-debug.c | 3 ++- gdb/symfile.c | 1 + gdb/symmisc.c | 1 + gdb/symtab.c | 1 + 11 files changed, 66 insertions(+), 18 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 3d27f68b93c..31af446c5b6 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,30 @@ +2021-04-17 Tom Tromey + + * symtab.c (global_symbol_searcher::expand_symtabs): Update. + * symmisc.c (maintenance_expand_symtabs): Update. + * symfile.c (expand_symtabs_matching): Update. + * symfile-debug.c (objfile::expand_symtabs_matching): Add 'domain' + parameter. + * quick-symbol.h (struct quick_symbol_functions) + : Add 'domain' parameter. + * psymtab.c (recursively_search_psymtabs) + (psymbol_functions::expand_symtabs_matching): Add 'domain' + parameter. + * psympriv.h (struct psymbol_functions) : + Add 'domain' parameter. + * objfiles.h (struct objfile) : Add + 'domain' parameter. + * linespec.c (iterate_over_all_matching_symtabs): Update. + * dwarf2/read.c (struct dwarf2_gdb_index) + : Add 'domain' parameter. + (struct dwarf2_debug_names_index) : Add + 'domain' parameter. + (dw2_expand_symtabs_matching) + (dwarf2_gdb_index::expand_symtabs_matching) + (dw2_debug_names_iterator) + (dwarf2_debug_names_index::expand_symtabs_matching): Add 'domain' + parameter. + 2021-04-17 Tom Tromey * symtab.c (global_symbol_searcher::expand_symtabs) diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c index 824945a95bc..43d276f4736 100644 --- a/gdb/dwarf2/read.c +++ b/gdb/dwarf2/read.c @@ -2290,6 +2290,7 @@ struct dwarf2_gdb_index : public dwarf2_base_index_functions gdb::function_view symbol_matcher, gdb::function_view expansion_notify, block_search_flags search_flags, + domain_enum domain, enum search_domain kind) override; }; @@ -2320,6 +2321,7 @@ struct dwarf2_debug_names_index : public dwarf2_base_index_functions gdb::function_view symbol_matcher, gdb::function_view expansion_notify, block_search_flags search_flags, + domain_enum domain, enum search_domain kind) override; }; @@ -4878,6 +4880,7 @@ dwarf2_gdb_index::expand_symtabs_matching gdb::function_view symbol_matcher, gdb::function_view expansion_notify, block_search_flags search_flags, + domain_enum domain, enum search_domain kind) { dwarf2_per_objfile *per_objfile = get_dwarf2_per_objfile (objfile); @@ -5398,8 +5401,10 @@ public: dw2_debug_names_iterator (const mapped_debug_names &map, search_domain search, uint32_t namei, - dwarf2_per_objfile *per_objfile) + dwarf2_per_objfile *per_objfile, + domain_enum domain = UNDEF_DOMAIN) : m_map (map), + m_domain (domain), m_search (search), m_addr (find_vec_in_debug_names (map, namei, per_objfile)), m_per_objfile (per_objfile) @@ -5950,6 +5955,7 @@ dwarf2_debug_names_index::expand_symtabs_matching gdb::function_view symbol_matcher, gdb::function_view expansion_notify, block_search_flags search_flags, + domain_enum domain, enum search_domain kind) { dwarf2_per_objfile *per_objfile = get_dwarf2_per_objfile (objfile); @@ -5983,7 +5989,7 @@ dwarf2_debug_names_index::expand_symtabs_matching { /* The name was matched, now expand corresponding CUs that were marked. */ - dw2_debug_names_iterator iter (map, kind, namei, per_objfile); + dw2_debug_names_iterator iter (map, kind, namei, per_objfile, domain); struct dwarf2_per_cu_data *per_cu; while ((per_cu = iter.next ()) != NULL) diff --git a/gdb/linespec.c b/gdb/linespec.c index f37861b343a..03a11fda214 100644 --- a/gdb/linespec.c +++ b/gdb/linespec.c @@ -1172,6 +1172,7 @@ iterate_over_all_matching_symtabs objfile->expand_symtabs_matching (NULL, &lookup_name, NULL, NULL, (SEARCH_GLOBAL_BLOCK | SEARCH_STATIC_BLOCK), + UNDEF_DOMAIN, search_domain); for (compunit_symtab *cu : objfile->compunits ()) diff --git a/gdb/objfiles.h b/gdb/objfiles.h index 9a194c1d8d4..ec64b1c3a98 100644 --- a/gdb/objfiles.h +++ b/gdb/objfiles.h @@ -609,6 +609,7 @@ public: gdb::function_view symbol_matcher, gdb::function_view expansion_notify, block_search_flags search_flags, + domain_enum domain, enum search_domain kind); /* See quick_symbol_functions. */ diff --git a/gdb/psympriv.h b/gdb/psympriv.h index 70a397f8167..25f3fe500fa 100644 --- a/gdb/psympriv.h +++ b/gdb/psympriv.h @@ -548,6 +548,7 @@ struct psymbol_functions : public quick_symbol_functions gdb::function_view symbol_matcher, gdb::function_view expansion_notify, block_search_flags search_flags, + domain_enum domain, enum search_domain kind) override; struct compunit_symtab *find_pc_sect_compunit_symtab diff --git a/gdb/psymtab.c b/gdb/psymtab.c index c3461168294..c766107504d 100644 --- a/gdb/psymtab.c +++ b/gdb/psymtab.c @@ -1208,7 +1208,8 @@ recursively_search_psymtabs (struct partial_symtab *ps, struct objfile *objfile, block_search_flags search_flags, - enum search_domain domain, + domain_enum domain, + enum search_domain search, const lookup_name_info &lookup_name, gdb::function_view sym_matcher) { @@ -1230,7 +1231,7 @@ recursively_search_psymtabs continue; r = recursively_search_psymtabs (ps->dependencies[i], - objfile, search_flags, domain, + objfile, search_flags, domain, search, lookup_name, sym_matcher); if (r != 0) { @@ -1278,16 +1279,19 @@ recursively_search_psymtabs { QUIT; - if ((domain == ALL_DOMAIN - || (domain == MODULES_DOMAIN - && (*psym)->domain == MODULE_DOMAIN) - || (domain == VARIABLES_DOMAIN - && (*psym)->aclass != LOC_TYPEDEF - && (*psym)->aclass != LOC_BLOCK) - || (domain == FUNCTIONS_DOMAIN - && (*psym)->aclass == LOC_BLOCK) - || (domain == TYPES_DOMAIN - && (*psym)->aclass == LOC_TYPEDEF)) + if ((domain == UNDEF_DOMAIN + || symbol_matches_domain ((*psym)->ginfo.language (), + (*psym)->domain, domain)) + && (search == ALL_DOMAIN + || (search == MODULES_DOMAIN + && (*psym)->domain == MODULE_DOMAIN) + || (search == VARIABLES_DOMAIN + && (*psym)->aclass != LOC_TYPEDEF + && (*psym)->aclass != LOC_BLOCK) + || (search == FUNCTIONS_DOMAIN + && (*psym)->aclass == LOC_BLOCK) + || (search == TYPES_DOMAIN + && (*psym)->aclass == LOC_TYPEDEF)) && psymbol_name_matches (*psym, lookup_name) && (sym_matcher == NULL || sym_matcher ((*psym)->ginfo.search_name ()))) @@ -1315,7 +1319,8 @@ psymbol_functions::expand_symtabs_matching gdb::function_view symbol_matcher, gdb::function_view expansion_notify, block_search_flags search_flags, - enum search_domain domain) + domain_enum domain, + enum search_domain search) { /* Clear the search flags. */ for (partial_symtab *ps : require_partial_symbols (objfile)) @@ -1353,7 +1358,8 @@ psymbol_functions::expand_symtabs_matching } if ((symbol_matcher == NULL && lookup_name == NULL) - || recursively_search_psymtabs (ps, objfile, search_flags, domain, + || recursively_search_psymtabs (ps, objfile, search_flags, + domain, search, *psym_lookup_name, symbol_matcher)) { diff --git a/gdb/quick-symbol.h b/gdb/quick-symbol.h index 3332d329e02..4c0ef735472 100644 --- a/gdb/quick-symbol.h +++ b/gdb/quick-symbol.h @@ -202,7 +202,8 @@ struct quick_symbol_functions Otherwise, individual symbols are considered. - If KIND does not match, the symbol is skipped. + If DOMAIN or KIND do not match, the symbol is skipped. + If DOMAIN is UNDEF_DOMAIN, that is treated as a wildcard. If the symbol name does not match LOOKUP_NAME, the symbol is skipped. @@ -220,6 +221,7 @@ struct quick_symbol_functions gdb::function_view symbol_matcher, gdb::function_view expansion_notify, block_search_flags search_flags, + domain_enum domain, enum search_domain kind) = 0; /* Return the comp unit from OBJFILE that contains PC and diff --git a/gdb/symfile-debug.c b/gdb/symfile-debug.c index b1763243534..577b0fcd86c 100644 --- a/gdb/symfile-debug.c +++ b/gdb/symfile-debug.c @@ -272,6 +272,7 @@ objfile::expand_symtabs_matching gdb::function_view symbol_matcher, gdb::function_view expansion_notify, block_search_flags search_flags, + domain_enum domain, enum search_domain kind) { if (debug_symfile) @@ -286,7 +287,7 @@ objfile::expand_symtabs_matching for (const auto &iter : qf) if (!iter->expand_symtabs_matching (this, file_matcher, lookup_name, symbol_matcher, expansion_notify, - search_flags, kind)) + search_flags, domain, kind)) return false; return true; } diff --git a/gdb/symfile.c b/gdb/symfile.c index 5f83cbf67c8..7dfe1ee1ca0 100644 --- a/gdb/symfile.c +++ b/gdb/symfile.c @@ -3731,6 +3731,7 @@ expand_symtabs_matching symbol_matcher, expansion_notify, search_flags, + UNDEF_DOMAIN, kind)) return false; return true; diff --git a/gdb/symmisc.c b/gdb/symmisc.c index 33657f88fa9..d992c671635 100644 --- a/gdb/symmisc.c +++ b/gdb/symmisc.c @@ -939,6 +939,7 @@ maintenance_expand_symtabs (const char *args, int from_tty) NULL, NULL, SEARCH_GLOBAL_BLOCK | SEARCH_STATIC_BLOCK, + UNDEF_DOMAIN, ALL_DOMAIN); } diff --git a/gdb/symtab.c b/gdb/symtab.c index a34207fc74b..274ddfd1dae 100644 --- a/gdb/symtab.c +++ b/gdb/symtab.c @@ -4548,6 +4548,7 @@ global_symbol_searcher::expand_symtabs }, NULL, SEARCH_GLOBAL_BLOCK | SEARCH_STATIC_BLOCK, + UNDEF_DOMAIN, kind); /* Here, we search through the minimal symbol tables for functions and -- 2.30.2