From 6e9cd73eb553c372153d6e9ba4934119623fdad3 Mon Sep 17 00:00:00 2001 From: Simon Marchi Date: Wed, 4 May 2022 08:14:22 -0400 Subject: 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 --- gdb/findvar.c | 55 ++++++++++++++----------------------------------------- 1 file changed, 14 insertions(+), 41 deletions(-) (limited to 'gdb/findvar.c') diff --git a/gdb/findvar.c b/gdb/findvar.c index 1f03175..36c0945 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. */ -- cgit v1.1