Automatic date update in version.in
[deliverable/binutils-gdb.git] / gdb / symmisc.c
CommitLineData
c906108c 1/* Do various things to symbol tables (other than lookup), for GDB.
af5f3db6 2
42a4f53d 3 Copyright (C) 1986-2019 Free Software Foundation, Inc.
c906108c 4
c5aa993b 5 This file is part of GDB.
c906108c 6
c5aa993b
JM
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
a9762ec7 9 the Free Software Foundation; either version 3 of the License, or
c5aa993b 10 (at your option) any later version.
c906108c 11
c5aa993b
JM
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
c906108c 16
c5aa993b 17 You should have received a copy of the GNU General Public License
a9762ec7 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
c906108c
SS
19
20#include "defs.h"
21#include "symtab.h"
22#include "gdbtypes.h"
23#include "bfd.h"
0ba1096a 24#include "filenames.h"
c906108c
SS
25#include "symfile.h"
26#include "objfiles.h"
27#include "breakpoint.h"
28#include "command.h"
04ea0df1 29#include "gdb_obstack.h"
c906108c
SS
30#include "language.h"
31#include "bcache.h"
fe898f56 32#include "block.h"
44ea7b70 33#include "gdb_regex.h"
53ce3c39 34#include <sys/stat.h>
de4f826b 35#include "dictionary.h"
79d43c61 36#include "typeprint.h"
80480540 37#include "gdbcmd.h"
05cba821 38#include "source.h"
dbda9972 39#include "readline/readline.h"
c906108c 40
ccefe4c4
TT
41#include "psymtab.h"
42
c906108c
SS
43/* Unfortunately for debugging, stderr is usually a macro. This is painful
44 when calling functions that take FILE *'s from the debugger.
45 So we make a variable which has the same value and which is accessible when
46 debugging GDB with itself. Because stdin et al need not be constants,
47 we initialize them in the _initialize_symmisc function at the bottom
48 of the file. */
49FILE *std_in;
50FILE *std_out;
51FILE *std_err;
52
53/* Prototypes for local functions */
54
a14ed312 55static int block_depth (struct block *);
c906108c 56
bf469271
PA
57static void print_symbol (struct gdbarch *gdbarch, struct symbol *symbol,
58 int depth, ui_file *outfile);
c906108c 59\f
c906108c 60
c906108c 61void
fba45db2 62print_symbol_bcache_statistics (void)
c906108c 63{
6c95b8df 64 struct program_space *pspace;
c906108c 65
6c95b8df 66 ALL_PSPACES (pspace)
2030c079 67 for (objfile *objfile : pspace->objfiles ())
99d89cde
TT
68 {
69 QUIT;
70 printf_filtered (_("Byte cache statistics for '%s':\n"),
71 objfile_name (objfile));
25629dfd
TT
72 objfile->partial_symtabs->psymbol_cache.print_statistics
73 ("partial symbol cache");
74 objfile->per_bfd->macro_cache.print_statistics
75 ("preprocessor macro cache");
76 objfile->per_bfd->filename_cache.print_statistics ("file name cache");
99d89cde 77 }
c906108c
SS
78}
79
80void
fba45db2 81print_objfile_statistics (void)
c906108c 82{
6c95b8df 83 struct program_space *pspace;
c4f90d87 84 int i, linetables, blockvectors;
c906108c 85
6c95b8df 86 ALL_PSPACES (pspace)
2030c079 87 for (objfile *objfile : pspace->objfiles ())
99d89cde
TT
88 {
89 QUIT;
90 printf_filtered (_("Statistics for '%s':\n"), objfile_name (objfile));
91 if (OBJSTAT (objfile, n_stabs) > 0)
92 printf_filtered (_(" Number of \"stab\" symbols read: %d\n"),
93 OBJSTAT (objfile, n_stabs));
94 if (objfile->per_bfd->n_minsyms > 0)
95 printf_filtered (_(" Number of \"minimal\" symbols read: %d\n"),
96 objfile->per_bfd->n_minsyms);
97 if (OBJSTAT (objfile, n_psyms) > 0)
98 printf_filtered (_(" Number of \"partial\" symbols read: %d\n"),
99 OBJSTAT (objfile, n_psyms));
100 if (OBJSTAT (objfile, n_syms) > 0)
101 printf_filtered (_(" Number of \"full\" symbols read: %d\n"),
102 OBJSTAT (objfile, n_syms));
103 if (OBJSTAT (objfile, n_types) > 0)
104 printf_filtered (_(" Number of \"types\" defined: %d\n"),
105 OBJSTAT (objfile, n_types));
106 if (objfile->sf)
107 objfile->sf->qf->print_stats (objfile);
592553c4 108 i = linetables = 0;
b669c953 109 for (compunit_symtab *cu : objfile->compunits ())
99d89cde 110 {
d5da8b3c
TT
111 for (symtab *s : compunit_filetabs (cu))
112 {
113 i++;
114 if (SYMTAB_LINETABLE (s) != NULL)
115 linetables++;
116 }
99d89cde 117 }
b669c953
TT
118 blockvectors = std::distance (objfile->compunits ().begin (),
119 objfile->compunits ().end ());
99d89cde
TT
120 printf_filtered (_(" Number of symbol tables: %d\n"), i);
121 printf_filtered (_(" Number of symbol tables with line tables: %d\n"),
122 linetables);
123 printf_filtered (_(" Number of symbol tables with blockvectors: %d\n"),
124 blockvectors);
125
126 if (OBJSTAT (objfile, sz_strtab) > 0)
127 printf_filtered (_(" Space used by string tables: %d\n"),
128 OBJSTAT (objfile, sz_strtab));
129 printf_filtered (_(" Total memory used for objfile obstack: %s\n"),
130 pulongest (obstack_memory_used (&objfile
131 ->objfile_obstack)));
132 printf_filtered (_(" Total memory used for BFD obstack: %s\n"),
133 pulongest (obstack_memory_used (&objfile->per_bfd
134 ->storage_obstack)));
d320c2b5
TT
135 printf_filtered
136 (_(" Total memory used for psymbol cache: %d\n"),
25629dfd 137 objfile->partial_symtabs->psymbol_cache.memory_used ());
99d89cde 138 printf_filtered (_(" Total memory used for macro cache: %d\n"),
25629dfd 139 objfile->per_bfd->macro_cache.memory_used ());
99d89cde 140 printf_filtered (_(" Total memory used for file name cache: %d\n"),
25629dfd 141 objfile->per_bfd->filename_cache.memory_used ());
99d89cde 142 }
c906108c
SS
143}
144
c5aa993b 145static void
fba45db2 146dump_objfile (struct objfile *objfile)
c906108c 147{
4262abfb 148 printf_filtered ("\nObject file %s: ", objfile_name (objfile));
c906108c 149 printf_filtered ("Objfile at ");
d4f3574e 150 gdb_print_host_address (objfile, gdb_stdout);
c906108c 151 printf_filtered (", bfd at ");
d4f3574e 152 gdb_print_host_address (objfile->obfd, gdb_stdout);
c906108c 153 printf_filtered (", %d minsyms\n\n",
34643a32 154 objfile->per_bfd->minimal_symbol_count);
c906108c 155
ccefe4c4
TT
156 if (objfile->sf)
157 objfile->sf->qf->dump (objfile);
c906108c 158
43f3e411 159 if (objfile->compunit_symtabs != NULL)
c906108c
SS
160 {
161 printf_filtered ("Symtabs:\n");
b669c953 162 for (compunit_symtab *cu : objfile->compunits ())
c906108c 163 {
d5da8b3c 164 for (symtab *symtab : compunit_filetabs (cu))
c906108c 165 {
d5da8b3c
TT
166 printf_filtered ("%s at ",
167 symtab_to_filename_for_display (symtab));
168 gdb_print_host_address (symtab, gdb_stdout);
169 printf_filtered (", ");
170 if (SYMTAB_OBJFILE (symtab) != objfile)
171 {
172 printf_filtered ("NOT ON CHAIN! ");
173 }
174 wrap_here (" ");
c906108c 175 }
c906108c
SS
176 }
177 printf_filtered ("\n\n");
178 }
179}
180
181/* Print minimal symbols from this objfile. */
c5aa993b
JM
182
183static void
fba45db2 184dump_msymbols (struct objfile *objfile, struct ui_file *outfile)
c906108c 185{
5af949e3 186 struct gdbarch *gdbarch = get_objfile_arch (objfile);
c906108c
SS
187 int index;
188 char ms_type;
c5aa993b 189
4262abfb 190 fprintf_filtered (outfile, "\nObject file %s:\n\n", objfile_name (objfile));
34643a32 191 if (objfile->per_bfd->minimal_symbol_count == 0)
c906108c
SS
192 {
193 fprintf_filtered (outfile, "No minimal symbols found.\n");
194 return;
195 }
3567439c 196 index = 0;
7932255d 197 for (minimal_symbol *msymbol : objfile->msymbols ())
c906108c 198 {
efd66ac6 199 struct obj_section *section = MSYMBOL_OBJ_SECTION (objfile, msymbol);
714835d5 200
712f90be 201 switch (MSYMBOL_TYPE (msymbol))
c906108c 202 {
c5aa993b
JM
203 case mst_unknown:
204 ms_type = 'u';
205 break;
206 case mst_text:
207 ms_type = 'T';
208 break;
0875794a 209 case mst_text_gnu_ifunc:
f50776aa 210 case mst_data_gnu_ifunc:
0875794a
JK
211 ms_type = 'i';
212 break;
c5aa993b
JM
213 case mst_solib_trampoline:
214 ms_type = 'S';
215 break;
216 case mst_data:
217 ms_type = 'D';
218 break;
219 case mst_bss:
220 ms_type = 'B';
221 break;
222 case mst_abs:
223 ms_type = 'A';
224 break;
225 case mst_file_text:
226 ms_type = 't';
227 break;
228 case mst_file_data:
229 ms_type = 'd';
230 break;
231 case mst_file_bss:
232 ms_type = 'b';
233 break;
234 default:
235 ms_type = '?';
236 break;
c906108c
SS
237 }
238 fprintf_filtered (outfile, "[%2d] %c ", index, ms_type);
77e371c0
TT
239 fputs_filtered (paddress (gdbarch, MSYMBOL_VALUE_ADDRESS (objfile,
240 msymbol)),
5af949e3 241 outfile);
efd66ac6 242 fprintf_filtered (outfile, " %s", MSYMBOL_LINKAGE_NAME (msymbol));
714835d5 243 if (section)
8625fc1b
TT
244 {
245 if (section->the_bfd_section != NULL)
246 fprintf_filtered (outfile, " section %s",
247 bfd_section_name (objfile->obfd,
248 section->the_bfd_section));
249 else
250 fprintf_filtered (outfile, " spurious section %ld",
4c8429ef 251 (long) (section - objfile->sections));
8625fc1b 252 }
efd66ac6 253 if (MSYMBOL_DEMANGLED_NAME (msymbol) != NULL)
c906108c 254 {
efd66ac6 255 fprintf_filtered (outfile, " %s", MSYMBOL_DEMANGLED_NAME (msymbol));
c906108c 256 }
c906108c
SS
257 if (msymbol->filename)
258 fprintf_filtered (outfile, " %s", msymbol->filename);
c906108c 259 fputs_filtered ("\n", outfile);
3567439c 260 index++;
c906108c 261 }
34643a32 262 if (objfile->per_bfd->minimal_symbol_count != index)
c906108c 263 {
8a3fe4f8 264 warning (_("internal error: minimal symbol count %d != %d"),
34643a32 265 objfile->per_bfd->minimal_symbol_count, index);
c906108c
SS
266 }
267 fprintf_filtered (outfile, "\n");
268}
269
c5aa993b 270static void
d04c1a59 271dump_symtab_1 (struct symtab *symtab, struct ui_file *outfile)
c906108c 272{
d04c1a59 273 struct objfile *objfile = SYMTAB_OBJFILE (symtab);
5af949e3 274 struct gdbarch *gdbarch = get_objfile_arch (objfile);
de4f826b 275 int i;
b026f593 276 struct mdict_iterator miter;
952a6d41 277 int len;
de4f826b 278 struct linetable *l;
346d1dfe 279 const struct blockvector *bv;
e88c90f2 280 struct symbol *sym;
de4f826b 281 struct block *b;
c906108c
SS
282 int depth;
283
05cba821
JK
284 fprintf_filtered (outfile, "\nSymtab for file %s\n",
285 symtab_to_filename_for_display (symtab));
ee6f8984 286 if (SYMTAB_DIRNAME (symtab) != NULL)
c906108c 287 fprintf_filtered (outfile, "Compilation directory is %s\n",
ee6f8984 288 SYMTAB_DIRNAME (symtab));
4262abfb
JK
289 fprintf_filtered (outfile, "Read from object file %s (",
290 objfile_name (objfile));
d4f3574e 291 gdb_print_host_address (objfile, outfile);
c906108c 292 fprintf_filtered (outfile, ")\n");
3e43a32a
MS
293 fprintf_filtered (outfile, "Language: %s\n",
294 language_str (symtab->language));
c906108c
SS
295
296 /* First print the line table. */
8435453b 297 l = SYMTAB_LINETABLE (symtab);
c906108c
SS
298 if (l)
299 {
300 fprintf_filtered (outfile, "\nLine table:\n\n");
301 len = l->nitems;
302 for (i = 0; i < len; i++)
303 {
304 fprintf_filtered (outfile, " line %d at ", l->item[i].line);
5af949e3 305 fputs_filtered (paddress (gdbarch, l->item[i].pc), outfile);
c906108c
SS
306 fprintf_filtered (outfile, "\n");
307 }
308 }
43f3e411 309 /* Now print the block info, but only for compunit symtabs since we will
c378eb4e 310 print lots of duplicate info otherwise. */
43f3e411 311 if (symtab == COMPUNIT_FILETABS (SYMTAB_COMPUNIT (symtab)))
c906108c
SS
312 {
313 fprintf_filtered (outfile, "\nBlockvector:\n\n");
439247b6 314 bv = SYMTAB_BLOCKVECTOR (symtab);
c906108c
SS
315 len = BLOCKVECTOR_NBLOCKS (bv);
316 for (i = 0; i < len; i++)
317 {
318 b = BLOCKVECTOR_BLOCK (bv, i);
319 depth = block_depth (b) * 2;
320 print_spaces (depth, outfile);
321 fprintf_filtered (outfile, "block #%03d, object at ", i);
d4f3574e 322 gdb_print_host_address (b, outfile);
c906108c
SS
323 if (BLOCK_SUPERBLOCK (b))
324 {
325 fprintf_filtered (outfile, " under ");
d4f3574e 326 gdb_print_host_address (BLOCK_SUPERBLOCK (b), outfile);
c906108c 327 }
261397f8
DJ
328 /* drow/2002-07-10: We could save the total symbols count
329 even if we're using a hashtable, but nothing else but this message
330 wants it. */
de4f826b 331 fprintf_filtered (outfile, ", %d syms/buckets in ",
b026f593 332 mdict_size (BLOCK_MULTIDICT (b)));
5af949e3 333 fputs_filtered (paddress (gdbarch, BLOCK_START (b)), outfile);
c906108c 334 fprintf_filtered (outfile, "..");
5af949e3 335 fputs_filtered (paddress (gdbarch, BLOCK_END (b)), outfile);
c906108c
SS
336 if (BLOCK_FUNCTION (b))
337 {
3567439c
DJ
338 fprintf_filtered (outfile, ", function %s",
339 SYMBOL_LINKAGE_NAME (BLOCK_FUNCTION (b)));
c906108c
SS
340 if (SYMBOL_DEMANGLED_NAME (BLOCK_FUNCTION (b)) != NULL)
341 {
342 fprintf_filtered (outfile, ", %s",
c5aa993b 343 SYMBOL_DEMANGLED_NAME (BLOCK_FUNCTION (b)));
c906108c
SS
344 }
345 }
c906108c 346 fprintf_filtered (outfile, "\n");
261397f8 347 /* Now print each symbol in this block (in no particular order, if
8157b174
TT
348 we're using a hashtable). Note that we only want this
349 block, not any blocks from included symtabs. */
b026f593 350 ALL_DICT_SYMBOLS (BLOCK_MULTIDICT (b), miter, sym)
c906108c 351 {
bf469271
PA
352 TRY
353 {
354 print_symbol (gdbarch, sym, depth + 1, outfile);
355 }
356 CATCH (ex, RETURN_MASK_ERROR)
357 {
358 exception_fprintf (gdb_stderr, ex,
359 "Error printing symbol:\n");
360 }
361 END_CATCH
c906108c
SS
362 }
363 }
364 fprintf_filtered (outfile, "\n");
365 }
366 else
367 {
6c739336
DE
368 const char *compunit_filename
369 = symtab_to_filename_for_display (COMPUNIT_FILETABS (SYMTAB_COMPUNIT (symtab)));
370
371 fprintf_filtered (outfile,
372 "\nBlockvector same as owning compunit: %s\n\n",
373 compunit_filename);
c906108c
SS
374 }
375}
376
44b164c5 377static void
d04c1a59 378dump_symtab (struct symtab *symtab, struct ui_file *outfile)
44b164c5 379{
44b164c5
JB
380 /* Set the current language to the language of the symtab we're dumping
381 because certain routines used during dump_symtab() use the current
969107c5
EZ
382 language to print an image of the symbol. We'll restore it later.
383 But use only real languages, not placeholders. */
384 if (symtab->language != language_unknown
385 && symtab->language != language_auto)
386 {
387 enum language saved_lang;
388
389 saved_lang = set_language (symtab->language);
44b164c5 390
d04c1a59 391 dump_symtab_1 (symtab, outfile);
44b164c5 392
969107c5
EZ
393 set_language (saved_lang);
394 }
395 else
d04c1a59 396 dump_symtab_1 (symtab, outfile);
44b164c5
JB
397}
398
80480540 399static void
e99c83e7 400maintenance_print_symbols (const char *args, int from_tty)
c906108c 401{
34c41c68 402 struct ui_file *outfile = gdb_stdout;
34c41c68
DE
403 char *address_arg = NULL, *source_arg = NULL, *objfile_arg = NULL;
404 int i, outfile_idx;
c906108c
SS
405
406 dont_repeat ();
407
773a1edc 408 gdb_argv argv (args);
c906108c 409
99e8a4f9 410 for (i = 0; argv != NULL && argv[i] != NULL; ++i)
c906108c 411 {
34c41c68
DE
412 if (strcmp (argv[i], "-pc") == 0)
413 {
414 if (argv[i + 1] == NULL)
415 error (_("Missing pc value"));
416 address_arg = argv[++i];
417 }
418 else if (strcmp (argv[i], "-source") == 0)
419 {
420 if (argv[i + 1] == NULL)
421 error (_("Missing source file"));
422 source_arg = argv[++i];
423 }
424 else if (strcmp (argv[i], "-objfile") == 0)
425 {
426 if (argv[i + 1] == NULL)
427 error (_("Missing objfile name"));
428 objfile_arg = argv[++i];
429 }
430 else if (strcmp (argv[i], "--") == 0)
431 {
432 /* End of options. */
433 ++i;
434 break;
435 }
436 else if (argv[i][0] == '-')
c906108c 437 {
34c41c68
DE
438 /* Future proofing: Don't allow OUTFILE to begin with "-". */
439 error (_("Unknown option: %s"), argv[i]);
c906108c 440 }
34c41c68
DE
441 else
442 break;
c906108c 443 }
34c41c68 444 outfile_idx = i;
c906108c 445
34c41c68
DE
446 if (address_arg != NULL && source_arg != NULL)
447 error (_("Must specify at most one of -pc and -source"));
c5aa993b 448
d7e74731
PA
449 stdio_file arg_outfile;
450
99e8a4f9 451 if (argv != NULL && argv[outfile_idx] != NULL)
34c41c68 452 {
34c41c68
DE
453 if (argv[outfile_idx + 1] != NULL)
454 error (_("Junk at end of command"));
ee0c3293
TT
455 gdb::unique_xmalloc_ptr<char> outfile_name
456 (tilde_expand (argv[outfile_idx]));
457 if (!arg_outfile.open (outfile_name.get (), FOPEN_WT))
458 perror_with_name (outfile_name.get ());
d7e74731 459 outfile = &arg_outfile;
34c41c68 460 }
c906108c 461
34c41c68 462 if (address_arg != NULL)
27618ce4 463 {
34c41c68
DE
464 CORE_ADDR pc = parse_and_eval_address (address_arg);
465 struct symtab *s = find_pc_line_symtab (pc);
466
467 if (s == NULL)
468 error (_("No symtab for address: %s"), address_arg);
469 dump_symtab (s, outfile);
27618ce4 470 }
34c41c68
DE
471 else
472 {
34c41c68
DE
473 int found = 0;
474
2030c079 475 for (objfile *objfile : current_program_space->objfiles ())
34c41c68
DE
476 {
477 int print_for_objfile = 1;
478
479 if (objfile_arg != NULL)
480 print_for_objfile
481 = compare_filenames_for_search (objfile_name (objfile),
482 objfile_arg);
483 if (!print_for_objfile)
484 continue;
485
b669c953 486 for (compunit_symtab *cu : objfile->compunits ())
34c41c68 487 {
d5da8b3c 488 for (symtab *s : compunit_filetabs (cu))
34c41c68 489 {
d5da8b3c
TT
490 int print_for_source = 0;
491
492 QUIT;
493 if (source_arg != NULL)
494 {
495 print_for_source
496 = compare_filenames_for_search
497 (symtab_to_filename_for_display (s), source_arg);
498 found = 1;
499 }
500 if (source_arg == NULL
501 || print_for_source)
502 dump_symtab (s, outfile);
34c41c68 503 }
34c41c68
DE
504 }
505 }
506
507 if (source_arg != NULL && !found)
508 error (_("No symtab for source file: %s"), source_arg);
509 }
c906108c
SS
510}
511
bf469271 512/* Print symbol SYMBOL on OUTFILE. DEPTH says how far to indent. */
c906108c 513
bf469271
PA
514static void
515print_symbol (struct gdbarch *gdbarch, struct symbol *symbol,
516 int depth, ui_file *outfile)
c906108c 517{
1994afbf
DE
518 struct obj_section *section;
519
520 if (SYMBOL_OBJFILE_OWNED (symbol))
521 section = SYMBOL_OBJ_SECTION (symbol_objfile (symbol), symbol);
522 else
523 section = NULL;
c906108c
SS
524
525 print_spaces (depth, outfile);
176620f1 526 if (SYMBOL_DOMAIN (symbol) == LABEL_DOMAIN)
c906108c 527 {
de5ad195 528 fprintf_filtered (outfile, "label %s at ", SYMBOL_PRINT_NAME (symbol));
5af949e3
UW
529 fputs_filtered (paddress (gdbarch, SYMBOL_VALUE_ADDRESS (symbol)),
530 outfile);
714835d5 531 if (section)
c906108c 532 fprintf_filtered (outfile, " section %s\n",
714835d5
UW
533 bfd_section_name (section->the_bfd_section->owner,
534 section->the_bfd_section));
c906108c
SS
535 else
536 fprintf_filtered (outfile, "\n");
bf469271 537 return;
c906108c 538 }
bf469271 539
176620f1 540 if (SYMBOL_DOMAIN (symbol) == STRUCT_DOMAIN)
c906108c 541 {
e86ca25f 542 if (TYPE_NAME (SYMBOL_TYPE (symbol)))
c906108c 543 {
79d43c61
TT
544 LA_PRINT_TYPE (SYMBOL_TYPE (symbol), "", outfile, 1, depth,
545 &type_print_raw_options);
c906108c
SS
546 }
547 else
548 {
549 fprintf_filtered (outfile, "%s %s = ",
c5aa993b
JM
550 (TYPE_CODE (SYMBOL_TYPE (symbol)) == TYPE_CODE_ENUM
551 ? "enum"
552 : (TYPE_CODE (SYMBOL_TYPE (symbol)) == TYPE_CODE_STRUCT
553 ? "struct" : "union")),
3567439c 554 SYMBOL_LINKAGE_NAME (symbol));
79d43c61
TT
555 LA_PRINT_TYPE (SYMBOL_TYPE (symbol), "", outfile, 1, depth,
556 &type_print_raw_options);
c906108c
SS
557 }
558 fprintf_filtered (outfile, ";\n");
559 }
560 else
561 {
562 if (SYMBOL_CLASS (symbol) == LOC_TYPEDEF)
563 fprintf_filtered (outfile, "typedef ");
564 if (SYMBOL_TYPE (symbol))
565 {
566 /* Print details of types, except for enums where it's clutter. */
de5ad195 567 LA_PRINT_TYPE (SYMBOL_TYPE (symbol), SYMBOL_PRINT_NAME (symbol),
c906108c
SS
568 outfile,
569 TYPE_CODE (SYMBOL_TYPE (symbol)) != TYPE_CODE_ENUM,
79d43c61
TT
570 depth,
571 &type_print_raw_options);
c906108c
SS
572 fprintf_filtered (outfile, "; ");
573 }
574 else
de5ad195 575 fprintf_filtered (outfile, "%s ", SYMBOL_PRINT_NAME (symbol));
c906108c
SS
576
577 switch (SYMBOL_CLASS (symbol))
578 {
579 case LOC_CONST:
12df843f
JK
580 fprintf_filtered (outfile, "const %s (%s)",
581 plongest (SYMBOL_VALUE (symbol)),
582 hex_string (SYMBOL_VALUE (symbol)));
c906108c
SS
583 break;
584
585 case LOC_CONST_BYTES:
586 {
587 unsigned i;
588 struct type *type = check_typedef (SYMBOL_TYPE (symbol));
433759f7 589
c906108c
SS
590 fprintf_filtered (outfile, "const %u hex bytes:",
591 TYPE_LENGTH (type));
592 for (i = 0; i < TYPE_LENGTH (type); i++)
593 fprintf_filtered (outfile, " %02x",
c5aa993b 594 (unsigned) SYMBOL_VALUE_BYTES (symbol)[i]);
c906108c
SS
595 }
596 break;
597
598 case LOC_STATIC:
599 fprintf_filtered (outfile, "static at ");
5af949e3
UW
600 fputs_filtered (paddress (gdbarch, SYMBOL_VALUE_ADDRESS (symbol)),
601 outfile);
714835d5 602 if (section)
c906108c 603 fprintf_filtered (outfile, " section %s",
714835d5
UW
604 bfd_section_name (section->the_bfd_section->owner,
605 section->the_bfd_section));
c906108c
SS
606 break;
607
c906108c 608 case LOC_REGISTER:
2a2d4dc3 609 if (SYMBOL_IS_ARGUMENT (symbol))
12df843f
JK
610 fprintf_filtered (outfile, "parameter register %s",
611 plongest (SYMBOL_VALUE (symbol)));
2a2d4dc3 612 else
12df843f
JK
613 fprintf_filtered (outfile, "register %s",
614 plongest (SYMBOL_VALUE (symbol)));
c906108c
SS
615 break;
616
617 case LOC_ARG:
12df843f
JK
618 fprintf_filtered (outfile, "arg at offset %s",
619 hex_string (SYMBOL_VALUE (symbol)));
c906108c
SS
620 break;
621
c906108c 622 case LOC_REF_ARG:
12df843f
JK
623 fprintf_filtered (outfile, "reference arg at %s",
624 hex_string (SYMBOL_VALUE (symbol)));
c906108c
SS
625 break;
626
c906108c 627 case LOC_REGPARM_ADDR:
12df843f
JK
628 fprintf_filtered (outfile, "address parameter register %s",
629 plongest (SYMBOL_VALUE (symbol)));
c906108c
SS
630 break;
631
632 case LOC_LOCAL:
12df843f
JK
633 fprintf_filtered (outfile, "local at offset %s",
634 hex_string (SYMBOL_VALUE (symbol)));
c906108c
SS
635 break;
636
c906108c
SS
637 case LOC_TYPEDEF:
638 break;
639
640 case LOC_LABEL:
641 fprintf_filtered (outfile, "label at ");
5af949e3
UW
642 fputs_filtered (paddress (gdbarch, SYMBOL_VALUE_ADDRESS (symbol)),
643 outfile);
714835d5 644 if (section)
c906108c 645 fprintf_filtered (outfile, " section %s",
714835d5
UW
646 bfd_section_name (section->the_bfd_section->owner,
647 section->the_bfd_section));
c906108c
SS
648 break;
649
650 case LOC_BLOCK:
651 fprintf_filtered (outfile, "block object ");
d4f3574e 652 gdb_print_host_address (SYMBOL_BLOCK_VALUE (symbol), outfile);
c906108c 653 fprintf_filtered (outfile, ", ");
5af949e3
UW
654 fputs_filtered (paddress (gdbarch,
655 BLOCK_START (SYMBOL_BLOCK_VALUE (symbol))),
ed49a04f 656 outfile);
c906108c 657 fprintf_filtered (outfile, "..");
5af949e3
UW
658 fputs_filtered (paddress (gdbarch,
659 BLOCK_END (SYMBOL_BLOCK_VALUE (symbol))),
ed49a04f 660 outfile);
714835d5 661 if (section)
c906108c 662 fprintf_filtered (outfile, " section %s",
714835d5
UW
663 bfd_section_name (section->the_bfd_section->owner,
664 section->the_bfd_section));
c906108c
SS
665 break;
666
4c2df51b 667 case LOC_COMPUTED:
4c2df51b
DJ
668 fprintf_filtered (outfile, "computed at runtime");
669 break;
670
c906108c
SS
671 case LOC_UNRESOLVED:
672 fprintf_filtered (outfile, "unresolved");
673 break;
674
675 case LOC_OPTIMIZED_OUT:
676 fprintf_filtered (outfile, "optimized out");
677 break;
678
c5aa993b 679 default:
c906108c
SS
680 fprintf_filtered (outfile, "botched symbol class %x",
681 SYMBOL_CLASS (symbol));
682 break;
683 }
684 }
685 fprintf_filtered (outfile, "\n");
c906108c
SS
686}
687
80480540 688static void
e99c83e7 689maintenance_print_msymbols (const char *args, int from_tty)
c906108c 690{
34c41c68 691 struct ui_file *outfile = gdb_stdout;
34c41c68 692 char *objfile_arg = NULL;
34c41c68 693 int i, outfile_idx;
07318b29 694
c906108c
SS
695 dont_repeat ();
696
773a1edc 697 gdb_argv argv (args);
c906108c 698
99e8a4f9 699 for (i = 0; argv != NULL && argv[i] != NULL; ++i)
c906108c 700 {
34c41c68 701 if (strcmp (argv[i], "-objfile") == 0)
c906108c 702 {
34c41c68
DE
703 if (argv[i + 1] == NULL)
704 error (_("Missing objfile name"));
705 objfile_arg = argv[++i];
706 }
707 else if (strcmp (argv[i], "--") == 0)
708 {
709 /* End of options. */
710 ++i;
711 break;
c906108c 712 }
34c41c68
DE
713 else if (argv[i][0] == '-')
714 {
715 /* Future proofing: Don't allow OUTFILE to begin with "-". */
716 error (_("Unknown option: %s"), argv[i]);
717 }
718 else
719 break;
c906108c 720 }
34c41c68 721 outfile_idx = i;
c906108c 722
d7e74731
PA
723 stdio_file arg_outfile;
724
99e8a4f9 725 if (argv != NULL && argv[outfile_idx] != NULL)
34c41c68 726 {
34c41c68
DE
727 if (argv[outfile_idx + 1] != NULL)
728 error (_("Junk at end of command"));
ee0c3293
TT
729 gdb::unique_xmalloc_ptr<char> outfile_name
730 (tilde_expand (argv[outfile_idx]));
731 if (!arg_outfile.open (outfile_name.get (), FOPEN_WT))
732 perror_with_name (outfile_name.get ());
d7e74731 733 outfile = &arg_outfile;
34c41c68 734 }
c5aa993b 735
2030c079 736 for (objfile *objfile : current_program_space->objfiles ())
aed57c53
TT
737 {
738 QUIT;
739 if (objfile_arg == NULL
740 || compare_filenames_for_search (objfile_name (objfile), objfile_arg))
741 dump_msymbols (objfile, outfile);
742 }
c906108c
SS
743}
744
80480540 745static void
e99c83e7 746maintenance_print_objfiles (const char *regexp, int from_tty)
c906108c 747{
6c95b8df 748 struct program_space *pspace;
c906108c
SS
749
750 dont_repeat ();
751
52e260a3
DE
752 if (regexp)
753 re_comp (regexp);
754
6c95b8df 755 ALL_PSPACES (pspace)
2030c079 756 for (objfile *objfile : pspace->objfiles ())
27618ce4
TT
757 {
758 QUIT;
52e260a3 759 if (! regexp
4262abfb 760 || re_exec (objfile_name (objfile)))
52e260a3 761 dump_objfile (objfile);
27618ce4 762 }
c906108c
SS
763}
764
5e7b2f39 765/* List all the symbol tables whose names match REGEXP (optional). */
b5ebcee6 766
80480540 767static void
e99c83e7 768maintenance_info_symtabs (const char *regexp, int from_tty)
44ea7b70 769{
6c95b8df 770 struct program_space *pspace;
44ea7b70 771
db68bbae
DE
772 dont_repeat ();
773
44ea7b70
JB
774 if (regexp)
775 re_comp (regexp);
776
6c95b8df 777 ALL_PSPACES (pspace)
2030c079 778 for (objfile *objfile : pspace->objfiles ())
99d89cde 779 {
99d89cde
TT
780 /* We don't want to print anything for this objfile until we
781 actually find a symtab whose name matches. */
782 int printed_objfile_start = 0;
43f3e411 783
b669c953 784 for (compunit_symtab *cust : objfile->compunits ())
99d89cde
TT
785 {
786 int printed_compunit_symtab_start = 0;
787
5accd1a0 788 for (symtab *symtab : compunit_filetabs (cust))
99d89cde
TT
789 {
790 QUIT;
791
792 if (! regexp
793 || re_exec (symtab_to_filename_for_display (symtab)))
794 {
795 if (! printed_objfile_start)
796 {
797 printf_filtered ("{ objfile %s ", objfile_name (objfile));
798 wrap_here (" ");
799 printf_filtered ("((struct objfile *) %s)\n",
800 host_address_to_string (objfile));
801 printed_objfile_start = 1;
802 }
803 if (! printed_compunit_symtab_start)
804 {
805 printf_filtered (" { ((struct compunit_symtab *) %s)\n",
806 host_address_to_string (cust));
807 printf_filtered (" debugformat %s\n",
808 COMPUNIT_DEBUGFORMAT (cust));
809 printf_filtered (" producer %s\n",
810 COMPUNIT_PRODUCER (cust) != NULL
811 ? COMPUNIT_PRODUCER (cust)
812 : "(null)");
813 printf_filtered (" dirname %s\n",
814 COMPUNIT_DIRNAME (cust) != NULL
815 ? COMPUNIT_DIRNAME (cust)
816 : "(null)");
817 printf_filtered (" blockvector"
818 " ((struct blockvector *) %s)\n",
819 host_address_to_string
43f3e411 820 (COMPUNIT_BLOCKVECTOR (cust)));
99d89cde
TT
821 printed_compunit_symtab_start = 1;
822 }
823
824 printf_filtered ("\t{ symtab %s ",
825 symtab_to_filename_for_display (symtab));
826 wrap_here (" ");
827 printf_filtered ("((struct symtab *) %s)\n",
828 host_address_to_string (symtab));
829 printf_filtered ("\t fullname %s\n",
830 symtab->fullname != NULL
831 ? symtab->fullname
832 : "(null)");
833 printf_filtered ("\t "
834 "linetable ((struct linetable *) %s)\n",
835 host_address_to_string (symtab->linetable));
836 printf_filtered ("\t}\n");
837 }
838 }
839
840 if (printed_compunit_symtab_start)
841 printf_filtered (" }\n");
842 }
44ea7b70 843
99d89cde
TT
844 if (printed_objfile_start)
845 printf_filtered ("}\n");
846 }
44ea7b70 847}
7d0c9981
DE
848
849/* Check consistency of symtabs.
850 An example of what this checks for is NULL blockvectors.
851 They can happen if there's a bug during debug info reading.
852 GDB assumes they are always non-NULL.
853
854 Note: This does not check for psymtab vs symtab consistency.
855 Use "maint check-psymtabs" for that. */
856
857static void
e99c83e7 858maintenance_check_symtabs (const char *ignore, int from_tty)
7d0c9981
DE
859{
860 struct program_space *pspace;
7d0c9981
DE
861
862 ALL_PSPACES (pspace)
2030c079 863 for (objfile *objfile : pspace->objfiles ())
99d89cde 864 {
99d89cde
TT
865 /* We don't want to print anything for this objfile until we
866 actually find something worth printing. */
867 int printed_objfile_start = 0;
7d0c9981 868
b669c953 869 for (compunit_symtab *cust : objfile->compunits ())
99d89cde
TT
870 {
871 int found_something = 0;
872 struct symtab *symtab = compunit_primary_filetab (cust);
873
874 QUIT;
875
876 if (COMPUNIT_BLOCKVECTOR (cust) == NULL)
877 found_something = 1;
878 /* Add more checks here. */
879
880 if (found_something)
881 {
882 if (! printed_objfile_start)
883 {
884 printf_filtered ("{ objfile %s ", objfile_name (objfile));
885 wrap_here (" ");
886 printf_filtered ("((struct objfile *) %s)\n",
887 host_address_to_string (objfile));
888 printed_objfile_start = 1;
889 }
890 printf_filtered (" { symtab %s\n",
891 symtab_to_filename_for_display (symtab));
892 if (COMPUNIT_BLOCKVECTOR (cust) == NULL)
893 printf_filtered (" NULL blockvector\n");
894 printf_filtered (" }\n");
895 }
896 }
7d0c9981 897
99d89cde
TT
898 if (printed_objfile_start)
899 printf_filtered ("}\n");
900 }
7d0c9981
DE
901}
902
7d0c9981
DE
903/* Expand all symbol tables whose name matches an optional regexp. */
904
905static void
e99c83e7 906maintenance_expand_symtabs (const char *args, int from_tty)
7d0c9981
DE
907{
908 struct program_space *pspace;
7d0c9981
DE
909 char *regexp = NULL;
910
911 /* We use buildargv here so that we handle spaces in the regexp
912 in a way that allows adding more arguments later. */
773a1edc 913 gdb_argv argv (args);
7d0c9981
DE
914
915 if (argv != NULL)
916 {
917 if (argv[0] != NULL)
918 {
919 regexp = argv[0];
920 if (argv[1] != NULL)
921 error (_("Extra arguments after regexp."));
922 }
923 }
924
925 if (regexp)
926 re_comp (regexp);
927
928 ALL_PSPACES (pspace)
2030c079 929 for (objfile *objfile : pspace->objfiles ())
99d89cde
TT
930 {
931 if (objfile->sf)
932 {
933 objfile->sf->qf->expand_symtabs_matching
934 (objfile,
935 [&] (const char *filename, bool basenames)
936 {
937 /* KISS: Only apply the regexp to the complete file name. */
938 return (!basenames
939 && (regexp == NULL || re_exec (filename)));
940 },
941 lookup_name_info::match_any (),
942 [] (const char *symname)
943 {
944 /* Since we're not searching on symbols, just return true. */
945 return true;
946 },
947 NULL,
948 ALL_DOMAIN);
949 }
950 }
7d0c9981 951}
c906108c 952\f
c5aa993b 953
c906108c
SS
954/* Return the nexting depth of a block within other blocks in its symtab. */
955
956static int
fba45db2 957block_depth (struct block *block)
c906108c 958{
52f0bd74 959 int i = 0;
433759f7 960
c5aa993b 961 while ((block = BLOCK_SUPERBLOCK (block)) != NULL)
c906108c
SS
962 {
963 i++;
964 }
965 return i;
966}
c906108c 967\f
c5aa993b 968
f2403c39
AB
969/* Used by MAINTENANCE_INFO_LINE_TABLES to print the information about a
970 single line table. */
971
972static int
973maintenance_print_one_line_table (struct symtab *symtab, void *data)
974{
975 struct linetable *linetable;
976 struct objfile *objfile;
977
978 objfile = symtab->compunit_symtab->objfile;
979 printf_filtered (_("objfile: %s ((struct objfile *) %s)\n"),
980 objfile_name (objfile),
981 host_address_to_string (objfile));
982 printf_filtered (_("compunit_symtab: ((struct compunit_symtab *) %s)\n"),
983 host_address_to_string (symtab->compunit_symtab));
984 printf_filtered (_("symtab: %s ((struct symtab *) %s)\n"),
985 symtab_to_fullname (symtab),
986 host_address_to_string (symtab));
987 linetable = SYMTAB_LINETABLE (symtab);
988 printf_filtered (_("linetable: ((struct linetable *) %s):\n"),
989 host_address_to_string (linetable));
990
991 if (linetable == NULL)
992 printf_filtered (_("No line table.\n"));
993 else if (linetable->nitems <= 0)
994 printf_filtered (_("Line table has no lines.\n"));
995 else
996 {
997 int i;
998
999 /* Leave space for 6 digits of index and line number. After that the
1000 tables will just not format as well. */
1001 printf_filtered (_("%-6s %6s %s\n"),
1002 _("INDEX"), _("LINE"), _("ADDRESS"));
1003
1004 for (i = 0; i < linetable->nitems; ++i)
1005 {
1006 struct linetable_entry *item;
f2403c39
AB
1007
1008 item = &linetable->item [i];
1009 printf_filtered (_("%-6d %6d %s\n"), i, item->line,
1010 core_addr_to_string (item->pc));
1011 }
1012 }
1013
1014 return 0;
1015}
1016
1017/* Implement the 'maint info line-table' command. */
1018
1019static void
e99c83e7 1020maintenance_info_line_tables (const char *regexp, int from_tty)
f2403c39
AB
1021{
1022 struct program_space *pspace;
f2403c39
AB
1023
1024 dont_repeat ();
1025
1026 if (regexp != NULL)
1027 re_comp (regexp);
1028
1029 ALL_PSPACES (pspace)
2030c079 1030 for (objfile *objfile : pspace->objfiles ())
99d89cde 1031 {
b669c953 1032 for (compunit_symtab *cust : objfile->compunits ())
99d89cde 1033 {
5accd1a0 1034 for (symtab *symtab : compunit_filetabs (cust))
99d89cde
TT
1035 {
1036 QUIT;
1037
1038 if (regexp == NULL
1039 || re_exec (symtab_to_filename_for_display (symtab)))
1040 maintenance_print_one_line_table (symtab, NULL);
1041 }
1042 }
1043 }
f2403c39
AB
1044}
1045
1046\f
1047
c378eb4e 1048/* Do early runtime initializations. */
b5ebcee6 1049
c906108c 1050void
fba45db2 1051_initialize_symmisc (void)
c906108c 1052{
c5aa993b 1053 std_in = stdin;
c906108c
SS
1054 std_out = stdout;
1055 std_err = stderr;
80480540
YQ
1056
1057 add_cmd ("symbols", class_maintenance, maintenance_print_symbols, _("\
1058Print dump of current symbol definitions.\n\
48c5e7e2
TT
1059Usage: mt print symbols [-pc ADDRESS] [--] [OUTFILE]\n\
1060 mt print symbols [-objfile OBJFILE] [-source SOURCE] [--] [OUTFILE]\n\
34c41c68
DE
1061Entries in the full symbol table are dumped to file OUTFILE,\n\
1062or the terminal if OUTFILE is unspecified.\n\
1063If ADDRESS is provided, dump only the file for that address.\n\
1064If SOURCE is provided, dump only that file's symbols.\n\
1065If OBJFILE is provided, dump only that file's minimal symbols."),
80480540
YQ
1066 &maintenanceprintlist);
1067
1068 add_cmd ("msymbols", class_maintenance, maintenance_print_msymbols, _("\
1069Print dump of current minimal symbol definitions.\n\
48c5e7e2 1070Usage: mt print msymbols [-objfile OBJFILE] [--] [OUTFILE]\n\
34c41c68
DE
1071Entries in the minimal symbol table are dumped to file OUTFILE,\n\
1072or the terminal if OUTFILE is unspecified.\n\
1073If OBJFILE is provided, dump only that file's minimal symbols."),
80480540
YQ
1074 &maintenanceprintlist);
1075
1076 add_cmd ("objfiles", class_maintenance, maintenance_print_objfiles,
52e260a3
DE
1077 _("Print dump of current object file definitions.\n\
1078With an argument REGEXP, list the object files with matching names."),
80480540
YQ
1079 &maintenanceprintlist);
1080
1081 add_cmd ("symtabs", class_maintenance, maintenance_info_symtabs, _("\
1082List the full symbol tables for all object files.\n\
1083This does not include information about individual symbols, blocks, or\n\
1084linetables --- just the symbol table structures themselves.\n\
db68bbae 1085With an argument REGEXP, list the symbol tables with matching names."),
80480540 1086 &maintenanceinfolist);
7d0c9981 1087
f2403c39
AB
1088 add_cmd ("line-table", class_maintenance, maintenance_info_line_tables, _("\
1089List the contents of all line tables, from all symbol tables.\n\
1090With an argument REGEXP, list just the line tables for the symbol\n\
1091tables with matching names."),
1092 &maintenanceinfolist);
1093
7d0c9981
DE
1094 add_cmd ("check-symtabs", class_maintenance, maintenance_check_symtabs,
1095 _("\
1096Check consistency of currently expanded symtabs."),
1097 &maintenancelist);
1098
1099 add_cmd ("expand-symtabs", class_maintenance, maintenance_expand_symtabs,
1100 _("Expand symbol tables.\n\
1101With an argument REGEXP, only expand the symbol tables with matching names."),
1102 &maintenancelist);
c906108c 1103}
This page took 2.183845 seconds and 4 git commands to generate.