public inbox for gdb-cvs@sourceware.org
help / color / mirror / Atom feed
* [binutils-gdb] gdb: use gdb::function_view for gdbarch_iterate_over_objfiles_in_search_order callback
@ 2022-05-05 19:27 Simon Marchi
  0 siblings, 0 replies; only message in thread
From: Simon Marchi @ 2022-05-05 19:27 UTC (permalink / raw)
  To: gdb-cvs

https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=6e9cd73eb553c372153d6e9ba4934119623fdad3

commit 6e9cd73eb553c372153d6e9ba4934119623fdad3
Author: Simon Marchi <simon.marchi@polymtl.ca>
Date:   Wed May 4 08:14:22 2022 -0400

    gdb: use gdb::function_view for gdbarch_iterate_over_objfiles_in_search_order callback
    
    A rather straightforward patch to change an instance of callback +
    void pointer to gdb::function_view, allowing pasing lambdas that
    capture, and eliminating the need for the untyped pointer.
    
    Change-Id: I73ed644e7849945265a2c763f79f5456695b0037

Diff:
---
 gdb/findvar.c             | 55 +++++++++++-------------------------------
 gdb/gdbarch-components.py | 12 +++-------
 gdb/gdbarch-gen.h         | 13 ++++------
 gdb/gdbarch.c             |  4 ++--
 gdb/gdbarch.h             |  4 ++--
 gdb/objfiles.c            | 14 ++++-------
 gdb/objfiles.h            |  5 ++--
 gdb/solib-svr4.c          | 15 ++++++------
 gdb/symtab.c              | 61 +++++++----------------------------------------
 gdb/windows-tdep.c        | 23 +++++++-----------
 10 files changed, 55 insertions(+), 151 deletions(-)

diff --git a/gdb/findvar.c b/gdb/findvar.c
index 1f0317567cd..36c094534be 100644
--- a/gdb/findvar.c
+++ b/gdb/findvar.c
@@ -399,37 +399,6 @@ symbol_read_needs_frame (struct symbol *sym)
   return symbol_read_needs (sym) == SYMBOL_NEEDS_FRAME;
 }
 
-/* Private data to be used with minsym_lookup_iterator_cb.  */
-
-struct minsym_lookup_data
-{
-  /* The name of the minimal symbol we are searching for.  */
-  const char *name = nullptr;
-
-  /* The field where the callback should store the minimal symbol
-     if found.  It should be initialized to NULL before the search
-     is started.  */
-  struct bound_minimal_symbol result;
-};
-
-/* A callback function for gdbarch_iterate_over_objfiles_in_search_order.
-   It searches by name for a minimal symbol within the given OBJFILE.
-   The arguments are passed via CB_DATA, which in reality is a pointer
-   to struct minsym_lookup_data.  */
-
-static int
-minsym_lookup_iterator_cb (struct objfile *objfile, void *cb_data)
-{
-  struct minsym_lookup_data *data = (struct minsym_lookup_data *) cb_data;
-
-  gdb_assert (data->result.minsym == NULL);
-
-  data->result = lookup_minimal_symbol (data->name, NULL, objfile);
-
-  /* The iterator should stop iff a match was found.  */
-  return (data->result.minsym != NULL);
-}
-
 /* Given static link expression and the frame it lives in, look for the frame
    the static links points to and return it.  Return NULL if we could not find
    such a frame.   */
