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 513083858D34 for ; Tue, 26 May 2020 13:02:02 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 513083858D34 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 288FEB120; Tue, 26 May 2020 13:02:04 +0000 (UTC) Subject: [PATCH][gdb/symtab] Make gold index workaround more precise To: Tom Tromey Cc: gdb-patches@sourceware.org References: <20200513094147.GA20499@delia> <87tv0b64yd.fsf@tromey.com> <89719b8a-9252-7af5-3ad8-1bcd1ebbc80c@suse.de> <87zh9z1zkr.fsf@tromey.com> From: Tom de Vries Autocrypt: addr=tdevries@suse.de; keydata= xsBNBF0ltCcBCADDhsUnMMdEXiHFfqJdXeRvgqSEUxLCy/pHek88ALuFnPTICTwkf4g7uSR7 HvOFUoUyu8oP5mNb4VZHy3Xy8KRZGaQuaOHNhZAT1xaVo6kxjswUi3vYgGJhFMiLuIHdApoc u5f7UbV+egYVxmkvVLSqsVD4pUgHeSoAcIlm3blZ1sDKviJCwaHxDQkVmSsGXImaAU+ViJ5l CwkvyiiIifWD2SoOuFexZyZ7RUddLosgsO0npVUYbl6dEMq2a5ijGF6/rBs1m3nAoIgpXk6P TCKlSWVW6OCneTaKM5C387972qREtiArTakRQIpvDJuiR2soGfdeJ6igGA1FZjU+IsM5ABEB AAHNH1RvbSBkZSBWcmllcyA8dGRldnJpZXNAc3VzZS5kZT7CwKsEEwEIAD4WIQSsnSe5hKbL MK1mGmjuhV2rbOJEoAUCXSW0JwIbAwUJA8JnAAULCQgHAgYVCgkICwIEFgIDAQIeAQIXgAAh CRDuhV2rbOJEoBYhBKydJ7mEpsswrWYaaO6FXats4kSgc48H/Ra2lq5p3dHsrlQLqM7N68Fo eRDf3PMevXyMlrCYDGLVncQwMw3O/AkousktXKQ42DPJh65zoXB22yUt8m0g12xkLax98KFJ 5NyUloa6HflLl+wQL/uZjIdNUQaHQLw3HKwRMVi4l0/Jh/TygYG1Dtm8I4o708JS4y8GQxoQ UL0z1OM9hyM3gI2WVTTyprsBHy2EjMOu/2Xpod95pF8f90zBLajy6qXEnxlcsqreMaqmkzKn 3KTZpWRxNAS/IH3FbGQ+3RpWkNGSJpwfEMVCeyK5a1n7yt1podd1ajY5mA1jcaUmGppqx827 8TqyteNe1B/pbiUt2L/WhnTgW1NC1QDOwE0EXSW0JwEIAM99H34Bu4MKM7HDJVt864MXbx7B 1M93wVlpJ7Uq+XDFD0A0hIal028j+h6jA6bhzWto4RUfDl/9mn1StngNVFovvwtfzbamp6+W pKHZm9X5YvlIwCx131kTxCNDcF+/adRW4n8CU3pZWYmNVqhMUiPLxElA6QhXTtVBh1RkjCZQ Kmbd1szvcOfaD8s+tJABJzNZsmO2hVuFwkDrRN8Jgrh92a+yHQPd9+RybW2l7sJv26nkUH5Z 5s84P6894ebgimcprJdAkjJTgprl1nhgvptU5M9Uv85Pferoh2groQEAtRPlCGrZ2/2qVNe9 XJfSYbiyedvApWcJs5DOByTaKkcAEQEAAcLAkwQYAQgAJhYhBKydJ7mEpsswrWYaaO6FXats 4kSgBQJdJbQnAhsMBQkDwmcAACEJEO6FXats4kSgFiEErJ0nuYSmyzCtZhpo7oVdq2ziRKD3 twf7BAQBZ8TqR812zKAD7biOnWIJ0McV72PFBxmLIHp24UVe0ZogtYMxSWKLg3csh0yLVwc7 H3vldzJ9AoK3Qxp0Q6K/rDOeUy3HMqewQGcqrsRRh0NXDIQk5CgSrZslPe47qIbe3O7ik/MC q31FNIAQJPmKXX25B115MMzkSKlv4udfx7KdyxHrTSkwWZArLQiEZj5KG4cCKhIoMygPTA3U yGaIvI/BGOtHZ7bEBVUCFDFfOWJ26IOCoPnSVUvKPEOH9dv+sNy7jyBsP5QxeTqwxC/1ZtNS DUCSFQjqA6bEGwM22dP8OUY6SC94x1G81A9/xbtm9LQxKm0EiDH8KBMLfQ== Message-ID: Date: Tue, 26 May 2020 15:01:58 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.5.0 MIME-Version: 1.0 In-Reply-To: <87zh9z1zkr.fsf@tromey.com> Content-Type: multipart/mixed; boundary="------------563822F78F51A2FF04DF7A82" Content-Language: en-US X-Spam-Status: No, score=-16.7 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, KAM_STOCKGEN, 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, 26 May 2020 13:02:04 -0000 This is a multi-part message in MIME format. --------------563822F78F51A2FF04DF7A82 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit [ was: Re: [PATCH][gdb/symtab] Handle .gdb_index in ada language mode ] On 22-05-2020 22:31, Tom Tromey wrote: >>>>>> "Tom" == Tom de Vries writes: > > Tom> Using this patch, I managed to get it working. > > Wow, cool. > > Tom> The patch does the following: > Tom> - enable ada .gdb_index by removing the ada check in write_psymbols > Tom> - copy some ada-specific code from debug_names::insert to > Tom> write_psymbols > Tom> - disable a workaround for gold/15646 in dw2_expand_marked_cus > > Tom> As for the disabled workaround, I ran into trouble in > Tom> gdb.ada/access_tagged_param.exp, where setting a breakpoint on foo failed. > > Tom> The index shows that there are two entries for foo, one variable, one > Tom> function: > Tom> ... > Tom> [3733] foo: > Tom> 3 [global, variable] > Tom> 5 [global, function] > Tom> ... > Tom> The workaround skips the function, so disabling the workaround allows > Tom> the test to pass (my guess atm is that the workaround is not precise > Tom> enough). > > Looking at the gold bug, I suspect what's needed is to rule out > duplicates that have the same kind. > I've: - committed a target board gold-gdb-index - committed a test-case for the workaround (gdb.base/gold-gdb-index.exp), and - wrote a patch to make the duplicate check more precise (attached below). Any comments? Thanks, - Tom --------------563822F78F51A2FF04DF7A82 Content-Type: text/x-patch; charset=UTF-8; name="0001-gdb-symtab-Make-gold-index-workaround-more-precise.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename*0="0001-gdb-symtab-Make-gold-index-workaround-more-precise.patc"; filename*1="h" [gdb/symtab] Make gold index workaround more precise There's a PR binutils/15646 - "gold-generated .gdb_index has duplicated symbols that gdb-generated index doesn't", that causes gold to generate duplicate symbols in the index. F.i., a namespace N1 declared in a header file can be listed for two CUs that include the header file: ... [759] N1: 2 [global type] 3 [global type] ... This causes a gdb performance problem: f.i. when attempting to set a breakpoint on a non-existing function N1::misspelled, the symtab for both CUs will be expanded. Gdb contains a workaround for this, added in commit 8943b87476 "Work around gold/15646", that skips duplicate global symbols in the index. However, the workaround does not check for the symbol kind ("type" in the example above). Make the workaround more precise by taking symbol kind into account in the check for duplicates. Tested on x86_64-linux, with native and target board gold-gdb-index. gdb/ChangeLog: 2020-05-26 Tom de Vries * dwarf2/read.c (NR_GDB_INDEX_SYMBOL_KINDS): Define. (struct dw2_symtab_iterator): Make seen_before a bool array. (dw2_symtab_iter_init): Update seen_before initialization. (dw2_symtab_iter_next, dw2_expand_marked_cus): Check for symbol_kind in duplicate check. --- gdb/dwarf2/read.c | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c index ec3844188e..4a93cad301 100644 --- a/gdb/dwarf2/read.c +++ b/gdb/dwarf2/read.c @@ -3344,6 +3344,8 @@ dw2_map_symtabs_matching_filename return false; } +#define NR_GDB_INDEX_SYMBOL_KINDS (GDB_INDEX_SYMBOL_KIND_MASK + 1) + /* Struct used to manage iterating over all CUs looking for a symbol. */ struct dw2_symtab_iterator @@ -3366,7 +3368,7 @@ struct dw2_symtab_iterator If so we can ignore all further global instances. This is to work around gold/15646, inefficient gold-generated indices. */ - int global_seen; + bool global_seen[NR_GDB_INDEX_SYMBOL_KINDS]; }; /* Initialize the index symtab iterator ITER. */ @@ -3382,7 +3384,8 @@ dw2_symtab_iter_init (struct dw2_symtab_iterator *iter, iter->block_index = block_index; iter->domain = domain; iter->next = 0; - iter->global_seen = 0; + for (unsigned i = 0; i < NR_GDB_INDEX_SYMBOL_KINDS; ++i) + iter->global_seen[i] = false; mapped_index *index = dwarf2_per_objfile->index_table.get (); @@ -3448,10 +3451,10 @@ dw2_symtab_iter_next (struct dw2_symtab_iterator *iter) } /* Work around gold/15646. */ - if (!is_static && iter->global_seen) + if (!is_static && iter->global_seen[symbol_kind]) continue; if (!is_static) - iter->global_seen = 1; + iter->global_seen[symbol_kind] = true; } /* Only check the symbol's kind if it has one. */ @@ -4514,9 +4517,12 @@ dw2_expand_marked_cus search_domain kind) { offset_type *vec, vec_len, vec_idx; - bool global_seen = false; + bool global_seen[NR_GDB_INDEX_SYMBOL_KINDS]; mapped_index &index = *dwarf2_per_objfile->index_table; + for (unsigned i = 0; i < NR_GDB_INDEX_SYMBOL_KINDS; ++i) + global_seen[i] = false; + vec = (offset_type *) (index.constant_pool + MAYBE_SWAP (index.symbol_table[idx].vec)); vec_len = MAYBE_SWAP (vec[0]); @@ -4539,10 +4545,10 @@ dw2_expand_marked_cus /* Work around gold/15646. */ if (attrs_valid) { - if (!is_static && global_seen) + if (!is_static && global_seen[symbol_kind]) continue; if (!is_static) - global_seen = true; + global_seen[symbol_kind] = true; } /* Only check the symbol's kind if it has one. */ --------------563822F78F51A2FF04DF7A82--