gdb: use gdb::function_view for gdbarch_iterate_over_objfiles_in_search_order callback
authorSimon Marchi <simon.marchi@polymtl.ca>
Wed, 4 May 2022 12:14:22 +0000 (08:14 -0400)
committerSimon Marchi <simon.marchi@efficios.com>
Thu, 5 May 2022 19:27:26 +0000 (15:27 -0400)
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

gdb/findvar.c
gdb/gdbarch-components.py
gdb/gdbarch-gen.h
gdb/gdbarch.c
gdb/gdbarch.h
gdb/objfiles.c
gdb/objfiles.h
gdb/solib-svr4.c
gdb/symtab.c
gdb/windows-tdep.c

index 1f0317567cd4219006a8516b7e25a7358bb4d98b..36c094534be3adeb77d79c6ac5338c4f940764a6 100644 (file)
@@ -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. */
index e8f20c83ff0ad392b6c3f0ef340a7ba23b26429d..fc10e8600ba4033af66533faecd28c67be8c2618 100644 (file)
@@ -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",
index 882b9057b1ac64fa3594e655355f580eaf46e4a7..ddcb4c55615b5599bc3803d690f0524086448b4b 100644 (file)
@@ -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. */
index a588bdef61ab72a10a3465deb43b7b5fb67c6e3b..68ef04802193aff599791f1e48d84e4c5b911780 100644 (file)
@@ -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
index 6404dc1cb438b09e2179ff90c29d6b582f3ee63c..3a7b7f92ef7759ef7085a6a9c3c031ccc5998163 100644 (file)
@@ -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
index 3f18e98710b573b5fb7750a038e7fb1690aa0f00..80f68fda1c17de2d5832e51108fda7ad325f4d86 100644 (file)
@@ -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.  */
index 8bd76705688a20ff98a2c5309509a8f3ffd7f9e6..cb7a1357cfea36f63a3a3b1c1c650396e0b5f50a 100644 (file)
@@ -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.  */
 
index 2f3e79d200f20524c82d750ab684e72868115543..5c046d3fab55a586a06cdd94a352fd82be5ed55f 100644 (file)
@@ -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;
     }
 }
index 4b33d6c91af8921b9b0626dd33a6f7cd4c8415f9..8564986f66d225c34cd01f1f5d6d8cadb9340119 100644 (file)
@@ -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);
index 9049f1e17f5db3c3e8423be8514d85a085466b33..2516e4ed058215f9f37b309bcfc230ec419053b7 100644 (file)
@@ -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