+2021-06-25 Andrew Burgess <andrew.burgess@embecosm.com>
+
+ * NEWS: Mention additions to -file-list-exec-source-files.
+ * mi/mi-cmd-file.c (mi_cmd_file_list_exec_source_files): Add
+ --group-by-objfile option.
+ * symtab.c (isrc_flag_option_def): Rename to...
+ (isrc_match_flag_option_def): ...this.
+ (info_sources_option_defs): Rename to...
+ (info_sources_match_option_defs): ...this, and update to rename of
+ isrc_flag_option_def.
+ (struct filename_grouping_opts): New struct.
+ (isrc_grouping_flag_option_def): New type.
+ (info_sources_grouping_option_defs): New static global.
+ (make_info_sources_options_def_group): Update to return two option
+ groups.
+ (info_sources_command_completer): Update for changes to
+ make_info_sources_options_def_group.
+ (info_sources_worker): Add extra parameter, use this to display
+ alternative output format.
+ (info_sources_command): Pass extra parameter to
+ info_sources_worker.
+ (_initialize_symtab): Update for changes to
+ make_info_sources_options_def_group.
+ * symtab.h (info_sources_worker): Add extra parameter.
+
2021-06-25 Andrew Burgess <andrew.burgess@embecosm.com>
* NEWS: Mention additions to -file-list-exec-source-files.
all locations of the selected breakpoint. This is equivalent to
the '-force' flag of the CLI's "cond" command.
- ** '-file-list-exec-source-files [--basename | --dirname] [--] [REGEXP]'
+ ** '-file-list-exec-source-files [--group-by-objfile]
+ [--basename | --dirname]
+ [--] [REGEXP]'
The existing -file-list-exec-source-files command now takes an
optional REGEXP which is used to filter the source files that are
REGEXP is only matched against the specified part of the full
source filename.
+ When the optional --group-by-objfile flag is used the output
+ format is changed, the results are now a list of object files
+ (executable and libraries) with the source files that are
+ associated with each object file.
+
The results from -file-list-exec-source-files now include a
'debug-fully-read' field which takes the value 'true' or 'false'.
A 'true' value indicates the source file is from a compilation
+2021-06-25 Andrew Burgess <andrew.burgess@embecosm.com>
+
+ * gdb.texinfo (GDB/MI File Commands): Document --group-by-objfile
+ extension for -file-list-exec-source-files.
+
2021-06-25 Andrew Burgess <andrew.burgess@embecosm.com>
* gdb.texinfo (GDB/MI File Commands): Document extensions to
@subsubheading Synopsis
@smallexample
- -file-list-exec-source-files @r{[} @var{--dirname} @r{|} @var{--basename} @r{]}
+ -file-list-exec-source-files @r{[} @var{--group-by-objfile} @r{]}
+ @r{[} @var{--dirname} @r{|} @var{--basename} @r{]}
@r{[} -- @r{]}
@r{[} @var{regexp} @r{]}
@end smallexample
source file. Only one of @code{--dirname} or @code{--basename} may be
given, and if either is given then @var{regexp} is required.
+If @code{--group-by-objfile} is used then the format of the results is
+changed. The results will now be a list of tuples, with each tuple
+representing an object file (executable or shared library) loaded into
+@value{GDBN}. The fields of these tuples are; @var{filename},
+@var{debug-info}, and @var{sources}. The @var{filename} is the
+absolute name of the object file, @var{debug-info} is a string with
+one of the following values:
+
+@table @code
+@item none
+This object file has no debug information.
+@item partially-read
+This object file has debug information, but it is not fully read in
+yet. When it is read in later, GDB might become aware of additional
+source files.
+@item fully-read
+This object file has debug information, and this information is fully
+read into GDB. The list of source files is complete.
+@end table
+
+The @var{sources} is a list or tuples, with each tuple describing a
+single source file with the same fields as described previously. The
+@var{sources} list can be empty for object files that have no debug
+information.
+
@subsubheading @value{GDBN} Command
The @value{GDBN} equivalent is @samp{info sources}.
fullname="/tmp/info-sources/helper.c",
debug-fully-read="true"@}]
(@value{GDBP})
+-file-list-exec-source-files --group-by-objfile
+^done,files=[@{filename="/tmp/info-sources/test.x",
+ debug-info="fully-read",
+ sources=[@{file="test.c",
+ fullname="/tmp/info-sources/test.c",
+ debug-fully-read="true"@},
+ @{file="/usr/include/stdc-predef.h",
+ fullname="/usr/include/stdc-predef.h",
+ debug-fully-read="true"@},
+ @{file="header.h",
+ fullname="/tmp/info-sources/header.h",
+ debug-fully-read="true"@}]@},
+ @{filename="/lib64/ld-linux-x86-64.so.2",
+ debug-info="none",
+ sources=[]@},
+ @{filename="system-supplied DSO at 0x7ffff7fcf000",
+ debug-info="none",
+ sources=[]@},
+ @{filename="/tmp/info-sources/libhelper.so",
+ debug-info="fully-read",
+ sources=[@{file="helper.c",
+ fullname="/tmp/info-sources/helper.c",
+ debug-fully-read="true"@},
+ @{file="/usr/include/stdc-predef.h",
+ fullname="/usr/include/stdc-predef.h",
+ debug-fully-read="true"@},
+ @{file="header.h",
+ fullname="/tmp/info-sources/header.h",
+ debug-fully-read="true"@}]@},
+ @{filename="/lib64/libc.so.6",
+ debug-info="none",
+ sources=[]@}]
@end smallexample
@subheading The @code{-file-list-shared-libraries} Command
{
enum opt
{
+ GROUP_BY_OBJFILE_OPT,
MATCH_BASENAME_OPT,
MATCH_DIRNAME_OPT
};
static const struct mi_opt opts[] =
{
+ {"-group-by-objfile", GROUP_BY_OBJFILE_OPT, 0},
{"-basename", MATCH_BASENAME_OPT, 0},
{"-dirname", MATCH_DIRNAME_OPT, 0},
{ 0, 0, 0 }
int oind = 0;
char *oarg;
+ bool group_by_objfile = false;
bool match_on_basename = false;
bool match_on_dirname = false;
break;
switch ((enum opt) opt)
{
+ case GROUP_BY_OBJFILE_OPT:
+ group_by_objfile = true;
+ break;
case MATCH_BASENAME_OPT:
match_on_basename = true;
break;
}
if ((argc - oind > 1) || (match_on_basename && match_on_dirname))
- error (_("-file-list-exec-source-files: Usage: [--basename | --dirname] [--] REGEXP"));
+ error (_("-file-list-exec-source-files: Usage: [--group-by-objfile] [--basename | --dirname] [--] REGEXP"));
const char *regexp = nullptr;
if (argc - oind == 1)
match_type = info_sources_filter::match_on::FULLNAME;
info_sources_filter filter (match_type, regexp);
- info_sources_worker (current_uiout, filter);
+ info_sources_worker (current_uiout, group_by_objfile, filter);
}
/* See mi-cmds.h. */
void
info_sources_worker (struct ui_out *uiout,
+ bool group_by_objfile,
const info_sources_filter &filter)
{
output_source_filename_data data (uiout, filter);
gdb::optional<ui_out_emit_tuple> output_tuple;
gdb::optional<ui_out_emit_list> sources_list;
- if (!uiout->is_mi_like_p ())
- data.print_header (_("Source files for which symbols have been read in:\n"));
+ gdb_assert (!group_by_objfile || uiout->is_mi_like_p ());
+
+ if (!group_by_objfile)
+ {
+ if (!uiout->is_mi_like_p ())
+ data.print_header (_("Source files for which symbols have been read in:\n"));
+ }
for (objfile *objfile : current_program_space->objfiles ())
{
+ if (group_by_objfile)
+ {
+ output_tuple.emplace (uiout, nullptr);
+ uiout->field_string ("filename", objfile_name (objfile));
+ bool debug_fully_readin = !objfile->has_unexpanded_symtabs ();
+ const char *debug_info_state;
+ if (objfile_has_symbols (objfile))
+ {
+ if (debug_fully_readin)
+ debug_info_state = "fully-read";
+ else
+ debug_info_state = "partially-read";
+ }
+ else
+ debug_info_state = "none";
+ current_uiout->field_string ("debug-info", debug_info_state);
+ sources_list.emplace (uiout, "sources");
+ }
+
for (compunit_symtab *cu : objfile->compunits ())
{
for (symtab *s : compunit_filetabs (cu))
data.output (file, fullname, true);
}
}
+
+ if (group_by_objfile)
+ {
+ objfile->map_symbol_filenames (data, true /* need_fullname */);
+ data.reset_output ();
+ sources_list.reset ();
+ output_tuple.reset ();
+ }
}
- uiout->text ("\n\n");
- if (!uiout->is_mi_like_p ())
- data.print_header (_("Source files for which symbols will be read in on demand:\n"));
- data.reset_output ();
- map_symbol_filenames (data, true /*need_fullname*/);
- uiout->text ("\n");
+ if (!group_by_objfile)
+ {
+ uiout->text ("\n\n");
+ if (!uiout->is_mi_like_p ())
+ data.print_header (_("Source files for which symbols will be read in on demand:\n"));
+ data.reset_output ();
+ map_symbol_filenames (data, true /*need_fullname*/);
+ uiout->text ("\n");
+ }
}
/* Implement the 'info sources' command. */
match_type = info_sources_filter::match_on::FULLNAME;
info_sources_filter filter (match_type, regex);
- info_sources_worker (current_uiout, filter);
+ info_sources_worker (current_uiout, false, filter);
}
/* Compare FILE against all the entries of FILENAMES. If BASENAMES is
Output is written to UIOUT in CLI or MI style as appropriate. */
extern void info_sources_worker (struct ui_out *uiout,
+ bool group_by_objfile,
const info_sources_filter &filter);
#endif /* !defined(SYMTAB_H) */
+2021-06-25 Andrew Burgess <andrew.burgess@embecosm.com>
+
+ * gdb.mi/mi-info-sources.exp: Add additional tests.
+
2021-06-25 Andrew Burgess <andrew.burgess@embecosm.com>
* gdb.dwarf2/dw2-filename.exp: Update expected results.
[mi_field "debug-fully-read" "${debug_fully_read}"]]]
mi_gdb_test "-file-list-exec-source-files --basename -- base" ".*\\^done,${p}" \
"-file-list-exec-source-files --basename -- base"
+
+ # Figure out the value for the 'debug-info' field.
+ if {${debug_fully_read} == "true"} {
+ set debug_info "fully-read"
+ } else {
+ set debug_info "partially-read"
+ }
+
+ set p [mi_list "files" \
+ [mi_tuple "" \
+ [mi_field "filename" "\[^\"\]+/mi-info-sources"] \
+ [mi_field "debug-info" "${debug_info}"] \
+ [mi_list "sources" \
+ ".*" \
+ [mi_tuple "" \
+ [mi_field "file" "\[^\"\]+/mi-info-sources\\.c"] \
+ [mi_field "fullname" "\[^\"\]+/mi-info-sources\\.c"] \
+ [mi_field "debug-fully-read" "true"]] \
+ ".*"]]]
+ mi_gdb_test "-file-list-exec-source-files --group-by-objfile" \
+ ".*\\^done,${p}" \
+ "-file-list-exec-source-files --group-by-objfile, look for mi-info-sources.c"
+
+ set p [mi_list "files" \
+ [mi_tuple "" \
+ [mi_field "filename" "\[^\"\]+/mi-info-sources"] \
+ [mi_field "debug-info" "${debug_info}"] \
+ [mi_list "sources" \
+ ".*" \
+ [mi_tuple "" \
+ [mi_field "file" "\[^\"\]+/mi-info-sources-base\\.c"] \
+ [mi_field "fullname" "\[^\"\]+/mi-info-sources-base\\.c"] \
+ [mi_field "debug-fully-read" "${debug_fully_read}"]] \
+ ".*"]]]
+ mi_gdb_test "-file-list-exec-source-files --group-by-objfile" \
+ ".*\\^done,${p}" \
+ "-file-list-exec-source-files --group-by-objfile, look for mi-info-sources-base.c"
}
}