Use function view in quick_symbol_functions::map_symbol_filenames

This changes quick_symbol_functions::map_symbol_filenames to use a
function_view, and updates all the uses.  It also changes the final
parameter to 'bool'.  A couple of spots are further updated to use
operator() rather than a lambda.

gdb/ChangeLog
2021-03-26  Tom Tromey  <tom@tromey.com>

	* symtab.c (struct output_source_filename_data): Add 'output'
	method and operator().
	(output_source_filename_data::output): Rename from
	output_source_filename.
	(output_partial_symbol_filename): Remove.
	(info_sources_command): Update.
	(struct add_partial_filename_data): Add operator().
	(add_partial_filename_data::operator()): Rename from
	maybe_add_partial_symtab_filename.
	(make_source_files_completion_list): Update.
	* symfile.c (quick_symbol_functions): Update.
	* symfile-debug.c (objfile::map_symbol_filenames): Update.
	* quick-symbol.h (symbol_filename_ftype): Change type of 'fun' and
	'need_fullname'.  Remove 'data' parameter.
	(struct quick_symbol_functions) <map_symbol_filenames>: Likewise.
	* psymtab.c (psymbol_functions::map_symbol_filenames): Update.
	* psympriv.h (struct psymbol_functions) <map_symbol_filenames>:
	Change type of 'fun' and 'need_fullname'.  Remove 'data'
	parameter.
	* objfiles.h (struct objfile) <map_symbol_filenames>: Change type
	of 'fun' and 'need_fullname'.  Remove 'data' parameter.
	* mi/mi-cmd-file.c (print_partial_file_name): Remove 'ignore'
	parameter.
	(mi_cmd_file_list_exec_source_files): Update.
	* dwarf2/read.c
	(dwarf2_base_index_functions::map_symbol_filenames): Update.
This commit is contained in:
Tom Tromey 2021-03-26 13:44:24 -06:00
parent 2315bb2d57
commit f4655dee77
11 changed files with 100 additions and 81 deletions

View file

@ -1,3 +1,32 @@
2021-03-26 Tom Tromey <tom@tromey.com>
* symtab.c (struct output_source_filename_data): Add 'output'
method and operator().
(output_source_filename_data::output): Rename from
output_source_filename.
(output_partial_symbol_filename): Remove.
(info_sources_command): Update.
(struct add_partial_filename_data): Add operator().
(add_partial_filename_data::operator()): Rename from
maybe_add_partial_symtab_filename.
(make_source_files_completion_list): Update.
* symfile.c (quick_symbol_functions): Update.
* symfile-debug.c (objfile::map_symbol_filenames): Update.
* quick-symbol.h (symbol_filename_ftype): Change type of 'fun' and
'need_fullname'. Remove 'data' parameter.
(struct quick_symbol_functions) <map_symbol_filenames>: Likewise.
* psymtab.c (psymbol_functions::map_symbol_filenames): Update.
* psympriv.h (struct psymbol_functions) <map_symbol_filenames>:
Change type of 'fun' and 'need_fullname'. Remove 'data'
parameter.
* objfiles.h (struct objfile) <map_symbol_filenames>: Change type
of 'fun' and 'need_fullname'. Remove 'data' parameter.
* mi/mi-cmd-file.c (print_partial_file_name): Remove 'ignore'
parameter.
(mi_cmd_file_list_exec_source_files): Update.
* dwarf2/read.c
(dwarf2_base_index_functions::map_symbol_filenames): Update.
2021-03-26 Tom Tromey <tom@tromey.com> 2021-03-26 Tom Tromey <tom@tromey.com>
* ada-lang.c (struct match_data): Add operator(). * ada-lang.c (struct match_data): Add operator().

View file

@ -2230,8 +2230,8 @@ struct dwarf2_base_index_functions : public quick_symbol_functions
} }
void map_symbol_filenames (struct objfile *objfile, void map_symbol_filenames (struct objfile *objfile,
symbol_filename_ftype *fun, void *data, gdb::function_view<symbol_filename_ftype> fun,
int need_fullname) override; bool need_fullname) override;
}; };
struct dwarf2_gdb_index : public dwarf2_base_index_functions struct dwarf2_gdb_index : public dwarf2_base_index_functions
@ -4945,10 +4945,10 @@ dwarf2_base_index_functions::find_pc_sect_compunit_symtab
} }
void void
dwarf2_base_index_functions::map_symbol_filenames (struct objfile *objfile, dwarf2_base_index_functions::map_symbol_filenames
symbol_filename_ftype *fun, (struct objfile *objfile,
void *data, gdb::function_view<symbol_filename_ftype> fun,
int need_fullname) bool need_fullname)
{ {
dwarf2_per_objfile *per_objfile = get_dwarf2_per_objfile (objfile); dwarf2_per_objfile *per_objfile = get_dwarf2_per_objfile (objfile);
@ -5009,7 +5009,7 @@ dwarf2_base_index_functions::map_symbol_filenames (struct objfile *objfile,
if (need_fullname) if (need_fullname)
this_real_name = gdb_realpath (filename); this_real_name = gdb_realpath (filename);
(*fun) (filename, this_real_name.get (), data); fun (filename, this_real_name.get ());
}); });
} }

