From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id iKH0BH1mvmCsRwAAWB0awg (envelope-from ) for ; Mon, 07 Jun 2021 14:33:33 -0400 Received: by simark.ca (Postfix, from userid 112) id 11E5D1F163; Mon, 7 Jun 2021 14:33:33 -0400 (EDT) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on simark.ca X-Spam-Level: X-Spam-Status: No, score=-0.5 required=5.0 tests=DKIM_SIGNED, MAILING_LIST_MULTI,RDNS_DYNAMIC,T_DKIM_INVALID,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.2 Received: from sourceware.org (ip-8-43-85-97.sourceware.org [8.43.85.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by simark.ca (Postfix) with ESMTPS id 70A141E813 for ; Mon, 7 Jun 2021 14:33:31 -0400 (EDT) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 3E2F93894C2A for ; Mon, 7 Jun 2021 18:33:31 +0000 (GMT) Received: from mail-wr1-x431.google.com (mail-wr1-x431.google.com [IPv6:2a00:1450:4864:20::431]) by sourceware.org (Postfix) with ESMTPS id 5CA0D3896C0F for ; Mon, 7 Jun 2021 18:32:41 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 5CA0D3896C0F Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=embecosm.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=embecosm.com Received: by mail-wr1-x431.google.com with SMTP id a11so16848807wrt.13 for ; Mon, 07 Jun 2021 11:32:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=embecosm.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=VBNe0AFtd+dGbffdeTrEB4mZqmWbt7wxyyXa4+RB03M=; b=fNCGsmYSp/ekZAQ0QaT1tDSCXqfMWns2FrND2DvIExG0lbY3HrpydoMFnlL7cyNrp/ cNrOHk5fe2crQ6tJUn/WL3SL5r6jQXEXX2efoeednKBS2cIYX9g54tpxrtexL013PP/9 wl+UBgwoesKEMEP39fkrgaFipIQhBTQBi5LJNgIX9b+yAyUbqufKVsRj8OsBYZ9XGiZK D7/deOcxU5WoYG+EtoZoIASS2kXhAhWXfuL+vGZwCV8zA/HsK6ulSp6UJilRHzg1L47h ZEHv6MSVfLm1LOrNrkO0EffZQMtyPVOX9x3ZBj8hrYg0K6r03FGV0Q51hIN58hjvX4S2 /9jw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=VBNe0AFtd+dGbffdeTrEB4mZqmWbt7wxyyXa4+RB03M=; b=Gq6uN8qQcGPocEqlnbcn543svZ6BxmlAYlW4U6INkgtJtzspFQ3Eqs5Qn4rRRNNEcT ps+N3kAXI96NnvhhdwroBNZN5tvBSpPZxKoZeoB9wOpfwCIW+7nzWvgVeKG5iS2DQrUD JCFXx3dfZx4ohnt3ELITHYkPQhOcA/Kpau1+A/kIix0trK4TNNDkWe25Fb1+0kZSXIRh wwnsgWKi1gm0uCW9fUrABayS6A5Cu9qBmj9uZqUfGVb9O3FpN9Pt3G6QlUV1YY+2y27e TjFXnFHnFXfKdlshHKHLIzNSyBTJuAK9F3pGd0YPsnqi5VEBu9JPHAEl6dt4ZMSMo3f5 kj2Q== X-Gm-Message-State: AOAM533ncCmu5+j6vSG9sXxWDlzHAAwQgffqibuZnHX9t39Va0b8CRqq Gi0edizKSfiWrrGGWVY4ufXedbgNdOSBFg== X-Google-Smtp-Source: ABdhPJwVw7G/AyRc9Q6QGt7OQl1cz1nXZcADlj5OvSvUVDgtkGr95eWPS96Td/P0pLLXlX4fQdgSBA== X-Received: by 2002:a5d:474d:: with SMTP id o13mr18019162wrs.176.1623090759993; Mon, 07 Jun 2021 11:32:39 -0700 (PDT) Received: from localhost (host109-151-46-70.range109-151.btcentralplus.com. [109.151.46.70]) by smtp.gmail.com with ESMTPSA id g17sm3040350wrh.72.2021.06.07.11.32.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Jun 2021 11:32:39 -0700 (PDT) From: Andrew Burgess To: gdb-patches@sourceware.org Subject: [PATCHv3 4/5] gdb/mi: add new --group-by-objfile flag for -file-list-exec-source-files Date: Mon, 7 Jun 2021 19:32:26 +0100 Message-Id: <6a158c228d564780b26c6ec259e6ebc238958679.1623090529.git.andrew.burgess@embecosm.com> X-Mailer: git-send-email 2.25.4 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gdb-patches-bounces+public-inbox=simark.ca@sourceware.org Sender: "Gdb-patches" 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-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=[]}] In the above output the 'debug-info' field associated with each objfile will have one of the values 'none', 'partially-read', or 'fully-read'. For example, /lib64/libc.so.6 has the value 'none', this indicates that this object file has no debug information associated with it, unsurprisingly then, the sources list of this object file is empty. An object file that was compiled with debug, for example /tmp/info-sources/libhelper.so, has the value 'fully-read' above indicating that this object file does have debug information, and the information is fully read into GDB. At different times this field might have the value 'partially-read' indicating that that the object file has debug information, but it has not been fully read into GDB yet. 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 | 60 +++++++++++++++++++++++- gdb/mi/mi-cmd-file.c | 10 +++- gdb/symtab.c | 54 +++++++++++++++++---- gdb/symtab.h | 1 + gdb/testsuite/ChangeLog | 4 ++ gdb/testsuite/gdb.mi/mi-info-sources.exp | 37 +++++++++++++++ 9 files changed, 192 insertions(+), 13 deletions(-) diff --git a/gdb/NEWS b/gdb/NEWS index 8885c4773a8..468d276a939 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 @@ -57,6 +59,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/gdb.texinfo b/gdb/doc/gdb.texinfo index af17eb6260f..6312a520b7b 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,31 @@ 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}. @@ -35703,6 +35729,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-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 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 e300596be6e..cd6da063141 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 output_tuple; gdb::optional 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 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..c4d6b910ef8 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" } } -- 2.25.4