[09/28] Remove dwarf2_per_cu_data::mark

Message ID 20250311-search-in-psyms-v1-9-d73d9be20983@tromey.com
State New
Headers
Series Search symbols via quick API |

Commit Message

Tom Tromey March 11, 2025, 2:12 p.m. UTC
  This removes dwarf2_per_cu_data::mark, replacing it with a
locally-allocated boolean vector.  It also inverts the sense of the
flag -- now, the flag is true when a CU should be skipped, and false
when the CU should be further examined.  Also, the validity of the
flag is no longer dependent on 'file_matcher != NULL'.

This patch makes the subsequent patch to searching a bit simpler, so
I've separated it out.

Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=16994
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=16998
---
 gdb/dwarf2/read-gdb-index.c | 14 +++++-----
 gdb/dwarf2/read.c           | 64 ++++++++++++++++++++++++++-------------------
 gdb/dwarf2/read.h           | 35 +++++++++++++++++++++----
 3 files changed, 75 insertions(+), 38 deletions(-)
  

Patch

diff --git a/gdb/dwarf2/read-gdb-index.c b/gdb/dwarf2/read-gdb-index.c
index 8daaca96fda60417be42790963a23a91c7edac1b..ae4b2a544b16d237370e52659d4e29956a97f7ab 100644
--- a/gdb/dwarf2/read-gdb-index.c
+++ b/gdb/dwarf2/read-gdb-index.c
@@ -1030,6 +1030,7 @@  dwarf2_gdb_index::dump (struct objfile *objfile)
 
 static bool
 dw2_expand_marked_cus (dwarf2_per_objfile *per_objfile, offset_type idx,
+		       auto_bool_vector &marked,
 		       expand_symtabs_file_matcher file_matcher,
 		       expand_symtabs_expansion_listener expansion_notify,
 		       block_search_flags search_flags,
@@ -1114,9 +1115,9 @@  dw2_expand_marked_cus (dwarf2_per_objfile *per_objfile, offset_type idx,
 	}
 
       dwarf2_per_cu *per_cu = per_objfile->per_bfd->get_cu (cu_index);
-
-      if (!dw2_expand_symtabs_matching_one (per_cu, per_objfile, file_matcher,
-					    expansion_notify, lang_matcher))
+      if (!dw2_expand_symtabs_matching_one (per_cu, per_objfile, marked,
+					    file_matcher, expansion_notify,
+					    lang_matcher))
 	return false;
     }
 
