Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Andrew Burgess <aburgess@redhat.com>
To: Simon Marchi <simon.marchi@efficios.com>, gdb-patches@sourceware.org
Cc: Simon Marchi <simon.marchi@polymtl.ca>
Subject: Re: [PATCH 07/11] gdb: split iterate_over_minimal_symbols in for_each_minimal_symbol and find_minimal_symbol
Date: Fri, 17 Apr 2026 13:13:36 +0100	[thread overview]
Message-ID: <87h5p9eqdr.fsf@redhat.com> (raw)
In-Reply-To: <20260416202408.422441-8-simon.marchi@efficios.com>

Simon Marchi <simon.marchi@efficios.com> writes:

> From: Simon Marchi <simon.marchi@polymtl.ca>

Just 'in' -> 'into' in the subject line again.  Otherwise:

Approved-By: Andrew Burgess <aburgess@redhat.com>

Thanks,
Andrew


>
> Based on the same rationale as the previous patches, split
> iterate_over_minimal_symbols in two.
>
> Implement for_each_minimal_symbol using find_minimal_symbol, since that
> one is really not trivial.
>
> Change-Id: Ie02e67278359454f7aa583200ec68d2f429f7ebe
> ---
>  gdb/linespec.c | 35 ++++++++++++++++-------------------
>  gdb/minsyms.c  | 25 ++++++++++++++++++++-----
>  gdb/minsyms.h  | 37 +++++++++++++++++++++++++++++--------
>  gdb/symtab.c   | 18 +++++++++---------
>  4 files changed, 74 insertions(+), 41 deletions(-)
>
> diff --git a/gdb/linespec.c b/gdb/linespec.c
> index 4ea6d597a093..4170d4ecf2c4 100644
> --- a/gdb/linespec.c
> +++ b/gdb/linespec.c
> @@ -4150,33 +4150,30 @@ search_minsyms_for_name (struct collect_info *info,
>  	  set_current_program_space (pspace);
>  
>  	  for (objfile &objfile : pspace->objfiles ())
> -	    {
> -	      iterate_over_minimal_symbols (&objfile, name,
> -					    [&] (struct minimal_symbol *msym)
> -					    {
> -					      add_minsym (msym, &objfile, nullptr,
> -							  info->state->list_mode,
> -							  &minsyms);
> -					      return false;
> -					    });
> -	    }
> +	    for_each_minimal_symbol (&objfile, name,
> +				     [&] (minimal_symbol *msym)
> +				       {
> +					 add_minsym (msym, &objfile, nullptr,
> +						     info->state->list_mode,
> +						     &minsyms);
> +				       });
>  	}
>      }
>    else
>      {
> -      program_space *pspace = symtab->compunit ()->objfile ()->pspace ();
> +      objfile &objfile = *symtab->compunit ()->objfile ();
> +      program_space *pspace = objfile.pspace ();
>  
>        if (search_pspace == NULL || pspace == search_pspace)
>  	{
>  	  set_current_program_space (pspace);
> -	  iterate_over_minimal_symbols
> -	    (symtab->compunit ()->objfile (), name,
> -	     [&] (struct minimal_symbol *msym)
> -	       {
> -		 add_minsym (msym, symtab->compunit ()->objfile (), symtab,
> -			     info->state->list_mode, &minsyms);
> -		 return false;
> -	       });
> +	  for_each_minimal_symbol (&objfile, name,
> +				   [&] (minimal_symbol *msym)
> +				     {
> +				       add_minsym (msym, &objfile, symtab,
> +						   info->state->list_mode,
> +						   &minsyms);
> +				     });
>  	}
>      }
>  
> diff --git a/gdb/minsyms.c b/gdb/minsyms.c
> index 0d6ea53aecf6..4eafc7890478 100644
> --- a/gdb/minsyms.c
> +++ b/gdb/minsyms.c
> @@ -496,9 +496,22 @@ linkage_name_str (const lookup_name_info &lookup_name)
>  /* See minsyms.h.  */
>  
>  void
> -iterate_over_minimal_symbols
> -    (struct objfile *objf, const lookup_name_info &lookup_name,
> -     gdb::function_view<bool (struct minimal_symbol *)> callback)
> +for_each_minimal_symbol (struct objfile *objf, const lookup_name_info &name,
> +			 for_each_minimal_symbol_callback_ftype callback)
> +{
> +  find_minimal_symbol (objf, name,
> +		       [&] (struct minimal_symbol *msym)
> +			 {
> +			   callback (msym);
> +			   return false;
> +			 });
> +}
> +
> +/* See minsyms.h.  */
> +
> +minimal_symbol *
> +find_minimal_symbol (struct objfile *objf, const lookup_name_info &lookup_name,
> +		     find_minimal_symbol_callback_ftype callback)
>  {
>    /* The first pass is over the ordinary hash table.  */
>      {
> @@ -515,7 +528,7 @@ iterate_over_minimal_symbols
>  	{
>  	  if (mangled_cmp (iter->linkage_name (), name) == 0)
>  	    if (callback (iter))
> -	      return;
> +	      return iter;
>  	}
>      }
>  
> @@ -539,8 +552,10 @@ iterate_over_minimal_symbols
>  	   iter = iter->demangled_hash_next)
>  	if (name_match (iter->search_name (), lookup_name, NULL))
>  	  if (callback (iter))
> -	    return;
> +	    return iter;
>      }
> +
> +  return nullptr;
>  }
>  
>  /* See minsyms.h.  */
> diff --git a/gdb/minsyms.h b/gdb/minsyms.h
> index 8f38cc7137fc..c44d5b20aec8 100644
> --- a/gdb/minsyms.h
> +++ b/gdb/minsyms.h
> @@ -20,6 +20,7 @@
>  #ifndef GDB_MINSYMS_H
>  #define GDB_MINSYMS_H
>  
> +#include "gdbsupport/function-view.h"
>  #include <deque>
>  
>  struct program_space;
> @@ -279,16 +280,36 @@ bound_minimal_symbol lookup_minimal_symbol_by_pc_section
>  
>  bound_minimal_symbol lookup_minimal_symbol_by_pc (CORE_ADDR);
>  
> -/* Iterate over all the minimal symbols in the objfile OBJF which
> -   match NAME.  Both the ordinary and demangled names of each symbol
> -   are considered.  The caller is responsible for canonicalizing NAME,
> -   should that need to be done.
> +/* Callback type for function for_each_minimal_symbol.  */
>  
> -   For each matching symbol, CALLBACK is called with the symbol.  */
> +using for_each_minimal_symbol_callback_ftype
> +  = gdb::function_view<void (struct minimal_symbol *)>;
>  
> -void iterate_over_minimal_symbols
> -    (struct objfile *objf, const lookup_name_info &name,
> -     gdb::function_view<bool (struct minimal_symbol *)> callback);
> +/* Call CALLBACK for all minimal symbols in objfile OBJF which match NAME.
> +
> +   Both the ordinary and demangled names of each symbol are considered.  The
> +   caller is responsible for canonicalizing NAME, should that need to be
> +   done.  */
> +
> +void for_each_minimal_symbol (struct objfile *objf,
> +			      const lookup_name_info &name,
> +			      for_each_minimal_symbol_callback_ftype callback);
> +
> +/* Callback type for function find_minimal_symbol.  */
> +
> +using find_minimal_symbol_callback_ftype
> +  = gdb::function_view<bool (struct minimal_symbol *)>;
> +
> +/* Find the first minimal symbol for objfile OBJF which matches NAME and for
> +   which CALLBACK returns true.
> +
> +   Both the ordinary and demangled names of each symbol are considered.  The
> +   caller is responsible for canonicalizing NAME, should that need to be
> +   done.  */
> +
> +minimal_symbol *find_minimal_symbol
> +  (struct objfile *objf, const lookup_name_info &name,
> +   find_minimal_symbol_callback_ftype callback);
>  
>  /* Compute the upper bound of MINSYM.  The upper bound is the last
>     address thought to be part of the symbol.  If the symbol has a
> diff --git a/gdb/symtab.c b/gdb/symtab.c
> index d22dd81a246a..5a39081dfc54 100644
> --- a/gdb/symtab.c
> +++ b/gdb/symtab.c
> @@ -5782,32 +5782,32 @@ find_gnu_ifunc (const symbol *sym)
>    struct objfile *objfile = sym->objfile ();
>  
>    CORE_ADDR address = sym->value_block ()->entry_pc ();
> -  minimal_symbol *ifunc = NULL;
> -
> -  iterate_over_minimal_symbols (objfile, lookup_name,
> -				[&] (minimal_symbol *minsym)
> +  minimal_symbol *ifunc
> +    = find_minimal_symbol (objfile, lookup_name,
> +			   [&] (minimal_symbol *minsym)
>      {
>        if (minsym->type () == mst_text_gnu_ifunc
>  	  || minsym->type () == mst_data_gnu_ifunc)
>  	{
>  	  CORE_ADDR msym_addr = minsym->value_address (objfile);
> +
>  	  if (minsym->type () == mst_data_gnu_ifunc)
>  	    {
>  	      struct gdbarch *gdbarch = objfile->arch ();
>  	      msym_addr = gdbarch_convert_from_func_ptr_addr
>  		(gdbarch, msym_addr, current_inferior ()->top_target ());
>  	    }
> +
>  	  if (msym_addr == address)
> -	    {
> -	      ifunc = minsym;
> -	      return true;
> -	    }
> +	    return true;
>  	}
> +
>        return false;
>      });
>  
> -  if (ifunc != NULL)
> +  if (ifunc != nullptr)
>      return {ifunc, objfile};
> +
>    return {};
>  }
>  
> -- 
> 2.53.0


  reply	other threads:[~2026-04-17 12:14 UTC|newest]

Thread overview: 33+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-04-16 20:16 [PATCH 00/11] Readability improvements of some iteration functions Simon Marchi
2026-04-16 20:16 ` [PATCH 01/11] gdb/dwarf: remove unused file_match parameter from dwarf2_base_index_functions::search_one Simon Marchi
2026-04-17 11:11   ` Andrew Burgess
2026-04-16 20:16 ` [PATCH 02/11] gdb: rename search_symtabs_expansion_listener -> compunit_symtab_iteration_callback Simon Marchi
2026-04-17 15:08   ` Simon Marchi
2026-04-17 17:17   ` Tom Tromey
2026-04-17 19:34     ` Simon Marchi
2026-04-16 20:16 ` [PATCH 03/11] gdb: introduce iteration_status enum, use it for search callbacks Simon Marchi
2026-04-17 11:01   ` Andrew Burgess
2026-04-17 14:33     ` Simon Marchi
2026-04-17 14:34   ` Tom Tromey
2026-04-16 20:16 ` [PATCH 04/11] gdb, gdbserver: make iterate_over_lwps_ftype a function_view Simon Marchi
2026-04-17 11:09   ` Andrew Burgess
2026-04-17 14:37     ` Simon Marchi
2026-04-16 20:16 ` [PATCH 05/11] gdb, gdbserver: split iterate_over_lwps in for_each_lwp and find_lwp Simon Marchi
2026-04-17 11:25   ` Andrew Burgess
2026-04-17 14:53     ` Simon Marchi
2026-04-16 20:16 ` [PATCH 06/11] gdb: split iterate_over_threads in for_each_thread and find_thread Simon Marchi
2026-04-17 11:33   ` Andrew Burgess
2026-04-16 20:16 ` [PATCH 07/11] gdb: split iterate_over_minimal_symbols in for_each_minimal_symbol and find_minimal_symbol Simon Marchi
2026-04-17 12:13   ` Andrew Burgess [this message]
2026-04-16 20:16 ` [PATCH 08/11] gdb: split iterate_over_symtabs in for_each_symtab and find_symtab Simon Marchi
2026-04-17 13:31   ` Andrew Burgess
2026-04-17 14:54     ` Simon Marchi
2026-04-16 20:16 ` [PATCH 09/11] gdb: change objfile::map_symtabs_matching_filename to find_symtab_matching_filename Simon Marchi
2026-04-17 13:50   ` Andrew Burgess
2026-04-17 15:03     ` Simon Marchi
2026-04-16 20:16 ` [PATCH 10/11] gdb: make symbol_found_callback_ftype a function_view Simon Marchi
2026-04-17 13:55   ` Andrew Burgess
2026-04-17 15:04     ` Simon Marchi
2026-04-16 20:16 ` [PATCH 11/11] gdb: make iterate_over_symbols return void, rename to for_each_symbol Simon Marchi
2026-04-17 14:05   ` Andrew Burgess
2026-04-17 15:06     ` Simon Marchi

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87h5p9eqdr.fsf@redhat.com \
    --to=aburgess@redhat.com \
    --cc=gdb-patches@sourceware.org \
    --cc=simon.marchi@efficios.com \
    --cc=simon.marchi@polymtl.ca \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox