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
This commit is contained in:
Simon Marchi 2022-05-04 08:14:22 -04:00 committed by Simon Marchi
parent 1653ae5b84
commit 6e9cd73eb5
10 changed files with 55 additions and 151 deletions

View 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. */

View 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",

View 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. */

View 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

View 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

View file

@ -1315,19 +1315,13 @@ 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)
if (cb (objfile))
return;
}
}
/* See objfiles.h. */

View 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. */

View 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;
}
}

View 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;
}
[&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);

View file

@ -573,29 +573,22 @@ 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)
if (cb (objfile))
return;
}
}
}
static void
show_maint_show_all_tib (struct ui_file *file, int from_tty,