@@ -746,22 +715,25 @@ language_defn::read_var_value (struct symbol *var,
 
     case LOC_UNRESOLVED:
       {
-	struct minsym_lookup_data lookup_data;
-	struct minimal_symbol *msym;
 	struct obj_section *obj_section;
-
-	lookup_data.name = var->linkage_name ();
+	bound_minimal_symbol bmsym;
 
 	gdbarch_iterate_over_objfiles_in_search_order
 	  (var->arch (),
-	   minsym_lookup_iterator_cb, &lookup_data,
+	   [var, &bmsym] (objfile *objfile)
+	     {
+		bmsym = lookup_minimal_symbol (var->linkage_name (), nullptr,
+					       objfile);
+
+		/* Stop if a match is found.  */
+		return bmsym.minsym != nullptr;
+	     },
 	   var->objfile ());
-	msym = lookup_data.result.minsym;
 
 	/* If we can't find the minsym there's a problem in the symbol info.
 	   The symbol exists in the debug info, but it's missing in the minsym
 	   table.  */
-	if (msym == NULL)
+	if (bmsym.minsym == nullptr)
 	  {
 	    const char *flavour_name
 	      = objfile_flavour_name (var->objfile ());
@@ -772,14 +744,15 @@ language_defn::read_var_value (struct symbol *var,
 	    error (_("Missing %s symbol \"%s\"."),
 		   flavour_name, var->linkage_name ());
 	  }
-	obj_section = msym->obj_section (lookup_data.result.objfile);
+
+	obj_section = bmsym.minsym->obj_section (bmsym.objfile);
 	/* Relocate address, unless there is no section or the variable is
 	   a TLS variable. */
 	if (obj_section == NULL
 	    || (obj_section->the_bfd_section->flags & SEC_THREAD_LOCAL) != 0)
-	   addr = msym->value_raw_address ();
+	   addr = bmsym.minsym->value_raw_address ();
 	else
-	   addr = lookup_data.result.value_address ();
+	   addr = bmsym.value_address ();
 	if (overlay_debugging)
 	  addr = symbol_overlayed_address (addr, obj_section);
 	/* Determine address of TLS variable. */
diff --git a/gdb/gdbarch-components.py b/gdb/gdbarch-components.py
index e8f20c83ff0..fc10e8600ba 100644
--- a/gdb/gdbarch-components.py
+++ b/gdb/gdbarch-components.py
@@ -2362,13 +2362,8 @@ Method(
 Iterate over all objfiles in the order that makes the most sense
 for the architecture to make global symbol searches.
 
-CB is a callback function where OBJFILE is the objfile to be searched,
-and CB_DATA a pointer to user-defined data (the same data that is passed
-when calling this gdbarch method).  The iteration stops if this function
-returns nonzero.
-
-CB_DATA is a pointer to some user-defined data to be passed to
-the callback.
+CB is a callback function passed an objfile to be searched.  The iteration stops
+if this function returns nonzero.
 
 If not NULL, CURRENT_OBJFILE corresponds to the objfile being
 inspected when the symbol search was requested.
@@ -2376,8 +2371,7 @@ inspected when the symbol search was requested.
     type="void",
     name="iterate_over_objfiles_in_search_order",
     params=[
-        ("iterate_over_objfiles_in_search_order_cb_ftype *", "cb"),
-        ("void *", "cb_data"),
+        ("iterate_over_objfiles_in_search_order_cb_ftype", "cb"),
         ("struct objfile *", "current_objfile"),
     ],
     predefault="default_iterate_over_objfiles_in_search_order",
diff --git a/gdb/gdbarch-gen.h b/gdb/gdbarch-gen.h
index 882b9057b1a..ddcb4c55615 100644
--- a/gdb/gdbarch-gen.h
+++ b/gdb/gdbarch-gen.h
@@ -1461,19 +1461,14 @@ extern void set_gdbarch_core_info_proc (struct gdbarch *gdbarch, gdbarch_core_in
 /* Iterate over all objfiles in the order that makes the most sense
    for the architecture to make global symbol searches.
 
-   CB is a callback function where OBJFILE is the objfile to be searched,
-   and CB_DATA a pointer to user-defined data (the same data that is passed
-   when calling this gdbarch method).  The iteration stops if this function
-   returns nonzero.
-
-   CB_DATA is a pointer to some user-defined data to be passed to
-   the callback.
+   CB is a callback function passed an objfile to be searched.  The iteration stops
+   if this function returns nonzero.
 
    If not NULL, CURRENT_OBJFILE corresponds to the objfile being
    inspected when the symbol search was requested. */
 
-typedef void (gdbarch_iterate_over_objfiles_in_search_order_ftype) (struct gdbarch *gdbarch, iterate_over_objfiles_in_search_order_cb_ftype *cb, void *cb_data, struct objfile *current_objfile);
-extern void gdbarch_iterate_over_objfiles_in_search_order (struct gdbarch *gdbarch, iterate_over_objfiles_in_search_order_cb_ftype *cb, void *cb_data, struct objfile *current_objfile);
+typedef void (gdbarch_iterate_over_objfiles_in_search_order_ftype) (struct gdbarch *gdbarch, iterate_over_objfiles_in_search_order_cb_ftype cb, struct objfile *current_objfile);
+extern void gdbarch_iterate_over_objfiles_in_search_order (struct gdbarch *gdbarch, iterate_over_objfiles_in_search_order_cb_ftype cb, struct objfile *current_objfile);
 extern void set_gdbarch_iterate_over_objfiles_in_search_order (struct gdbarch *gdbarch, gdbarch_iterate_over_objfiles_in_search_order_ftype *iterate_over_objfiles_in_search_order);
 
 /* Ravenscar arch-dependent ops. */
diff --git a/gdb/gdbarch.c b/gdb/gdbarch.c
index a588bdef61a..68ef0480219 100644
--- a/gdb/gdbarch.c
+++ b/gdb/gdbarch.c
@@ -4928,13 +4928,13 @@ set_gdbarch_core_info_proc (struct gdbarch *gdbarch,
 }
 
 void
-gdbarch_iterate_over_objfiles_in_search_order (struct gdbarch *gdbarch, iterate_over_objfiles_in_search_order_cb_ftype *cb, void *cb_data, struct objfile *current_objfile)
+gdbarch_iterate_over_objfiles_in_search_order (struct gdbarch *gdbarch, iterate_over_objfiles_in_search_order_cb_ftype cb, struct objfile *current_objfile)
 {
   gdb_assert (gdbarch != NULL);
   gdb_assert (gdbarch->iterate_over_objfiles_in_search_order != NULL);
   if (gdbarch_debug >= 2)
     gdb_printf (gdb_stdlog, "gdbarch_iterate_over_objfiles_in_search_order called\n");
-  gdbarch->iterate_over_objfiles_in_search_order (gdbarch, cb, cb_data, current_objfile);
+  gdbarch->iterate_over_objfiles_in_search_order (gdbarch, cb, current_objfile);
 }
 
 void
diff --git a/gdb/gdbarch.h b/gdb/gdbarch.h
index 6404dc1cb43..3a7b7f92ef7 100644
--- a/gdb/gdbarch.h
+++ b/gdb/gdbarch.h
@@ -78,8 +78,8 @@ extern struct gdbarch *target_gdbarch (void);
 /* Callback type for the 'iterate_over_objfiles_in_search_order'
    gdbarch  method.  */
 
-typedef int (iterate_over_objfiles_in_search_order_cb_ftype)
-  (struct objfile *objfile, void *cb_data);
+using iterate_over_objfiles_in_search_order_cb_ftype
+  = gdb::function_view<bool(objfile *)>;
 
 /* Callback type for regset section iterators.  The callback usually
    invokes the REGSET's supply or collect method, to which it must
diff --git a/gdb/objfiles.c b/gdb/objfiles.c
index 3f18e98710b..80f68fda1c1 100644
--- a/gdb/objfiles.c
+++ b/gdb/objfiles.c
@@ -1315,18 +1315,12 @@ shared_objfile_contains_address_p (struct program_space *pspace,
 
 void
 default_iterate_over_objfiles_in_search_order
-  (struct gdbarch *gdbarch,
-   iterate_over_objfiles_in_search_order_cb_ftype *cb,
-   void *cb_data, struct objfile *current_objfile)
+  (gdbarch *gdbarch, iterate_over_objfiles_in_search_order_cb_ftype cb,
+   objfile *current_objfile)
 {
-  int stop = 0;
-
   for (objfile *objfile : current_program_space->objfiles ())
-    {
-       stop = cb (objfile, cb_data);
-       if (stop)
-	 return;
-    }
+    if (cb (objfile))
+	return;
 }
 
 /* See objfiles.h.  */
diff --git a/gdb/objfiles.h b/gdb/objfiles.h
index 8bd76705688..cb7a1357cfe 100644
--- a/gdb/objfiles.h
+++ b/gdb/objfiles.h
@@ -903,9 +903,8 @@ extern scoped_restore_tmpl<int> inhibit_section_map_updates
     (struct program_space *pspace);
 
 extern void default_iterate_over_objfiles_in_search_order
-  (struct gdbarch *gdbarch,
-   iterate_over_objfiles_in_search_order_cb_ftype *cb,
-   void *cb_data, struct objfile *current_objfile);
+  (gdbarch *gdbarch, iterate_over_objfiles_in_search_order_cb_ftype cb,
+   objfile *current_objfile);
 
 /* Reset the per-BFD storage area on OBJ.  */
 
diff --git a/gdb/solib-svr4.c b/gdb/solib-svr4.c
index 2f3e79d200f..5c046d3fab5 100644
--- a/gdb/solib-svr4.c
+++ b/gdb/solib-svr4.c
@@ -51,9 +51,9 @@ static int svr4_have_link_map_offsets (void);
 static void svr4_relocate_main_executable (void);
 static void svr4_free_library_list (void *p_list);
 static void probes_table_remove_objfile_probes (struct objfile *objfile);
-static void svr4_iterate_over_objfiles_in_search_order (
-  struct gdbarch *gdbarch, iterate_over_objfiles_in_search_order_cb_ftype *cb,
-  void *cb_data, struct objfile *objfile);
+static void svr4_iterate_over_objfiles_in_search_order
+  (gdbarch *gdbarch, iterate_over_objfiles_in_search_order_cb_ftype cb,
+   objfile *current_objfile);
 
 
 /* On SVR4 systems, a list of symbols in the dynamic linker where
@@ -3135,9 +3135,8 @@ struct target_so_ops svr4_so_ops;
 
 static void
 svr4_iterate_over_objfiles_in_search_order
-  (struct gdbarch *gdbarch,
-   iterate_over_objfiles_in_search_order_cb_ftype *cb,
-   void *cb_data, struct objfile *current_objfile)
+  (gdbarch *gdbarch, iterate_over_objfiles_in_search_order_cb_ftype cb,
+   objfile *current_objfile)
 {
   bool checked_current_objfile = false;
   if (current_objfile != nullptr)
@@ -3156,7 +3155,7 @@ svr4_iterate_over_objfiles_in_search_order
 	  && gdb_bfd_scan_elf_dyntag (DT_SYMBOLIC, abfd, nullptr, nullptr) == 1)
 	{
 	  checked_current_objfile = true;
-	  if (cb (current_objfile, cb_data) != 0)
+	  if (cb (current_objfile))
 	    return;
 	}
     }
@@ -3165,7 +3164,7 @@ svr4_iterate_over_objfiles_in_search_order
     {
       if (checked_current_objfile && objfile == current_objfile)
 	continue;
-      if (cb (objfile, cb_data) != 0)
+      if (cb (objfile))
 	return;
     }
 }
diff --git a/gdb/symtab.c b/gdb/symtab.c
index 4b33d6c91af..8564986f66d 100644
--- a/gdb/symtab.c
+++ b/gdb/symtab.c
@@ -2627,47 +2627,6 @@ find_quick_global_symbol_language (const char *name, const domain_enum domain)
   return language_unknown;
 }
 
-/* Private data to be used with lookup_symbol_global_iterator_cb.  */
-
-struct global_or_static_sym_lookup_data
-{
-  /* The name of the symbol we are searching for.  */
-  const char *name;
-
-  /* The domain to use for our search.  */
-  domain_enum domain;
-
-  /* The block index in which to search.  */
-  enum block_enum block_index;
-
-  /* The field where the callback should store the symbol if found.
-     It should be initialized to {NULL, NULL} before the search is started.  */
-  struct block_symbol result;
-};
-
-/* A callback function for gdbarch_iterate_over_objfiles_in_search_order.
-   It searches by name for a symbol in the block given by BLOCK_INDEX of the
-   given OBJFILE.  The arguments for the search are passed via CB_DATA, which
-   in reality is a pointer to struct global_or_static_sym_lookup_data.  */
-
-static int
-lookup_symbol_global_or_static_iterator_cb (struct objfile *objfile,
-					    void *cb_data)
-{
-  struct global_or_static_sym_lookup_data *data =
-    (struct global_or_static_sym_lookup_data *) cb_data;
-
-  gdb_assert (data->result.symbol == NULL
-	      && data->result.block == NULL);
-
-  data->result = lookup_symbol_in_objfile (objfile, data->block_index,
-					   data->name, data->domain);
-
-  /* If we found a match, tell the iterator to stop.  Otherwise,
-     keep going.  */
-  return (data->result.symbol != NULL);
-}
-
 /* This function contains the common code of lookup_{global,static}_symbol.
    OBJFILE is only used if BLOCK_INDEX is GLOBAL_SCOPE, in which case it is
    the objfile to start the lookup in.  */
@@ -2680,7 +2639,6 @@ lookup_global_or_static_symbol (const char *name,
 {
   struct symbol_cache *cache = get_symbol_cache (current_program_space);
   struct block_symbol result;
-  struct global_or_static_sym_lookup_data lookup_data;
   struct block_symbol_cache *bsc;
   struct symbol_cache_slot *slot;
 
@@ -2700,16 +2658,15 @@ lookup_global_or_static_symbol (const char *name,
 
   /* Do a global search (of global blocks, heh).  */
   if (result.symbol == NULL)
-    {
-      memset (&lookup_data, 0, sizeof (lookup_data));
-      lookup_data.name = name;
-      lookup_data.block_index = block_index;
-      lookup_data.domain = domain;
-      gdbarch_iterate_over_objfiles_in_search_order
-	(objfile != NULL ? objfile->arch () : target_gdbarch (),
-	 lookup_symbol_global_or_static_iterator_cb, &lookup_data, objfile);
-      result = lookup_data.result;
-    }
+    gdbarch_iterate_over_objfiles_in_search_order
+      (objfile != NULL ? objfile->arch () : target_gdbarch (),
+       [&result, block_index, name, domain] (struct objfile *objfile_iter)
+	 {
+	   result = lookup_symbol_in_objfile (objfile_iter, block_index,
+					      name, domain);
+	   return result.symbol != nullptr;
+	 },
+       objfile);
 
   if (result.symbol != NULL)
     symbol_cache_mark_found (bsc, slot, objfile, result.symbol, result.block);
diff --git a/gdb/windows-tdep.c b/gdb/windows-tdep.c
index 9049f1e17f5..2516e4ed058 100644
--- a/gdb/windows-tdep.c
+++ b/gdb/windows-tdep.c
@@ -573,28 +573,21 @@ windows_xfer_shared_library (const char* so_name, CORE_ADDR load_addr,
 
 static void
 windows_iterate_over_objfiles_in_search_order
-  (struct gdbarch *gdbarch,
-   iterate_over_objfiles_in_search_order_cb_ftype *cb,
-   void *cb_data, struct objfile *current_objfile)
+  (gdbarch *gdbarch, iterate_over_objfiles_in_search_order_cb_ftype cb,
+   objfile *current_objfile)
 {
-  int stop;
-
   if (current_objfile)
     {
-      stop = cb (current_objfile, cb_data);
-      if (stop)
+      if (cb (current_objfile))
 	return;
     }
 
   for (objfile *objfile : current_program_space->objfiles ())
-    {
-      if (objfile != current_objfile)
-	{
-	  stop = cb (objfile, cb_data);
-	  if (stop)
-	    return;
-	}
-    }
+    if (objfile != current_objfile)
+      {
+	if (cb (objfile))
+	  return;
+      }
 }
 
 static void


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2022-05-05 19:27 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-05-05 19:27 [binutils-gdb] gdb: use gdb::function_view for gdbarch_iterate_over_objfiles_in_search_order callback Simon Marchi

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).