diff options
-rw-r--r-- | gdb/ChangeLog | 25 | ||||
-rw-r--r-- | gdb/NEWS | 9 | ||||
-rw-r--r-- | gdb/doc/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/doc/gdb.texinfo | 60 | ||||
-rw-r--r-- | gdb/mi/mi-cmd-file.c | 10 | ||||
-rw-r--r-- | gdb/symtab.c | 54 | ||||
-rw-r--r-- | gdb/symtab.h | 1 | ||||
-rw-r--r-- | gdb/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gdb/testsuite/gdb.mi/mi-info-sources.exp | 37 |
9 files changed, 192 insertions, 13 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index aa1d458..637fd09 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,6 +1,31 @@ 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. * 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. @@ -49,7 +49,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 @@ -60,6 +62,11 @@ 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/ChangeLog b/gdb/doc/ChangeLog index 4dc1904..20ea7f7 100644 --- a/gdb/doc/ChangeLog +++ b/gdb/doc/ChangeLog @@ -1,5 +1,10 @@ 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 -file-list-exec-source-files. diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo index 1e56c3a..19b6a5f 100644 --- a/gdb/doc/gdb.texinfo +++ b/gdb/doc/gdb.texinfo @@ -35629,7 +35629,8 @@ The @value{GDBN} equivalent is @samp{info source} @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 @@ -35667,6 +35668,31 @@ is provided, then @var{regexp} is matched against the basename of each 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}. @@ -35702,6 +35728,38 @@ 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 diff --git a/gdb/mi/mi-cmd-file.c b/gdb/mi/mi-cmd-file.c index 684f7eb..0970d36 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 e300596..cd6da06 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,35 @@ 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 (); + 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)) @@ -4481,14 +4506,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 +4559,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 db0df5c..968b447 100644 --- a/gdb/symtab.h +++ b/gdb/symtab.h @@ -2446,6 +2446,7 @@ private: 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/ChangeLog b/gdb/testsuite/ChangeLog index 7eb13b8..8a8c7f2 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,5 +1,9 @@ 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. * gdb.mi/mi-file.exp: Likewise. * gdb.mi/mi-info-sources-base.c: New file. diff --git a/gdb/testsuite/gdb.mi/mi-info-sources.exp b/gdb/testsuite/gdb.mi/mi-info-sources.exp index c218af4..c4d6b91 100644 --- a/gdb/testsuite/gdb.mi/mi-info-sources.exp +++ b/gdb/testsuite/gdb.mi/mi-info-sources.exp @@ -137,6 +137,43 @@ 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" + + # 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" } } |