1 /* Do various things to symbol tables (other than lookup), for GDB.
3 Copyright (C) 1986-2017 Free Software Foundation, Inc.
5 This file is part of GDB.
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.
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.
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/>. */
24 #include "filenames.h"
27 #include "breakpoint.h"
29 #include "gdb_obstack.h"
33 #include "gdb_regex.h"
35 #include "dictionary.h"
36 #include "typeprint.h"
39 #include "readline/readline.h"
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
53 /* Prototypes for local functions */
55 static int block_depth (struct block *);
57 static void print_symbol (struct gdbarch *gdbarch, struct symbol *symbol,
58 int depth, ui_file *outfile);
62 print_symbol_bcache_statistics (void)
64 struct program_space *pspace;
65 struct objfile *objfile;
68 ALL_PSPACE_OBJFILES (pspace, objfile)
71 printf_filtered (_("Byte cache statistics for '%s':\n"),
72 objfile_name (objfile));
73 print_bcache_statistics (psymbol_bcache_get_bcache (objfile->psymbol_cache),
74 "partial symbol cache");
75 print_bcache_statistics (objfile->per_bfd->macro_cache,
76 "preprocessor macro cache");
77 print_bcache_statistics (objfile->per_bfd->filename_cache,
83 print_objfile_statistics (void)
85 struct program_space *pspace;
86 struct objfile *objfile;
87 struct compunit_symtab *cu;
89 int i, linetables, blockvectors;
92 ALL_PSPACE_OBJFILES (pspace, objfile)
95 printf_filtered (_("Statistics for '%s':\n"), objfile_name (objfile));
96 if (OBJSTAT (objfile, n_stabs) > 0)
97 printf_filtered (_(" Number of \"stab\" symbols read: %d\n"),
98 OBJSTAT (objfile, n_stabs));
99 if (objfile->per_bfd->n_minsyms > 0)
100 printf_filtered (_(" Number of \"minimal\" symbols read: %d\n"),
101 objfile->per_bfd->n_minsyms);
102 if (OBJSTAT (objfile, n_psyms) > 0)
103 printf_filtered (_(" Number of \"partial\" symbols read: %d\n"),
104 OBJSTAT (objfile, n_psyms));
105 if (OBJSTAT (objfile, n_syms) > 0)
106 printf_filtered (_(" Number of \"full\" symbols read: %d\n"),
107 OBJSTAT (objfile, n_syms));
108 if (OBJSTAT (objfile, n_types) > 0)
109 printf_filtered (_(" Number of \"types\" defined: %d\n"),
110 OBJSTAT (objfile, n_types));
112 objfile->sf->qf->print_stats (objfile);
113 i = linetables = blockvectors = 0;
114 ALL_OBJFILE_FILETABS (objfile, cu, s)
117 if (SYMTAB_LINETABLE (s) != NULL)
120 ALL_OBJFILE_COMPUNITS (objfile, cu)
122 printf_filtered (_(" Number of symbol tables: %d\n"), i);
123 printf_filtered (_(" Number of symbol tables with line tables: %d\n"),
125 printf_filtered (_(" Number of symbol tables with blockvectors: %d\n"),
128 if (OBJSTAT (objfile, sz_strtab) > 0)
129 printf_filtered (_(" Space used by string tables: %d\n"),
130 OBJSTAT (objfile, sz_strtab));
131 printf_filtered (_(" Total memory used for objfile obstack: %s\n"),
132 pulongest (obstack_memory_used (&objfile
133 ->objfile_obstack)));
134 printf_filtered (_(" Total memory used for BFD obstack: %s\n"),
135 pulongest (obstack_memory_used (&objfile->per_bfd
136 ->storage_obstack)));
137 printf_filtered (_(" Total memory used for psymbol cache: %d\n"),
138 bcache_memory_used (psymbol_bcache_get_bcache
139 (objfile->psymbol_cache)));
140 printf_filtered (_(" Total memory used for macro cache: %d\n"),
141 bcache_memory_used (objfile->per_bfd->macro_cache));
142 printf_filtered (_(" Total memory used for file name cache: %d\n"),
143 bcache_memory_used (objfile->per_bfd->filename_cache));
148 dump_objfile (struct objfile *objfile)
150 struct compunit_symtab *cust;
151 struct symtab *symtab;
153 printf_filtered ("\nObject file %s: ", objfile_name (objfile));
154 printf_filtered ("Objfile at ");
155 gdb_print_host_address (objfile, gdb_stdout);
156 printf_filtered (", bfd at ");
157 gdb_print_host_address (objfile->obfd, gdb_stdout);
158 printf_filtered (", %d minsyms\n\n",
159 objfile->per_bfd->minimal_symbol_count);
162 objfile->sf->qf->dump (objfile);
164 if (objfile->compunit_symtabs != NULL)
166 printf_filtered ("Symtabs:\n");
167 ALL_OBJFILE_FILETABS (objfile, cust, symtab)
169 printf_filtered ("%s at ", symtab_to_filename_for_display (symtab));
170 gdb_print_host_address (symtab, gdb_stdout);
171 printf_filtered (", ");
172 if (SYMTAB_OBJFILE (symtab) != objfile)
174 printf_filtered ("NOT ON CHAIN! ");
178 printf_filtered ("\n\n");
182 /* Print minimal symbols from this objfile. */
185 dump_msymbols (struct objfile *objfile, struct ui_file *outfile)
187 struct gdbarch *gdbarch = get_objfile_arch (objfile);
188 struct minimal_symbol *msymbol;
192 fprintf_filtered (outfile, "\nObject file %s:\n\n", objfile_name (objfile));
193 if (objfile->per_bfd->minimal_symbol_count == 0)
195 fprintf_filtered (outfile, "No minimal symbols found.\n");
199 ALL_OBJFILE_MSYMBOLS (objfile, msymbol)
201 struct obj_section *section = MSYMBOL_OBJ_SECTION (objfile, msymbol);
203 switch (MSYMBOL_TYPE (msymbol))
211 case mst_text_gnu_ifunc:
214 case mst_solib_trampoline:
239 fprintf_filtered (outfile, "[%2d] %c ", index, ms_type);
240 fputs_filtered (paddress (gdbarch, MSYMBOL_VALUE_ADDRESS (objfile,
243 fprintf_filtered (outfile, " %s", MSYMBOL_LINKAGE_NAME (msymbol));
246 if (section->the_bfd_section != NULL)
247 fprintf_filtered (outfile, " section %s",
248 bfd_section_name (objfile->obfd,
249 section->the_bfd_section));
251 fprintf_filtered (outfile, " spurious section %ld",
252 (long) (section - objfile->sections));
254 if (MSYMBOL_DEMANGLED_NAME (msymbol) != NULL)
256 fprintf_filtered (outfile, " %s", MSYMBOL_DEMANGLED_NAME (msymbol));
258 if (msymbol->filename)
259 fprintf_filtered (outfile, " %s", msymbol->filename);
260 fputs_filtered ("\n", outfile);
263 if (objfile->per_bfd->minimal_symbol_count != index)
265 warning (_("internal error: minimal symbol count %d != %d"),
266 objfile->per_bfd->minimal_symbol_count, index);
268 fprintf_filtered (outfile, "\n");
272 dump_symtab_1 (struct symtab *symtab, struct ui_file *outfile)
274 struct objfile *objfile = SYMTAB_OBJFILE (symtab);
275 struct gdbarch *gdbarch = get_objfile_arch (objfile);
277 struct dict_iterator iter;
280 const struct blockvector *bv;
285 fprintf_filtered (outfile, "\nSymtab for file %s\n",
286 symtab_to_filename_for_display (symtab));
287 if (SYMTAB_DIRNAME (symtab) != NULL)
288 fprintf_filtered (outfile, "Compilation directory is %s\n",
289 SYMTAB_DIRNAME (symtab));
290 fprintf_filtered (outfile, "Read from object file %s (",
291 objfile_name (objfile));
292 gdb_print_host_address (objfile, outfile);
293 fprintf_filtered (outfile, ")\n");
294 fprintf_filtered (outfile, "Language: %s\n",
295 language_str (symtab->language));
297 /* First print the line table. */
298 l = SYMTAB_LINETABLE (symtab);
301 fprintf_filtered (outfile, "\nLine table:\n\n");
303 for (i = 0; i < len; i++)
305 fprintf_filtered (outfile, " line %d at ", l->item[i].line);
306 fputs_filtered (paddress (gdbarch, l->item[i].pc), outfile);
307 fprintf_filtered (outfile, "\n");
310 /* Now print the block info, but only for compunit symtabs since we will
311 print lots of duplicate info otherwise. */
312 if (symtab == COMPUNIT_FILETABS (SYMTAB_COMPUNIT (symtab)))
314 fprintf_filtered (outfile, "\nBlockvector:\n\n");
315 bv = SYMTAB_BLOCKVECTOR (symtab);
316 len = BLOCKVECTOR_NBLOCKS (bv);
317 for (i = 0; i < len; i++)
319 b = BLOCKVECTOR_BLOCK (bv, i);
320 depth = block_depth (b) * 2;
321 print_spaces (depth, outfile);
322 fprintf_filtered (outfile, "block #%03d, object at ", i);
323 gdb_print_host_address (b, outfile);
324 if (BLOCK_SUPERBLOCK (b))
326 fprintf_filtered (outfile, " under ");
327 gdb_print_host_address (BLOCK_SUPERBLOCK (b), outfile);
329 /* drow/2002-07-10: We could save the total symbols count
330 even if we're using a hashtable, but nothing else but this message
332 fprintf_filtered (outfile, ", %d syms/buckets in ",
333 dict_size (BLOCK_DICT (b)));
334 fputs_filtered (paddress (gdbarch, BLOCK_START (b)), outfile);
335 fprintf_filtered (outfile, "..");
336 fputs_filtered (paddress (gdbarch, BLOCK_END (b)), outfile);
337 if (BLOCK_FUNCTION (b))
339 fprintf_filtered (outfile, ", function %s",
340 SYMBOL_LINKAGE_NAME (BLOCK_FUNCTION (b)));
341 if (SYMBOL_DEMANGLED_NAME (BLOCK_FUNCTION (b)) != NULL)
343 fprintf_filtered (outfile, ", %s",
344 SYMBOL_DEMANGLED_NAME (BLOCK_FUNCTION (b)));
347 fprintf_filtered (outfile, "\n");
348 /* Now print each symbol in this block (in no particular order, if
349 we're using a hashtable). Note that we only want this
350 block, not any blocks from included symtabs. */
351 ALL_DICT_SYMBOLS (BLOCK_DICT (b), iter, sym)
355 print_symbol (gdbarch, sym, depth + 1, outfile);
357 CATCH (ex, RETURN_MASK_ERROR)
359 exception_fprintf (gdb_stderr, ex,
360 "Error printing symbol:\n");
365 fprintf_filtered (outfile, "\n");
369 const char *compunit_filename
370 = symtab_to_filename_for_display (COMPUNIT_FILETABS (SYMTAB_COMPUNIT (symtab)));
372 fprintf_filtered (outfile,
373 "\nBlockvector same as owning compunit: %s\n\n",
379 dump_symtab (struct symtab *symtab, struct ui_file *outfile)
381 /* Set the current language to the language of the symtab we're dumping
382 because certain routines used during dump_symtab() use the current
383 language to print an image of the symbol. We'll restore it later.
384 But use only real languages, not placeholders. */
385 if (symtab->language != language_unknown
386 && symtab->language != language_auto)
388 enum language saved_lang;
390 saved_lang = set_language (symtab->language);
392 dump_symtab_1 (symtab, outfile);
394 set_language (saved_lang);
397 dump_symtab_1 (symtab, outfile);
401 maintenance_print_symbols (const char *args, int from_tty)
403 struct ui_file *outfile = gdb_stdout;
404 char *address_arg = NULL, *source_arg = NULL, *objfile_arg = NULL;
409 gdb_argv argv (args);
411 for (i = 0; argv != NULL && argv[i] != NULL; ++i)
413 if (strcmp (argv[i], "-pc") == 0)
415 if (argv[i + 1] == NULL)
416 error (_("Missing pc value"));
417 address_arg = argv[++i];
419 else if (strcmp (argv[i], "-source") == 0)
421 if (argv[i + 1] == NULL)
422 error (_("Missing source file"));
423 source_arg = argv[++i];
425 else if (strcmp (argv[i], "-objfile") == 0)
427 if (argv[i + 1] == NULL)
428 error (_("Missing objfile name"));
429 objfile_arg = argv[++i];
431 else if (strcmp (argv[i], "--") == 0)
433 /* End of options. */
437 else if (argv[i][0] == '-')
439 /* Future proofing: Don't allow OUTFILE to begin with "-". */
440 error (_("Unknown option: %s"), argv[i]);
447 if (address_arg != NULL && source_arg != NULL)
448 error (_("Must specify at most one of -pc and -source"));
450 stdio_file arg_outfile;
452 if (argv != NULL && argv[outfile_idx] != NULL)
454 if (argv[outfile_idx + 1] != NULL)
455 error (_("Junk at end of command"));
456 gdb::unique_xmalloc_ptr<char> outfile_name
457 (tilde_expand (argv[outfile_idx]));
458 if (!arg_outfile.open (outfile_name.get (), FOPEN_WT))
459 perror_with_name (outfile_name.get ());
460 outfile = &arg_outfile;
463 if (address_arg != NULL)
465 CORE_ADDR pc = parse_and_eval_address (address_arg);
466 struct symtab *s = find_pc_line_symtab (pc);
469 error (_("No symtab for address: %s"), address_arg);
470 dump_symtab (s, outfile);
474 struct objfile *objfile;
475 struct compunit_symtab *cu;
479 ALL_OBJFILES (objfile)
481 int print_for_objfile = 1;
483 if (objfile_arg != NULL)
485 = compare_filenames_for_search (objfile_name (objfile),
487 if (!print_for_objfile)
490 ALL_OBJFILE_FILETABS (objfile, cu, s)
492 int print_for_source = 0;
495 if (source_arg != NULL)
498 = compare_filenames_for_search
499 (symtab_to_filename_for_display (s), source_arg);
502 if (source_arg == NULL
504 dump_symtab (s, outfile);
508 if (source_arg != NULL && !found)
509 error (_("No symtab for source file: %s"), source_arg);
513 /* Print symbol SYMBOL on OUTFILE. DEPTH says how far to indent. */
516 print_symbol (struct gdbarch *gdbarch, struct symbol *symbol,
517 int depth, ui_file *outfile)
519 struct obj_section *section;
521 if (SYMBOL_OBJFILE_OWNED (symbol))
522 section = SYMBOL_OBJ_SECTION (symbol_objfile (symbol), symbol);
526 print_spaces (depth, outfile);
527 if (SYMBOL_DOMAIN (symbol) == LABEL_DOMAIN)
529 fprintf_filtered (outfile, "label %s at ", SYMBOL_PRINT_NAME (symbol));
530 fputs_filtered (paddress (gdbarch, SYMBOL_VALUE_ADDRESS (symbol)),
533 fprintf_filtered (outfile, " section %s\n",
534 bfd_section_name (section->the_bfd_section->owner,
535 section->the_bfd_section));
537 fprintf_filtered (outfile, "\n");
541 if (SYMBOL_DOMAIN (symbol) == STRUCT_DOMAIN)
543 if (TYPE_TAG_NAME (SYMBOL_TYPE (symbol)))
545 LA_PRINT_TYPE (SYMBOL_TYPE (symbol), "", outfile, 1, depth,
546 &type_print_raw_options);
550 fprintf_filtered (outfile, "%s %s = ",
551 (TYPE_CODE (SYMBOL_TYPE (symbol)) == TYPE_CODE_ENUM
553 : (TYPE_CODE (SYMBOL_TYPE (symbol)) == TYPE_CODE_STRUCT
554 ? "struct" : "union")),
555 SYMBOL_LINKAGE_NAME (symbol));
556 LA_PRINT_TYPE (SYMBOL_TYPE (symbol), "", outfile, 1, depth,
557 &type_print_raw_options);
559 fprintf_filtered (outfile, ";\n");
563 if (SYMBOL_CLASS (symbol) == LOC_TYPEDEF)
564 fprintf_filtered (outfile, "typedef ");
565 if (SYMBOL_TYPE (symbol))
567 /* Print details of types, except for enums where it's clutter. */
568 LA_PRINT_TYPE (SYMBOL_TYPE (symbol), SYMBOL_PRINT_NAME (symbol),
570 TYPE_CODE (SYMBOL_TYPE (symbol)) != TYPE_CODE_ENUM,
572 &type_print_raw_options);
573 fprintf_filtered (outfile, "; ");
576 fprintf_filtered (outfile, "%s ", SYMBOL_PRINT_NAME (symbol));
578 switch (SYMBOL_CLASS (symbol))
581 fprintf_filtered (outfile, "const %s (%s)",
582 plongest (SYMBOL_VALUE (symbol)),
583 hex_string (SYMBOL_VALUE (symbol)));
586 case LOC_CONST_BYTES:
589 struct type *type = check_typedef (SYMBOL_TYPE (symbol));
591 fprintf_filtered (outfile, "const %u hex bytes:",
593 for (i = 0; i < TYPE_LENGTH (type); i++)
594 fprintf_filtered (outfile, " %02x",
595 (unsigned) SYMBOL_VALUE_BYTES (symbol)[i]);
600 fprintf_filtered (outfile, "static at ");
601 fputs_filtered (paddress (gdbarch, SYMBOL_VALUE_ADDRESS (symbol)),
604 fprintf_filtered (outfile, " section %s",
605 bfd_section_name (section->the_bfd_section->owner,
606 section->the_bfd_section));
610 if (SYMBOL_IS_ARGUMENT (symbol))
611 fprintf_filtered (outfile, "parameter register %s",
612 plongest (SYMBOL_VALUE (symbol)));
614 fprintf_filtered (outfile, "register %s",
615 plongest (SYMBOL_VALUE (symbol)));
619 fprintf_filtered (outfile, "arg at offset %s",
620 hex_string (SYMBOL_VALUE (symbol)));
624 fprintf_filtered (outfile, "reference arg at %s",
625 hex_string (SYMBOL_VALUE (symbol)));
628 case LOC_REGPARM_ADDR:
629 fprintf_filtered (outfile, "address parameter register %s",
630 plongest (SYMBOL_VALUE (symbol)));
634 fprintf_filtered (outfile, "local at offset %s",
635 hex_string (SYMBOL_VALUE (symbol)));
642 fprintf_filtered (outfile, "label at ");
643 fputs_filtered (paddress (gdbarch, SYMBOL_VALUE_ADDRESS (symbol)),
646 fprintf_filtered (outfile, " section %s",
647 bfd_section_name (section->the_bfd_section->owner,
648 section->the_bfd_section));
652 fprintf_filtered (outfile, "block object ");
653 gdb_print_host_address (SYMBOL_BLOCK_VALUE (symbol), outfile);
654 fprintf_filtered (outfile, ", ");
655 fputs_filtered (paddress (gdbarch,
656 BLOCK_START (SYMBOL_BLOCK_VALUE (symbol))),
658 fprintf_filtered (outfile, "..");
659 fputs_filtered (paddress (gdbarch,
660 BLOCK_END (SYMBOL_BLOCK_VALUE (symbol))),
663 fprintf_filtered (outfile, " section %s",
664 bfd_section_name (section->the_bfd_section->owner,
665 section->the_bfd_section));
669 fprintf_filtered (outfile, "computed at runtime");
673 fprintf_filtered (outfile, "unresolved");
676 case LOC_OPTIMIZED_OUT:
677 fprintf_filtered (outfile, "optimized out");
681 fprintf_filtered (outfile, "botched symbol class %x",
682 SYMBOL_CLASS (symbol));
686 fprintf_filtered (outfile, "\n");
690 maintenance_print_msymbols (const char *args, int from_tty)
692 struct ui_file *outfile = gdb_stdout;
693 char *objfile_arg = NULL;
694 struct objfile *objfile;
699 gdb_argv argv (args);
701 for (i = 0; argv != NULL && argv[i] != NULL; ++i)
703 if (strcmp (argv[i], "-objfile") == 0)
705 if (argv[i + 1] == NULL)
706 error (_("Missing objfile name"));
707 objfile_arg = argv[++i];
709 else if (strcmp (argv[i], "--") == 0)
711 /* End of options. */
715 else if (argv[i][0] == '-')
717 /* Future proofing: Don't allow OUTFILE to begin with "-". */
718 error (_("Unknown option: %s"), argv[i]);
725 stdio_file arg_outfile;
727 if (argv != NULL && argv[outfile_idx] != NULL)
729 if (argv[outfile_idx + 1] != NULL)
730 error (_("Junk at end of command"));
731 gdb::unique_xmalloc_ptr<char> outfile_name
732 (tilde_expand (argv[outfile_idx]));
733 if (!arg_outfile.open (outfile_name.get (), FOPEN_WT))
734 perror_with_name (outfile_name.get ());
735 outfile = &arg_outfile;
738 ALL_OBJFILES (objfile)
741 if (objfile_arg == NULL
742 || compare_filenames_for_search (objfile_name (objfile), objfile_arg))
743 dump_msymbols (objfile, outfile);
748 maintenance_print_objfiles (const char *regexp, int from_tty)
750 struct program_space *pspace;
751 struct objfile *objfile;
759 ALL_PSPACE_OBJFILES (pspace, objfile)
763 || re_exec (objfile_name (objfile)))
764 dump_objfile (objfile);
768 /* List all the symbol tables whose names match REGEXP (optional). */
771 maintenance_info_symtabs (const char *regexp, int from_tty)
773 struct program_space *pspace;
774 struct objfile *objfile;
782 ALL_PSPACE_OBJFILES (pspace, objfile)
784 struct compunit_symtab *cust;
785 struct symtab *symtab;
787 /* We don't want to print anything for this objfile until we
788 actually find a symtab whose name matches. */
789 int printed_objfile_start = 0;
791 ALL_OBJFILE_COMPUNITS (objfile, cust)
793 int printed_compunit_symtab_start = 0;
795 ALL_COMPUNIT_FILETABS (cust, symtab)
800 || re_exec (symtab_to_filename_for_display (symtab)))
802 if (! printed_objfile_start)
804 printf_filtered ("{ objfile %s ", objfile_name (objfile));
806 printf_filtered ("((struct objfile *) %s)\n",
807 host_address_to_string (objfile));
808 printed_objfile_start = 1;
810 if (! printed_compunit_symtab_start)
812 printf_filtered (" { ((struct compunit_symtab *) %s)\n",
813 host_address_to_string (cust));
814 printf_filtered (" debugformat %s\n",
815 COMPUNIT_DEBUGFORMAT (cust));
816 printf_filtered (" producer %s\n",
817 COMPUNIT_PRODUCER (cust) != NULL
818 ? COMPUNIT_PRODUCER (cust)
820 printf_filtered (" dirname %s\n",
821 COMPUNIT_DIRNAME (cust) != NULL
822 ? COMPUNIT_DIRNAME (cust)
824 printf_filtered (" blockvector"
825 " ((struct blockvector *) %s)\n",
826 host_address_to_string
827 (COMPUNIT_BLOCKVECTOR (cust)));
828 printed_compunit_symtab_start = 1;
831 printf_filtered ("\t{ symtab %s ",
832 symtab_to_filename_for_display (symtab));
834 printf_filtered ("((struct symtab *) %s)\n",
835 host_address_to_string (symtab));
836 printf_filtered ("\t fullname %s\n",
837 symtab->fullname != NULL
840 printf_filtered ("\t "
841 "linetable ((struct linetable *) %s)\n",
842 host_address_to_string (symtab->linetable));
843 printf_filtered ("\t}\n");
847 if (printed_compunit_symtab_start)
848 printf_filtered (" }\n");
851 if (printed_objfile_start)
852 printf_filtered ("}\n");
856 /* Check consistency of symtabs.
857 An example of what this checks for is NULL blockvectors.
858 They can happen if there's a bug during debug info reading.
859 GDB assumes they are always non-NULL.
861 Note: This does not check for psymtab vs symtab consistency.
862 Use "maint check-psymtabs" for that. */
865 maintenance_check_symtabs (const char *ignore, int from_tty)
867 struct program_space *pspace;
868 struct objfile *objfile;
871 ALL_PSPACE_OBJFILES (pspace, objfile)
873 struct compunit_symtab *cust;
875 /* We don't want to print anything for this objfile until we
876 actually find something worth printing. */
877 int printed_objfile_start = 0;
879 ALL_OBJFILE_COMPUNITS (objfile, cust)
881 int found_something = 0;
882 struct symtab *symtab = compunit_primary_filetab (cust);
886 if (COMPUNIT_BLOCKVECTOR (cust) == NULL)
888 /* Add more checks here. */
892 if (! printed_objfile_start)
894 printf_filtered ("{ objfile %s ", objfile_name (objfile));
896 printf_filtered ("((struct objfile *) %s)\n",
897 host_address_to_string (objfile));
898 printed_objfile_start = 1;
900 printf_filtered (" { symtab %s\n",
901 symtab_to_filename_for_display (symtab));
902 if (COMPUNIT_BLOCKVECTOR (cust) == NULL)
903 printf_filtered (" NULL blockvector\n");
904 printf_filtered (" }\n");
908 if (printed_objfile_start)
909 printf_filtered ("}\n");
913 /* Expand all symbol tables whose name matches an optional regexp. */
916 maintenance_expand_symtabs (const char *args, int from_tty)
918 struct program_space *pspace;
919 struct objfile *objfile;
922 /* We use buildargv here so that we handle spaces in the regexp
923 in a way that allows adding more arguments later. */
924 gdb_argv argv (args);
932 error (_("Extra arguments after regexp."));
940 ALL_PSPACE_OBJFILES (pspace, objfile)
944 objfile->sf->qf->expand_symtabs_matching
946 [&] (const char *filename, bool basenames)
948 /* KISS: Only apply the regexp to the complete file name. */
950 && (regexp == NULL || re_exec (filename)));
952 lookup_name_info::match_any (),
953 [] (const char *symname)
955 /* Since we're not searching on symbols, just return true. */
965 /* Return the nexting depth of a block within other blocks in its symtab. */
968 block_depth (struct block *block)
972 while ((block = BLOCK_SUPERBLOCK (block)) != NULL)
980 /* Used by MAINTENANCE_INFO_LINE_TABLES to print the information about a
981 single line table. */
984 maintenance_print_one_line_table (struct symtab *symtab, void *data)
986 struct linetable *linetable;
987 struct objfile *objfile;
989 objfile = symtab->compunit_symtab->objfile;
990 printf_filtered (_("objfile: %s ((struct objfile *) %s)\n"),
991 objfile_name (objfile),
992 host_address_to_string (objfile));
993 printf_filtered (_("compunit_symtab: ((struct compunit_symtab *) %s)\n"),
994 host_address_to_string (symtab->compunit_symtab));
995 printf_filtered (_("symtab: %s ((struct symtab *) %s)\n"),
996 symtab_to_fullname (symtab),
997 host_address_to_string (symtab));
998 linetable = SYMTAB_LINETABLE (symtab);
999 printf_filtered (_("linetable: ((struct linetable *) %s):\n"),
1000 host_address_to_string (linetable));
1002 if (linetable == NULL)
1003 printf_filtered (_("No line table.\n"));
1004 else if (linetable->nitems <= 0)
1005 printf_filtered (_("Line table has no lines.\n"));
1010 /* Leave space for 6 digits of index and line number. After that the
1011 tables will just not format as well. */
1012 printf_filtered (_("%-6s %6s %s\n"),
1013 _("INDEX"), _("LINE"), _("ADDRESS"));
1015 for (i = 0; i < linetable->nitems; ++i)
1017 struct linetable_entry *item;
1019 item = &linetable->item [i];
1020 printf_filtered (_("%-6d %6d %s\n"), i, item->line,
1021 core_addr_to_string (item->pc));
1028 /* Implement the 'maint info line-table' command. */
1031 maintenance_info_line_tables (const char *regexp, int from_tty)
1033 struct program_space *pspace;
1034 struct objfile *objfile;
1041 ALL_PSPACES (pspace)
1042 ALL_PSPACE_OBJFILES (pspace, objfile)
1044 struct compunit_symtab *cust;
1045 struct symtab *symtab;
1047 ALL_OBJFILE_COMPUNITS (objfile, cust)
1049 ALL_COMPUNIT_FILETABS (cust, symtab)
1054 || re_exec (symtab_to_filename_for_display (symtab)))
1055 maintenance_print_one_line_table (symtab, NULL);
1063 /* Do early runtime initializations. */
1066 _initialize_symmisc (void)
1072 add_cmd ("symbols", class_maintenance, maintenance_print_symbols, _("\
1073 Print dump of current symbol definitions.\n\
1074 Usage: mt print symbols [-pc address] [--] [outfile]\n\
1075 mt print symbols [-objfile objfile] [-source source] [--] [outfile]\n\
1076 Entries in the full symbol table are dumped to file OUTFILE,\n\
1077 or the terminal if OUTFILE is unspecified.\n\
1078 If ADDRESS is provided, dump only the file for that address.\n\
1079 If SOURCE is provided, dump only that file's symbols.\n\
1080 If OBJFILE is provided, dump only that file's minimal symbols."),
1081 &maintenanceprintlist);
1083 add_cmd ("msymbols", class_maintenance, maintenance_print_msymbols, _("\
1084 Print dump of current minimal symbol definitions.\n\
1085 Usage: mt print msymbols [-objfile objfile] [--] [outfile]\n\
1086 Entries in the minimal symbol table are dumped to file OUTFILE,\n\
1087 or the terminal if OUTFILE is unspecified.\n\
1088 If OBJFILE is provided, dump only that file's minimal symbols."),
1089 &maintenanceprintlist);
1091 add_cmd ("objfiles", class_maintenance, maintenance_print_objfiles,
1092 _("Print dump of current object file definitions.\n\
1093 With an argument REGEXP, list the object files with matching names."),
1094 &maintenanceprintlist);
1096 add_cmd ("symtabs", class_maintenance, maintenance_info_symtabs, _("\
1097 List the full symbol tables for all object files.\n\
1098 This does not include information about individual symbols, blocks, or\n\
1099 linetables --- just the symbol table structures themselves.\n\
1100 With an argument REGEXP, list the symbol tables with matching names."),
1101 &maintenanceinfolist);
1103 add_cmd ("line-table", class_maintenance, maintenance_info_line_tables, _("\
1104 List the contents of all line tables, from all symbol tables.\n\
1105 With an argument REGEXP, list just the line tables for the symbol\n\
1106 tables with matching names."),
1107 &maintenanceinfolist);
1109 add_cmd ("check-symtabs", class_maintenance, maintenance_check_symtabs,
1111 Check consistency of currently expanded symtabs."),
1114 add_cmd ("expand-symtabs", class_maintenance, maintenance_expand_symtabs,
1115 _("Expand symbol tables.\n\
1116 With an argument REGEXP, only expand the symbol tables with matching names."),