1 /* Do various things to symbol tables (other than lookup), for GDB.
3 Copyright (C) 1986-2019 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
;
67 for (objfile
*objfile
: all_objfiles (pspace
))
70 printf_filtered (_("Byte cache statistics for '%s':\n"),
71 objfile_name (objfile
));
72 print_bcache_statistics (psymbol_bcache_get_bcache (objfile
->psymbol_cache
),
73 "partial symbol cache");
74 print_bcache_statistics (objfile
->per_bfd
->macro_cache
,
75 "preprocessor macro cache");
76 print_bcache_statistics (objfile
->per_bfd
->filename_cache
,
82 print_objfile_statistics (void)
84 struct program_space
*pspace
;
85 struct compunit_symtab
*cu
;
87 int i
, linetables
, blockvectors
;
90 for (objfile
*objfile
: all_objfiles (pspace
))
93 printf_filtered (_("Statistics for '%s':\n"), objfile_name (objfile
));
94 if (OBJSTAT (objfile
, n_stabs
) > 0)
95 printf_filtered (_(" Number of \"stab\" symbols read: %d\n"),
96 OBJSTAT (objfile
, n_stabs
));
97 if (objfile
->per_bfd
->n_minsyms
> 0)
98 printf_filtered (_(" Number of \"minimal\" symbols read: %d\n"),
99 objfile
->per_bfd
->n_minsyms
);
100 if (OBJSTAT (objfile
, n_psyms
) > 0)
101 printf_filtered (_(" Number of \"partial\" symbols read: %d\n"),
102 OBJSTAT (objfile
, n_psyms
));
103 if (OBJSTAT (objfile
, n_syms
) > 0)
104 printf_filtered (_(" Number of \"full\" symbols read: %d\n"),
105 OBJSTAT (objfile
, n_syms
));
106 if (OBJSTAT (objfile
, n_types
) > 0)
107 printf_filtered (_(" Number of \"types\" defined: %d\n"),
108 OBJSTAT (objfile
, n_types
));
110 objfile
->sf
->qf
->print_stats (objfile
);
111 i
= linetables
= blockvectors
= 0;
112 ALL_OBJFILE_FILETABS (objfile
, cu
, s
)
115 if (SYMTAB_LINETABLE (s
) != NULL
)
118 ALL_OBJFILE_COMPUNITS (objfile
, cu
)
120 printf_filtered (_(" Number of symbol tables: %d\n"), i
);
121 printf_filtered (_(" Number of symbol tables with line tables: %d\n"),
123 printf_filtered (_(" Number of symbol tables with blockvectors: %d\n"),
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
)));
135 printf_filtered (_(" Total memory used for psymbol cache: %d\n"),
136 bcache_memory_used (psymbol_bcache_get_bcache
137 (objfile
->psymbol_cache
)));
138 printf_filtered (_(" Total memory used for macro cache: %d\n"),
139 bcache_memory_used (objfile
->per_bfd
->macro_cache
));
140 printf_filtered (_(" Total memory used for file name cache: %d\n"),
141 bcache_memory_used (objfile
->per_bfd
->filename_cache
));
146 dump_objfile (struct objfile
*objfile
)
148 struct compunit_symtab
*cust
;
149 struct symtab
*symtab
;
151 printf_filtered ("\nObject file %s: ", objfile_name (objfile
));
152 printf_filtered ("Objfile at ");
153 gdb_print_host_address (objfile
, gdb_stdout
);
154 printf_filtered (", bfd at ");
155 gdb_print_host_address (objfile
->obfd
, gdb_stdout
);
156 printf_filtered (", %d minsyms\n\n",
157 objfile
->per_bfd
->minimal_symbol_count
);
160 objfile
->sf
->qf
->dump (objfile
);
162 if (objfile
->compunit_symtabs
!= NULL
)
164 printf_filtered ("Symtabs:\n");
165 ALL_OBJFILE_FILETABS (objfile
, cust
, symtab
)
167 printf_filtered ("%s at ", symtab_to_filename_for_display (symtab
));
168 gdb_print_host_address (symtab
, gdb_stdout
);
169 printf_filtered (", ");
170 if (SYMTAB_OBJFILE (symtab
) != objfile
)
172 printf_filtered ("NOT ON CHAIN! ");
176 printf_filtered ("\n\n");
180 /* Print minimal symbols from this objfile. */
183 dump_msymbols (struct objfile
*objfile
, struct ui_file
*outfile
)
185 struct gdbarch
*gdbarch
= get_objfile_arch (objfile
);
186 struct minimal_symbol
*msymbol
;
190 fprintf_filtered (outfile
, "\nObject file %s:\n\n", objfile_name (objfile
));
191 if (objfile
->per_bfd
->minimal_symbol_count
== 0)
193 fprintf_filtered (outfile
, "No minimal symbols found.\n");
197 ALL_OBJFILE_MSYMBOLS (objfile
, msymbol
)
199 struct obj_section
*section
= MSYMBOL_OBJ_SECTION (objfile
, msymbol
);
201 switch (MSYMBOL_TYPE (msymbol
))
209 case mst_text_gnu_ifunc
:
210 case mst_data_gnu_ifunc
:
213 case mst_solib_trampoline
:
238 fprintf_filtered (outfile
, "[%2d] %c ", index
, ms_type
);
239 fputs_filtered (paddress (gdbarch
, MSYMBOL_VALUE_ADDRESS (objfile
,
242 fprintf_filtered (outfile
, " %s", MSYMBOL_LINKAGE_NAME (msymbol
));
245 if (section
->the_bfd_section
!= NULL
)
246 fprintf_filtered (outfile
, " section %s",
247 bfd_section_name (objfile
->obfd
,
248 section
->the_bfd_section
));
250 fprintf_filtered (outfile
, " spurious section %ld",
251 (long) (section
- objfile
->sections
));
253 if (MSYMBOL_DEMANGLED_NAME (msymbol
) != NULL
)
255 fprintf_filtered (outfile
, " %s", MSYMBOL_DEMANGLED_NAME (msymbol
));
257 if (msymbol
->filename
)
258 fprintf_filtered (outfile
, " %s", msymbol
->filename
);
259 fputs_filtered ("\n", outfile
);
262 if (objfile
->per_bfd
->minimal_symbol_count
!= index
)
264 warning (_("internal error: minimal symbol count %d != %d"),
265 objfile
->per_bfd
->minimal_symbol_count
, index
);
267 fprintf_filtered (outfile
, "\n");
271 dump_symtab_1 (struct symtab
*symtab
, struct ui_file
*outfile
)
273 struct objfile
*objfile
= SYMTAB_OBJFILE (symtab
);
274 struct gdbarch
*gdbarch
= get_objfile_arch (objfile
);
276 struct dict_iterator iter
;
279 const struct blockvector
*bv
;
284 fprintf_filtered (outfile
, "\nSymtab for file %s\n",
285 symtab_to_filename_for_display (symtab
));
286 if (SYMTAB_DIRNAME (symtab
) != NULL
)
287 fprintf_filtered (outfile
, "Compilation directory is %s\n",
288 SYMTAB_DIRNAME (symtab
));
289 fprintf_filtered (outfile
, "Read from object file %s (",
290 objfile_name (objfile
));
291 gdb_print_host_address (objfile
, outfile
);
292 fprintf_filtered (outfile
, ")\n");
293 fprintf_filtered (outfile
, "Language: %s\n",
294 language_str (symtab
->language
));
296 /* First print the line table. */
297 l
= SYMTAB_LINETABLE (symtab
);
300 fprintf_filtered (outfile
, "\nLine table:\n\n");
302 for (i
= 0; i
< len
; i
++)
304 fprintf_filtered (outfile
, " line %d at ", l
->item
[i
].line
);
305 fputs_filtered (paddress (gdbarch
, l
->item
[i
].pc
), outfile
);
306 fprintf_filtered (outfile
, "\n");
309 /* Now print the block info, but only for compunit symtabs since we will
310 print lots of duplicate info otherwise. */
311 if (symtab
== COMPUNIT_FILETABS (SYMTAB_COMPUNIT (symtab
)))
313 fprintf_filtered (outfile
, "\nBlockvector:\n\n");
314 bv
= SYMTAB_BLOCKVECTOR (symtab
);
315 len
= BLOCKVECTOR_NBLOCKS (bv
);
316 for (i
= 0; i
< len
; i
++)
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
);
322 gdb_print_host_address (b
, outfile
);
323 if (BLOCK_SUPERBLOCK (b
))
325 fprintf_filtered (outfile
, " under ");
326 gdb_print_host_address (BLOCK_SUPERBLOCK (b
), outfile
);
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
331 fprintf_filtered (outfile
, ", %d syms/buckets in ",
332 dict_size (BLOCK_DICT (b
)));
333 fputs_filtered (paddress (gdbarch
, BLOCK_START (b
)), outfile
);
334 fprintf_filtered (outfile
, "..");
335 fputs_filtered (paddress (gdbarch
, BLOCK_END (b
)), outfile
);
336 if (BLOCK_FUNCTION (b
))
338 fprintf_filtered (outfile
, ", function %s",
339 SYMBOL_LINKAGE_NAME (BLOCK_FUNCTION (b
)));
340 if (SYMBOL_DEMANGLED_NAME (BLOCK_FUNCTION (b
)) != NULL
)
342 fprintf_filtered (outfile
, ", %s",
343 SYMBOL_DEMANGLED_NAME (BLOCK_FUNCTION (b
)));
346 fprintf_filtered (outfile
, "\n");
347 /* Now print each symbol in this block (in no particular order, if
348 we're using a hashtable). Note that we only want this
349 block, not any blocks from included symtabs. */
350 ALL_DICT_SYMBOLS (BLOCK_DICT (b
), iter
, sym
)
354 print_symbol (gdbarch
, sym
, depth
+ 1, outfile
);
356 CATCH (ex
, RETURN_MASK_ERROR
)
358 exception_fprintf (gdb_stderr
, ex
,
359 "Error printing symbol:\n");
364 fprintf_filtered (outfile
, "\n");
368 const char *compunit_filename
369 = symtab_to_filename_for_display (COMPUNIT_FILETABS (SYMTAB_COMPUNIT (symtab
)));
371 fprintf_filtered (outfile
,
372 "\nBlockvector same as owning compunit: %s\n\n",
378 dump_symtab (struct symtab
*symtab
, struct ui_file
*outfile
)
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
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
)
387 enum language saved_lang
;
389 saved_lang
= set_language (symtab
->language
);
391 dump_symtab_1 (symtab
, outfile
);
393 set_language (saved_lang
);
396 dump_symtab_1 (symtab
, outfile
);
400 maintenance_print_symbols (const char *args
, int from_tty
)
402 struct ui_file
*outfile
= gdb_stdout
;
403 char *address_arg
= NULL
, *source_arg
= NULL
, *objfile_arg
= NULL
;
408 gdb_argv
argv (args
);
410 for (i
= 0; argv
!= NULL
&& argv
[i
] != NULL
; ++i
)
412 if (strcmp (argv
[i
], "-pc") == 0)
414 if (argv
[i
+ 1] == NULL
)
415 error (_("Missing pc value"));
416 address_arg
= argv
[++i
];
418 else if (strcmp (argv
[i
], "-source") == 0)
420 if (argv
[i
+ 1] == NULL
)
421 error (_("Missing source file"));
422 source_arg
= argv
[++i
];
424 else if (strcmp (argv
[i
], "-objfile") == 0)
426 if (argv
[i
+ 1] == NULL
)
427 error (_("Missing objfile name"));
428 objfile_arg
= argv
[++i
];
430 else if (strcmp (argv
[i
], "--") == 0)
432 /* End of options. */
436 else if (argv
[i
][0] == '-')
438 /* Future proofing: Don't allow OUTFILE to begin with "-". */
439 error (_("Unknown option: %s"), argv
[i
]);
446 if (address_arg
!= NULL
&& source_arg
!= NULL
)
447 error (_("Must specify at most one of -pc and -source"));
449 stdio_file arg_outfile
;
451 if (argv
!= NULL
&& argv
[outfile_idx
] != NULL
)
453 if (argv
[outfile_idx
+ 1] != NULL
)
454 error (_("Junk at end of command"));
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 ());
459 outfile
= &arg_outfile
;
462 if (address_arg
!= NULL
)
464 CORE_ADDR pc
= parse_and_eval_address (address_arg
);
465 struct symtab
*s
= find_pc_line_symtab (pc
);
468 error (_("No symtab for address: %s"), address_arg
);
469 dump_symtab (s
, outfile
);
473 struct compunit_symtab
*cu
;
477 for (objfile
*objfile
: all_objfiles (current_program_space
))
479 int print_for_objfile
= 1;
481 if (objfile_arg
!= NULL
)
483 = compare_filenames_for_search (objfile_name (objfile
),
485 if (!print_for_objfile
)
488 ALL_OBJFILE_FILETABS (objfile
, cu
, s
)
490 int print_for_source
= 0;
493 if (source_arg
!= NULL
)
496 = compare_filenames_for_search
497 (symtab_to_filename_for_display (s
), source_arg
);
500 if (source_arg
== NULL
502 dump_symtab (s
, outfile
);
506 if (source_arg
!= NULL
&& !found
)
507 error (_("No symtab for source file: %s"), source_arg
);
511 /* Print symbol SYMBOL on OUTFILE. DEPTH says how far to indent. */
514 print_symbol (struct gdbarch
*gdbarch
, struct symbol
*symbol
,
515 int depth
, ui_file
*outfile
)
517 struct obj_section
*section
;
519 if (SYMBOL_OBJFILE_OWNED (symbol
))
520 section
= SYMBOL_OBJ_SECTION (symbol_objfile (symbol
), symbol
);
524 print_spaces (depth
, outfile
);
525 if (SYMBOL_DOMAIN (symbol
) == LABEL_DOMAIN
)
527 fprintf_filtered (outfile
, "label %s at ", SYMBOL_PRINT_NAME (symbol
));
528 fputs_filtered (paddress (gdbarch
, SYMBOL_VALUE_ADDRESS (symbol
)),
531 fprintf_filtered (outfile
, " section %s\n",
532 bfd_section_name (section
->the_bfd_section
->owner
,
533 section
->the_bfd_section
));
535 fprintf_filtered (outfile
, "\n");
539 if (SYMBOL_DOMAIN (symbol
) == STRUCT_DOMAIN
)
541 if (TYPE_NAME (SYMBOL_TYPE (symbol
)))
543 LA_PRINT_TYPE (SYMBOL_TYPE (symbol
), "", outfile
, 1, depth
,
544 &type_print_raw_options
);
548 fprintf_filtered (outfile
, "%s %s = ",
549 (TYPE_CODE (SYMBOL_TYPE (symbol
)) == TYPE_CODE_ENUM
551 : (TYPE_CODE (SYMBOL_TYPE (symbol
)) == TYPE_CODE_STRUCT
552 ? "struct" : "union")),
553 SYMBOL_LINKAGE_NAME (symbol
));
554 LA_PRINT_TYPE (SYMBOL_TYPE (symbol
), "", outfile
, 1, depth
,
555 &type_print_raw_options
);
557 fprintf_filtered (outfile
, ";\n");
561 if (SYMBOL_CLASS (symbol
) == LOC_TYPEDEF
)
562 fprintf_filtered (outfile
, "typedef ");
563 if (SYMBOL_TYPE (symbol
))
565 /* Print details of types, except for enums where it's clutter. */
566 LA_PRINT_TYPE (SYMBOL_TYPE (symbol
), SYMBOL_PRINT_NAME (symbol
),
568 TYPE_CODE (SYMBOL_TYPE (symbol
)) != TYPE_CODE_ENUM
,
570 &type_print_raw_options
);
571 fprintf_filtered (outfile
, "; ");
574 fprintf_filtered (outfile
, "%s ", SYMBOL_PRINT_NAME (symbol
));
576 switch (SYMBOL_CLASS (symbol
))
579 fprintf_filtered (outfile
, "const %s (%s)",
580 plongest (SYMBOL_VALUE (symbol
)),
581 hex_string (SYMBOL_VALUE (symbol
)));
584 case LOC_CONST_BYTES
:
587 struct type
*type
= check_typedef (SYMBOL_TYPE (symbol
));
589 fprintf_filtered (outfile
, "const %u hex bytes:",
591 for (i
= 0; i
< TYPE_LENGTH (type
); i
++)
592 fprintf_filtered (outfile
, " %02x",
593 (unsigned) SYMBOL_VALUE_BYTES (symbol
)[i
]);
598 fprintf_filtered (outfile
, "static at ");
599 fputs_filtered (paddress (gdbarch
, SYMBOL_VALUE_ADDRESS (symbol
)),
602 fprintf_filtered (outfile
, " section %s",
603 bfd_section_name (section
->the_bfd_section
->owner
,
604 section
->the_bfd_section
));
608 if (SYMBOL_IS_ARGUMENT (symbol
))
609 fprintf_filtered (outfile
, "parameter register %s",
610 plongest (SYMBOL_VALUE (symbol
)));
612 fprintf_filtered (outfile
, "register %s",
613 plongest (SYMBOL_VALUE (symbol
)));
617 fprintf_filtered (outfile
, "arg at offset %s",
618 hex_string (SYMBOL_VALUE (symbol
)));
622 fprintf_filtered (outfile
, "reference arg at %s",
623 hex_string (SYMBOL_VALUE (symbol
)));
626 case LOC_REGPARM_ADDR
:
627 fprintf_filtered (outfile
, "address parameter register %s",
628 plongest (SYMBOL_VALUE (symbol
)));
632 fprintf_filtered (outfile
, "local at offset %s",
633 hex_string (SYMBOL_VALUE (symbol
)));
640 fprintf_filtered (outfile
, "label at ");
641 fputs_filtered (paddress (gdbarch
, SYMBOL_VALUE_ADDRESS (symbol
)),
644 fprintf_filtered (outfile
, " section %s",
645 bfd_section_name (section
->the_bfd_section
->owner
,
646 section
->the_bfd_section
));
650 fprintf_filtered (outfile
, "block object ");
651 gdb_print_host_address (SYMBOL_BLOCK_VALUE (symbol
), outfile
);
652 fprintf_filtered (outfile
, ", ");
653 fputs_filtered (paddress (gdbarch
,
654 BLOCK_START (SYMBOL_BLOCK_VALUE (symbol
))),
656 fprintf_filtered (outfile
, "..");
657 fputs_filtered (paddress (gdbarch
,
658 BLOCK_END (SYMBOL_BLOCK_VALUE (symbol
))),
661 fprintf_filtered (outfile
, " section %s",
662 bfd_section_name (section
->the_bfd_section
->owner
,
663 section
->the_bfd_section
));
667 fprintf_filtered (outfile
, "computed at runtime");
671 fprintf_filtered (outfile
, "unresolved");
674 case LOC_OPTIMIZED_OUT
:
675 fprintf_filtered (outfile
, "optimized out");
679 fprintf_filtered (outfile
, "botched symbol class %x",
680 SYMBOL_CLASS (symbol
));
684 fprintf_filtered (outfile
, "\n");
688 maintenance_print_msymbols (const char *args
, int from_tty
)
690 struct ui_file
*outfile
= gdb_stdout
;
691 char *objfile_arg
= NULL
;
696 gdb_argv
argv (args
);
698 for (i
= 0; argv
!= NULL
&& argv
[i
] != NULL
; ++i
)
700 if (strcmp (argv
[i
], "-objfile") == 0)
702 if (argv
[i
+ 1] == NULL
)
703 error (_("Missing objfile name"));
704 objfile_arg
= argv
[++i
];
706 else if (strcmp (argv
[i
], "--") == 0)
708 /* End of options. */
712 else if (argv
[i
][0] == '-')
714 /* Future proofing: Don't allow OUTFILE to begin with "-". */
715 error (_("Unknown option: %s"), argv
[i
]);
722 stdio_file arg_outfile
;
724 if (argv
!= NULL
&& argv
[outfile_idx
] != NULL
)
726 if (argv
[outfile_idx
+ 1] != NULL
)
727 error (_("Junk at end of command"));
728 gdb::unique_xmalloc_ptr
<char> outfile_name
729 (tilde_expand (argv
[outfile_idx
]));
730 if (!arg_outfile
.open (outfile_name
.get (), FOPEN_WT
))
731 perror_with_name (outfile_name
.get ());
732 outfile
= &arg_outfile
;
735 for (objfile
*objfile
: all_objfiles (current_program_space
))
738 if (objfile_arg
== NULL
739 || compare_filenames_for_search (objfile_name (objfile
), objfile_arg
))
740 dump_msymbols (objfile
, outfile
);
745 maintenance_print_objfiles (const char *regexp
, int from_tty
)
747 struct program_space
*pspace
;
755 for (objfile
*objfile
: all_objfiles (pspace
))
759 || re_exec (objfile_name (objfile
)))
760 dump_objfile (objfile
);
764 /* List all the symbol tables whose names match REGEXP (optional). */
767 maintenance_info_symtabs (const char *regexp
, int from_tty
)
769 struct program_space
*pspace
;
777 for (objfile
*objfile
: all_objfiles (pspace
))
779 struct compunit_symtab
*cust
;
780 struct symtab
*symtab
;
782 /* We don't want to print anything for this objfile until we
783 actually find a symtab whose name matches. */
784 int printed_objfile_start
= 0;
786 ALL_OBJFILE_COMPUNITS (objfile
, cust
)
788 int printed_compunit_symtab_start
= 0;
790 ALL_COMPUNIT_FILETABS (cust
, symtab
)
795 || re_exec (symtab_to_filename_for_display (symtab
)))
797 if (! printed_objfile_start
)
799 printf_filtered ("{ objfile %s ", objfile_name (objfile
));
801 printf_filtered ("((struct objfile *) %s)\n",
802 host_address_to_string (objfile
));
803 printed_objfile_start
= 1;
805 if (! printed_compunit_symtab_start
)
807 printf_filtered (" { ((struct compunit_symtab *) %s)\n",
808 host_address_to_string (cust
));
809 printf_filtered (" debugformat %s\n",
810 COMPUNIT_DEBUGFORMAT (cust
));
811 printf_filtered (" producer %s\n",
812 COMPUNIT_PRODUCER (cust
) != NULL
813 ? COMPUNIT_PRODUCER (cust
)
815 printf_filtered (" dirname %s\n",
816 COMPUNIT_DIRNAME (cust
) != NULL
817 ? COMPUNIT_DIRNAME (cust
)
819 printf_filtered (" blockvector"
820 " ((struct blockvector *) %s)\n",
821 host_address_to_string
822 (COMPUNIT_BLOCKVECTOR (cust
)));
823 printed_compunit_symtab_start
= 1;
826 printf_filtered ("\t{ symtab %s ",
827 symtab_to_filename_for_display (symtab
));
829 printf_filtered ("((struct symtab *) %s)\n",
830 host_address_to_string (symtab
));
831 printf_filtered ("\t fullname %s\n",
832 symtab
->fullname
!= NULL
835 printf_filtered ("\t "
836 "linetable ((struct linetable *) %s)\n",
837 host_address_to_string (symtab
->linetable
));
838 printf_filtered ("\t}\n");
842 if (printed_compunit_symtab_start
)
843 printf_filtered (" }\n");
846 if (printed_objfile_start
)
847 printf_filtered ("}\n");
851 /* Check consistency of symtabs.
852 An example of what this checks for is NULL blockvectors.
853 They can happen if there's a bug during debug info reading.
854 GDB assumes they are always non-NULL.
856 Note: This does not check for psymtab vs symtab consistency.
857 Use "maint check-psymtabs" for that. */
860 maintenance_check_symtabs (const char *ignore
, int from_tty
)
862 struct program_space
*pspace
;
865 for (objfile
*objfile
: all_objfiles (pspace
))
867 struct compunit_symtab
*cust
;
869 /* We don't want to print anything for this objfile until we
870 actually find something worth printing. */
871 int printed_objfile_start
= 0;
873 ALL_OBJFILE_COMPUNITS (objfile
, cust
)
875 int found_something
= 0;
876 struct symtab
*symtab
= compunit_primary_filetab (cust
);
880 if (COMPUNIT_BLOCKVECTOR (cust
) == NULL
)
882 /* Add more checks here. */
886 if (! printed_objfile_start
)
888 printf_filtered ("{ objfile %s ", objfile_name (objfile
));
890 printf_filtered ("((struct objfile *) %s)\n",
891 host_address_to_string (objfile
));
892 printed_objfile_start
= 1;
894 printf_filtered (" { symtab %s\n",
895 symtab_to_filename_for_display (symtab
));
896 if (COMPUNIT_BLOCKVECTOR (cust
) == NULL
)
897 printf_filtered (" NULL blockvector\n");
898 printf_filtered (" }\n");
902 if (printed_objfile_start
)
903 printf_filtered ("}\n");
907 /* Expand all symbol tables whose name matches an optional regexp. */
910 maintenance_expand_symtabs (const char *args
, int from_tty
)
912 struct program_space
*pspace
;
915 /* We use buildargv here so that we handle spaces in the regexp
916 in a way that allows adding more arguments later. */
917 gdb_argv
argv (args
);
925 error (_("Extra arguments after regexp."));
933 for (objfile
*objfile
: all_objfiles (pspace
))
937 objfile
->sf
->qf
->expand_symtabs_matching
939 [&] (const char *filename
, bool basenames
)
941 /* KISS: Only apply the regexp to the complete file name. */
943 && (regexp
== NULL
|| re_exec (filename
)));
945 lookup_name_info::match_any (),
946 [] (const char *symname
)
948 /* Since we're not searching on symbols, just return true. */
958 /* Return the nexting depth of a block within other blocks in its symtab. */
961 block_depth (struct block
*block
)
965 while ((block
= BLOCK_SUPERBLOCK (block
)) != NULL
)
973 /* Used by MAINTENANCE_INFO_LINE_TABLES to print the information about a
974 single line table. */
977 maintenance_print_one_line_table (struct symtab
*symtab
, void *data
)
979 struct linetable
*linetable
;
980 struct objfile
*objfile
;
982 objfile
= symtab
->compunit_symtab
->objfile
;
983 printf_filtered (_("objfile: %s ((struct objfile *) %s)\n"),
984 objfile_name (objfile
),
985 host_address_to_string (objfile
));
986 printf_filtered (_("compunit_symtab: ((struct compunit_symtab *) %s)\n"),
987 host_address_to_string (symtab
->compunit_symtab
));
988 printf_filtered (_("symtab: %s ((struct symtab *) %s)\n"),
989 symtab_to_fullname (symtab
),
990 host_address_to_string (symtab
));
991 linetable
= SYMTAB_LINETABLE (symtab
);
992 printf_filtered (_("linetable: ((struct linetable *) %s):\n"),
993 host_address_to_string (linetable
));
995 if (linetable
== NULL
)
996 printf_filtered (_("No line table.\n"));
997 else if (linetable
->nitems
<= 0)
998 printf_filtered (_("Line table has no lines.\n"));
1003 /* Leave space for 6 digits of index and line number. After that the
1004 tables will just not format as well. */
1005 printf_filtered (_("%-6s %6s %s\n"),
1006 _("INDEX"), _("LINE"), _("ADDRESS"));
1008 for (i
= 0; i
< linetable
->nitems
; ++i
)
1010 struct linetable_entry
*item
;
1012 item
= &linetable
->item
[i
];
1013 printf_filtered (_("%-6d %6d %s\n"), i
, item
->line
,
1014 core_addr_to_string (item
->pc
));
1021 /* Implement the 'maint info line-table' command. */
1024 maintenance_info_line_tables (const char *regexp
, int from_tty
)
1026 struct program_space
*pspace
;
1033 ALL_PSPACES (pspace
)
1034 for (objfile
*objfile
: all_objfiles (pspace
))
1036 struct compunit_symtab
*cust
;
1037 struct symtab
*symtab
;
1039 ALL_OBJFILE_COMPUNITS (objfile
, cust
)
1041 ALL_COMPUNIT_FILETABS (cust
, symtab
)
1046 || re_exec (symtab_to_filename_for_display (symtab
)))
1047 maintenance_print_one_line_table (symtab
, NULL
);
1055 /* Do early runtime initializations. */
1058 _initialize_symmisc (void)
1064 add_cmd ("symbols", class_maintenance
, maintenance_print_symbols
, _("\
1065 Print dump of current symbol definitions.\n\
1066 Usage: mt print symbols [-pc ADDRESS] [--] [OUTFILE]\n\
1067 mt print symbols [-objfile OBJFILE] [-source SOURCE] [--] [OUTFILE]\n\
1068 Entries in the full symbol table are dumped to file OUTFILE,\n\
1069 or the terminal if OUTFILE is unspecified.\n\
1070 If ADDRESS is provided, dump only the file for that address.\n\
1071 If SOURCE is provided, dump only that file's symbols.\n\
1072 If OBJFILE is provided, dump only that file's minimal symbols."),
1073 &maintenanceprintlist
);
1075 add_cmd ("msymbols", class_maintenance
, maintenance_print_msymbols
, _("\
1076 Print dump of current minimal symbol definitions.\n\
1077 Usage: mt print msymbols [-objfile OBJFILE] [--] [OUTFILE]\n\
1078 Entries in the minimal symbol table are dumped to file OUTFILE,\n\
1079 or the terminal if OUTFILE is unspecified.\n\
1080 If OBJFILE is provided, dump only that file's minimal symbols."),
1081 &maintenanceprintlist
);
1083 add_cmd ("objfiles", class_maintenance
, maintenance_print_objfiles
,
1084 _("Print dump of current object file definitions.\n\
1085 With an argument REGEXP, list the object files with matching names."),
1086 &maintenanceprintlist
);
1088 add_cmd ("symtabs", class_maintenance
, maintenance_info_symtabs
, _("\
1089 List the full symbol tables for all object files.\n\
1090 This does not include information about individual symbols, blocks, or\n\
1091 linetables --- just the symbol table structures themselves.\n\
1092 With an argument REGEXP, list the symbol tables with matching names."),
1093 &maintenanceinfolist
);
1095 add_cmd ("line-table", class_maintenance
, maintenance_info_line_tables
, _("\
1096 List the contents of all line tables, from all symbol tables.\n\
1097 With an argument REGEXP, list just the line tables for the symbol\n\
1098 tables with matching names."),
1099 &maintenanceinfolist
);
1101 add_cmd ("check-symtabs", class_maintenance
, maintenance_check_symtabs
,
1103 Check consistency of currently expanded symtabs."),
1106 add_cmd ("expand-symtabs", class_maintenance
, maintenance_expand_symtabs
,
1107 _("Expand symbol tables.\n\
1108 With an argument REGEXP, only expand the symbol tables with matching names."),