View file

@ -65,8 +65,7 @@ mi_cmd_file_list_exec_source_file (const char *command, char **argv, int argc)
/* A callback for map_partial_symbol_filenames. */ /* A callback for map_partial_symbol_filenames. */
static void static void
print_partial_file_name (const char *filename, const char *fullname, print_partial_file_name (const char *filename, const char *fullname)
void *ignore)
{ {
struct ui_out *uiout = current_uiout; struct ui_out *uiout = current_uiout;
@ -108,8 +107,7 @@ mi_cmd_file_list_exec_source_files (const char *command, char **argv, int argc)
} }
} }
map_symbol_filenames (print_partial_file_name, NULL, map_symbol_filenames (print_partial_file_name, true /*need_fullname*/);
1 /*need_fullname*/);
uiout->end (ui_out_type_list); uiout->end (ui_out_type_list);
} }

View file

@ -590,8 +590,8 @@ public:
int warn_if_readin); int warn_if_readin);
/* See quick_symbol_functions. */ /* See quick_symbol_functions. */
void map_symbol_filenames (symbol_filename_ftype *fun, void *data, void map_symbol_filenames (gdb::function_view<symbol_filename_ftype> fun,
int need_fullname); bool need_fullname);
/* See quick_symbol_functions. */ /* See quick_symbol_functions. */
struct compunit_symtab *find_compunit_symtab_by_address (CORE_ADDR address); struct compunit_symtab *find_compunit_symtab_by_address (CORE_ADDR address);

View file

