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