1 /* MI Command Set - symbol commands.
2 Copyright (C) 2003-2022 Free Software Foundation, Inc.
4 This file is part of GDB.
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program. If not, see <http://www.gnu.org/licenses/>. */
25 #include "mi-getopt.h"
27 /* Print the list of all pc addresses and lines of code for the
28 provided (full or base) source file name. The entries are sorted
29 in ascending PC order. */
32 mi_cmd_symbol_list_lines (const char *command
, char **argv
, int argc
)
34 struct gdbarch
*gdbarch
;
38 struct ui_out
*uiout
= current_uiout
;
41 error (_("-symbol-list-lines: Usage: SOURCE_FILENAME"));
44 s
= lookup_symtab (filename
);
47 error (_("-symbol-list-lines: Unknown source file name."));
49 /* Now, dump the associated line table. The pc addresses are
50 already sorted by increasing values in the symbol table, so no
51 need to perform any other sorting. */
53 gdbarch
= s
->compunit ()->objfile ()->arch ();
55 ui_out_emit_list
list_emitter (uiout
, "lines");
56 if (s
->linetable () != NULL
&& s
->linetable ()->nitems
> 0)
57 for (i
= 0; i
< s
->linetable ()->nitems
; i
++)
59 ui_out_emit_tuple
tuple_emitter (uiout
, NULL
);
60 uiout
->field_core_addr ("pc", gdbarch
, s
->linetable ()->item
[i
].pc
);
61 uiout
->field_signed ("line", s
->linetable ()->item
[i
].line
);
65 /* Used by the -symbol-info-* and -symbol-info-module-* commands to print
66 information about the symbol SYM in a block of index BLOCK (either
67 GLOBAL_BLOCK or STATIC_BLOCK). KIND is the kind of symbol we searched
68 for in order to find SYM, which impact which fields are displayed in the
72 output_debug_symbol (ui_out
*uiout
, enum search_domain kind
,
73 struct symbol
*sym
, int block
)
75 ui_out_emit_tuple
tuple_emitter (uiout
, NULL
);
77 if (sym
->line () != 0)
78 uiout
->field_unsigned ("line", sym
->line ());
79 uiout
->field_string ("name", sym
->print_name ());
81 if (kind
== FUNCTIONS_DOMAIN
|| kind
== VARIABLES_DOMAIN
)
83 string_file tmp_stream
;
84 type_print (sym
->type (), "", &tmp_stream
, -1);
85 uiout
->field_string ("type", tmp_stream
.string ());
87 std::string str
= symbol_to_info_string (sym
, block
, kind
);
88 uiout
->field_string ("description", str
);
92 /* Actually output one nondebug symbol, puts a tuple emitter in place
93 and then outputs the fields for this msymbol. */
96 output_nondebug_symbol (ui_out
*uiout
,
97 const struct bound_minimal_symbol
&msymbol
)
99 struct gdbarch
*gdbarch
= msymbol
.objfile
->arch ();
100 ui_out_emit_tuple
tuple_emitter (uiout
, NULL
);
102 uiout
->field_core_addr ("address", gdbarch
,
103 msymbol
.value_address ());
104 uiout
->field_string ("name", msymbol
.minsym
->print_name ());
107 /* This is the guts of the commands '-symbol-info-functions',
108 '-symbol-info-variables', and '-symbol-info-types'. It searches for
109 symbols matching KING, NAME_REGEXP, TYPE_REGEXP, and EXCLUDE_MINSYMS,
110 and then prints the matching [m]symbols in an MI structured format. */
113 mi_symbol_info (enum search_domain kind
, const char *name_regexp
,
114 const char *type_regexp
, bool exclude_minsyms
,
117 global_symbol_searcher
sym_search (kind
, name_regexp
);
118 sym_search
.set_symbol_type_regexp (type_regexp
);
119 sym_search
.set_exclude_minsyms (exclude_minsyms
);
120 sym_search
.set_max_search_results (max_results
);
121 std::vector
<symbol_search
> symbols
= sym_search
.search ();
122 ui_out
*uiout
= current_uiout
;
125 ui_out_emit_tuple
outer_symbols_emitter (uiout
, "symbols");
127 /* Debug symbols are placed first. */
128 if (i
< symbols
.size () && symbols
[i
].msymbol
.minsym
== nullptr)
130 ui_out_emit_list
debug_symbols_list_emitter (uiout
, "debug");
132 /* As long as we have debug symbols... */
133 while (i
< symbols
.size () && symbols
[i
].msymbol
.minsym
== nullptr)
135 symtab
*symtab
= symbols
[i
].symbol
->symtab ();
136 ui_out_emit_tuple
symtab_tuple_emitter (uiout
, nullptr);
138 uiout
->field_string ("filename",
139 symtab_to_filename_for_display (symtab
));
140 uiout
->field_string ("fullname", symtab_to_fullname (symtab
));
142 ui_out_emit_list
symbols_list_emitter (uiout
, "symbols");
144 /* As long as we have debug symbols from this symtab... */
145 for (; (i
< symbols
.size ()
146 && symbols
[i
].msymbol
.minsym
== nullptr
147 && symbols
[i
].symbol
->symtab () == symtab
);
150 symbol_search
&s
= symbols
[i
];
152 output_debug_symbol (uiout
, kind
, s
.symbol
, s
.block
);
157 /* Non-debug symbols are placed after. */
158 if (i
< symbols
.size ())
160 ui_out_emit_list
nondebug_symbols_list_emitter (uiout
, "nondebug");
162 /* As long as we have nondebug symbols... */
163 for (; i
< symbols
.size (); i
++)
165 gdb_assert (symbols
[i
].msymbol
.minsym
!= nullptr);
166 output_nondebug_symbol (uiout
, symbols
[i
].msymbol
);
171 /* Helper to parse the option text from an -max-results argument and return
172 the parsed value. If the text can't be parsed then an error is thrown. */
175 parse_max_results_option (char *arg
)
178 long long val
= strtoll (arg
, &ptr
, 10);
179 if (arg
== ptr
|| *ptr
!= '\0' || val
> SIZE_MAX
|| val
< 0)
180 error (_("invalid value for --max-results argument"));
181 size_t max_results
= (size_t) val
;
186 /* Helper for mi_cmd_symbol_info_{functions,variables} - depending on KIND.
187 Processes command line options from ARGV and ARGC. */
190 mi_info_functions_or_variables (enum search_domain kind
, char **argv
, int argc
)
192 size_t max_results
= SIZE_MAX
;
193 const char *regexp
= nullptr;
194 const char *t_regexp
= nullptr;
195 bool exclude_minsyms
= true;
199 INCLUDE_NONDEBUG_OPT
, TYPE_REGEXP_OPT
, NAME_REGEXP_OPT
, MAX_RESULTS_OPT
201 static const struct mi_opt opts
[] =
203 {"-include-nondebug" , INCLUDE_NONDEBUG_OPT
, 0},
204 {"-type", TYPE_REGEXP_OPT
, 1},
205 {"-name", NAME_REGEXP_OPT
, 1},
206 {"-max-results", MAX_RESULTS_OPT
, 1},
211 char *oarg
= nullptr;
215 const char *cmd_string
216 = ((kind
== FUNCTIONS_DOMAIN
)
217 ? "-symbol-info-functions" : "-symbol-info-variables");
218 int opt
= mi_getopt (cmd_string
, argc
, argv
, opts
, &oind
, &oarg
);
221 switch ((enum opt
) opt
)
223 case INCLUDE_NONDEBUG_OPT
:
224 exclude_minsyms
= false;
226 case TYPE_REGEXP_OPT
:
229 case NAME_REGEXP_OPT
:
232 case MAX_RESULTS_OPT
:
233 max_results
= parse_max_results_option (oarg
);
238 mi_symbol_info (kind
, regexp
, t_regexp
, exclude_minsyms
, max_results
);
241 /* Type for an iterator over a vector of module_symbol_search results. */
242 typedef std::vector
<module_symbol_search
>::const_iterator
243 module_symbol_search_iterator
;
245 /* Helper for mi_info_module_functions_or_variables. Display the results
246 from ITER up to END or until we find a symbol that is in a different
247 module, or in a different symtab than the first symbol we print. Update
248 and return the new value for ITER. */
249 static module_symbol_search_iterator
250 output_module_symbols_in_single_module_and_file
251 (struct ui_out
*uiout
, module_symbol_search_iterator iter
,
252 const module_symbol_search_iterator end
, enum search_domain kind
)
254 /* The symbol for the module in which the first result resides. */
255 const symbol
*first_module_symbol
= iter
->first
.symbol
;
257 /* The symbol for the first result, and the symtab in which it resides. */
258 const symbol
*first_result_symbol
= iter
->second
.symbol
;
259 symtab
*first_symbtab
= first_result_symbol
->symtab ();
261 /* Formatted output. */
262 ui_out_emit_tuple
current_file (uiout
, nullptr);
263 uiout
->field_string ("filename",
264 symtab_to_filename_for_display (first_symbtab
));
265 uiout
->field_string ("fullname", symtab_to_fullname (first_symbtab
));
266 ui_out_emit_list
item_list (uiout
, "symbols");
268 /* Repeatedly output result symbols until either we run out of symbols,
269 we change module, or we change symtab. */
271 && first_module_symbol
== iter
->first
.symbol
272 && first_symbtab
== iter
->second
.symbol
->symtab ());
274 output_debug_symbol (uiout
, kind
, iter
->second
.symbol
,
280 /* Helper for mi_info_module_functions_or_variables. Display the results
281 from ITER up to END or until we find a symbol that is in a different
282 module than the first symbol we print. Update and return the new value
284 static module_symbol_search_iterator
285 output_module_symbols_in_single_module
286 (struct ui_out
*uiout
, module_symbol_search_iterator iter
,
287 const module_symbol_search_iterator end
, enum search_domain kind
)
289 gdb_assert (iter
->first
.symbol
!= nullptr);
290 gdb_assert (iter
->second
.symbol
!= nullptr);
292 /* The symbol for the module in which the first result resides. */
293 const symbol
*first_module_symbol
= iter
->first
.symbol
;
295 /* Create output formatting. */
296 ui_out_emit_tuple
module_tuple (uiout
, nullptr);
297 uiout
->field_string ("module", first_module_symbol
->print_name ());
298 ui_out_emit_list
files_list (uiout
, "files");
300 /* The results are sorted so that symbols within the same file are next
301 to each other in the list. Calling the output function once will
302 print all results within a single file. We keep calling the output
303 function until we change module. */
304 while (iter
!= end
&& first_module_symbol
== iter
->first
.symbol
)
305 iter
= output_module_symbols_in_single_module_and_file (uiout
, iter
,
310 /* Core of -symbol-info-module-functions and -symbol-info-module-variables.
311 KIND indicates what we are searching for, and ARGV and ARGC are the
312 command line options passed to the MI command. */
315 mi_info_module_functions_or_variables (enum search_domain kind
,
316 char **argv
, int argc
)
318 const char *module_regexp
= nullptr;
319 const char *regexp
= nullptr;
320 const char *type_regexp
= nullptr;
322 /* Process the command line options. */
326 MODULE_REGEXP_OPT
, TYPE_REGEXP_OPT
, NAME_REGEXP_OPT
328 static const struct mi_opt opts
[] =
330 {"-module", MODULE_REGEXP_OPT
, 1},
331 {"-type", TYPE_REGEXP_OPT
, 1},
332 {"-name", NAME_REGEXP_OPT
, 1},
337 char *oarg
= nullptr;
341 const char *cmd_string
342 = ((kind
== FUNCTIONS_DOMAIN
)
343 ? "-symbol-info-module-functions"
344 : "-symbol-info-module-variables");
345 int opt
= mi_getopt (cmd_string
, argc
, argv
, opts
, &oind
, &oarg
);
348 switch ((enum opt
) opt
)
350 case MODULE_REGEXP_OPT
:
351 module_regexp
= oarg
;
353 case TYPE_REGEXP_OPT
:
356 case NAME_REGEXP_OPT
:
362 std::vector
<module_symbol_search
> module_symbols
363 = search_module_symbols (module_regexp
, regexp
, type_regexp
, kind
);
365 struct ui_out
*uiout
= current_uiout
;
366 ui_out_emit_list
all_matching_symbols (uiout
, "symbols");
368 /* The results in the module_symbols list are ordered so symbols in the
369 same module are next to each other. Repeatedly call the output
370 function to print sequences of symbols that are in the same module
371 until we have no symbols left to print. */
372 module_symbol_search_iterator iter
= module_symbols
.begin ();
373 const module_symbol_search_iterator end
= module_symbols
.end ();
375 iter
= output_module_symbols_in_single_module (uiout
, iter
, end
, kind
);
378 /* Implement -symbol-info-functions command. */
381 mi_cmd_symbol_info_functions (const char *command
, char **argv
, int argc
)
383 mi_info_functions_or_variables (FUNCTIONS_DOMAIN
, argv
, argc
);
386 /* Implement -symbol-info-module-functions command. */
389 mi_cmd_symbol_info_module_functions (const char *command
, char **argv
,
392 mi_info_module_functions_or_variables (FUNCTIONS_DOMAIN
, argv
, argc
);
395 /* Implement -symbol-info-module-variables command. */
398 mi_cmd_symbol_info_module_variables (const char *command
, char **argv
,
401 mi_info_module_functions_or_variables (VARIABLES_DOMAIN
, argv
, argc
);
404 /* Implement -symbol-inf-modules command. */
407 mi_cmd_symbol_info_modules (const char *command
, char **argv
, int argc
)
409 size_t max_results
= SIZE_MAX
;
410 const char *regexp
= nullptr;
414 NAME_REGEXP_OPT
, MAX_RESULTS_OPT
416 static const struct mi_opt opts
[] =
418 {"-name", NAME_REGEXP_OPT
, 1},
419 {"-max-results", MAX_RESULTS_OPT
, 1},
424 char *oarg
= nullptr;
428 int opt
= mi_getopt ("-symbol-info-modules", argc
, argv
, opts
,
432 switch ((enum opt
) opt
)
434 case NAME_REGEXP_OPT
:
437 case MAX_RESULTS_OPT
:
438 max_results
= parse_max_results_option (oarg
);
443 mi_symbol_info (MODULES_DOMAIN
, regexp
, nullptr, true, max_results
);
446 /* Implement -symbol-info-types command. */
449 mi_cmd_symbol_info_types (const char *command
, char **argv
, int argc
)
451 size_t max_results
= SIZE_MAX
;
452 const char *regexp
= nullptr;
456 NAME_REGEXP_OPT
, MAX_RESULTS_OPT
458 static const struct mi_opt opts
[] =
460 {"-name", NAME_REGEXP_OPT
, 1},
461 {"-max-results", MAX_RESULTS_OPT
, 1},
466 char *oarg
= nullptr;
470 int opt
= mi_getopt ("-symbol-info-types", argc
, argv
, opts
,
474 switch ((enum opt
) opt
)
476 case NAME_REGEXP_OPT
:
479 case MAX_RESULTS_OPT
:
480 max_results
= parse_max_results_option (oarg
);
485 mi_symbol_info (TYPES_DOMAIN
, regexp
, nullptr, true, max_results
);
488 /* Implement -symbol-info-variables command. */
491 mi_cmd_symbol_info_variables (const char *command
, char **argv
, int argc
)
493 mi_info_functions_or_variables (VARIABLES_DOMAIN
, argv
, argc
);