Change map_matching_symbols to take a symbol_found_callback_ftype

This changes map_matching_symbols to take a
symbol_found_callback_ftype, rather than separate callback and data
parameters.  This enables a future patch to clean up some existing
code so that it can more readily be shared.

gdb/ChangeLog
2019-09-10  Tom Tromey  <tromey@adacore.com>

	* ada-lang.c (aux_add_nonlocal_symbols): Change type.
	(add_nonlocal_symbols): Update.
	* dwarf2read.c (dw2_map_matching_symbols): Change type.
	* psymtab.c (map_block, psym_map_matching_symbols): Change type.
	* symfile-debug.c (debug_qf_map_matching_symbols): Change type.
	* symfile.h (struct quick_symbol_functions) <map_matching_symbols>:
	Change type of "callback".  Remove "data".
This commit is contained in:
Tom Tromey 2019-07-12 10:45:34 -06:00
parent aebcfb76fc
commit 199b4314ef
6 changed files with 73 additions and 65 deletions

View File

@ -1,3 +1,13 @@
2019-09-10 Tom Tromey <tromey@adacore.com>
* ada-lang.c (aux_add_nonlocal_symbols): Change type.
(add_nonlocal_symbols): Update.
* dwarf2read.c (dw2_map_matching_symbols): Change type.
* psymtab.c (map_block, psym_map_matching_symbols): Change type.
* symfile-debug.c (debug_qf_map_matching_symbols): Change type.
* symfile.h (struct quick_symbol_functions) <map_matching_symbols>:
Change type of "callback". Remove "data".
2019-09-09 Ali Tamur <tamur@google.com>

View File

@ -5331,8 +5331,8 @@ struct match_data
int found_sym;
};
/* A callback for add_nonlocal_symbols that adds SYM, found in BLOCK,
to a list of symbols. DATA0 is a pointer to a struct match_data *
/* A callback for add_nonlocal_symbols that adds symbol, found in BSYM,
to a list of symbols. DATA is a pointer to a struct match_data *
containing the obstack that collects the symbol list, the file that SYM
must come from, a flag indicating whether a non-argument symbol has
been found in the current block, and the last argument symbol
@ -5340,12 +5340,13 @@ struct match_data
marking the end of a block, the argument symbol is added if no
other has been found. */
static int
aux_add_nonlocal_symbols (const struct block *block, struct symbol *sym,
void *data0)
static bool
aux_add_nonlocal_symbols (struct block_symbol *bsym,
struct match_data *data)
{
struct match_data *data = (struct match_data *) data0;
const struct block *block = bsym->block;
struct symbol *sym = bsym->symbol;
if (sym == NULL)
{
if (!data->found_sym && data->arg_sym != NULL)
@ -5358,7 +5359,7 @@ aux_add_nonlocal_symbols (const struct block *block, struct symbol *sym,
else
{
if (SYMBOL_CLASS (sym) == LOC_UNRESOLVED)
return 0;
return true;
else if (SYMBOL_IS_ARGUMENT (sym))
data->arg_sym = sym;
else
@ -5369,7 +5370,7 @@ aux_add_nonlocal_symbols (const struct block *block, struct symbol *sym,
block);
}
}
return 0;
return true;
}
/* Helper for add_nonlocal_symbols. Find symbols in DOMAIN which are
@ -5540,20 +5541,23 @@ add_nonlocal_symbols (struct obstack *obstackp,
bool is_wild_match = lookup_name.ada ().wild_match_p ();
auto callback = [&] (struct block_symbol *bsym)
{
return aux_add_nonlocal_symbols (bsym, &data);
};
for (objfile *objfile : current_program_space->objfiles ())
{
data.objfile = objfile;
if (is_wild_match)
objfile->sf->qf->map_matching_symbols (objfile, lookup_name.name ().c_str (),
domain, global,
aux_add_nonlocal_symbols, &data,
domain, global, callback,
symbol_name_match_type::WILD,
NULL);
else
objfile->sf->qf->map_matching_symbols (objfile, lookup_name.name ().c_str (),
domain, global,
aux_add_nonlocal_symbols, &data,
domain, global, callback,
symbol_name_match_type::FULL,
compare_names);
@ -5577,9 +5581,7 @@ add_nonlocal_symbols (struct obstack *obstackp,
{
data.objfile = objfile;
objfile->sf->qf->map_matching_symbols (objfile, name1.c_str (),
domain, global,
aux_add_nonlocal_symbols,
&data,
domain, global, callback,
symbol_name_match_type::FULL,
compare_names);
}

View File

@ -4184,13 +4184,13 @@ dw2_expand_symtabs_with_fullname (struct objfile *objfile,
}
static void
dw2_map_matching_symbols (struct objfile *objfile,
const char * name, domain_enum domain,
int global,
int (*callback) (const struct block *,
struct symbol *, void *),
void *data, symbol_name_match_type match,
symbol_compare_ftype *ordered_compare)
dw2_map_matching_symbols
(struct objfile *objfile,
const char * name, domain_enum domain,
int global,
gdb::function_view<symbol_found_callback_ftype> callback,
symbol_name_match_type match,
symbol_compare_ftype *ordered_compare)
{
/* Currently unimplemented; used for Ada. The function can be called if the
current language is Ada for a non-Ada objfile using GNU index. As Ada

View File

@ -1170,14 +1170,14 @@ psymtab_to_fullname (struct partial_symtab *ps)
/* For all symbols, s, in BLOCK that are in DOMAIN and match NAME
according to the function MATCH, call CALLBACK(BLOCK, s, DATA).
BLOCK is assumed to come from OBJFILE. Returns 1 iff CALLBACK
ever returns non-zero, and otherwise returns 0. */
BLOCK is assumed to come from OBJFILE. Returns false iff CALLBACK
ever returns false, and otherwise returns true. */
static int
static bool
map_block (const char *name, domain_enum domain, struct objfile *objfile,
const struct block *block,
int (*callback) (const struct block *, struct symbol *, void *),
void *data, symbol_name_match_type match)
gdb::function_view<symbol_found_callback_ftype> callback,
symbol_name_match_type match)
{
struct block_iterator iter;
struct symbol *sym;
@ -1191,26 +1191,26 @@ map_block (const char *name, domain_enum domain, struct objfile *objfile,
if (symbol_matches_domain (SYMBOL_LANGUAGE (sym),
SYMBOL_DOMAIN (sym), domain))
{
if (callback (block, sym, data))
return 1;
struct block_symbol block_sym = {sym, block};
if (!callback (&block_sym))
return false;
}
}
return 0;
return true;
}
/* Psymtab version of map_matching_symbols. See its definition in
the definition of quick_symbol_functions in symfile.h. */
static void
psym_map_matching_symbols (struct objfile *objfile,
const char *name, domain_enum domain,
int global,
int (*callback) (const struct block *,
struct symbol *, void *),
void *data,
symbol_name_match_type match,
symbol_compare_ftype *ordered_compare)
psym_map_matching_symbols
(struct objfile *objfile,
const char *name, domain_enum domain,
int global,
gdb::function_view<symbol_found_callback_ftype> callback,
symbol_name_match_type match,
symbol_compare_ftype *ordered_compare)
{
const int block_kind = global ? GLOBAL_BLOCK : STATIC_BLOCK;
@ -1227,10 +1227,10 @@ psym_map_matching_symbols (struct objfile *objfile,
if (cust == NULL)
continue;
block = BLOCKVECTOR_BLOCK (COMPUNIT_BLOCKVECTOR (cust), block_kind);
if (map_block (name, domain, objfile, block,
callback, data, match))
if (!map_block (name, domain, objfile, block, callback, match))
return;
if (callback (block, NULL, data))
struct block_symbol block_sym = {nullptr, block};
if (!callback (&block_sym))
return;
}
}

View File

@ -228,30 +228,27 @@ debug_qf_expand_symtabs_with_fullname (struct objfile *objfile,
}
static void
debug_qf_map_matching_symbols (struct objfile *objfile,
const char *name, domain_enum domain,
int global,
int (*callback) (const struct block *,
struct symbol *, void *),
void *data,
symbol_name_match_type match,
symbol_compare_ftype *ordered_compare)
debug_qf_map_matching_symbols
(struct objfile *objfile,
const char *name, domain_enum domain,
int global,
gdb::function_view<symbol_found_callback_ftype> callback,
symbol_name_match_type match,
symbol_compare_ftype *ordered_compare)
{
const struct debug_sym_fns_data *debug_data
= symfile_debug_objfile_data_key.get (objfile);
fprintf_filtered (gdb_stdlog,
"qf->map_matching_symbols (%s, \"%s\", %s, %d, %s, %s, %s, %s)\n",
"qf->map_matching_symbols (%s, \"%s\", %s, %d, %s, %s)\n",
objfile_debug_name (objfile), name,
domain_name (domain), global,
host_address_to_string (callback),
host_address_to_string (data),
plongest ((LONGEST) match),
host_address_to_string (ordered_compare));
debug_data->real_sf->qf->map_matching_symbols (objfile, name,
domain, global,
callback, data,
callback,
match,
ordered_compare);
}

View File

@ -212,7 +212,7 @@ struct quick_symbol_functions
and for which MATCH (symbol name, NAME) == 0, passing each to
CALLBACK, reading in partial symbol tables as needed. Look
through global symbols if GLOBAL and otherwise static symbols.
Passes NAME, NAMESPACE, and DATA to CALLBACK with each symbol
Passes NAME and NAMESPACE to CALLBACK with each symbol
found. After each block is processed, passes NULL to CALLBACK.
MATCH must be weaker than strcmp_iw_ordered in the sense that
strcmp_iw_ordered(x,y) == 0 --> MATCH(x,y) == 0. ORDERED_COMPARE,
@ -222,17 +222,16 @@ struct quick_symbol_functions
and
strcmp_iw_ordered(x,y) <= 0 --> ORDERED_COMPARE(x,y) <= 0
(allowing strcmp_iw_ordered(x,y) < 0 while ORDERED_COMPARE(x, y) == 0).
CALLBACK returns 0 to indicate that the scan should continue, or
non-zero to indicate that the scan should be terminated. */
CALLBACK returns true to indicate that the scan should continue, or
false to indicate that the scan should be terminated. */
void (*map_matching_symbols) (struct objfile *,
const char *name, domain_enum domain,
int global,
int (*callback) (const struct block *,
struct symbol *, void *),
void *data,
symbol_name_match_type match,
symbol_compare_ftype *ordered_compare);
void (*map_matching_symbols)
(struct objfile *,
const char *name, domain_enum domain,
int global,
gdb::function_view<symbol_found_callback_ftype> callback,
symbol_name_match_type match,
symbol_compare_ftype *ordered_compare);
/* Expand all symbol tables in OBJFILE matching some criteria.