aboutsummaryrefslogtreecommitdiff
path: root/gdb/mi
diff options
context:
space:
mode:
authorAndrew Burgess <andrew.burgess@embecosm.com>2021-05-18 13:46:19 +0100
committerAndrew Burgess <andrew.burgess@embecosm.com>2021-06-25 20:54:29 +0100
commit0e350a054bbeb4d00f2c430c4815c82d5ffb47a7 (patch)
tree079b2ed8a2344ef2b6b7c854b9ccfe8450d34137 /gdb/mi
parent4a0788e08cbf9e7b90640475b17afbbf5423ea9d (diff)
downloadgdb-0e350a054bbeb4d00f2c430c4815c82d5ffb47a7.zip
gdb-0e350a054bbeb4d00f2c430c4815c82d5ffb47a7.tar.gz
gdb-0e350a054bbeb4d00f2c430c4815c82d5ffb47a7.tar.bz2
gdb/mi: add regexp filtering to -file-list-exec-source-files
This commit extends the existing MI command -file-list-exec-source-files to provide the same regular expression based filtering that the equivalent CLI command "info sources" provides. The new command syntax is: -file-list-exec-source-files [--basename | --dirname] [--] [REGEXP] All options are optional, which ensures the command is backward compatible. As part of this work I have unified the CLI and MI code. As a result of the unified code I now provide additional information in the MI command output, there is now a new field 'debug-fully-read' included with each source file. This field which has the values 'true' or 'false', indicates if the source file is from a compilation unit that has had its debug information fully read. However, as this is additional information, a well written front-end should just ignore this field if it doesn't understand it, so things should still be backward compatible. gdb/ChangeLog: * NEWS: Mention additions to -file-list-exec-source-files. * mi/mi-cmd-file.c (print_partial_file_name): Delete. (mi_cmd_file_list_exec_source_files): Rewrite to handle command options, and make use of info_sources_worker. * symtab.c (struct info_sources_filter): Moved to symtab.h. (info_sources_filter::print): Take uiout argument, produce output through uiout. (struct output_source_filename_data) <output_source_filename_data>: Take uiout argument, store into m_uiout. <output>: Rewrite comment, add additional arguments to declaration. <operator()>: Send more arguments to output. <m_uiout>: New member variable. (output_source_filename_data::output): Take extra arguments, produce output through m_uiout, and structure for MI. (output_source_filename_data::print_header): Produce output through m_uiout. (info_sources_worker): New function, the implementation is taken from info_sources_command, but modified so produce output through a ui_out. (info_sources_command): The second half of this function has gone to become info_sources_worker. * symtab.h (struct info_sources_filter): Moved from symtab.c, add extra parameter to print member function. (info_sources_worker): Declare. gdb/doc/ChangeLog: * gdb.texinfo (GDB/MI File Commands): Document extensions to -file-list-exec-source-files. gdb/testsuite/ChangeLog: * gdb.dwarf2/dw2-filename.exp: Update expected results. * gdb.mi/mi-file.exp: Likewise. * gdb.mi/mi-info-sources-base.c: New file. * gdb.mi/mi-info-sources.c: New file. * gdb.mi/mi-info-sources.exp: New file.
Diffstat (limited to 'gdb/mi')
-rw-r--r--gdb/mi/mi-cmd-file.c86
1 files changed, 48 insertions, 38 deletions
diff --git a/gdb/mi/mi-cmd-file.c b/gdb/mi/mi-cmd-file.c
index 430449c..684f7eb 100644
--- a/gdb/mi/mi-cmd-file.c
+++ b/gdb/mi/mi-cmd-file.c
@@ -62,54 +62,64 @@ mi_cmd_file_list_exec_source_file (const char *command, char **argv, int argc)
COMPUNIT_MACRO_TABLE (SYMTAB_COMPUNIT (st.symtab)) != NULL);
}
-/* A callback for map_partial_symbol_filenames. */
-
-static void
-print_partial_file_name (const char *filename, const char *fullname)
-{
- struct ui_out *uiout = current_uiout;
-
- uiout->begin (ui_out_type_tuple, NULL);
-
- uiout->field_string ("file", filename);
-
- if (fullname)
- uiout->field_string ("fullname", fullname);
-
- uiout->end (ui_out_type_tuple);
-}
+/* Implement -file-list-exec-source-files command. */
void
mi_cmd_file_list_exec_source_files (const char *command, char **argv, int argc)
{
- struct ui_out *uiout = current_uiout;
-
- if (!mi_valid_noargs ("-file-list-exec-source-files", argc, argv))
- error (_("-file-list-exec-source-files: Usage: No args"));
-
- /* Print the table header. */
- uiout->begin (ui_out_type_list, "files");
-
- /* Look at all of the file symtabs. */
- for (objfile *objfile : current_program_space->objfiles ())
+ enum opt
+ {
+ MATCH_BASENAME_OPT,
+ MATCH_DIRNAME_OPT
+ };
+ static const struct mi_opt opts[] =
+ {
+ {"-basename", MATCH_BASENAME_OPT, 0},
+ {"-dirname", MATCH_DIRNAME_OPT, 0},
+ { 0, 0, 0 }
+ };
+
+ /* Parse arguments. */
+ int oind = 0;
+ char *oarg;
+
+ bool match_on_basename = false;
+ bool match_on_dirname = false;
+
+ while (1)
{
- for (compunit_symtab *cu : objfile->compunits ())
+ int opt = mi_getopt ("-file-list-exec-source-files", argc, argv,
+ opts, &oind, &oarg);
+ if (opt < 0)
+ break;
+ switch ((enum opt) opt)
{
- for (symtab *s : compunit_filetabs (cu))
- {
- uiout->begin (ui_out_type_tuple, NULL);
-
- uiout->field_string ("file", symtab_to_filename_for_display (s));
- uiout->field_string ("fullname", symtab_to_fullname (s));
-
- uiout->end (ui_out_type_tuple);
- }
+ case MATCH_BASENAME_OPT:
+ match_on_basename = true;
+ break;
+ case MATCH_DIRNAME_OPT:
+ match_on_dirname = true;
+ break;
}
}
- map_symbol_filenames (print_partial_file_name, true /*need_fullname*/);
+ if ((argc - oind > 1) || (match_on_basename && match_on_dirname))
+ error (_("-file-list-exec-source-files: Usage: [--basename | --dirname] [--] REGEXP"));
+
+ const char *regexp = nullptr;
+ if (argc - oind == 1)
+ regexp = argv[oind];
+
+ info_sources_filter::match_on match_type;
+ if (match_on_dirname)
+ match_type = info_sources_filter::match_on::DIRNAME;
+ else if (match_on_basename)
+ match_type = info_sources_filter::match_on::BASENAME;
+ else
+ match_type = info_sources_filter::match_on::FULLNAME;
- uiout->end (ui_out_type_list);
+ info_sources_filter filter (match_type, regexp);
+ info_sources_worker (current_uiout, filter);
}
/* See mi-cmds.h. */