@@ -1136,7 +1137,8 @@  dwarf2_gdb_index::expand_symtabs_matching
 {
   dwarf2_per_objfile *per_objfile = get_dwarf2_per_objfile (objfile);
 
-  dw_expand_symtabs_matching_file_matcher (per_objfile, file_matcher);
+  auto_bool_vector marked;
+  dw_expand_symtabs_matching_file_matcher (per_objfile, marked, file_matcher);
 
   /* This invariant is documented in quick-functions.h.  */
   gdb_assert (lookup_name != nullptr || symbol_matcher == nullptr);
@@ -1147,7 +1149,7 @@  dwarf2_gdb_index::expand_symtabs_matching
 	  QUIT;
 
 	  if (!dw2_expand_symtabs_matching_one (per_cu, per_objfile,
-						file_matcher,
+						marked, file_matcher,
 						expansion_notify,
 						lang_matcher))
 	    return false;
@@ -1164,7 +1166,7 @@  dwarf2_gdb_index::expand_symtabs_matching
 					  symbol_matcher,
 					  [&] (offset_type idx)
     {
-      if (!dw2_expand_marked_cus (per_objfile, idx, file_matcher,
+      if (!dw2_expand_marked_cus (per_objfile, idx, marked, file_matcher,
 				  expansion_notify, search_flags, domain,
 				  lang_matcher))
 	return false;
diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c
index eac9c648aef9e6daf9dc6d277f672bb624f24b05..bd0e524668f7f8966c1166533601961e3e2dbb86 100644
--- a/gdb/dwarf2/read.c
+++ b/gdb/dwarf2/read.c
@@ -1984,11 +1984,13 @@  bool
 dw2_expand_symtabs_matching_one
   (dwarf2_per_cu *per_cu,
    dwarf2_per_objfile *per_objfile,
+   auto_bool_vector &marked,
    expand_symtabs_file_matcher file_matcher,
    expand_symtabs_expansion_listener expansion_notify,
    expand_symtabs_lang_matcher lang_matcher)
 {
-  if (file_matcher != nullptr && !per_cu->mark)
+  /* Already visited, or intentionally skipped.  */
+  if (marked.is_set (per_cu->index))
     return true;
 
   if (lang_matcher != nullptr)
@@ -2015,7 +2017,9 @@  dw2_expand_symtabs_matching_one
 
 void
 dw_expand_symtabs_matching_file_matcher
-  (dwarf2_per_objfile *per_objfile, expand_symtabs_file_matcher file_matcher)
+  (dwarf2_per_objfile *per_objfile,
+   auto_bool_vector &marked,
+   expand_symtabs_file_matcher file_matcher)
 {
   if (file_matcher == NULL)
     return;
@@ -2031,54 +2035,57 @@  dw_expand_symtabs_matching_file_matcher
       QUIT;
 
       if (per_cu->is_debug_types)
-	continue;
-      per_cu->mark = 0;
+	{
+	  marked.set (per_cu->index, true);
+	  continue;
+	}
 
       /* We only need to look at symtabs not already expanded.  */
       if (per_objfile->symtab_set_p (per_cu.get ()))
-	continue;
+	{
+	  marked.set (per_cu->index, true);
+	  continue;
+	}
 
       if (per_cu->fnd != nullptr)
 	{
 	  file_and_directory *fnd = per_cu->fnd.get ();
 
 	  if (file_matcher (fnd->get_name (), false))
-	    {
-	      per_cu->mark = 1;
-	      continue;
-	    }
+	    continue;
 
 	  /* Before we invoke realpath, which can get expensive when many
 	     files are involved, do a quick comparison of the basenames.  */
 	  if ((basenames_may_differ
 	       || file_matcher (lbasename (fnd->get_name ()), true))
 	      && file_matcher (fnd->get_fullname (), false))
-	    {
-	      per_cu->mark = 1;
-	      continue;
-	    }
+	    continue;
 	}
 
       quick_file_names *file_data = dw2_get_file_names (per_cu.get (),
 							per_objfile);
       if (file_data == NULL)
-	continue;
+	{
+	  marked.set (per_cu->index, true);
+	  continue;
+	}
 
       if (visited_not_found.contains (file_data))
-	continue;
-      else if (visited_found.contains (file_data))
 	{
-	  per_cu->mark = 1;
+	  marked.set (per_cu->index, true);
 	  continue;
 	}
+      else if (visited_found.contains (file_data))
+	continue;
 
+      bool matched = false;
       for (int j = 0; j < file_data->num_file_names; ++j)
 	{
 	  const char *this_real_name;
 
 	  if (file_matcher (file_data->file_names[j], false))
 	    {
-	      per_cu->mark = 1;
+	      matched = true;
 	      break;
 	    }
 
@@ -2092,15 +2099,18 @@  dw_expand_symtabs_matching_file_matcher
 	  this_real_name = dw2_get_real_path (per_objfile, file_data, j);
 	  if (file_matcher (this_real_name, false))
 	    {
-	      per_cu->mark = 1;
+	      matched = true;
 	      break;
 	    }
 	}
 
-      if (per_cu->mark)
+      if (matched)
 	visited_found.insert (file_data);
       else
-	visited_not_found.insert (file_data);
+	{
+	  marked.set (per_cu->index, true);
+	  visited_not_found.insert (file_data);
+	}
     }
 }
 
@@ -14766,7 +14776,8 @@  cooked_index_functions::expand_symtabs_matching
 
   cooked_index *table = wait (objfile, true);
 
-  dw_expand_symtabs_matching_file_matcher (per_objfile, file_matcher);
+  auto_bool_vector marked;
+  dw_expand_symtabs_matching_file_matcher (per_objfile, marked, file_matcher);
 
   /* This invariant is documented in quick-functions.h.  */
   gdb_assert (lookup_name != nullptr || symbol_matcher == nullptr);
@@ -14777,7 +14788,7 @@  cooked_index_functions::expand_symtabs_matching
 	  QUIT;
 
 	  if (!dw2_expand_symtabs_matching_one (per_cu, per_objfile,
-						file_matcher,
+						marked, file_matcher,
 						expansion_notify,
 						lang_matcher))
 	    return false;
@@ -14858,9 +14869,8 @@  cooked_index_functions::expand_symtabs_matching
 	  if (per_objfile->symtab_set_p (entry->per_cu))
 	    continue;
 
-	  /* If file-matching was done, we don't need to consider
-	     symbols from unmarked CUs.  */
-	  if (file_matcher != nullptr && !entry->per_cu->mark)
+	  /* We don't need to consider symbols from some CUs.  */
+	  if (marked.is_set (entry->per_cu->index))
 	    continue;
 
 	  /* See if the symbol matches the type filter.  */
@@ -14945,7 +14955,7 @@  cooked_index_functions::expand_symtabs_matching
 	    }
 
 	  if (!dw2_expand_symtabs_matching_one (entry->per_cu, per_objfile,
-						file_matcher,
+						marked, file_matcher,
 						expansion_notify, nullptr))
 	    return false;
 	}
diff --git a/gdb/dwarf2/read.h b/gdb/dwarf2/read.h
index 347a6f220561aee2dd4031260cd6df633c1eca01..f1c7e795cd93ab69795089057c0d4c3c2fe80b7a 100644
--- a/gdb/dwarf2/read.h
+++ b/gdb/dwarf2/read.h
@@ -109,7 +109,6 @@  struct dwarf2_per_cu
       lto_artificial (false),
       queued (false),
       m_header_read_in (false),
-      mark (false),
       files_read (false),
       scanned (false),
       section (section),
@@ -177,10 +176,6 @@  struct dwarf2_per_cu
      it private at the moment.  */
   mutable packed<bool, 1> m_header_read_in;
 
-  /* A temporary mark bit used when iterating over all CUs in
-     expand_symtabs_matching.  */
-  packed<unsigned int, 1> mark;
-
   /* True if we've tried to read the file table.  There will be no
      point in trying to read it again next time.  */
   packed<bool, 1> files_read;
@@ -1169,6 +1164,34 @@  struct dwarf2_base_index_functions : public quick_symbol_functions
 			     bool need_fullname) override;
 };
 
