mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2025-01-06 12:09:26 +08:00
1fb1ce02fc
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.
175 lines
4.7 KiB
C
175 lines
4.7 KiB
C
/* MI Command Set - file commands.
|
|
Copyright (C) 2000-2021 Free Software Foundation, Inc.
|
|
Contributed by Cygnus Solutions (a Red Hat company).
|
|
|
|
This file is part of GDB.
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
|
|
|
#include "defs.h"
|
|
#include "mi-cmds.h"
|
|
#include "mi-getopt.h"
|
|
#include "mi-interp.h"
|
|
#include "ui-out.h"
|
|
#include "symtab.h"
|
|
#include "source.h"
|
|
#include "objfiles.h"
|
|
#include "psymtab.h"
|
|
#include "solib.h"
|
|
#include "solist.h"
|
|
#include "gdb_regex.h"
|
|
|
|
/* Return to the client the absolute path and line number of the
|
|
current file being executed. */
|
|
|
|
void
|
|
mi_cmd_file_list_exec_source_file (const char *command, char **argv, int argc)
|
|
{
|
|
struct symtab_and_line st;
|
|
struct ui_out *uiout = current_uiout;
|
|
|
|
if (!mi_valid_noargs ("-file-list-exec-source-file", argc, argv))
|
|
error (_("-file-list-exec-source-file: Usage: No args"));
|
|
|
|
/* Set the default file and line, also get them. */
|
|
set_default_source_symtab_and_line ();
|
|
st = get_current_source_symtab_and_line ();
|
|
|
|
/* We should always get a symtab. Apparently, filename does not
|
|
need to be tested for NULL. The documentation in symtab.h
|
|
suggests it will always be correct. */
|
|
if (!st.symtab)
|
|
error (_("-file-list-exec-source-file: No symtab"));
|
|
|
|
/* Print to the user the line, filename and fullname. */
|
|
uiout->field_signed ("line", st.line);
|
|
uiout->field_string ("file", symtab_to_filename_for_display (st.symtab));
|
|
|
|
uiout->field_string ("fullname", symtab_to_fullname (st.symtab));
|
|
|
|
uiout->field_signed ("macro-info",
|
|
COMPUNIT_MACRO_TABLE (SYMTAB_COMPUNIT (st.symtab)) != NULL);
|
|
}
|
|
|
|
/* Implement -file-list-exec-source-files command. */
|
|
|
|
void
|
|
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 }
|
|
};
|
|
|
|
/* Parse arguments. */
|
|
int oind = 0;
|
|
char *oarg;
|
|
|
|
bool group_by_objfile = false;
|
|
bool match_on_basename = false;
|
|
bool match_on_dirname = false;
|
|
|
|
while (1)
|
|
{
|
|
int opt = mi_getopt ("-file-list-exec-source-files", argc, argv,
|
|
opts, &oind, &oarg);
|
|
if (opt < 0)
|
|
break;
|
|
switch ((enum opt) opt)
|
|
{
|
|
case GROUP_BY_OBJFILE_OPT:
|
|
group_by_objfile = true;
|
|
break;
|
|
case MATCH_BASENAME_OPT:
|
|
match_on_basename = true;
|
|
break;
|
|
case MATCH_DIRNAME_OPT:
|
|
match_on_dirname = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if ((argc - oind > 1) || (match_on_basename && match_on_dirname))
|
|
error (_("-file-list-exec-source-files: Usage: [--group-by-objfile] [--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;
|
|
|
|
info_sources_filter filter (match_type, regexp);
|
|
info_sources_worker (current_uiout, group_by_objfile, filter);
|
|
}
|
|
|
|
/* See mi-cmds.h. */
|
|
|
|
void
|
|
mi_cmd_file_list_shared_libraries (const char *command, char **argv, int argc)
|
|
{
|
|
struct ui_out *uiout = current_uiout;
|
|
const char *pattern;
|
|
|
|
switch (argc)
|
|
{
|
|
case 0:
|
|
pattern = NULL;
|
|
break;
|
|
case 1:
|
|
pattern = argv[0];
|
|
break;
|
|
default:
|
|
error (_("Usage: -file-list-shared-libraries [REGEXP]"));
|
|
}
|
|
|
|
if (pattern != NULL)
|
|
{
|
|
const char *re_err = re_comp (pattern);
|
|
|
|
if (re_err != NULL)
|
|
error (_("Invalid regexp: %s"), re_err);
|
|
}
|
|
|
|
update_solib_list (1);
|
|
|
|
/* Print the table header. */
|
|
ui_out_emit_list list_emitter (uiout, "shared-libraries");
|
|
|
|
for (struct so_list *so : current_program_space->solibs ())
|
|
{
|
|
if (so->so_name[0] == '\0')
|
|
continue;
|
|
if (pattern != NULL && !re_exec (so->so_name))
|
|
continue;
|
|
|
|
ui_out_emit_tuple tuple_emitter (uiout, NULL);
|
|
mi_output_solib_attribs (uiout, so);
|
|
}
|
|
}
|