From: Tom Tromey <tom@tromey.com>
To: gdb-patches@sourceware.org
Cc: Tom Tromey <tom@tromey.com>
Subject: [PATCH v2 09/28] Remove dwarf2_per_cu_data::mark
Date: Wed, 02 Apr 2025 17:45:08 -0600 [thread overview]
Message-ID: <20250402-search-in-psyms-v2-9-ea91704487cb@tromey.com> (raw)
In-Reply-To: <20250402-search-in-psyms-v2-0-ea91704487cb@tromey.com>
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(-)
diff --git a/gdb/dwarf2/read-gdb-index.c b/gdb/dwarf2/read-gdb-index.c
index eeaa38a502c09a0acdd1b60a1c0b8403843aa9fe..7bcf50d347609f0b27068228cd78633dd57e1556 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 ae8369266be1b1d7e5cc99cb1f44966a2392ec2b..4b971173815f439ad26da4f78c6aadd0cd18446b 100644
--- a/gdb/dwarf2/read.c
+++ b/gdb/dwarf2/read.c
@@ -1913,11 +1913,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)
@@ -1944,7 +1946,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;
@@ -1960,54 +1964,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;
}
@@ -2021,15 +2028,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);
+ }
}
}
@@ -14435,7 +14445,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);
@@ -14446,7 +14457,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;
@@ -14527,9 +14538,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. */
@@ -14614,7 +14624,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 c39945d7da4e5a4bd33292849437bcbe396fbb0a..6cc08993a3ce7cdfa8b80350e8f0b965ed69b3e3 100644
--- a/gdb/dwarf2/read.h
+++ b/gdb/dwarf2/read.h
@@ -125,7 +125,6 @@ struct dwarf2_per_cu
lto_artificial (false),
queued (false),
m_header_read_in (false),
- mark (false),
files_read (false),
scanned (false),
section (section),
@@ -193,10 +192,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;
@@ -1179,6 +1174,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
@@ -1187,6 +1210,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);
@@ -1197,6 +1221,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. */
--
2.46.1
next prev parent reply other threads:[~2025-04-02 23:54 UTC|newest]
Thread overview: 50+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-04-02 23:44 [PATCH v2 00/28] Search symbols via quick API Tom Tromey
2025-04-02 23:45 ` [PATCH v2 01/28] Add another minor hack to cooked_index_entry::full_name Tom Tromey
2025-04-02 23:45 ` [PATCH v2 02/28] Change ada_decode to preserve upper-case in some situations Tom Tromey
2025-04-02 23:45 ` [PATCH v2 03/28] Emit some type declarations in .gdb_index Tom Tromey
2025-04-21 2:50 ` Simon Marchi
2025-04-21 14:50 ` Tom Tromey
2025-04-23 4:11 ` Simon Marchi
2025-04-23 20:54 ` Tom Tromey
2025-04-02 23:45 ` [PATCH v2 04/28] Ada import functions not in index Tom Tromey
2025-04-02 23:45 ` [PATCH v2 05/28] Fix index's handling of DW_TAG_imported_declaration Tom Tromey
2025-04-02 23:45 ` [PATCH v2 06/28] Put all CTF symbols in global scope Tom Tromey
2025-04-02 23:45 ` [PATCH v2 07/28] Restore "ingestion" of .debug_str when writing .debug_names Tom Tromey
2025-04-02 23:45 ` [PATCH v2 08/28] Entries from anon-struct.exp not in cooked index Tom Tromey
2025-04-02 23:45 ` Tom Tromey [this message]
2025-04-21 3:09 ` [PATCH v2 09/28] Remove dwarf2_per_cu_data::mark Simon Marchi
2025-04-21 15:38 ` Tom Tromey
2025-04-23 4:12 ` Simon Marchi
2025-04-02 23:45 ` [PATCH v2 10/28] Have expand_symtabs_matching work for already-expanded CUs Tom Tromey
2025-04-23 15:53 ` Simon Marchi
2025-04-23 20:39 ` Tom Tromey
2025-04-23 20:57 ` Tom Tromey
2025-04-02 23:45 ` [PATCH v2 11/28] Rewrite the .gdb_index reader Tom Tromey
2025-04-23 17:22 ` Simon Marchi
2025-04-23 20:50 ` Tom Tromey
2025-04-24 14:37 ` Pedro Alves
2025-04-02 23:45 ` [PATCH v2 12/28] Convert default_collect_symbol_completion_matches_break_on Tom Tromey
2025-04-02 23:45 ` [PATCH v2 13/28] Convert gdbpy_lookup_static_symbols Tom Tromey
2025-04-02 23:45 ` [PATCH v2 14/28] Convert ada_add_global_exceptions Tom Tromey
2025-04-02 23:45 ` [PATCH v2 15/28] Convert ada_language_defn::collect_symbol_completion_matches Tom Tromey
2025-04-02 23:45 ` [PATCH v2 16/28] Convert ada-lang.c:map_matching_symbols Tom Tromey
2025-04-02 23:45 ` [PATCH v2 17/28] Remove expand_symtabs_matching Tom Tromey
2025-04-02 23:45 ` [PATCH v2 18/28] Simplify basic_lookup_transparent_type Tom Tromey
2025-04-02 23:45 ` [PATCH v2 19/28] Remove objfile::expand_symtabs_for_function Tom Tromey
2025-04-02 23:45 ` [PATCH v2 20/28] Convert linespec.c:iterate_over_all_matching_symtabs Tom Tromey
2025-04-02 23:45 ` [PATCH v2 21/28] Simplify block_lookup_symbol_primary Tom Tromey
2025-04-02 23:45 ` [PATCH v2 22/28] Pass lookup_name_info to block_lookup_symbol_primary Tom Tromey
2025-04-02 23:45 ` [PATCH v2 23/28] Simplify block_lookup_symbol Tom Tromey
2025-04-02 23:45 ` [PATCH v2 24/28] Add best_symbol_tracker Tom Tromey
2025-04-02 23:45 ` [PATCH v2 25/28] Convert lookup_symbol_via_quick_fns Tom Tromey
2025-04-02 23:45 ` [PATCH v2 26/28] Convert lookup_symbol_in_objfile Tom Tromey
2025-04-02 23:45 ` [PATCH v2 27/28] Make dw_expand_symtabs_matching_file_matcher static Tom Tromey
2025-04-23 20:00 ` Simon Marchi
2025-04-23 20:09 ` Tom Tromey
2025-04-23 20:44 ` Tom Tromey
2025-04-02 23:45 ` [PATCH v2 28/28] Remove enter_symbol_lookup Tom Tromey
2025-04-23 20:09 ` [PATCH v2 00/28] Search symbols via quick API Simon Marchi
2025-04-24 21:09 ` Tom Tromey
2025-04-28 14:07 ` Guinevere Larsen
2025-04-28 22:06 ` Tom Tromey
2025-04-29 19:31 ` Guinevere Larsen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250402-search-in-psyms-v2-9-ea91704487cb@tromey.com \
--to=tom@tromey.com \
--cc=gdb-patches@sourceware.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox