aboutsummaryrefslogtreecommitdiff
path: root/gdb
diff options
context:
space:
mode:
authorTom Tromey <tom@tromey.com>2021-06-21 14:10:41 -0600
committerTom Tromey <tom@tromey.com>2021-07-16 13:54:01 -0600
commit4f348ca808af86c9698ef11595832018103f9492 (patch)
tree6fb82f3c099c1cdf2227986cd8da2f74a586113b /gdb
parentcc9d6997a5b23d0c8e1960f6c0b5f5cdf456d4e9 (diff)
downloadgdb-4f348ca808af86c9698ef11595832018103f9492.zip
gdb-4f348ca808af86c9698ef11595832018103f9492.tar.gz
gdb-4f348ca808af86c9698ef11595832018103f9492.tar.bz2
Document quick_symbol_functions::expand_symtabs_matching invariant
While working on my series to replace the DWARF psymbol reader, I noticed that the expand_symtabs_matching has an undocumented invariant. I think that, if this invariant is not followed, then GDB will crash. So, this patch documents this in the relevant spots and introduces some asserts to make it clear. Regression tested on x86-64 Fedora 32.
Diffstat (limited to 'gdb')
-rw-r--r--gdb/dwarf2/read.c8
-rw-r--r--gdb/psymtab.c5
-rw-r--r--gdb/quick-symbol.h2
-rw-r--r--gdb/symfile-debug.c3
4 files changed, 15 insertions, 3 deletions
diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c
index 9292e52..97f9d88 100644
--- a/gdb/dwarf2/read.c
+++ b/gdb/dwarf2/read.c
@@ -4319,7 +4319,9 @@ dwarf2_gdb_index::expand_symtabs_matching
dw_expand_symtabs_matching_file_matcher (per_objfile, file_matcher);
- if (symbol_matcher == NULL && lookup_name == NULL)
+ /* This invariant is documented in quick-functions.h. */
+ gdb_assert (lookup_name != nullptr || symbol_matcher == nullptr);
+ if (lookup_name == nullptr)
{
for (const auto &per_cu : per_objfile->per_bfd->all_comp_units)
{
@@ -5307,7 +5309,9 @@ dwarf2_debug_names_index::expand_symtabs_matching
dw_expand_symtabs_matching_file_matcher (per_objfile, file_matcher);
- if (symbol_matcher == NULL && lookup_name == NULL)
+ /* This invariant is documented in quick-functions.h. */
+ gdb_assert (lookup_name != nullptr || symbol_matcher == nullptr);
+ if (lookup_name == nullptr)
{
for (const auto &per_cu : per_objfile->per_bfd->all_comp_units)
{
diff --git a/gdb/psymtab.c b/gdb/psymtab.c
index 069052d..7c3017d 100644
--- a/gdb/psymtab.c
+++ b/gdb/psymtab.c
@@ -1130,6 +1130,9 @@ psymbol_functions::expand_symtabs_matching
if (lookup_name != nullptr)
psym_lookup_name = lookup_name->make_ignore_params ();
+ /* This invariant is documented in quick-functions.h. */
+ gdb_assert (lookup_name != nullptr || symbol_matcher == nullptr);
+
for (partial_symtab *ps : m_partial_symtabs->range ())
{
QUIT;
@@ -1157,7 +1160,7 @@ psymbol_functions::expand_symtabs_matching
continue;
}
- if ((symbol_matcher == NULL && lookup_name == NULL)
+ if (lookup_name == nullptr
|| recursively_search_psymtabs (ps, objfile, search_flags,
domain, search,
*psym_lookup_name,
diff --git a/gdb/quick-symbol.h b/gdb/quick-symbol.h
index 7af0aeb..5eb7c84 100644
--- a/gdb/quick-symbol.h
+++ b/gdb/quick-symbol.h
@@ -167,6 +167,8 @@ struct quick_symbol_functions
If the symbol name does not match LOOKUP_NAME, the symbol is skipped.
If SYMBOL_MATCHER returns false, then the symbol is skipped.
+ Note that if SYMBOL_MATCHER is non-NULL, then LOOKUP_NAME must
+ also be provided.
Otherwise, the symbol's symbol table is expanded and the
notification function is called. If the notification function
diff --git a/gdb/symfile-debug.c b/gdb/symfile-debug.c
index a10af68..f3d5a68 100644
--- a/gdb/symfile-debug.c
+++ b/gdb/symfile-debug.c
@@ -405,6 +405,9 @@ objfile::expand_symtabs_matching
domain_enum domain,
enum search_domain kind)
{
+ /* This invariant is documented in quick-functions.h. */
+ gdb_assert (lookup_name != nullptr || symbol_matcher == nullptr);
+
if (debug_symfile)
fprintf_filtered (gdb_stdlog,
"qf->expand_symtabs_matching (%s, %s, %s, %s, %s)\n",