diff options
author | Dmitry Neverov <dmitry.neverov@jetbrains.com> | 2024-05-06 17:09:20 +0200 |
---|---|---|
committer | Tom Tromey <tromey@adacore.com> | 2024-05-17 08:02:30 -0600 |
commit | 1f8243f0398689189dfab7a669729a8c447467a8 (patch) | |
tree | dc7504fa9b01f58c9e8985933a3defa10b1e8acf | |
parent | 1cd542c8e9a40a4deff1709bf6e9344c5e79f7d6 (diff) | |
download | gdb-1f8243f0398689189dfab7a669729a8c447467a8.zip gdb-1f8243f0398689189dfab7a669729a8c447467a8.tar.gz gdb-1f8243f0398689189dfab7a669729a8c447467a8.tar.bz2 |
gdb/symtab: use symbol name matcher for all segments in a qualified name
-rw-r--r-- | gdb/dwarf2/read.c | 35 |
1 files changed, 25 insertions, 10 deletions
diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c index f2842f0..e841690 100644 --- a/gdb/dwarf2/read.c +++ b/gdb/dwarf2/read.c @@ -16644,12 +16644,16 @@ cooked_index_functions::expand_symtabs_matching { std::vector<std::string_view> name_vec = lookup_name_without_params.split_name (lang); - std::string last_name (name_vec.back ()); - - lookup_name_info last_segment_lookup_name ( - last_name, symbol_name_match_type::FULL, completing, true); + std::vector<std::string> name_str_vec (name_vec.begin (), name_vec.end ()); + std::vector<lookup_name_info> segment_lookup_names; + segment_lookup_names.reserve (name_vec.size ()); + for (auto &segment_name : name_str_vec) + { + segment_lookup_names.emplace_back (segment_name, + symbol_name_match_type::FULL, completing, true); + } - for (const cooked_index_entry *entry : table->find (last_name, + for (const cooked_index_entry *entry : table->find (name_str_vec.back (), completing)) { QUIT; @@ -16678,13 +16682,24 @@ cooked_index_functions::expand_symtabs_matching { /* If we ran out of entries, or if this segment doesn't match, this did not match. */ - if (parent == nullptr - || strncmp (parent->name, name_vec[i - 1].data (), - name_vec[i - 1].length ()) != 0) + if (parent == nullptr) { found = false; break; } + if (parent->lang != language_unknown) + { + const language_defn *lang_def = language_def (parent->lang); + symbol_name_matcher_ftype *name_matcher + = lang_def->get_symbol_name_matcher + (segment_lookup_names[i-1]); + if (!name_matcher (parent->canonical, + segment_lookup_names[i-1], nullptr)) + { + found = false; + break; + } + } parent = parent->get_parent (); } @@ -16708,9 +16723,9 @@ cooked_index_functions::expand_symtabs_matching const language_defn *lang_def = language_def (entry->lang); symbol_name_matcher_ftype *name_matcher = lang_def->get_symbol_name_matcher - (last_segment_lookup_name); + (segment_lookup_names.back ()); if (!name_matcher (entry->canonical, - last_segment_lookup_name, nullptr)) + segment_lookup_names.back (), nullptr)) continue; } } |