From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id +UONDsTBvWryTCEAWB0awg (envelope-from ) for ; Wed, 30 Sep 2026 22:13:24 -0400 Authentication-Results: simark.ca; dkim=pass (2048-bit key; unprotected) header.d=polymtl.ca header.i=@polymtl.ca header.a=rsa-sha256 header.s=oct2025 header.b=A/g+LEIb; dkim-atps=neutral Received: by simark.ca (Postfix, from userid 112) id 340C11E051; Wed, 30 Sep 2026 22:13:24 -0400 (EDT) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-25) on simark.ca X-Spam-Level: X-Spam-Status: No, score=-5.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 autolearn=ham autolearn_force=no version=4.0.1 Received: from vm01.sourceware.org (vm01.sourceware.org [IPv6:2620:52:6:3111::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 617851E033 for ; Wed, 30 Sep 2026 22:13:23 -0400 (EDT) Received: from vm01.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id E4BFF4BB58CA for ; Thu, 1 Oct 2026 02:13:21 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org E4BFF4BB58CA Authentication-Results: sourceware.org; dkim=pass (2048-bit key, unprotected) header.d=polymtl.ca header.i=@polymtl.ca header.a=rsa-sha256 header.s=oct2025 header.b=A/g+LEIb Received: from smtp.polymtl.ca (smtp.polymtl.ca [132.207.4.11]) by sourceware.org (Postfix) with ESMTPS id 3C0A74BB1C24 for ; Thu, 1 Oct 2026 02:12:04 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 3C0A74BB1C24 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=polymtl.ca Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=polymtl.ca ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 3C0A74BB1C24 Authentication-Results: sourceware.org; arc=none smtp.remote-ip=132.207.4.11 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1790820724; cv=none; b=nrfEOGBHpHO4+VF8QTIiumzIjlLff0mWfSZO8JzUqgsSIaENA7z9JZD1EYwGwtOWHyvkWuzVeqVCBVs7/xLcaMfs+z9Rw6v3FXrNmDkgf8UUv/MxOFDyTkTg+5j6raMxuve38ZB+esi14p8kVqnPe5gT1jgGVBwLLXhlKTOKQKU= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1790820724; c=relaxed/simple; bh=RnQLqq5q+UF1N7dSWfkR28PSq3x0ifYkeFvwBJshvlk=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=itCiIQJfRed3syKSiRi4c08l1U+UwkGZNoFYDCMe+UIh9AEIZeW4Ozc1EyhEabtitnOU09DoR5TJgDzzRfCIIMDYImlVe6eiD39QT8ofe7+NHQj4QZ2ndHhSIgHziVAki8L9MfS2eB7Nhpxb/tEo7uE8AN5QXxvDMnuT688H/X4= ARC-Authentication-Results: i=1; sourceware.org; dkim=pass (2048-bit key, unprotected) header.d=polymtl.ca header.i=@polymtl.ca header.a=rsa-sha256 header.s=oct2025 header.b=A/g+LEIb DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 3C0A74BB1C24 Received: from simark.ca (simark.ca [158.69.221.121]) (authenticated bits=0) by smtp.polymtl.ca (8.14.7/8.14.7) with ESMTP id 6912BvS7168305 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 30 Sep 2026 22:12:02 -0400 DKIM-Filter: OpenDKIM Filter v2.11.0 smtp.polymtl.ca 6912BvS7168305 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=polymtl.ca; s=oct2025; t=1790820723; bh=D6hsvakglW0ux8bJhQWOhp9FPeB2FvCDPSl77t2M05c=; h=From:To:Cc:Subject:Date:In-Reply-To:From; b=A/g+LEIbpZ2dMiluHZZJsywDUX5lC18F6oUm6gZYaBlYxszEpLvnRurqPKOkMkafV q1Gz/7IhIqSPGtw0IA8ZrYxQxgP8hcd4tYoA97NdHtcwV0TR4qnuYAq7IYsRruB5Uf 4xE8OYz7MVWGKIn8zyEVxkicRMhjK0e4l4GgH2kODEJefTvnZoyGwjnx8bKMwqbV6B xMLl1Y1DfCg8rIoev8bU1kwf57o/n2s1Temx8tkc00rnaZU6kaJCFTsgBNDFLRuz+r XLgjcFXiwz6ACIc/eh+L4zNSqh4wtpVx4mt25X5qO2Cq7rmXA7FxMmGiHbd0QrjTX8 64GaHD0LQe0ng== Received: by simark.ca (Postfix) id A15381E04E; Wed, 30 Sep 2026 22:11:57 -0400 (EDT) From: simon.marchi@polymtl.ca To: gdb-patches@sourceware.org Cc: Simon Marchi Subject: [PATCH v2 09/11] gdb: add matching helpers to global_symbol_searcher Date: Wed, 30 Sep 2026 22:09:26 -0400 Message-ID: <20261001020952.698419-10-simon.marchi@polymtl.ca> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260929194119.155169-1-simon.marchi@efficios.com> References: <20260929194119.155169-1-simon.marchi@efficios.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Poly-FromMTA: (simark.ca [158.69.221.121]) at Thu, 1 Oct 2026 02:11:58 +0000 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 From: Simon Marchi The methods of global_symbol_searcher repeat the same checks in several places. Add some helpers to make the code easier to follow: - name_matches: check a name against the (optional) name regexp - symtab_matches_filenames: check a symtab against the searched file names - symbol_matches: all the filtering done on full symbols in add_matching_symbols - msymbol_matches: the filtering done on minimal symbols, shared by expand_symtabs and add_matching_msymbols Switch expand_symtabs, add_matching_symbols and add_matching_msymbols to use early continues to avoid deeply nested ifs. Change-Id: I553f70fb8ea9c7e55b89bb1204a402938c116c3b --- gdb/symtab.c | 205 ++++++++++++++++++++++++++++----------------------- gdb/symtab.h | 16 ++++ 2 files changed, 130 insertions(+), 91 deletions(-) diff --git a/gdb/symtab.c b/gdb/symtab.c index fc0ff22448ee..ef21f285abcd 100644 --- a/gdb/symtab.c +++ b/gdb/symtab.c @@ -4739,6 +4739,93 @@ global_symbol_searcher::is_suitable_msymbol } } +/* Return true if NAME matches NAME_REGEX, or if NAME_REGEX is empty. */ + +static bool +name_matches (const std::optional &name_regex, + const char *name) +{ + return (!name_regex.has_value () + || name_regex->exec (name, 0, nullptr, 0) == 0); +} + +/* See symtab.h. */ + +bool +global_symbol_searcher::symtab_matches_filenames (symtab *symtab) const +{ + /* Check first sole SYMTAB->FILENAME. It does not need to be a substring + of symtab_to_fullname as it may contain "./" etc. */ + if (file_matches (symtab->filename (), m_filenames, false)) + return true; + + if (!basenames_may_differ + && !file_matches (lbasename (symtab->filename ()), m_filenames, true)) + return false; + + return file_matches (symtab_to_fullname (symtab), m_filenames, false); +} + +/* See symtab.h. */ + +bool +global_symbol_searcher::symbol_matches + (const symbol *sym, + const std::optional &name_regex, + const std::optional &type_regex) const +{ + if (!symtab_matches_filenames (sym->symtab ())) + return false; + + if (!sym->matches (to_search_flags (m_kind))) + return false; + + if (!name_matches (name_regex, sym->natural_name ())) + return false; + + switch (m_kind) + { + case symbol_search_kind::VARIABLE: + /* LOC_CONST can be used for more than just enums, e.g., C++ static + const members. We only want to skip enums here. */ + if (sym->loc_class () == LOC_UNRESOLVED + || (sym->loc_class () == LOC_CONST + && sym->type ()->code () == TYPE_CODE_ENUM)) + return false; + [[fallthrough]]; + + case symbol_search_kind::FUNCTION: + if (type_regex.has_value () + && !regex_matches_sym_type_name (*type_regex, sym)) + return false; + break; + + case symbol_search_kind::MODULE: + /* Skip module declarations, keep only definitions. */ + if (sym->line () == 0) + return false; + break; + } + + return true; +} + +/* See symtab.h. */ + +bool +global_symbol_searcher::msymbol_matches + (const minimal_symbol *msymbol, + const std::optional &name_regex) const +{ + if (msymbol->created_by_gdb) + return false; + + if (!is_suitable_msymbol (msymbol)) + return false; + + return name_matches (name_regex, msymbol->natural_name ()); +} + /* See symtab.h. */ bool @@ -4761,8 +4848,7 @@ global_symbol_searcher::expand_symtabs &lookup_name_info::match_any (), [&] (const char *symname) { - return (!name_regex.has_value () - || name_regex->exec (symname, 0, NULL, 0) == 0); + return name_matches (name_regex, symname); }, NULL, SEARCH_GLOBAL_BLOCK | SEARCH_STATIC_BLOCK, @@ -4788,25 +4874,16 @@ global_symbol_searcher::expand_symtabs { QUIT; - if (msymbol->created_by_gdb) + if (!msymbol_matches (msymbol, name_regex)) continue; - if (is_suitable_msymbol (msymbol)) - { - if (!name_regex.has_value () - || name_regex->exec (msymbol->natural_name (), 0, - NULL, 0) == 0) - { - /* 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 (find_compunit_symtab_for_pc - (msymbol->value_address (objfile)) == nullptr) - found_func_msymbol_without_debug_info = true; - } - } + /* 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 (find_compunit_symtab_for_pc + (msymbol->value_address (objfile)) == nullptr) + found_func_msymbol_without_debug_info = true; } } @@ -4822,8 +4899,6 @@ global_symbol_searcher::add_matching_symbols const std::optional &type_regex, std::set *result_set) const { - domain_search_flags domain = to_search_flags (m_kind); - /* Add matching symbols (if not already present). */ for (compunit_symtab &cust : objfile->compunits ()) { @@ -4835,54 +4910,11 @@ global_symbol_searcher::add_matching_symbols for (struct symbol *sym : block_iterator_range (b)) { - struct symtab *real_symtab = sym->symtab (); - QUIT; - /* Check first sole REAL_SYMTAB->FILENAME. It does - not need to be a substring of symtab_to_fullname as - it may contain "./" etc. */ - if (!(file_matches (real_symtab->filename (), m_filenames, false) - || ((basenames_may_differ - || file_matches (lbasename (real_symtab->filename ()), - m_filenames, true)) - && file_matches (symtab_to_fullname (real_symtab), - m_filenames, false)))) - continue; - - if (!sym->matches (domain)) + if (!symbol_matches (sym, name_regex, type_regex)) continue; - if (name_regex.has_value () - && name_regex->exec (sym->natural_name (), 0, - nullptr, 0) != 0) - continue; - - switch (m_kind) - { - case symbol_search_kind::VARIABLE: - /* LOC_CONST can be used for more than just enums, e.g., - C++ static const members. We only want to skip enums - here. */ - if (sym->loc_class () == LOC_UNRESOLVED - || (sym->loc_class () == LOC_CONST - && sym->type ()->code () == TYPE_CODE_ENUM)) - continue; - [[fallthrough]]; - - case symbol_search_kind::FUNCTION: - if (type_regex.has_value () - && !regex_matches_sym_type_name (*type_regex, sym)) - continue; - break; - - case symbol_search_kind::MODULE: - /* Skip module declarations, keep only definitions. */ - if (sym->line () == 0) - continue; - break; - } - /* Match, insert if not already in the results. */ if (result_set->size () < m_max_search_results) result_set->emplace (block, sym); @@ -4906,34 +4938,25 @@ global_symbol_searcher::add_matching_msymbols { QUIT; - if (msymbol->created_by_gdb) + if (!msymbol_matches (msymbol, name_regex)) continue; - if (is_suitable_msymbol (msymbol)) - { - if (!name_regex.has_value () - || name_regex->exec (msymbol->natural_name (), 0, - NULL, 0) == 0) - { - /* For functions we can do a quick check of whether the - symbol might be found via find_pc_symtab. */ - if (m_kind != symbol_search_kind::FUNCTION - || (find_compunit_symtab_for_pc - (msymbol->value_address (objfile)) == NULL)) - { - if (lookup_symbol_in_objfile_from_linkage_name - (objfile, msymbol->linkage_name (), - SEARCH_VFT).symbol == NULL) - { - /* Matching msymbol, add it to the results list. */ - if (results->size () < m_max_search_results) - results->emplace_back (GLOBAL_BLOCK, msymbol, objfile); - else - return false; - } - } - } - } + /* For functions we can do a quick check of whether the + symbol might be found via find_pc_symtab. */ + if (m_kind == symbol_search_kind::FUNCTION + && (find_compunit_symtab_for_pc + (msymbol->value_address (objfile)) != NULL)) + continue; + + if (lookup_symbol_in_objfile_from_linkage_name + (objfile, msymbol->linkage_name (), SEARCH_VFT).symbol != NULL) + continue; + + /* Matching msymbol, add it to the results list. */ + if (results->size () < m_max_search_results) + results->emplace_back (GLOBAL_BLOCK, msymbol, objfile); + else + return false; } return true; diff --git a/gdb/symtab.h b/gdb/symtab.h index 28b9d7b4c78d..cf629387a17c 100644 --- a/gdb/symtab.h +++ b/gdb/symtab.h @@ -2687,6 +2687,22 @@ class global_symbol_searcher /* Compile M_SYMBOL_TYPE_REGEXP, if set. */ std::optional compile_type_regex () const; + /* Return true if SYMTAB matches one of M_FILENAMES. */ + bool symtab_matches_filenames (symtab *symtab) const; + + /* Return true if SYM is of kind M_KIND, is in a file matching + M_FILENAMES, and matches NAME_REGEX and TYPE_REGEX. */ + bool symbol_matches (const symbol *sym, + const std::optional &name_regex, + const std::optional &type_regex) const; + + /* Return true if MSYMBOL is of kind M_KIND and matches NAME_REGEX. + + This function also filters out the minimal symbols artificially created by + GDB. */ + bool msymbol_matches (const minimal_symbol *msymbol, + const std::optional &name_regex) const; + /* Expand symtabs in OBJFILE that match NAME_REGEX and are of type M_KIND. Return true if a matching function msymbol without debug info was seen, meaning that msymbols should later be considered for the results -- 2.55.0