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 int i
, linetables
, blockvectors
;
88 for (objfile
*objfile
: all_objfiles (pspace
))
91 printf_filtered (_("Statistics for '%s':\n"), objfile_name (objfile
));
92 if (OBJSTAT (objfile
, n_stabs
) > 0)
93 printf_filtered (_(" Number of \"stab\" symbols read: %d\n"),
94 OBJSTAT (objfile
, n_stabs
));
95 if (objfile
->per_bfd
->n_minsyms
> 0)
96 printf_filtered (_(" Number of \"minimal\" symbols read: %d\n"),
97 objfile
->per_bfd
->n_minsyms
);
98 if (OBJSTAT (objfile
, n_psyms
) > 0)
99 printf_filtered (_(" Number of \"partial\" symbols read: %d\n"),
100 OBJSTAT (objfile
, n_psyms
));
101 if (OBJSTAT (objfile
, n_syms
) > 0)
102 printf_filtered (_(" Number of \"full\" symbols read: %d\n"),
103 OBJSTAT (objfile
, n_syms
));
104 if (OBJSTAT (objfile
, n_types
) > 0)
105 printf_filtered (_(" Number of \"types\" defined: %d\n"),
106 OBJSTAT (objfile
, n_types
));
108 objfile
->sf
->qf
->print_stats (objfile
);
110 for (compunit_symtab
*cu
: objfile_compunits (objfile
))
112 for (symtab
*s
: compunit_filetabs (cu
))
115 if (SYMTAB_LINETABLE (s
) != NULL
)
119 blockvectors
= std::distance (objfile_compunits (objfile
).begin (),
120 objfile_compunits (objfile
).end ());
121 printf_filtered (_(" Number of symbol tables: %d\n"), i
);
122 printf_filtered (_(" Number of symbol tables with line tables: %d\n"),
124 printf_filtered (_(" Number of symbol tables with blockvectors: %d\n"),
127 if (OBJSTAT (objfile
, sz_strtab
) > 0)
128 printf_filtered (_(" Space used by string tables: %d\n"),
129 OBJSTAT (objfile
, sz_strtab
));
130 printf_filtered (_(" Total memory used for objfile obstack: %s\n"),
131 pulongest (obstack_memory_used (&objfile
132 ->objfile_obstack
)));
133 printf_filtered (_(" Total memory used for BFD obstack: %s\n"),
134 pulongest (obstack_memory_used (&objfile
->per_bfd
135 ->storage_obstack
)));
136 printf_filtered (_(" Total memory used for psymbol cache: %d\n"),
137 bcache_memory_used (psymbol_bcache_get_bcache
138 (objfile
->psymbol_cache
)));
139 printf_filtered (_(" Total memory used for macro cache: %d\n"),
140 bcache_memory_used (objfile
->per_bfd
->macro_cache
));
141 printf_filtered (_(" Total memory used for file name cache: %d\n"),
142 bcache_memory_used (objfile
->per_bfd
->filename_cache
));
147 dump_objfile (struct objfile
*objfile
)
149 printf_filtered ("\nObject file %s: ", objfile_name (objfile
));
150 printf_filtered ("Objfile at ");
151 gdb_print_host_address (objfile
, gdb_stdout
);
152 printf_filtered (", bfd at ");
153 gdb_print_host_address (objfile
->obfd
, gdb_stdout
);
154 printf_filtered (", %d minsyms\n\n",
155 objfile
->per_bfd
->minimal_symbol_count
);
158 objfile
->sf
->qf
->dump (objfile
);
160 if (objfile
->compunit_symtabs
!= NULL
)
162 printf_filtered ("Symtabs:\n");
163 for (compunit_symtab
*cu
: objfile_compunits (objfile
))
165 for (symtab
*symtab
: compunit_filetabs (cu
))
167 printf_filtered ("%s at ",
168 symtab_to_filename_for_display (symtab
));
169 gdb_print_host_address (symtab
, gdb_stdout
);
170 printf_filtered (", ");
171 if (SYMTAB_OBJFILE (symtab
) != objfile
)
173 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
);
191 fprintf_filtered (outfile
, "\nObject file %s:\n\n", objfile_name (objfile
));
192 if (objfile
->per_bfd
->minimal_symbol_count
== 0)
194 fprintf_filtered (outfile
, "No minimal symbols found.\n");
198 for (minimal_symbol
*msymbol
: objfile_msymbols (objfile
))
200 struct obj_section
*section
= MSYMBOL_OBJ_SECTION (objfile
, msymbol
);
202 switch (MSYMBOL_TYPE (msymbol
))
210 case mst_text_gnu_ifunc
:
211 case mst_data_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
);
476 for (objfile
*objfile
: all_objfiles (current_program_space
))
478 int print_for_objfile
= 1;
480 if (objfile_arg
!= NULL
)
482 = compare_filenames_for_search (objfile_name (objfile
),
484 if (!print_for_objfile
)
487 for (compunit_symtab
*cu
: objfile_compunits (objfile
))
489 for (symtab
*s
: compunit_filetabs (cu
))
491 int print_for_source
= 0;
494 if (source_arg
!= NULL
)
497 = compare_filenames_for_search
498 (symtab_to_filename_for_display (s
), source_arg
);
501 if (source_arg
== NULL
503 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_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
;
698 gdb_argv
argv (args
);
700 for (i
= 0; argv
!= NULL
&& argv
[i
] != NULL
; ++i
)
702 if (strcmp (argv
[i
], "-objfile") == 0)
704 if (argv
[i
+ 1] == NULL
)
705 error (_("Missing objfile name"));
706 objfile_arg
= argv
[++i
];
708 else if (strcmp (argv
[i
], "--") == 0)
710 /* End of options. */
714 else if (argv
[i
][0] == '-')
716 /* Future proofing: Don't allow OUTFILE to begin with "-". */
717 error (_("Unknown option: %s"), argv
[i
]);
724 stdio_file arg_outfile
;
726 if (argv
!= NULL
&& argv
[outfile_idx
] != NULL
)
728 if (argv
[outfile_idx
+ 1] != NULL
)
729 error (_("Junk at end of command"));
730 gdb::unique_xmalloc_ptr
<char> outfile_name
731 (tilde_expand (argv
[outfile_idx
]));
732 if (!arg_outfile
.open (outfile_name
.get (), FOPEN_WT
))
733 perror_with_name (outfile_name
.get ());
734 outfile
= &arg_outfile
;
737 for (objfile
*objfile
: all_objfiles (current_program_space
))
740 if (objfile_arg
== NULL
741 || compare_filenames_for_search (objfile_name (objfile
), objfile_arg
))
742 dump_msymbols (objfile
, outfile
);
747 maintenance_print_objfiles (const char *regexp
, int from_tty
)
749 struct program_space
*pspace
;
757 for (objfile
*objfile
: all_objfiles (pspace
))
761 || re_exec (objfile_name (objfile
)))
762 dump_objfile (objfile
);
766 /* List all the symbol tables whose names match REGEXP (optional). */
769 maintenance_info_symtabs (const char *regexp
, int from_tty
)
771 struct program_space
*pspace
;
779 for (objfile
*objfile
: all_objfiles (pspace
))
781 /* We don't want to print anything for this objfile until we
782 actually find a symtab whose name matches. */
783 int printed_objfile_start
= 0;
785 for (compunit_symtab
*cust
: objfile_compunits (objfile
))
787 int printed_compunit_symtab_start
= 0;
789 for (symtab
*symtab
: compunit_filetabs (cust
))
794 || re_exec (symtab_to_filename_for_display (symtab
)))
796 if (! printed_objfile_start
)
798 printf_filtered ("{ objfile %s ", objfile_name (objfile
));
800 printf_filtered ("((struct objfile *) %s)\n",
801 host_address_to_string (objfile
));
802 printed_objfile_start
= 1;
804 if (! printed_compunit_symtab_start
)
806 printf_filtered (" { ((struct compunit_symtab *) %s)\n",
807 host_address_to_string (cust
));
808 printf_filtered (" debugformat %s\n",
809 COMPUNIT_DEBUGFORMAT (cust
));
810 printf_filtered (" producer %s\n",
811 COMPUNIT_PRODUCER (cust
) != NULL
812 ? COMPUNIT_PRODUCER (cust
)
814 printf_filtered (" dirname %s\n",
815 COMPUNIT_DIRNAME (cust
) != NULL
816 ? COMPUNIT_DIRNAME (cust
)
818 printf_filtered (" blockvector"
819 " ((struct blockvector *) %s)\n",
820 host_address_to_string
821 (COMPUNIT_BLOCKVECTOR (cust
)));
822 printed_compunit_symtab_start
= 1;
825 printf_filtered ("\t{ symtab %s ",
826 symtab_to_filename_for_display (symtab
));
828 printf_filtered ("((struct symtab *) %s)\n",
829 host_address_to_string (symtab
));
830 printf_filtered ("\t fullname %s\n",
831 symtab
->fullname
!= NULL
834 printf_filtered ("\t "
835 "linetable ((struct linetable *) %s)\n",
836 host_address_to_string (symtab
->linetable
));
837 printf_filtered ("\t}\n");
841 if (printed_compunit_symtab_start
)
842 printf_filtered (" }\n");
845 if (printed_objfile_start
)
846 printf_filtered ("}\n");
850 /* Check consistency of symtabs.
851 An example of what this checks for is NULL blockvectors.
852 They can happen if there's a bug during debug info reading.
853 GDB assumes they are always non-NULL.
855 Note: This does not check for psymtab vs symtab consistency.
856 Use "maint check-psymtabs" for that. */
859 maintenance_check_symtabs (const char *ignore
, int from_tty
)
861 struct program_space
*pspace
;
864 for (objfile
*objfile
: all_objfiles (pspace
))
866 /* We don't want to print anything for this objfile until we
867 actually find something worth printing. */
868 int printed_objfile_start
= 0;
870 for (compunit_symtab
*cust
: objfile_compunits (objfile
))
872 int found_something
= 0;
873 struct symtab
*symtab
= compunit_primary_filetab (cust
);
877 if (COMPUNIT_BLOCKVECTOR (cust
) == NULL
)
879 /* Add more checks here. */
883 if (! printed_objfile_start
)
885 printf_filtered ("{ objfile %s ", objfile_name (objfile
));
887 printf_filtered ("((struct objfile *) %s)\n",
888 host_address_to_string (objfile
));
889 printed_objfile_start
= 1;
891 printf_filtered (" { symtab %s\n",
892 symtab_to_filename_for_display (symtab
));
893 if (COMPUNIT_BLOCKVECTOR (cust
) == NULL
)
894 printf_filtered (" NULL blockvector\n");
895 printf_filtered (" }\n");
899 if (printed_objfile_start
)
900 printf_filtered ("}\n");
904 /* Expand all symbol tables whose name matches an optional regexp. */
907 maintenance_expand_symtabs (const char *args
, int from_tty
)
909 struct program_space
*pspace
;
912 /* We use buildargv here so that we handle spaces in the regexp
913 in a way that allows adding more arguments later. */
914 gdb_argv
argv (args
);
922 error (_("Extra arguments after regexp."));
930 for (objfile
*objfile
: all_objfiles (pspace
))
934 objfile
->sf
->qf
->expand_symtabs_matching
936 [&] (const char *filename
, bool basenames
)
938 /* KISS: Only apply the regexp to the complete file name. */
940 && (regexp
== NULL
|| re_exec (filename
)));
942 lookup_name_info::match_any (),
943 [] (const char *symname
)
945 /* Since we're not searching on symbols, just return true. */
955 /* Return the nexting depth of a block within other blocks in its symtab. */
958 block_depth (struct block
*block
)
962 while ((block
= BLOCK_SUPERBLOCK (block
)) != NULL
)
970 /* Used by MAINTENANCE_INFO_LINE_TABLES to print the information about a
971 single line table. */
974 maintenance_print_one_line_table (struct symtab
*symtab
, void *data
)
976 struct linetable
*linetable
;
977 struct objfile
*objfile
;
979 objfile
= symtab
->compunit_symtab
->objfile
;
980 printf_filtered (_("objfile: %s ((struct objfile *) %s)\n"),
981 objfile_name (objfile
),
982 host_address_to_string (objfile
));
983 printf_filtered (_("compunit_symtab: ((struct compunit_symtab *) %s)\n"),
984 host_address_to_string (symtab
->compunit_symtab
));
985 printf_filtered (_("symtab: %s ((struct symtab *) %s)\n"),
986 symtab_to_fullname (symtab
),
987 host_address_to_string (symtab
));
988 linetable
= SYMTAB_LINETABLE (symtab
);
989 printf_filtered (_("linetable: ((struct linetable *) %s):\n"),
990 host_address_to_string (linetable
));
992 if (linetable
== NULL
)
993 printf_filtered (_("No line table.\n"));
994 else if (linetable
->nitems
<= 0)
995 printf_filtered (_("Line table has no lines.\n"));
1000 /* Leave space for 6 digits of index and line number. After that the
1001 tables will just not format as well. */
1002 printf_filtered (_("%-6s %6s %s\n"),
1003 _("INDEX"), _("LINE"), _("ADDRESS"));
1005 for (i
= 0; i
< linetable
->nitems
; ++i
)
1007 struct linetable_entry
*item
;
1009 item
= &linetable
->item
[i
];
1010 printf_filtered (_("%-6d %6d %s\n"), i
, item
->line
,
1011 core_addr_to_string (item
->pc
));
1018 /* Implement the 'maint info line-table' command. */
1021 maintenance_info_line_tables (const char *regexp
, int from_tty
)
1023 struct program_space
*pspace
;
1030 ALL_PSPACES (pspace
)
1031 for (objfile
*objfile
: all_objfiles (pspace
))
1033 for (compunit_symtab
*cust
: objfile_compunits (objfile
))
1035 for (symtab
*symtab
: compunit_filetabs (cust
))
1040 || re_exec (symtab_to_filename_for_display (symtab
)))
1041 maintenance_print_one_line_table (symtab
, NULL
);
1049 /* Do early runtime initializations. */
1052 _initialize_symmisc (void)
1058 add_cmd ("symbols", class_maintenance
, maintenance_print_symbols
, _("\
1059 Print dump of current symbol definitions.\n\
1060 Usage: mt print symbols [-pc ADDRESS] [--] [OUTFILE]\n\
1061 mt print symbols [-objfile OBJFILE] [-source SOURCE] [--] [OUTFILE]\n\
1062 Entries in the full symbol table are dumped to file OUTFILE,\n\
1063 or the terminal if OUTFILE is unspecified.\n\
1064 If ADDRESS is provided, dump only the file for that address.\n\
1065 If SOURCE is provided, dump only that file's symbols.\n\
1066 If OBJFILE is provided, dump only that file's minimal symbols."),
1067 &maintenanceprintlist
);
1069 add_cmd ("msymbols", class_maintenance
, maintenance_print_msymbols
, _("\
1070 Print dump of current minimal symbol definitions.\n\
1071 Usage: mt print msymbols [-objfile OBJFILE] [--] [OUTFILE]\n\
1072 Entries in the minimal symbol table are dumped to file OUTFILE,\n\
1073 or the terminal if OUTFILE is unspecified.\n\
1074 If OBJFILE is provided, dump only that file's minimal symbols."),
1075 &maintenanceprintlist
);
1077 add_cmd ("objfiles", class_maintenance
, maintenance_print_objfiles
,
1078 _("Print dump of current object file definitions.\n\
1079 With an argument REGEXP, list the object files with matching names."),
1080 &maintenanceprintlist
);
1082 add_cmd ("symtabs", class_maintenance
, maintenance_info_symtabs
, _("\
1083 List the full symbol tables for all object files.\n\
1084 This does not include information about individual symbols, blocks, or\n\
1085 linetables --- just the symbol table structures themselves.\n\
1086 With an argument REGEXP, list the symbol tables with matching names."),
1087 &maintenanceinfolist
);
1089 add_cmd ("line-table", class_maintenance
, maintenance_info_line_tables
, _("\
1090 List the contents of all line tables, from all symbol tables.\n\
1091 With an argument REGEXP, list just the line tables for the symbol\n\
1092 tables with matching names."),
1093 &maintenanceinfolist
);
1095 add_cmd ("check-symtabs", class_maintenance
, maintenance_check_symtabs
,
1097 Check consistency of currently expanded symtabs."),
1100 add_cmd ("expand-symtabs", class_maintenance
, maintenance_expand_symtabs
,
1101 _("Expand symbol tables.\n\
1102 With an argument REGEXP, only expand the symbol tables with matching names."),