@ -556,8 +556,8 @@ struct psymbol_functions : public quick_symbol_functions
(struct objfile *objfile, CORE_ADDR address) override; (struct objfile *objfile, CORE_ADDR address) override;
void map_symbol_filenames (struct objfile *objfile, void map_symbol_filenames (struct objfile *objfile,
symbol_filename_ftype *fun, void *data, gdb::function_view<symbol_filename_ftype> fun,
int need_fullname) override; bool need_fullname) override;
void relocated () override void relocated () override
{ {

View file

@ -1092,10 +1092,10 @@ psymbol_functions::expand_symtabs_with_fullname (struct objfile *objfile,
the definition of quick_symbol_functions in symfile.h. */ the definition of quick_symbol_functions in symfile.h. */
void void
psymbol_functions::map_symbol_filenames (struct objfile *objfile, psymbol_functions::map_symbol_filenames
symbol_filename_ftype *fun, (struct objfile *objfile,
void *data, gdb::function_view<symbol_filename_ftype> fun,
int need_fullname) bool need_fullname)
{ {
for (partial_symtab *ps : require_partial_symbols (objfile)) for (partial_symtab *ps : require_partial_symbols (objfile))
{ {
@ -1118,7 +1118,7 @@ psymbol_functions::map_symbol_filenames (struct objfile *objfile,
fullname = psymtab_to_fullname (ps); fullname = psymtab_to_fullname (ps);
else else
fullname = NULL; fullname = NULL;
(*fun) (ps->filename, fullname, data); fun (ps->filename, fullname);
} }
} }

View file

@ -28,7 +28,7 @@ typedef int (symbol_compare_ftype) (const char *string1,
/* Callback for quick_symbol_functions->map_symbol_filenames. */ /* Callback for quick_symbol_functions->map_symbol_filenames. */
typedef void (symbol_filename_ftype) (const char *filename, typedef void (symbol_filename_ftype) (const char *filename,
const char *fullname, void *data); const char *fullname);
/* Callback for quick_symbol_functions->expand_symtabs_matching /* Callback for quick_symbol_functions->expand_symtabs_matching
to match a file name. */ to match a file name. */
@ -224,12 +224,13 @@ struct quick_symbol_functions
(struct objfile *objfile, CORE_ADDR address) = 0; (struct objfile *objfile, CORE_ADDR address) = 0;
/* Call a callback for every file defined in OBJFILE whose symtab is /* Call a callback for every file defined in OBJFILE whose symtab is
not already read in. FUN is the callback. It is passed the file's not already read in. FUN is the callback. It is passed the
FILENAME, the file's FULLNAME (if need_fullname is non-zero), and file's FILENAME and the file's FULLNAME (if need_fullname is
the DATA passed to this function. */ non-zero). */
virtual void map_symbol_filenames (struct objfile *objfile, virtual void map_symbol_filenames
symbol_filename_ftype *fun, void *data, (struct objfile *objfile,
int need_fullname) = 0; gdb::function_view<symbol_filename_ftype> fun,
bool need_fullname) = 0;
/* This is called when the objfile is relocated. It can be used to /* This is called when the objfile is relocated. It can be used to
clean up any internal caches. */ clean up any internal caches. */

View file

@ -323,19 +323,17 @@ objfile::find_pc_sect_compunit_symtab (struct bound_minimal_symbol msymbol,
} }
void void
objfile::map_symbol_filenames (symbol_filename_ftype *fun, void *data, objfile::map_symbol_filenames (gdb::function_view<symbol_filename_ftype> fun,
int need_fullname) bool need_fullname)
{ {
if (debug_symfile) if (debug_symfile)
fprintf_filtered (gdb_stdlog, fprintf_filtered (gdb_stdlog,
"qf->map_symbol_filenames (%s, %s, %s, %d)\n", "qf->map_symbol_filenames (%s, ..., %d)\n",
objfile_debug_name (this), objfile_debug_name (this),
host_address_to_string (fun),
host_address_to_string (data),
need_fullname); need_fullname);
for (const auto &iter : qf) for (const auto &iter : qf)
iter->map_symbol_filenames (this, fun, data, need_fullname); iter->map_symbol_filenames (this, fun, need_fullname);
} }
struct compunit_symtab * struct compunit_symtab *

View file

@ -3737,11 +3737,11 @@ expand_symtabs_matching
See quick_symbol_functions.map_symbol_filenames for details. */ See quick_symbol_functions.map_symbol_filenames for details. */
void void
map_symbol_filenames (symbol_filename_ftype *fun, void *data, map_symbol_filenames (gdb::function_view<symbol_filename_ftype> fun,
int need_fullname) bool need_fullname)
{ {
for (objfile *objfile : current_program_space->objfiles ()) for (objfile *objfile : current_program_space->objfiles ())
objfile->map_symbol_filenames (fun, data, need_fullname); objfile->map_symbol_filenames (fun, need_fullname);
} }
#if GDB_SELF_TEST #if GDB_SELF_TEST

View file

@ -328,8 +328,8 @@ void expand_symtabs_matching
gdb::function_view<expand_symtabs_exp_notify_ftype> expansion_notify, gdb::function_view<expand_symtabs_exp_notify_ftype> expansion_notify,
enum search_domain kind); enum search_domain kind);
void map_symbol_filenames (symbol_filename_ftype *fun, void *data, void map_symbol_filenames (gdb::function_view<symbol_filename_ftype> fun,
int need_fullname); bool need_fullname);
/* Target-agnostic function to load the sections of an executable into memory. /* Target-agnostic function to load the sections of an executable into memory.

View file

@ -4227,15 +4227,21 @@ struct output_source_filename_data
/* Flag of whether we're printing the first one. */ /* Flag of whether we're printing the first one. */
int first; int first;
/* Worker for sources_info. Force line breaks at ,'s.
NAME is the name to print. */
void output (const char *name);
/* An overload suitable for use as a callback to
quick_symbol_functions::map_symbol_filenames. */
void operator() (const char *filename, const char *fullname)
{
output (fullname != nullptr ? fullname : filename);
}
}; };
/* Slave routine for sources_info. Force line breaks at ,'s. void
NAME is the name to print. output_source_filename_data::output (const char *name)
DATA contains the state for printing and watching for duplicates. */
static void
output_source_filename (const char *name,
struct output_source_filename_data *data)
{ {
/* Since a single source file can result in several partial symbol /* Since a single source file can result in several partial symbol
tables, we need to avoid printing it more than once. Note: if tables, we need to avoid printing it more than once. Note: if
@ -4247,51 +4253,41 @@ output_source_filename (const char *name,
symtabs; it doesn't hurt to check. */ symtabs; it doesn't hurt to check. */
/* Was NAME already seen? */ /* Was NAME already seen? */
if (data->filename_seen_cache->seen (name)) if (filename_seen_cache->seen (name))
{ {
/* Yes; don't print it again. */ /* Yes; don't print it again. */
return; return;
} }
/* Does it match data->regexp? */ /* Does it match regexp? */
if (data->c_regexp.has_value ()) if (c_regexp.has_value ())
{ {
const char *to_match; const char *to_match;
std::string dirname; std::string dirname;
if (data->partial_match.dirname) if (partial_match.dirname)
{ {
dirname = ldirname (name); dirname = ldirname (name);
to_match = dirname.c_str (); to_match = dirname.c_str ();
} }
else if (data->partial_match.basename) else if (partial_match.basename)
to_match = lbasename (name); to_match = lbasename (name);
else else
to_match = name; to_match = name;
if (data->c_regexp->exec (to_match, 0, NULL, 0) != 0) if (c_regexp->exec (to_match, 0, NULL, 0) != 0)
return; return;
} }
/* Print it and reset *FIRST. */ /* Print it and reset *FIRST. */
if (! data->first) if (! first)
printf_filtered (", "); printf_filtered (", ");
data->first = 0; first = 0;
wrap_here (""); wrap_here ("");
fputs_styled (name, file_name_style.style (), gdb_stdout); fputs_styled (name, file_name_style.style (), gdb_stdout);
} }
/* A callback for map_partial_symbol_filenames. */
static void
output_partial_symbol_filename (const char *filename, const char *fullname,
void *data)
{
output_source_filename (fullname ? fullname : filename,
(struct output_source_filename_data *) data);
}
using isrc_flag_option_def using isrc_flag_option_def
= gdb::option::flag_option_def<filename_partial_match_opts>; = gdb::option::flag_option_def<filename_partial_match_opts>;
@ -4410,7 +4406,7 @@ info_sources_command (const char *args, int from_tty)
{ {
const char *fullname = symtab_to_fullname (s); const char *fullname = symtab_to_fullname (s);
output_source_filename (fullname, &data); data.output (fullname);
} }
} }
} }
@ -4421,8 +4417,7 @@ info_sources_command (const char *args, int from_tty)
filenames_seen.clear (); filenames_seen.clear ();
data.first = 1; data.first = 1;
map_symbol_filenames (output_partial_symbol_filename, &data, map_symbol_filenames (data, true /*need_fullname*/);
1 /*need_fullname*/);
printf_filtered ("\n"); printf_filtered ("\n");
} }
@ -5957,7 +5952,7 @@ not_interesting_fname (const char *fname)
return 0; return 0;
} }
/* An object of this type is passed as the user_data argument to /* An object of this type is passed as the callback argument to
map_partial_symbol_filenames. */ map_partial_symbol_filenames. */
struct add_partial_filename_data struct add_partial_filename_data
{ {
@ -5966,34 +5961,33 @@ struct add_partial_filename_data
const char *word; const char *word;
int text_len; int text_len;
completion_list *list; completion_list *list;
void operator() (const char *filename, const char *fullname);
}; };
/* A callback for map_partial_symbol_filenames. */ /* A callback for map_partial_symbol_filenames. */
static void void
maybe_add_partial_symtab_filename (const char *filename, const char *fullname, add_partial_filename_data::operator() (const char *filename,
void *user_data) const char *fullname)
{ {
struct add_partial_filename_data *data
= (struct add_partial_filename_data *) user_data;
if (not_interesting_fname (filename)) if (not_interesting_fname (filename))
return; return;
if (!data->filename_seen_cache->seen (filename) if (!filename_seen_cache->seen (filename)
&& filename_ncmp (filename, data->text, data->text_len) == 0) && filename_ncmp (filename, text, text_len) == 0)
{ {
/* This file matches for a completion; add it to the /* This file matches for a completion; add it to the
current list of matches. */ current list of matches. */
add_filename_to_list (filename, data->text, data->word, data->list); add_filename_to_list (filename, text, word, list);
} }
else else
{ {
const char *base_name = lbasename (filename); const char *base_name = lbasename (filename);
if (base_name != filename if (base_name != filename
&& !data->filename_seen_cache->seen (base_name) && !filename_seen_cache->seen (base_name)
&& filename_ncmp (base_name, data->text, data->text_len) == 0) && filename_ncmp (base_name, text, text_len) == 0)
add_filename_to_list (base_name, data->text, data->word, data->list); add_filename_to_list (base_name, text, word, list);
} }
} }
@ -6050,8 +6044,7 @@ make_source_files_completion_list (const char *text, const char *word)
datum.word = word; datum.word = word;
datum.text_len = text_len; datum.text_len = text_len;
datum.list = &list; datum.list = &list;
map_symbol_filenames (maybe_add_partial_symtab_filename, &datum, map_symbol_filenames (datum, false /*need_fullname*/);
0 /*need_fullname*/);
return list; return list;
} }