From: Andrew Burgess <andrew.burgess@embecosm.com>
To: gdb-patches@sourceware.org
Subject: [PATCHv2 4/5] gdb/mi: add new --group-by-objfile flag for -file-list-exec-source-files
Date: Wed, 19 May 2021 12:12:41 +0100 [thread overview]
Message-ID: <262bab9f91a72af816095a01628e7cd9ac3e48ba.1621421987.git.andrew.burgess@embecosm.com> (raw)
In-Reply-To: <cover.1621421987.git.andrew.burgess@embecosm.com>
This commit adds a new option '--group-by-objfile' to the MI command
-file-list-exec-source-files. With this option the output format is
changed; instead of a single list of source files the results are now
a list of objfiles. For each objfile all of the source files
associated with that objfile are listed.
Here is an example of the new output format taken from the
documentation (the newlines are added just for readability):
-file-list-exec-source-files --group-by-objfile
^done,files=[{filename="/tmp/info-sources/test.x",
debug-fully-read="true",
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-fully-read="true",
sources=[]},
{filename="system-supplied DSO at 0x7ffff7fcf000",
debug-fully-read="true",
sources=[]},
{filename="/tmp/info-sources/libhelper.so",
debug-fully-read="true",
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-fully-read="true",
sources=[]}]
In the above output we see, for example, that /lib64/libc.so.6 has had
its debug fully read, but still has no associated source files, this
most likely indicates that libc (in this case) has no debug
information available.
Source files can appear at most once for any single objfile, but can
appear multiple times in total, if the same source file is part of
multiple objfiles, for example /tmp/info-sources/header.h in the above
output.
The new output format is hidden behind a command option to ensure that
the default output is unchanged, this ensures backward compatibility.
The behaviour of the CLI "info sources" command is unchanged after
this commit.
gdb/ChangeLog:
* 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.
gdb/doc/ChangeLog:
* gdb.texinfo (GDB/MI File Commands): Document --group-by-objfile
extension for -file-list-exec-source-files.
gdb/testsuite/ChangeLog:
* gdb.mi/mi-info-sources.exp: Add additional tests.
---
gdb/ChangeLog | 25 ++++++++++++
gdb/NEWS | 9 ++++-
gdb/doc/ChangeLog | 5 +++
gdb/doc/gdb.texinfo | 48 +++++++++++++++++++++++-
gdb/mi/mi-cmd-file.c | 10 ++++-
gdb/symtab.c | 46 ++++++++++++++++++-----
gdb/symtab.h | 1 +
gdb/testsuite/ChangeLog | 4 ++
gdb/testsuite/gdb.mi/mi-info-sources.exp | 30 +++++++++++++++
9 files changed, 165 insertions(+), 13 deletions(-)
diff --git a/gdb/NEWS b/gdb/NEWS
index aae0d5b025a..77dd2fac082 100644
--- a/gdb/NEWS
+++ b/gdb/NEWS
@@ -46,7 +46,9 @@
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
@@ -56,6 +58,11 @@
When one of --basename or --dirname is given then 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
diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
index e0789a4b5c6..692da35f424 100644
--- a/gdb/doc/gdb.texinfo
+++ b/gdb/doc/gdb.texinfo
@@ -35630,7 +35630,8 @@
@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
@@ -35668,6 +35669,19 @@
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 libraries) loaded
+into @value{GDBN}. The fields of these tuples are; @var{filename},
+@var{debug-fully-read}, and @var{sources}. The @var{filename} is the
+absolute name of the object file, @var{debug-fully-read} is a string,
+either @code{true} or @code{false} indicating if the full debug
+information for this object file has been read in or not. 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}.
@@ -35703,6 +35717,38 @@
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-fully-read="true",
+ 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-fully-read="true",
+ sources=[]@},
+ @{filename="system-supplied DSO at 0x7ffff7fcf000",
+ debug-fully-read="true",
+ sources=[]@},
+ @{filename="/tmp/info-sources/libhelper.so",
+ debug-fully-read="true",
+ 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-fully-read="true",
+ sources=[]@}]
@end smallexample
@subheading The @code{-file-list-shared-libraries} Command
diff --git a/gdb/mi/mi-cmd-file.c b/gdb/mi/mi-cmd-file.c
index 684f7eb3f0c..0970d369cc5 100644
--- a/gdb/mi/mi-cmd-file.c
+++ b/gdb/mi/mi-cmd-file.c
@@ -69,11 +69,13 @@ mi_cmd_file_list_exec_source_files (const char *command, char **argv, int argc)
{
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 }
@@ -83,6 +85,7 @@ mi_cmd_file_list_exec_source_files (const char *command, char **argv, int argc)
int oind = 0;
char *oarg;
+ bool group_by_objfile = false;
bool match_on_basename = false;
bool match_on_dirname = false;
@@ -94,6 +97,9 @@ mi_cmd_file_list_exec_source_files (const char *command, char **argv, int argc)
break;
switch ((enum opt) opt)
{
+ case GROUP_BY_OBJFILE_OPT:
+ group_by_objfile = true;
+ break;
case MATCH_BASENAME_OPT:
match_on_basename = true;
break;
@@ -104,7 +110,7 @@ mi_cmd_file_list_exec_source_files (const char *command, char **argv, int argc)
}
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)
@@ -119,7 +125,7 @@ mi_cmd_file_list_exec_source_files (const char *command, char **argv, int argc)
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. */
diff --git a/gdb/symtab.c b/gdb/symtab.c
index c328b485f3a..8d75fe4f44c 100644
--- a/gdb/symtab.c
+++ b/gdb/symtab.c
@@ -4459,6 +4459,7 @@ info_sources_command_completer (cmd_list_element *ignore,
void
info_sources_worker (struct ui_out *uiout,
+ bool group_by_objfile,
const info_sources_filter &filter)
{
output_source_filename_data data (uiout, filter);
@@ -4467,11 +4468,27 @@ info_sources_worker (struct ui_out *uiout,
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 ();
+ current_uiout->field_string ("debug-fully-read",
+ (debug_fully_readin
+ ? "true" : "false"));
+ sources_list.emplace (uiout, "sources");
+ }
+
for (compunit_symtab *cu : objfile->compunits ())
{
for (symtab *s : compunit_filetabs (cu))
@@ -4481,14 +4498,25 @@ info_sources_worker (struct ui_out *uiout,
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. */
@@ -4523,7 +4551,7 @@ info_sources_command (const char *args, int from_tty)
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
diff --git a/gdb/symtab.h b/gdb/symtab.h
index 7dd659284ed..803b1bc0ce7 100644
--- a/gdb/symtab.h
+++ b/gdb/symtab.h
@@ -2445,6 +2445,7 @@ struct info_sources_filter
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) */
diff --git a/gdb/testsuite/gdb.mi/mi-info-sources.exp b/gdb/testsuite/gdb.mi/mi-info-sources.exp
index c218af4ba80..c7ddcc9aa2f 100644
--- a/gdb/testsuite/gdb.mi/mi-info-sources.exp
+++ b/gdb/testsuite/gdb.mi/mi-info-sources.exp
@@ -137,6 +137,36 @@ proc check_info_sources { debug_fully_read } {
[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"
+
+ set p [mi_list "files" \
+ [mi_tuple "" \
+ [mi_field "filename" "\[^\"\]+/mi-info-sources"] \
+ [mi_field "debug-fully-read" "${debug_fully_read}"] \
+ [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-fully-read" "${debug_fully_read}"] \
+ [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"
}
}
--
2.25.4
next prev parent reply other threads:[~2021-05-19 11:13 UTC|newest]
Thread overview: 38+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-04-26 17:06 [PATCH 0/4] New option for 'info sources', also better MI support Andrew Burgess
2021-04-26 17:07 ` [PATCH 1/4] gdb: add new function quick_symbol_functions::has_unexpanded_symbols Andrew Burgess
2021-05-13 14:38 ` Simon Marchi via Gdb-patches
2021-05-13 17:29 ` Tom Tromey
2021-05-13 14:46 ` Simon Marchi via Gdb-patches
2021-04-26 17:07 ` [PATCH 2/4] gdb: make struct output_source_filename_data more C++ like Andrew Burgess
2021-05-13 14:58 ` Simon Marchi via Gdb-patches
2021-04-26 17:07 ` [PATCH 3/4] gdb: add new -group-by-binary flag to info sources command Andrew Burgess
2021-04-26 17:34 ` Eli Zaretskii via Gdb-patches
2021-05-13 15:05 ` Simon Marchi via Gdb-patches
2021-05-15 8:45 ` Andrew Burgess
2021-05-15 13:19 ` Simon Marchi via Gdb-patches
2021-04-26 17:07 ` [PATCH 4/4] gdb/mi: extend -file-list-exec-source-files command Andrew Burgess
2021-04-26 17:39 ` Eli Zaretskii via Gdb-patches
2021-05-13 15:47 ` Simon Marchi via Gdb-patches
2021-05-13 10:34 ` [PATCH 0/4] New option for 'info sources', also better MI support Andrew Burgess
2021-05-19 11:12 ` [PATCHv2 0/5] "info sources" - group by objfile Andrew Burgess
2021-05-19 11:12 ` [PATCHv2 1/5] gdb: add new function quick_symbol_functions::has_unexpanded_symbols Andrew Burgess
2021-05-19 11:12 ` [PATCHv2 2/5] gdb: make struct output_source_filename_data more C++ like Andrew Burgess
2021-05-19 11:12 ` [PATCHv2 3/5] gdb/mi: add regexp filtering to -file-list-exec-source-files Andrew Burgess
2021-05-19 11:51 ` Eli Zaretskii via Gdb-patches
2021-05-19 11:12 ` Andrew Burgess [this message]
2021-05-19 11:44 ` [PATCHv2 4/5] gdb/mi: add new --group-by-objfile flag for -file-list-exec-source-files Eli Zaretskii via Gdb-patches
2021-05-19 11:12 ` [PATCHv2 5/5] gdb: change info sources to group results by objfile Andrew Burgess
2021-05-19 11:53 ` Eli Zaretskii via Gdb-patches
2021-06-03 13:08 ` Simon Marchi via Gdb-patches
2021-06-03 9:27 ` [PATCHv2 0/5] "info sources" - group " Andrew Burgess
2021-06-03 13:15 ` Simon Marchi via Gdb-patches
2021-06-07 18:32 ` [PATCHv3 " Andrew Burgess
2021-06-07 18:32 ` [PATCHv3 1/5] gdb: add new function quick_symbol_functions::has_unexpanded_symbols Andrew Burgess
2021-06-07 18:32 ` [PATCHv3 2/5] gdb: make struct output_source_filename_data more C++ like Andrew Burgess
2021-07-05 12:31 ` Tom de Vries
2021-07-26 13:21 ` Andrew Burgess
2021-06-07 18:32 ` [PATCHv3 3/5] gdb/mi: add regexp filtering to -file-list-exec-source-files Andrew Burgess
2021-06-07 18:32 ` [PATCHv3 4/5] gdb/mi: add new --group-by-objfile flag for -file-list-exec-source-files Andrew Burgess
2021-06-07 18:32 ` [PATCHv3 5/5] gdb: change info sources to group results by objfile Andrew Burgess
2021-06-21 12:02 ` PING! Re: [PATCHv3 0/5] "info sources" - group " Andrew Burgess
2021-06-25 20:08 ` Andrew Burgess
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=262bab9f91a72af816095a01628e7cd9ac3e48ba.1621421987.git.andrew.burgess@embecosm.com \
--to=andrew.burgess@embecosm.com \
--cc=gdb-patches@sourceware.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox