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 (const 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
: pspace
->objfiles ())
70 printf_filtered (_("Byte cache statistics for '%s':\n"),
71 objfile_name (objfile
));
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");
81 print_objfile_statistics (void)
83 struct program_space
*pspace
;
84 int i
, linetables
, blockvectors
;
87 for (objfile
*objfile
: pspace
->objfiles ())
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
));
107 objfile
->sf
->qf
->print_stats (objfile
);
109 for (compunit_symtab
*cu
: objfile
->compunits ())
111 for (symtab
*s
: compunit_filetabs (cu
))
114 if (SYMTAB_LINETABLE (s
) != NULL
)
118 blockvectors
= std::distance (objfile
->compunits ().begin (),
119 objfile
->compunits ().end ());
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
)));
136 (_(" Total memory used for psymbol cache: %d\n"),
137 objfile
->partial_symtabs
->psymbol_cache
.memory_used ());
138 printf_filtered (_(" Total memory used for macro cache: %d\n"),
139 objfile
->per_bfd
->macro_cache
.memory_used ());
140 printf_filtered (_(" Total memory used for file name cache: %d\n"),
141 objfile
->per_bfd
->filename_cache
.memory_used ());
146 dump_objfile (struct objfile
*objfile
)
148 printf_filtered ("\nObject file %s: ", objfile_name (objfile
));
149 printf_filtered ("Objfile at ");
150 gdb_print_host_address (objfile
, gdb_stdout
);
151 printf_filtered (", bfd at ");
152 gdb_print_host_address (objfile
->obfd
, gdb_stdout
);
153 printf_filtered (", %d minsyms\n\n",
154 objfile
->per_bfd
->minimal_symbol_count
);
157 objfile
->sf
->qf
->dump (objfile
);
159 if (objfile
->compunit_symtabs
!= NULL
)
161 printf_filtered ("Symtabs:\n");
162 for (compunit_symtab
*cu
: objfile
->compunits ())
164 for (symtab
*symtab
: compunit_filetabs (cu
))
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
)
172 printf_filtered ("NOT ON CHAIN! ");
177 printf_filtered ("\n\n");
181 /* Print minimal symbols from this objfile. */
184 dump_msymbols (struct objfile
*objfile
, struct ui_file
*outfile
)
186 struct gdbarch
*gdbarch
= get_objfile_arch (objfile
);
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 for (minimal_symbol
*msymbol
: objfile
->msymbols ())
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 mdict_iterator miter
;
279 const struct blockvector
*bv
;
281 const struct block
*b
;
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 mdict_size (BLOCK_MULTIDICT (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_MULTIDICT (b
), miter
, sym
)
354 print_symbol (gdbarch
, sym
, depth
+ 1, outfile
);
356 catch (const gdb_exception_error
&ex
)
358 exception_fprintf (gdb_stderr
, ex
,
359 "Error printing symbol:\n");
363 fprintf_filtered (outfile
, "\n");
367 const char *compunit_filename
368 = symtab_to_filename_for_display (COMPUNIT_FILETABS (SYMTAB_COMPUNIT (symtab
)));
370 fprintf_filtered (outfile
,
371 "\nBlockvector same as owning compunit: %s\n\n",
377 dump_symtab (struct symtab
*symtab
, struct ui_file
*outfile
)
379 /* Set the current language to the language of the symtab we're dumping
380 because certain routines used during dump_symtab() use the current
381 language to print an image of the symbol. We'll restore it later.
382 But use only real languages, not placeholders. */
383 if (symtab
->language
!= language_unknown
384 && symtab
->language
!= language_auto
)
386 scoped_restore_current_language save_lang
;
387 set_language (symtab
->language
);
388 dump_symtab_1 (symtab
, outfile
);
391 dump_symtab_1 (symtab
, outfile
);
395 maintenance_print_symbols (const char *args
, int from_tty
)
397 struct ui_file
*outfile
= gdb_stdout
;
398 char *address_arg
= NULL
, *source_arg
= NULL
, *objfile_arg
= NULL
;
403 gdb_argv
argv (args
);
405 for (i
= 0; argv
!= NULL
&& argv
[i
] != NULL
; ++i
)
407 if (strcmp (argv
[i
], "-pc") == 0)
409 if (argv
[i
+ 1] == NULL
)
410 error (_("Missing pc value"));
411 address_arg
= argv
[++i
];
413 else if (strcmp (argv
[i
], "-source") == 0)
415 if (argv
[i
+ 1] == NULL
)
416 error (_("Missing source file"));
417 source_arg
= argv
[++i
];
419 else if (strcmp (argv
[i
], "-objfile") == 0)
421 if (argv
[i
+ 1] == NULL
)
422 error (_("Missing objfile name"));
423 objfile_arg
= argv
[++i
];
425 else if (strcmp (argv
[i
], "--") == 0)
427 /* End of options. */
431 else if (argv
[i
][0] == '-')
433 /* Future proofing: Don't allow OUTFILE to begin with "-". */
434 error (_("Unknown option: %s"), argv
[i
]);
441 if (address_arg
!= NULL
&& source_arg
!= NULL
)
442 error (_("Must specify at most one of -pc and -source"));
444 stdio_file arg_outfile
;
446 if (argv
!= NULL
&& argv
[outfile_idx
] != NULL
)
448 if (argv
[outfile_idx
+ 1] != NULL
)
449 error (_("Junk at end of command"));
450 gdb::unique_xmalloc_ptr
<char> outfile_name
451 (tilde_expand (argv
[outfile_idx
]));
452 if (!arg_outfile
.open (outfile_name
.get (), FOPEN_WT
))
453 perror_with_name (outfile_name
.get ());
454 outfile
= &arg_outfile
;
457 if (address_arg
!= NULL
)
459 CORE_ADDR pc
= parse_and_eval_address (address_arg
);
460 struct symtab
*s
= find_pc_line_symtab (pc
);
463 error (_("No symtab for address: %s"), address_arg
);
464 dump_symtab (s
, outfile
);
470 for (objfile
*objfile
: current_program_space
->objfiles ())
472 int print_for_objfile
= 1;
474 if (objfile_arg
!= NULL
)
476 = compare_filenames_for_search (objfile_name (objfile
),
478 if (!print_for_objfile
)
481 for (compunit_symtab
*cu
: objfile
->compunits ())
483 for (symtab
*s
: compunit_filetabs (cu
))
485 int print_for_source
= 0;
488 if (source_arg
!= NULL
)
491 = compare_filenames_for_search
492 (symtab_to_filename_for_display (s
), source_arg
);
495 if (source_arg
== NULL
497 dump_symtab (s
, outfile
);
502 if (source_arg
!= NULL
&& !found
)
503 error (_("No symtab for source file: %s"), source_arg
);
507 /* Print symbol SYMBOL on OUTFILE. DEPTH says how far to indent. */
510 print_symbol (struct gdbarch
*gdbarch
, struct symbol
*symbol
,
511 int depth
, ui_file
*outfile
)
513 struct obj_section
*section
;
515 if (SYMBOL_OBJFILE_OWNED (symbol
))
516 section
= SYMBOL_OBJ_SECTION (symbol_objfile (symbol
), symbol
);
520 print_spaces (depth
, outfile
);
521 if (SYMBOL_DOMAIN (symbol
) == LABEL_DOMAIN
)
523 fprintf_filtered (outfile
, "label %s at ", SYMBOL_PRINT_NAME (symbol
));
524 fputs_filtered (paddress (gdbarch
, SYMBOL_VALUE_ADDRESS (symbol
)),
527 fprintf_filtered (outfile
, " section %s\n",
528 bfd_section_name (section
->the_bfd_section
->owner
,
529 section
->the_bfd_section
));
531 fprintf_filtered (outfile
, "\n");
535 if (SYMBOL_DOMAIN (symbol
) == STRUCT_DOMAIN
)
537 if (TYPE_NAME (SYMBOL_TYPE (symbol
)))
539 LA_PRINT_TYPE (SYMBOL_TYPE (symbol
), "", outfile
, 1, depth
,
540 &type_print_raw_options
);
544 fprintf_filtered (outfile
, "%s %s = ",
545 (TYPE_CODE (SYMBOL_TYPE (symbol
)) == TYPE_CODE_ENUM
547 : (TYPE_CODE (SYMBOL_TYPE (symbol
)) == TYPE_CODE_STRUCT
548 ? "struct" : "union")),
549 SYMBOL_LINKAGE_NAME (symbol
));
550 LA_PRINT_TYPE (SYMBOL_TYPE (symbol
), "", outfile
, 1, depth
,
551 &type_print_raw_options
);
553 fprintf_filtered (outfile
, ";\n");
557 if (SYMBOL_CLASS (symbol
) == LOC_TYPEDEF
)
558 fprintf_filtered (outfile
, "typedef ");
559 if (SYMBOL_TYPE (symbol
))
561 /* Print details of types, except for enums where it's clutter. */
562 LA_PRINT_TYPE (SYMBOL_TYPE (symbol
), SYMBOL_PRINT_NAME (symbol
),
564 TYPE_CODE (SYMBOL_TYPE (symbol
)) != TYPE_CODE_ENUM
,
566 &type_print_raw_options
);
567 fprintf_filtered (outfile
, "; ");
570 fprintf_filtered (outfile
, "%s ", SYMBOL_PRINT_NAME (symbol
));
572 switch (SYMBOL_CLASS (symbol
))
575 fprintf_filtered (outfile
, "const %s (%s)",
576 plongest (SYMBOL_VALUE (symbol
)),
577 hex_string (SYMBOL_VALUE (symbol
)));
580 case LOC_CONST_BYTES
:
583 struct type
*type
= check_typedef (SYMBOL_TYPE (symbol
));
585 fprintf_filtered (outfile
, "const %s hex bytes:",
586 pulongest (TYPE_LENGTH (type
)));
587 for (i
= 0; i
< TYPE_LENGTH (type
); i
++)
588 fprintf_filtered (outfile
, " %02x",
589 (unsigned) SYMBOL_VALUE_BYTES (symbol
)[i
]);
594 fprintf_filtered (outfile
, "static at ");
595 fputs_filtered (paddress (gdbarch
, SYMBOL_VALUE_ADDRESS (symbol
)),
598 fprintf_filtered (outfile
, " section %s",
599 bfd_section_name (section
->the_bfd_section
->owner
,
600 section
->the_bfd_section
));
604 if (SYMBOL_IS_ARGUMENT (symbol
))
605 fprintf_filtered (outfile
, "parameter register %s",
606 plongest (SYMBOL_VALUE (symbol
)));
608 fprintf_filtered (outfile
, "register %s",
609 plongest (SYMBOL_VALUE (symbol
)));
613 fprintf_filtered (outfile
, "arg at offset %s",
614 hex_string (SYMBOL_VALUE (symbol
)));
618 fprintf_filtered (outfile
, "reference arg at %s",
619 hex_string (SYMBOL_VALUE (symbol
)));
622 case LOC_REGPARM_ADDR
:
623 fprintf_filtered (outfile
, "address parameter register %s",
624 plongest (SYMBOL_VALUE (symbol
)));
628 fprintf_filtered (outfile
, "local at offset %s",
629 hex_string (SYMBOL_VALUE (symbol
)));
636 fprintf_filtered (outfile
, "label at ");
637 fputs_filtered (paddress (gdbarch
, SYMBOL_VALUE_ADDRESS (symbol
)),
640 fprintf_filtered (outfile
, " section %s",
641 bfd_section_name (section
->the_bfd_section
->owner
,
642 section
->the_bfd_section
));
646 fprintf_filtered (outfile
, "block object ");
647 gdb_print_host_address (SYMBOL_BLOCK_VALUE (symbol
), outfile
);
648 fprintf_filtered (outfile
, ", ");
649 fputs_filtered (paddress (gdbarch
,
650 BLOCK_START (SYMBOL_BLOCK_VALUE (symbol
))),
652 fprintf_filtered (outfile
, "..");
653 fputs_filtered (paddress (gdbarch
,
654 BLOCK_END (SYMBOL_BLOCK_VALUE (symbol
))),
657 fprintf_filtered (outfile
, " section %s",
658 bfd_section_name (section
->the_bfd_section
->owner
,
659 section
->the_bfd_section
));
663 fprintf_filtered (outfile
, "computed at runtime");
667 fprintf_filtered (outfile
, "unresolved");
670 case LOC_OPTIMIZED_OUT
:
671 fprintf_filtered (outfile
, "optimized out");
675 fprintf_filtered (outfile
, "botched symbol class %x",
676 SYMBOL_CLASS (symbol
));
680 fprintf_filtered (outfile
, "\n");
684 maintenance_print_msymbols (const char *args
, int from_tty
)
686 struct ui_file
*outfile
= gdb_stdout
;
687 char *objfile_arg
= NULL
;
692 gdb_argv
argv (args
);
694 for (i
= 0; argv
!= NULL
&& argv
[i
] != NULL
; ++i
)
696 if (strcmp (argv
[i
], "-objfile") == 0)
698 if (argv
[i
+ 1] == NULL
)
699 error (_("Missing objfile name"));
700 objfile_arg
= argv
[++i
];
702 else if (strcmp (argv
[i
], "--") == 0)
704 /* End of options. */
708 else if (argv
[i
][0] == '-')
710 /* Future proofing: Don't allow OUTFILE to begin with "-". */
711 error (_("Unknown option: %s"), argv
[i
]);
718 stdio_file arg_outfile
;
720 if (argv
!= NULL
&& argv
[outfile_idx
] != NULL
)
722 if (argv
[outfile_idx
+ 1] != NULL
)
723 error (_("Junk at end of command"));
724 gdb::unique_xmalloc_ptr
<char> outfile_name
725 (tilde_expand (argv
[outfile_idx
]));
726 if (!arg_outfile
.open (outfile_name
.get (), FOPEN_WT
))
727 perror_with_name (outfile_name
.get ());
728 outfile
= &arg_outfile
;
731 for (objfile
*objfile
: current_program_space
->objfiles ())
734 if (objfile_arg
== NULL
735 || compare_filenames_for_search (objfile_name (objfile
), objfile_arg
))
736 dump_msymbols (objfile
, outfile
);
741 maintenance_print_objfiles (const char *regexp
, int from_tty
)
743 struct program_space
*pspace
;
751 for (objfile
*objfile
: pspace
->objfiles ())
755 || re_exec (objfile_name (objfile
)))
756 dump_objfile (objfile
);
760 /* List all the symbol tables whose names match REGEXP (optional). */
763 maintenance_info_symtabs (const char *regexp
, int from_tty
)
765 struct program_space
*pspace
;
773 for (objfile
*objfile
: pspace
->objfiles ())
775 /* We don't want to print anything for this objfile until we
776 actually find a symtab whose name matches. */
777 int printed_objfile_start
= 0;
779 for (compunit_symtab
*cust
: objfile
->compunits ())
781 int printed_compunit_symtab_start
= 0;
783 for (symtab
*symtab
: compunit_filetabs (cust
))
788 || re_exec (symtab_to_filename_for_display (symtab
)))
790 if (! printed_objfile_start
)
792 printf_filtered ("{ objfile %s ", objfile_name (objfile
));
794 printf_filtered ("((struct objfile *) %s)\n",
795 host_address_to_string (objfile
));
796 printed_objfile_start
= 1;
798 if (! printed_compunit_symtab_start
)
800 printf_filtered (" { ((struct compunit_symtab *) %s)\n",
801 host_address_to_string (cust
));
802 printf_filtered (" debugformat %s\n",
803 COMPUNIT_DEBUGFORMAT (cust
));
804 printf_filtered (" producer %s\n",
805 COMPUNIT_PRODUCER (cust
) != NULL
806 ? COMPUNIT_PRODUCER (cust
)
808 printf_filtered (" dirname %s\n",
809 COMPUNIT_DIRNAME (cust
) != NULL
810 ? COMPUNIT_DIRNAME (cust
)
812 printf_filtered (" blockvector"
813 " ((struct blockvector *) %s)\n",
814 host_address_to_string
815 (COMPUNIT_BLOCKVECTOR (cust
)));
816 printed_compunit_symtab_start
= 1;
819 printf_filtered ("\t{ symtab %s ",
820 symtab_to_filename_for_display (symtab
));
822 printf_filtered ("((struct symtab *) %s)\n",
823 host_address_to_string (symtab
));
824 printf_filtered ("\t fullname %s\n",
825 symtab
->fullname
!= NULL
828 printf_filtered ("\t "
829 "linetable ((struct linetable *) %s)\n",
830 host_address_to_string (symtab
->linetable
));
831 printf_filtered ("\t}\n");
835 if (printed_compunit_symtab_start
)
836 printf_filtered (" }\n");
839 if (printed_objfile_start
)
840 printf_filtered ("}\n");
844 /* Check consistency of symtabs.
845 An example of what this checks for is NULL blockvectors.
846 They can happen if there's a bug during debug info reading.
847 GDB assumes they are always non-NULL.
849 Note: This does not check for psymtab vs symtab consistency.
850 Use "maint check-psymtabs" for that. */
853 maintenance_check_symtabs (const char *ignore
, int from_tty
)
855 struct program_space
*pspace
;
858 for (objfile
*objfile
: pspace
->objfiles ())
860 /* We don't want to print anything for this objfile until we
861 actually find something worth printing. */
862 int printed_objfile_start
= 0;
864 for (compunit_symtab
*cust
: objfile
->compunits ())
866 int found_something
= 0;
867 struct symtab
*symtab
= compunit_primary_filetab (cust
);
871 if (COMPUNIT_BLOCKVECTOR (cust
) == NULL
)
873 /* Add more checks here. */
877 if (! printed_objfile_start
)
879 printf_filtered ("{ objfile %s ", objfile_name (objfile
));
881 printf_filtered ("((struct objfile *) %s)\n",
882 host_address_to_string (objfile
));
883 printed_objfile_start
= 1;
885 printf_filtered (" { symtab %s\n",
886 symtab_to_filename_for_display (symtab
));
887 if (COMPUNIT_BLOCKVECTOR (cust
) == NULL
)
888 printf_filtered (" NULL blockvector\n");
889 printf_filtered (" }\n");
893 if (printed_objfile_start
)
894 printf_filtered ("}\n");
898 /* Expand all symbol tables whose name matches an optional regexp. */
901 maintenance_expand_symtabs (const char *args
, int from_tty
)
903 struct program_space
*pspace
;
906 /* We use buildargv here so that we handle spaces in the regexp
907 in a way that allows adding more arguments later. */
908 gdb_argv
argv (args
);
916 error (_("Extra arguments after regexp."));
924 for (objfile
*objfile
: pspace
->objfiles ())
928 objfile
->sf
->qf
->expand_symtabs_matching
930 [&] (const char *filename
, bool basenames
)
932 /* KISS: Only apply the regexp to the complete file name. */
934 && (regexp
== NULL
|| re_exec (filename
)));
936 lookup_name_info::match_any (),
937 [] (const char *symname
)
939 /* Since we're not searching on symbols, just return true. */
949 /* Return the nexting depth of a block within other blocks in its symtab. */
952 block_depth (const struct block
*block
)
956 while ((block
= BLOCK_SUPERBLOCK (block
)) != NULL
)
964 /* Used by MAINTENANCE_INFO_LINE_TABLES to print the information about a
965 single line table. */
968 maintenance_print_one_line_table (struct symtab
*symtab
, void *data
)
970 struct linetable
*linetable
;
971 struct objfile
*objfile
;
973 objfile
= symtab
->compunit_symtab
->objfile
;
974 printf_filtered (_("objfile: %s ((struct objfile *) %s)\n"),
975 objfile_name (objfile
),
976 host_address_to_string (objfile
));
977 printf_filtered (_("compunit_symtab: ((struct compunit_symtab *) %s)\n"),
978 host_address_to_string (symtab
->compunit_symtab
));
979 printf_filtered (_("symtab: %s ((struct symtab *) %s)\n"),
980 symtab_to_fullname (symtab
),
981 host_address_to_string (symtab
));
982 linetable
= SYMTAB_LINETABLE (symtab
);
983 printf_filtered (_("linetable: ((struct linetable *) %s):\n"),
984 host_address_to_string (linetable
));
986 if (linetable
== NULL
)
987 printf_filtered (_("No line table.\n"));
988 else if (linetable
->nitems
<= 0)
989 printf_filtered (_("Line table has no lines.\n"));
994 /* Leave space for 6 digits of index and line number. After that the
995 tables will just not format as well. */
996 printf_filtered (_("%-6s %6s %s\n"),
997 _("INDEX"), _("LINE"), _("ADDRESS"));
999 for (i
= 0; i
< linetable
->nitems
; ++i
)
1001 struct linetable_entry
*item
;
1003 item
= &linetable
->item
[i
];
1004 printf_filtered (_("%-6d %6d %s\n"), i
, item
->line
,
1005 core_addr_to_string (item
->pc
));
1012 /* Implement the 'maint info line-table' command. */
1015 maintenance_info_line_tables (const char *regexp
, int from_tty
)
1017 struct program_space
*pspace
;
1024 ALL_PSPACES (pspace
)
1025 for (objfile
*objfile
: pspace
->objfiles ())
1027 for (compunit_symtab
*cust
: objfile
->compunits ())
1029 for (symtab
*symtab
: compunit_filetabs (cust
))
1034 || re_exec (symtab_to_filename_for_display (symtab
)))
1035 maintenance_print_one_line_table (symtab
, NULL
);
1043 /* Do early runtime initializations. */
1046 _initialize_symmisc (void)
1052 add_cmd ("symbols", class_maintenance
, maintenance_print_symbols
, _("\
1053 Print dump of current symbol definitions.\n\
1054 Usage: mt print symbols [-pc ADDRESS] [--] [OUTFILE]\n\
1055 mt print symbols [-objfile OBJFILE] [-source SOURCE] [--] [OUTFILE]\n\
1056 Entries in the full symbol table are dumped to file OUTFILE,\n\
1057 or the terminal if OUTFILE is unspecified.\n\
1058 If ADDRESS is provided, dump only the file for that address.\n\
1059 If SOURCE is provided, dump only that file's symbols.\n\
1060 If OBJFILE is provided, dump only that file's minimal symbols."),
1061 &maintenanceprintlist
);
1063 add_cmd ("msymbols", class_maintenance
, maintenance_print_msymbols
, _("\
1064 Print dump of current minimal symbol definitions.\n\
1065 Usage: mt print msymbols [-objfile OBJFILE] [--] [OUTFILE]\n\
1066 Entries in the minimal symbol table are dumped to file OUTFILE,\n\
1067 or the terminal if OUTFILE is unspecified.\n\
1068 If OBJFILE is provided, dump only that file's minimal symbols."),
1069 &maintenanceprintlist
);
1071 add_cmd ("objfiles", class_maintenance
, maintenance_print_objfiles
,
1072 _("Print dump of current object file definitions.\n\
1073 With an argument REGEXP, list the object files with matching names."),
1074 &maintenanceprintlist
);
1076 add_cmd ("symtabs", class_maintenance
, maintenance_info_symtabs
, _("\
1077 List the full symbol tables for all object files.\n\
1078 This does not include information about individual symbols, blocks, or\n\
1079 linetables --- just the symbol table structures themselves.\n\
1080 With an argument REGEXP, list the symbol tables with matching names."),
1081 &maintenanceinfolist
);
1083 add_cmd ("line-table", class_maintenance
, maintenance_info_line_tables
, _("\
1084 List the contents of all line tables, from all symbol tables.\n\
1085 With an argument REGEXP, list just the line tables for the symbol\n\
1086 tables with matching names."),
1087 &maintenanceinfolist
);
1089 add_cmd ("check-symtabs", class_maintenance
, maintenance_check_symtabs
,
1091 Check consistency of currently expanded symtabs."),
1094 add_cmd ("expand-symtabs", class_maintenance
, maintenance_expand_symtabs
,
1095 _("Expand symbol tables.\n\
1096 With an argument REGEXP, only expand the symbol tables with matching names."),