From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id +cmsD11Lt2pN2wUAWB0awg (envelope-from ) for ; Sat, 26 Sep 2026 00:34:37 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=simark.ca; s=mail; t=1790397277; bh=tnMVGWlXqx1iJbxjkkEua/jtG//hddM+OdNggTa8LOI=; h=Date:Subject:To:Cc:References:From:In-Reply-To:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=vWfgRrkNLnQWMvlfi+6uldq1UP4lKt7eu435YRtBG+oNbQYWpNS1+DEwUIdwx6kGP sfFtTgm4Iqs8bhAHSV8GRMQUDGIqsRunGyoAfTu21I3sTcELBrZY9WY+JLBW764wrK SzCx2HZagzT8PyVpz2tlcNiycsAtu8b3uJK2V68E= Received: by simark.ca (Postfix, from userid 112) id 2FAA11E06B; Sat, 26 Sep 2026 00:34:37 -0400 (EDT) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-25) on simark.ca X-Spam-Level: X-Spam-Status: No, score=-2.4 required=5.0 tests=ARC_SIGNED,ARC_VALID,BAYES_00, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,MAILING_LIST_MULTI, RCVD_IN_DNSWL_MED,RCVD_IN_VALIDITY_CERTIFIED_BLOCKED, RCVD_IN_VALIDITY_RPBL_BLOCKED,RCVD_IN_VALIDITY_SAFE_BLOCKED autolearn=ham autolearn_force=no version=4.0.1 Authentication-Results: simark.ca; dkim=pass (1024-bit key; unprotected) header.d=simark.ca header.i=@simark.ca header.a=rsa-sha256 header.s=mail header.b=C3qipLH9; dkim-atps=neutral Received: from vm01.sourceware.org (vm01.sourceware.org [38.145.34.32]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature ECDSA (prime256v1) server-digest SHA256) (No client certificate requested) by simark.ca (Postfix) with ESMTPS id A45E21E033 for ; Sat, 26 Sep 2026 00:34:34 -0400 (EDT) Received: from vm01.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 0470F4B920C8 for ; Sat, 26 Sep 2026 04:34:34 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 0470F4B920C8 Authentication-Results: sourceware.org; dkim=pass (1024-bit key, unprotected) header.d=simark.ca header.i=@simark.ca header.a=rsa-sha256 header.s=mail header.b=C3qipLH9 Received: from simark.ca (simark.ca [158.69.221.121]) by sourceware.org (Postfix) with ESMTPS id 832414BB591D for ; Sat, 26 Sep 2026 04:34:09 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 832414BB591D Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=simark.ca Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=simark.ca ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 832414BB591D Authentication-Results: sourceware.org; arc=none smtp.remote-ip=158.69.221.121 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1790397249; cv=none; b=dlpv3UQsvo/TicNrTm1f8Mg0+8GJxhDAnEYmo5xSL3Aax7pV8v9oPqQWY4JgBzWfZIY0ixDiCY+J4SXToTJtFeb/79+RWVGKYJAdf0OCyOvIES1WxY6E3S3TsZQGd+X5Tl3BlrjhOW01brxHbiUqPESsQa9/Bb8LwG6wE9aYcQk= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1790397249; c=relaxed/simple; bh=tnMVGWlXqx1iJbxjkkEua/jtG//hddM+OdNggTa8LOI=; h=DKIM-Signature:Message-ID:Date:MIME-Version:Subject:To:From; b=NPM/SXKRLzAsAoO1teoKkbgSgZwxhrl8r+AVAvpmCSXk9H4L3YCmnhvwaG8xNgOZprnyF8+V5mxk/IeuVrbPVSLr51AzTAM4yOCW5PR5ILMWDaRs+T9Rsc2KFGXE1RulTdhIdiCZK0aq7DOu1x72JTLCT6LYoQwz9rSxGDbc37g= ARC-Authentication-Results: i=1; sourceware.org; dkim=pass (1024-bit key, unprotected) header.d=simark.ca header.i=@simark.ca header.a=rsa-sha256 header.s=mail header.b=C3qipLH9 DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 832414BB591D DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=simark.ca; s=mail; t=1790397247; bh=tnMVGWlXqx1iJbxjkkEua/jtG//hddM+OdNggTa8LOI=; h=Date:Subject:To:Cc:References:From:In-Reply-To:From; b=C3qipLH92QdeS4fiUbEou0U9gGoCe3GGVaFFrhz+EfnvxlCnxe6Bge2KpnCG3oKMB VIIceN8VR1pJ//N5ZjEGwyKmmWXCJIaYoitrgRU0OuxnJBXzxAhqToscq33JI/+UX9 effJslSshWHy8cp7NeIwKwhB719Av3RTVNQ9UmxA= Received: by simark.ca (Postfix) id 8FC381E033; Sat, 26 Sep 2026 00:34:06 -0400 (EDT) Message-ID: <70a1e0a0-97e9-45fb-94fd-16534505d96c@simark.ca> Date: Sat, 26 Sep 2026 00:34:06 -0400 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH] gdb: Skip useless minsym scan in variable-only symbol searches To: Adhemerval Zanella , gdb-patches@sourceware.org Cc: Thiago Jung Bauermann References: <20260922155125.3710118-1-adhemerval.zanella@linaro.org> Content-Language: fr From: Simon Marchi In-Reply-To: <20260922155125.3710118-1-adhemerval.zanella@linaro.org> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gdb-patches-bounces~public-inbox=simark.ca@sourceware.org On 9/22/26 11:51 AM, Adhemerval Zanella wrote: > The symbol-listing command -symbol-info-* family goes through > global_symbol_searcher::search, which has 3 steps: > > 1. expand_symtabs (objfile, preg): make sure every compunit that could > contain a match is expanded. Returns found_msymbol = true if it > saw a matching msymbol that has no debug info. > > 2. add_matching_symbols (...): walk the compunits and collect the real > matches. > > 3. After the loop, a minsym fallback: if found_msymbol was set, or > unconditionally for any variable search with no file filter, re-scan > msymbols and append the ones without debug info (unless the searcher > set exclude_minsyms). > > Step 1 had two phases, first objfile::search, which uses the > quick-symbol index to expand candidate compunits; then the pre-pass > for every msymbol in the objfile whose name matches the regexp: > > 1.1. function search: call find_compunit_symtab_for_pc (address). This > consults the quick functions and can expand the compunit containing > that address. > > 1.2. variable search: call lookup_symbol_in_objfile_from_linkage_name, > which does a linear scan of objfile->compunits () per lookup. It > can not expand anything; its only output is setting found_msymbol > when the lookup fails. > > So for variables the pre-pass costs 'msymbols * expanded-compunits' > block lookups and produces exactly one bit of information (found_msymbol) > and this dominates the command execution time. > > And in step 3. these MI3 commands (search_module_symbols) calls > spec2.set_exclude_minsyms (true), which sets !m_exclude_minsyms to false. The phrasing "sets !m_exclude_minsyms to false" really confused me, could you rephrase this? > The fallback never runs (found_msymbol is ignored), making the pre-pass > calculation not required. > > The fix is make SEARCH_VAR_DOMAIN skip the pre-pass. For variable > searches with no filenames the fallback condition already contains > '(m_kind & SEARCH_VAR_DOMAIN) != 0' as an unconditional alternative. > > Since the pre-pass now only runs for searches that include > SEARCH_FUNCTION_DOMAIN, the lookup_symbol_in_objfile_from_linkage_name > branch of the conditional inside the loop is unreachable. > > Also update the comments, which still described the variable lookup and > claimed it forces symtabs to be read. That was true when > lookup_symbol_in_objfile_from_linkage_name was added in commit > 422d65e705c7, but it no longer expands any symtab. > > -symbol-info-module-variables --module on the 2000-module benchmark > drops from 90 s to 0.56 s cold. Awesome. It took me a while to convince myself that the change is correct, and how global_symbol_searcher works in the various cases. One thing that was not obvious to me was that it only supports one kind of search at a time (you can't search for variables _and_ functions in one search), despite the use of domain_search_flags that would suggest the opposite. In the process I made a few patches to tweak global_symbol_searcher to make it more readable, I'll post them after your patch it merged. > > Change-Id: I6019bcf80629f21cf6dee74d0e96fa788a70e220 > --- > gdb/symtab.c | 35 ++++++++++++++--------------------- > 1 file changed, 14 insertions(+), 21 deletions(-) > > diff --git a/gdb/symtab.c b/gdb/symtab.c > index 93684c14777..13824587e75 100644 > --- a/gdb/symtab.c > +++ b/gdb/symtab.c > @@ -4750,22 +4750,20 @@ global_symbol_searcher::expand_symtabs > SEARCH_GLOBAL_BLOCK | SEARCH_STATIC_BLOCK, > kind); > > - /* Here, we search through the minimal symbol tables for functions and > - variables that match, and force their symbols to be read. This is in > - particular necessary for demangled variable names, which are no longer > - put into the partial symbol tables. The symbol will then be found > + /* Here, we search through the minimal symbol tables for functions that > + match, and force their symbols to be read. The symbol will then be found > during the scan of symtabs later. > > - For functions, find_pc_symtab should succeed if we have debug info for > - the function, for variables we have to call > - lookup_symbol_in_objfile_from_linkage_name to determine if the > - variable has debug info. If the lookup fails, set found_msymbol so > - that we will rescan to print any matching symbols without debug info. > - We only search the objfile the msymbol came from, we no longer search > - all objfiles. In large programs (1000s of shared libs) searching all > - objfiles is not worth the pain. */ > + The find_compunit_symtab_for_pc should succeed if we have debug info for I would remove the "The" in this last line. > + the function. If it fails, set found_msymbol so that we will rescan to > + print any matching symbols without debug info. We only search the > + objfile the msymbol came from, we no longer search all objfiles. > + > + Variables are not handled here, and looking them up does not expand any > + symtab. When no file names were given the caller unconditionally rescans > + the minimal symbols for SEARCH_VAR_DOMAIN. */ > if (m_filenames.empty () > - && (kind & (SEARCH_VAR_DOMAIN | SEARCH_FUNCTION_DOMAIN)) != 0) > + && (kind & SEARCH_FUNCTION_DOMAIN) != 0) > { > for (minimal_symbol *msymbol : objfile->msymbols ()) > { > @@ -4780,18 +4778,13 @@ global_symbol_searcher::expand_symtabs > || preg->exec (msymbol->natural_name (), 0, > NULL, 0) == 0) > { > - /* An important side-effect of these lookup functions is > + /* An important side-effect of this lookup function is > to expand the symbol table if msymbol is found, later > in the process we will add matching symbols or > msymbols to the results list, and that requires that > the symbols tables are expanded. */ > - if ((kind & SEARCH_FUNCTION_DOMAIN) != 0 > - ? (find_compunit_symtab_for_pc > - (msymbol->value_address (objfile)) == NULL) > - : (lookup_symbol_in_objfile_from_linkage_name > - (objfile, msymbol->linkage_name (), > - SEARCH_VFT) > - .symbol == NULL)) > + if (find_compunit_symtab_for_pc > + (msymbol->value_address (objfile)) == nullptr) > found_msymbol = true; One change I had locally to help me understand what this does was to rename found_msymbol to found_func_msymbol_without_debug_info. Could you rename it as part of this patch, and rename the variable in global_symbol_searcher::search too? LGTM with that fixed. Approved-By: Simon Marchi And thanks Thiago for testing. Simon