+/* This is used to track whether a CU has already been visited during
+   symbol expansion.  It is an auto-resizing bool vector.  */
+class auto_bool_vector
+{
+public:
+
+  auto_bool_vector () = default;
+
+  /* Return true if element I is set.  */
+  bool is_set (size_t i) const
+  {
+    if (i < m_vec.size ())
+      return m_vec[i];
+    return false;
+  }
+
+  /* Set a value in this vector, growing it automatically.  */
+  void set (size_t i, bool value)
+  {
+    if (m_vec.size () < i + 1)
+      m_vec.resize (i + 1);
+    m_vec[i] = value;
+  }
+
+private:
+  std::vector<bool> m_vec;
+};
+
 /* If FILE_MATCHER is NULL or if PER_CU has
    dwarf2_per_cu_quick_data::MARK set (see
    dw_expand_symtabs_matching_file_matcher), expand the CU and call
@@ -1177,6 +1200,7 @@  struct dwarf2_base_index_functions : public quick_symbol_functions
 extern bool dw2_expand_symtabs_matching_one
   (dwarf2_per_cu *per_cu,
    dwarf2_per_objfile *per_objfile,
+   auto_bool_vector &marked,
    expand_symtabs_file_matcher file_matcher,
    expand_symtabs_expansion_listener expansion_notify,
    expand_symtabs_lang_matcher lang_matcher);
@@ -1187,6 +1211,7 @@  extern bool dw2_expand_symtabs_matching_one
 
 extern void dw_expand_symtabs_matching_file_matcher
   (dwarf2_per_objfile *per_objfile,
+   auto_bool_vector &marked,
    expand_symtabs_file_matcher file_matcher);
 
 /* Return pointer to string at .debug_str offset STR_OFFSET.  */