Document quick_symbol_functions::expand_symtabs_matching invariant
authorTom Tromey <tom@tromey.com>
Mon, 21 Jun 2021 20:10:41 +0000 (14:10 -0600)
committerTom Tromey <tom@tromey.com>
Fri, 16 Jul 2021 19:54:01 +0000 (13:54 -0600)
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.

gdb/dwarf2/read.c
gdb/psymtab.c
gdb/quick-symbol.h
gdb/symfile-debug.c

index 9292e52c0001c1779e1bc22cf65136ee3160e8dc..97f9d88943ef93f7ac5ead2c0815e52af1f90f5f 100644 (file)
@@ -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)
        {
index 069052d712c614c4997caca10c8d6773280835eb..7c3017d36d2663127a5bef0adee55a9387269b31 100644 (file)
@@ -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,
index 7af0aebb9fe3c84a6a77350324b37b9444851e04..5eb7c8423e2ae3dd63e49d78db053e552e31a779 100644 (file)
@@ -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
index a10af68f5b18b9530ff9c8ea24e83c1dbb2cad9c..f3d5a68b72e743e80f28230805355feacc447b2b 100644 (file)
@@ -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",