From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mx2.suse.de (mx2.suse.de [195.135.220.15]) by sourceware.org (Postfix) with ESMTPS id B83993858D34 for ; Tue, 2 Jun 2020 10:42:08 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org B83993858D34 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=tdevries@suse.de X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (unknown [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 36BB5AC5F for ; Tue, 2 Jun 2020 10:42:10 +0000 (UTC) Date: Tue, 2 Jun 2020 12:42:06 +0200 From: Tom de Vries To: gdb-patches@sourceware.org Subject: [PATCH, 1/2][gdb/symtab] Fix name lookup in dw2_map_matching_symbols Message-ID: <20200602104205.GA5646@delia> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.10.1 (2018-07-13) X-Spam-Status: No, score=-16.9 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 02 Jun 2020 10:42:10 -0000 Hi, 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. Any comments? Thanks, - Tom [gdb/symtab] Fix name lookup in dw2_map_matching_symbols gdb/ChangeLog: 2020-06-02 Tom de Vries * 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. --- gdb/dwarf2/read.c | 61 ++++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 47 insertions(+), 14 deletions(-) diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c index e6566f9649..65b3b9f0a3 100644 --- a/gdb/dwarf2/read.c +++ b/gdb/dwarf2/read.c @@ -3431,31 +3431,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_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_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_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_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. */ @@ -3760,7 +3793,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);