diff options
author | Tom de Vries <tdevries@suse.de> | 2020-06-10 14:46:53 +0200 |
---|---|---|
committer | Tom de Vries <tdevries@suse.de> | 2020-06-10 14:46:53 +0200 |
commit | e5f3ece2ab3b14677c87d9694d822c9ee01b36fe (patch) | |
tree | a3d298550febe9d946af4f99b695edf00f538534 /gdb | |
parent | e1b5d517d1c293a64df311d2749bbbbfbe035a4c (diff) | |
download | gdb-e5f3ece2ab3b14677c87d9694d822c9ee01b36fe.zip gdb-e5f3ece2ab3b14677c87d9694d822c9ee01b36fe.tar.gz gdb-e5f3ece2ab3b14677c87d9694d822c9ee01b36fe.tar.bz2 |
[gdb/symtab] Fix name lookup in dw2_map_matching_symbols
In commit 9a0bacfb08 "[gdb/symtab] Handle .gdb_index in ada language mode", a
missing part of dw2_map_matching_symbols was added, containing a call to
dw2_expand_symtabs_matching_symbol.
However, the callback passed to that call has one problem: the callback has an
argument "offset_type namei", which is ignored. Instead, match_name is passed
as argument to dw2_symtab_iter_init, where a name lookup is done, which may or
may not yield the same value as namei.
Fix this by creating a new version of dw2_symtab_iter_init that takes a
"offset_type namei" argument instead of "const char *name", and passing namei.
Tested on x86_64-linux, with native and target board cc-with-gdb-index.
gdb/ChangeLog:
2020-06-10 Tom de Vries <tdevries@suse.de>
* dwarf2/read.c (dw2_symtab_iter_init_common): Factor out of ...
(dw2_symtab_iter_init): ... here. Add variant with "offset_type
namei" instead of "const char *name" argument.
(dw2_map_matching_symbols): Use "offset_type namei" variant of
dw2_symtab_iter_init.
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/ChangeLog | 8 | ||||
-rw-r--r-- | gdb/dwarf2/read.c | 61 |
2 files changed, 55 insertions, 14 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 26310c4..40ce7bb 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,11 @@ +2020-06-10 Tom de Vries <tdevries@suse.de> + + * dwarf2/read.c (dw2_symtab_iter_init_common): Factor out of ... + (dw2_symtab_iter_init): ... here. Add variant with "offset_type + namei" instead of "const char *name" argument. + (dw2_map_matching_symbols): Use "offset_type namei" variant of + dw2_symtab_iter_init. + 2020-06-08 Simon Marchi <simon.marchi@efficios.com> * gdbtypes.h (TYPE_FIELD_TYPE): Remove. Change all call sites diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c index 97d1771..c33f0a1 100644 --- a/gdb/dwarf2/read.c +++ b/gdb/dwarf2/read.c @@ -3436,31 +3436,64 @@ struct dw2_symtab_iterator int global_seen; }; -/* Initialize the index symtab iterator ITER. */ +/* Initialize the index symtab iterator ITER, common part. */ static void -dw2_symtab_iter_init (struct dw2_symtab_iterator *iter, - dwarf2_per_objfile *per_objfile, - gdb::optional<block_enum> block_index, - domain_enum domain, - const char *name) +dw2_symtab_iter_init_common (struct dw2_symtab_iterator *iter, + dwarf2_per_objfile *per_objfile, + gdb::optional<block_enum> block_index, + domain_enum domain) { iter->per_objfile = per_objfile; iter->block_index = block_index; iter->domain = domain; iter->next = 0; iter->global_seen = 0; + iter->vec = NULL; + iter->length = 0; +} - mapped_index *index = per_objfile->per_bfd->index_table.get (); +/* Initialize the index symtab iterator ITER, const char *NAME variant. */ + +static void +dw2_symtab_iter_init (struct dw2_symtab_iterator *iter, + dwarf2_per_objfile *per_objfile, + gdb::optional<block_enum> block_index, + domain_enum domain, + const char *name) +{ + dw2_symtab_iter_init_common (iter, per_objfile, block_index, domain); + mapped_index *index = per_objfile->per_bfd->index_table.get (); /* index is NULL if OBJF_READNOW. */ - if (index != NULL && find_slot_in_mapped_hash (index, name, &iter->vec)) + if (index == NULL) + return; + + if (find_slot_in_mapped_hash (index, name, &iter->vec)) iter->length = MAYBE_SWAP (*iter->vec); - else - { - iter->vec = NULL; - iter->length = 0; - } +} + +/* Initialize the index symtab iterator ITER, offset_type NAMEI variant. */ + +static void +dw2_symtab_iter_init (struct dw2_symtab_iterator *iter, + dwarf2_per_objfile *per_objfile, + gdb::optional<block_enum> block_index, + domain_enum domain, offset_type namei) +{ + dw2_symtab_iter_init_common (iter, per_objfile, block_index, domain); + + mapped_index *index = per_objfile->per_bfd->index_table.get (); + /* index is NULL if OBJF_READNOW. */ + if (index == NULL) + return; + + gdb_assert (!index->symbol_name_slot_invalid (namei)); + const auto &bucket = index->symbol_table[namei]; + + iter->vec = (offset_type *) (index->constant_pool + + MAYBE_SWAP (bucket.vec)); + iter->length = MAYBE_SWAP (*iter->vec); } /* Return the next matching CU or NULL if there are no more. */ @@ -3765,7 +3798,7 @@ dw2_map_matching_symbols struct dwarf2_per_cu_data *per_cu; dw2_symtab_iter_init (&iter, per_objfile, block_kind, domain, - match_name); + namei); while ((per_cu = dw2_symtab_iter_next (&iter)) != NULL) dw2_expand_symtabs_matching_one (per_cu, per_objfile, nullptr, nullptr); |