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 (section
->the_bfd_section
));
249 fprintf_filtered (outfile
, " spurious section %ld",
250 (long) (section
- objfile
->sections
));
252 if (MSYMBOL_DEMANGLED_NAME (msymbol
) != NULL
)
254 fprintf_filtered (outfile
, " %s", MSYMBOL_DEMANGLED_NAME (msymbol
));
256 if (msymbol
->filename
)
257 fprintf_filtered (outfile
, " %s", msymbol
->filename
);
258 fputs_filtered ("\n", outfile
);
261 if (objfile
->per_bfd
->minimal_symbol_count
!= index
)
263 warning (_("internal error: minimal symbol count %d != %d"),
264 objfile
->per_bfd
->minimal_symbol_count
, index
);
266 fprintf_filtered (outfile
, "\n");
270 dump_symtab_1 (struct symtab
*symtab
, struct ui_file
*outfile
)
272 struct objfile
*objfile
= SYMTAB_OBJFILE (symtab
);
273 struct gdbarch
*gdbarch
= get_objfile_arch (objfile
);
275 struct mdict_iterator miter
;
278 const struct blockvector
*bv
;
280 const struct block
*b
;
283 fprintf_filtered (outfile
, "\nSymtab for file %s\n",
284 symtab_to_filename_for_display (symtab
));
285 if (SYMTAB_DIRNAME (symtab
) != NULL
)
286 fprintf_filtered (outfile
, "Compilation directory is %s\n",
287 SYMTAB_DIRNAME (symtab
));
288 fprintf_filtered (outfile
, "Read from object file %s (",
289 objfile_name (objfile
));
290 gdb_print_host_address (objfile
, outfile
);
291 fprintf_filtered (outfile
, ")\n");
292 fprintf_filtered (outfile
, "Language: %s\n",
293 language_str (symtab
->language
));
295 /* First print the line table. */
296 l
= SYMTAB_LINETABLE (symtab
);
299 fprintf_filtered (outfile
, "\nLine table:\n\n");
301 for (i
= 0; i
< len
; i
++)
303 fprintf_filtered (outfile
, " line %d at ", l
->item
[i
].line
);
304 fputs_filtered (paddress (gdbarch
, l
->item
[i
].pc
), outfile
);
305 fprintf_filtered (outfile
, "\n");
308 /* Now print the block info, but only for compunit symtabs since we will
309 print lots of duplicate info otherwise. */
310 if (symtab
== COMPUNIT_FILETABS (SYMTAB_COMPUNIT (symtab
)))
312 fprintf_filtered (outfile
, "\nBlockvector:\n\n");
313 bv
= SYMTAB_BLOCKVECTOR (symtab
);
314 len
= BLOCKVECTOR_NBLOCKS (bv
);
315 for (i
= 0; i
< len
; i
++)
317 b
= BLOCKVECTOR_BLOCK (bv
, i
);
318 depth
= block_depth (b
) * 2;
319 print_spaces (depth
, outfile
);
320 fprintf_filtered (outfile
, "block #%03d, object at ", i
);
321 gdb_print_host_address (b
, outfile
);
322 if (BLOCK_SUPERBLOCK (b
))
324 fprintf_filtered (outfile
, " under ");
325 gdb_print_host_address (BLOCK_SUPERBLOCK (b
), outfile
);
327 /* drow/2002-07-10: We could save the total symbols count
328 even if we're using a hashtable, but nothing else but this message
330 fprintf_filtered (outfile
, ", %d syms/buckets in ",
331 mdict_size (BLOCK_MULTIDICT (b
)));
332 fputs_filtered (paddress (gdbarch
, BLOCK_START (b
)), outfile
);
333 fprintf_filtered (outfile
, "..");
334 fputs_filtered (paddress (gdbarch
, BLOCK_END (b
)), outfile
);
335 if (BLOCK_FUNCTION (b
))
337 fprintf_filtered (outfile
, ", function %s",
338 SYMBOL_LINKAGE_NAME (BLOCK_FUNCTION (b
)));
339 if (SYMBOL_DEMANGLED_NAME (BLOCK_FUNCTION (b
)) != NULL
)
341 fprintf_filtered (outfile
, ", %s",
342 SYMBOL_DEMANGLED_NAME (BLOCK_FUNCTION (b
)));
345 fprintf_filtered (outfile
, "\n");
346 /* Now print each symbol in this block (in no particular order, if
347 we're using a hashtable). Note that we only want this
348 block, not any blocks from included symtabs. */
349 ALL_DICT_SYMBOLS (BLOCK_MULTIDICT (b
), miter
, sym
)
353 print_symbol (gdbarch
, sym
, depth
+ 1, outfile
);
355 catch (const gdb_exception_error
&ex
)
357 exception_fprintf (gdb_stderr
, ex
,
358 "Error printing symbol:\n");
362 fprintf_filtered (outfile
, "\n");
366 const char *compunit_filename
367 = symtab_to_filename_for_display (COMPUNIT_FILETABS (SYMTAB_COMPUNIT (symtab
)));
369 fprintf_filtered (outfile
,
370 "\nBlockvector same as owning compunit: %s\n\n",
376 dump_symtab (struct symtab
*symtab
, struct ui_file
*outfile
)
378 /* Set the current language to the language of the symtab we're dumping
379 because certain routines used during dump_symtab() use the current
380 language to print an image of the symbol. We'll restore it later.
381 But use only real languages, not placeholders. */
382 if (symtab
->language
!= language_unknown
383 && symtab
->language
!= language_auto
)
385 scoped_restore_current_language save_lang
;
386 set_language (symtab
->language
);
387 dump_symtab_1 (symtab
, outfile
);
390 dump_symtab_1 (symtab
, outfile
);
394 maintenance_print_symbols (const char *args
, int from_tty
)
396 struct ui_file
*outfile
= gdb_stdout
;
397 char *address_arg
= NULL
, *source_arg
= NULL
, *objfile_arg
= NULL
;
402 gdb_argv
argv (args
);
404 for (i
= 0; argv
!= NULL
&& argv
[i
] != NULL
; ++i
)
406 if (strcmp (argv
[i
], "-pc") == 0)
408 if (argv
[i
+ 1] == NULL
)
409 error (_("Missing pc value"));
410 address_arg
= argv
[++i
];
412 else if (strcmp (argv
[i
], "-source") == 0)
414 if (argv
[i
+ 1] == NULL
)
415 error (_("Missing source file"));
416 source_arg
= argv
[++i
];
418 else if (strcmp (argv
[i
], "-objfile") == 0)
420 if (argv
[i
+ 1] == NULL
)
421 error (_("Missing objfile name"));
422 objfile_arg
= argv
[++i
];
424 else if (strcmp (argv
[i
], "--") == 0)
426 /* End of options. */
430 else if (argv
[i
][0] == '-')
432 /* Future proofing: Don't allow OUTFILE to begin with "-". */
433 error (_("Unknown option: %s"), argv
[i
]);
440 if (address_arg
!= NULL
&& source_arg
!= NULL
)
441 error (_("Must specify at most one of -pc and -source"));
443 stdio_file arg_outfile
;
445 if (argv
!= NULL
&& argv
[outfile_idx
] != NULL
)
447 if (argv
[outfile_idx
+ 1] != NULL
)
448 error (_("Junk at end of command"));
449 gdb::unique_xmalloc_ptr
<char> outfile_name
450 (tilde_expand (argv
[outfile_idx
]));
451 if (!arg_outfile
.open (outfile_name
.get (), FOPEN_WT
))
452 perror_with_name (outfile_name
.get ());
453 outfile
= &arg_outfile
;
456 if (address_arg
!= NULL
)
458 CORE_ADDR pc
= parse_and_eval_address (address_arg
);
459 struct symtab
*s
= find_pc_line_symtab (pc
);
462 error (_("No symtab for address: %s"), address_arg
);
463 dump_symtab (s
, outfile
);
469 for (objfile
*objfile
: current_program_space
->objfiles ())
471 int print_for_objfile
= 1;
473 if (objfile_arg
!= NULL
)
475 = compare_filenames_for_search (objfile_name (objfile
),
477 if (!print_for_objfile
)
480 for (compunit_symtab
*cu
: objfile
->compunits ())
482 for (symtab
*s
: compunit_filetabs (cu
))
484 int print_for_source
= 0;
487 if (source_arg
!= NULL
)
490 = compare_filenames_for_search
491 (symtab_to_filename_for_display (s
), source_arg
);
494 if (source_arg
== NULL
496 dump_symtab (s
, outfile
);
501 if (source_arg
!= NULL
&& !found
)
502 error (_("No symtab for source file: %s"), source_arg
);
506 /* Print symbol SYMBOL on OUTFILE. DEPTH says how far to indent. */
509 print_symbol (struct gdbarch
*gdbarch
, struct symbol
*symbol
,
510 int depth
, ui_file
*outfile
)
512 struct obj_section
*section
;
514 if (SYMBOL_OBJFILE_OWNED (symbol
))
515 section
= SYMBOL_OBJ_SECTION (symbol_objfile (symbol
), symbol
);
519 print_spaces (depth
, outfile
);
520 if (SYMBOL_DOMAIN (symbol
) == LABEL_DOMAIN
)
522 fprintf_filtered (outfile
, "label %s at ", SYMBOL_PRINT_NAME (symbol
));
523 fputs_filtered (paddress (gdbarch
, SYMBOL_VALUE_ADDRESS (symbol
)),
526 fprintf_filtered (outfile
, " section %s\n",
527 bfd_section_name (section
->the_bfd_section
));
529 fprintf_filtered (outfile
, "\n");
533 if (SYMBOL_DOMAIN (symbol
) == STRUCT_DOMAIN
)
535 if (TYPE_NAME (SYMBOL_TYPE (symbol
)))
537 LA_PRINT_TYPE (SYMBOL_TYPE (symbol
), "", outfile
, 1, depth
,
538 &type_print_raw_options
);
542 fprintf_filtered (outfile
, "%s %s = ",
543 (TYPE_CODE (SYMBOL_TYPE (symbol
)) == TYPE_CODE_ENUM
545 : (TYPE_CODE (SYMBOL_TYPE (symbol
)) == TYPE_CODE_STRUCT
546 ? "struct" : "union")),
547 SYMBOL_LINKAGE_NAME (symbol
));
548 LA_PRINT_TYPE (SYMBOL_TYPE (symbol
), "", outfile
, 1, depth
,
549 &type_print_raw_options
);
551 fprintf_filtered (outfile
, ";\n");
555 if (SYMBOL_CLASS (symbol
) == LOC_TYPEDEF
)
556 fprintf_filtered (outfile
, "typedef ");
557 if (SYMBOL_TYPE (symbol
))
559 /* Print details of types, except for enums where it's clutter. */
560 LA_PRINT_TYPE (SYMBOL_TYPE (symbol
), SYMBOL_PRINT_NAME (symbol
),
562 TYPE_CODE (SYMBOL_TYPE (symbol
)) != TYPE_CODE_ENUM
,
564 &type_print_raw_options
);
565 fprintf_filtered (outfile
, "; ");
568 fprintf_filtered (outfile
, "%s ", SYMBOL_PRINT_NAME (symbol
));
570 switch (SYMBOL_CLASS (symbol
))
573 fprintf_filtered (outfile
, "const %s (%s)",
574 plongest (SYMBOL_VALUE (symbol
)),
575 hex_string (SYMBOL_VALUE (symbol
)));
578 case LOC_CONST_BYTES
:
581 struct type
*type
= check_typedef (SYMBOL_TYPE (symbol
));
583 fprintf_filtered (outfile
, "const %s hex bytes:",
584 pulongest (TYPE_LENGTH (type
)));
585 for (i
= 0; i
< TYPE_LENGTH (type
); i
++)
586 fprintf_filtered (outfile
, " %02x",
587 (unsigned) SYMBOL_VALUE_BYTES (symbol
)[i
]);
592 fprintf_filtered (outfile
, "static at ");
593 fputs_filtered (paddress (gdbarch
, SYMBOL_VALUE_ADDRESS (symbol
)),
596 fprintf_filtered (outfile
, " section %s",
597 bfd_section_name (section
->the_bfd_section
));
601 if (SYMBOL_IS_ARGUMENT (symbol
))
602 fprintf_filtered (outfile
, "parameter register %s",
603 plongest (SYMBOL_VALUE (symbol
)));
605 fprintf_filtered (outfile
, "register %s",
606 plongest (SYMBOL_VALUE (symbol
)));
610 fprintf_filtered (outfile
, "arg at offset %s",
611 hex_string (SYMBOL_VALUE (symbol
)));
615 fprintf_filtered (outfile
, "reference arg at %s",
616 hex_string (SYMBOL_VALUE (symbol
)));
619 case LOC_REGPARM_ADDR
:
620 fprintf_filtered (outfile
, "address parameter register %s",
621 plongest (SYMBOL_VALUE (symbol
)));
625 fprintf_filtered (outfile
, "local at offset %s",
626 hex_string (SYMBOL_VALUE (symbol
)));
633 fprintf_filtered (outfile
, "label at ");
634 fputs_filtered (paddress (gdbarch
, SYMBOL_VALUE_ADDRESS (symbol
)),
637 fprintf_filtered (outfile
, " section %s",
638 bfd_section_name (section
->the_bfd_section
));
642 fprintf_filtered (outfile
, "block object ");
643 gdb_print_host_address (SYMBOL_BLOCK_VALUE (symbol
), outfile
);
644 fprintf_filtered (outfile
, ", ");
645 fputs_filtered (paddress (gdbarch
,
646 BLOCK_START (SYMBOL_BLOCK_VALUE (symbol
))),
648 fprintf_filtered (outfile
, "..");
649 fputs_filtered (paddress (gdbarch
,
650 BLOCK_END (SYMBOL_BLOCK_VALUE (symbol
))),
653 fprintf_filtered (outfile
, " section %s",
654 bfd_section_name (section
->the_bfd_section
));
658 fprintf_filtered (outfile
, "computed at runtime");
662 fprintf_filtered (outfile
, "unresolved");
665 case LOC_OPTIMIZED_OUT
:
666 fprintf_filtered (outfile
, "optimized out");
670 fprintf_filtered (outfile
, "botched symbol class %x",
671 SYMBOL_CLASS (symbol
));
675 fprintf_filtered (outfile
, "\n");
679 maintenance_print_msymbols (const char *args
, int from_tty
)
681 struct ui_file
*outfile
= gdb_stdout
;
682 char *objfile_arg
= NULL
;
687 gdb_argv
argv (args
);
689 for (i
= 0; argv
!= NULL
&& argv
[i
] != NULL
; ++i
)
691 if (strcmp (argv
[i
], "-objfile") == 0)
693 if (argv
[i
+ 1] == NULL
)
694 error (_("Missing objfile name"));
695 objfile_arg
= argv
[++i
];
697 else if (strcmp (argv
[i
], "--") == 0)
699 /* End of options. */
703 else if (argv
[i
][0] == '-')
705 /* Future proofing: Don't allow OUTFILE to begin with "-". */
706 error (_("Unknown option: %s"), argv
[i
]);
713 stdio_file arg_outfile
;
715 if (argv
!= NULL
&& argv
[outfile_idx
] != NULL
)
717 if (argv
[outfile_idx
+ 1] != NULL
)
718 error (_("Junk at end of command"));
719 gdb::unique_xmalloc_ptr
<char> outfile_name
720 (tilde_expand (argv
[outfile_idx
]));
721 if (!arg_outfile
.open (outfile_name
.get (), FOPEN_WT
))
722 perror_with_name (outfile_name
.get ());
723 outfile
= &arg_outfile
;
726 for (objfile
*objfile
: current_program_space
->objfiles ())
729 if (objfile_arg
== NULL
730 || compare_filenames_for_search (objfile_name (objfile
), objfile_arg
))
731 dump_msymbols (objfile
, outfile
);
736 maintenance_print_objfiles (const char *regexp
, int from_tty
)
738 struct program_space
*pspace
;
746 for (objfile
*objfile
: pspace
->objfiles ())
750 || re_exec (objfile_name (objfile
)))
751 dump_objfile (objfile
);
755 /* List all the symbol tables whose names match REGEXP (optional). */
758 maintenance_info_symtabs (const char *regexp
, int from_tty
)
760 struct program_space
*pspace
;
768 for (objfile
*objfile
: pspace
->objfiles ())
770 /* We don't want to print anything for this objfile until we
771 actually find a symtab whose name matches. */
772 int printed_objfile_start
= 0;
774 for (compunit_symtab
*cust
: objfile
->compunits ())
776 int printed_compunit_symtab_start
= 0;
778 for (symtab
*symtab
: compunit_filetabs (cust
))
783 || re_exec (symtab_to_filename_for_display (symtab
)))
785 if (! printed_objfile_start
)
787 printf_filtered ("{ objfile %s ", objfile_name (objfile
));
789 printf_filtered ("((struct objfile *) %s)\n",
790 host_address_to_string (objfile
));
791 printed_objfile_start
= 1;
793 if (! printed_compunit_symtab_start
)
795 printf_filtered (" { ((struct compunit_symtab *) %s)\n",
796 host_address_to_string (cust
));
797 printf_filtered (" debugformat %s\n",
798 COMPUNIT_DEBUGFORMAT (cust
));
799 printf_filtered (" producer %s\n",
800 COMPUNIT_PRODUCER (cust
) != NULL
801 ? COMPUNIT_PRODUCER (cust
)
803 printf_filtered (" dirname %s\n",
804 COMPUNIT_DIRNAME (cust
) != NULL
805 ? COMPUNIT_DIRNAME (cust
)
807 printf_filtered (" blockvector"
808 " ((struct blockvector *) %s)\n",
809 host_address_to_string
810 (COMPUNIT_BLOCKVECTOR (cust
)));
811 printed_compunit_symtab_start
= 1;
814 printf_filtered ("\t{ symtab %s ",
815 symtab_to_filename_for_display (symtab
));
817 printf_filtered ("((struct symtab *) %s)\n",
818 host_address_to_string (symtab
));
819 printf_filtered ("\t fullname %s\n",
820 symtab
->fullname
!= NULL
823 printf_filtered ("\t "
824 "linetable ((struct linetable *) %s)\n",
825 host_address_to_string (symtab
->linetable
));
826 printf_filtered ("\t}\n");
830 if (printed_compunit_symtab_start
)
831 printf_filtered (" }\n");
834 if (printed_objfile_start
)
835 printf_filtered ("}\n");
839 /* Check consistency of symtabs.
840 An example of what this checks for is NULL blockvectors.
841 They can happen if there's a bug during debug info reading.
842 GDB assumes they are always non-NULL.
844 Note: This does not check for psymtab vs symtab consistency.
845 Use "maint check-psymtabs" for that. */
848 maintenance_check_symtabs (const char *ignore
, int from_tty
)
850 struct program_space
*pspace
;
853 for (objfile
*objfile
: pspace
->objfiles ())
855 /* We don't want to print anything for this objfile until we
856 actually find something worth printing. */
857 int printed_objfile_start
= 0;
859 for (compunit_symtab
*cust
: objfile
->compunits ())
861 int found_something
= 0;
862 struct symtab
*symtab
= compunit_primary_filetab (cust
);
866 if (COMPUNIT_BLOCKVECTOR (cust
) == NULL
)
868 /* Add more checks here. */
872 if (! printed_objfile_start
)
874 printf_filtered ("{ objfile %s ", objfile_name (objfile
));
876 printf_filtered ("((struct objfile *) %s)\n",
877 host_address_to_string (objfile
));
878 printed_objfile_start
= 1;
880 printf_filtered (" { symtab %s\n",
881 symtab_to_filename_for_display (symtab
));
882 if (COMPUNIT_BLOCKVECTOR (cust
) == NULL
)
883 printf_filtered (" NULL blockvector\n");
884 printf_filtered (" }\n");
888 if (printed_objfile_start
)
889 printf_filtered ("}\n");
893 /* Expand all symbol tables whose name matches an optional regexp. */
896 maintenance_expand_symtabs (const char *args
, int from_tty
)
898 struct program_space
*pspace
;
901 /* We use buildargv here so that we handle spaces in the regexp
902 in a way that allows adding more arguments later. */
903 gdb_argv
argv (args
);
911 error (_("Extra arguments after regexp."));
919 for (objfile
*objfile
: pspace
->objfiles ())
923 objfile
->sf
->qf
->expand_symtabs_matching
925 [&] (const char *filename
, bool basenames
)
927 /* KISS: Only apply the regexp to the complete file name. */
929 && (regexp
== NULL
|| re_exec (filename
)));
931 lookup_name_info::match_any (),
932 [] (const char *symname
)
934 /* Since we're not searching on symbols, just return true. */
944 /* Return the nexting depth of a block within other blocks in its symtab. */
947 block_depth (const struct block
*block
)
951 while ((block
= BLOCK_SUPERBLOCK (block
)) != NULL
)
959 /* Used by MAINTENANCE_INFO_LINE_TABLES to print the information about a
960 single line table. */
963 maintenance_print_one_line_table (struct symtab
*symtab
, void *data
)
965 struct linetable
*linetable
;
966 struct objfile
*objfile
;
968 objfile
= symtab
->compunit_symtab
->objfile
;
969 printf_filtered (_("objfile: %s ((struct objfile *) %s)\n"),
970 objfile_name (objfile
),
971 host_address_to_string (objfile
));
972 printf_filtered (_("compunit_symtab: ((struct compunit_symtab *) %s)\n"),
973 host_address_to_string (symtab
->compunit_symtab
));
974 printf_filtered (_("symtab: %s ((struct symtab *) %s)\n"),
975 symtab_to_fullname (symtab
),
976 host_address_to_string (symtab
));
977 linetable
= SYMTAB_LINETABLE (symtab
);
978 printf_filtered (_("linetable: ((struct linetable *) %s):\n"),
979 host_address_to_string (linetable
));
981 if (linetable
== NULL
)
982 printf_filtered (_("No line table.\n"));
983 else if (linetable
->nitems
<= 0)
984 printf_filtered (_("Line table has no lines.\n"));
989 /* Leave space for 6 digits of index and line number. After that the
990 tables will just not format as well. */
991 printf_filtered (_("%-6s %6s %s\n"),
992 _("INDEX"), _("LINE"), _("ADDRESS"));
994 for (i
= 0; i
< linetable
->nitems
; ++i
)
996 struct linetable_entry
*item
;
998 item
= &linetable
->item
[i
];
999 printf_filtered (_("%-6d %6d %s\n"), i
, item
->line
,
1000 core_addr_to_string (item
->pc
));
1007 /* Implement the 'maint info line-table' command. */
1010 maintenance_info_line_tables (const char *regexp
, int from_tty
)
1012 struct program_space
*pspace
;
1019 ALL_PSPACES (pspace
)
1020 for (objfile
*objfile
: pspace
->objfiles ())
1022 for (compunit_symtab
*cust
: objfile
->compunits ())
1024 for (symtab
*symtab
: compunit_filetabs (cust
))
1029 || re_exec (symtab_to_filename_for_display (symtab
)))
1030 maintenance_print_one_line_table (symtab
, NULL
);
1038 /* Do early runtime initializations. */
1041 _initialize_symmisc (void)
1047 add_cmd ("symbols", class_maintenance
, maintenance_print_symbols
, _("\
1048 Print dump of current symbol definitions.\n\
1049 Usage: mt print symbols [-pc ADDRESS] [--] [OUTFILE]\n\
1050 mt print symbols [-objfile OBJFILE] [-source SOURCE] [--] [OUTFILE]\n\
1051 Entries in the full symbol table are dumped to file OUTFILE,\n\
1052 or the terminal if OUTFILE is unspecified.\n\
1053 If ADDRESS is provided, dump only the file for that address.\n\
1054 If SOURCE is provided, dump only that file's symbols.\n\
1055 If OBJFILE is provided, dump only that file's minimal symbols."),
1056 &maintenanceprintlist
);
1058 add_cmd ("msymbols", class_maintenance
, maintenance_print_msymbols
, _("\
1059 Print dump of current minimal symbol definitions.\n\
1060 Usage: mt print msymbols [-objfile OBJFILE] [--] [OUTFILE]\n\
1061 Entries in the minimal symbol table are dumped to file OUTFILE,\n\
1062 or the terminal if OUTFILE is unspecified.\n\
1063 If OBJFILE is provided, dump only that file's minimal symbols."),
1064 &maintenanceprintlist
);
1066 add_cmd ("objfiles", class_maintenance
, maintenance_print_objfiles
,
1067 _("Print dump of current object file definitions.\n\
1068 With an argument REGEXP, list the object files with matching names."),
1069 &maintenanceprintlist
);
1071 add_cmd ("symtabs", class_maintenance
, maintenance_info_symtabs
, _("\
1072 List the full symbol tables for all object files.\n\
1073 This does not include information about individual symbols, blocks, or\n\
1074 linetables --- just the symbol table structures themselves.\n\
1075 With an argument REGEXP, list the symbol tables with matching names."),
1076 &maintenanceinfolist
);
1078 add_cmd ("line-table", class_maintenance
, maintenance_info_line_tables
, _("\
1079 List the contents of all line tables, from all symbol tables.\n\
1080 With an argument REGEXP, list just the line tables for the symbol\n\
1081 tables with matching names."),
1082 &maintenanceinfolist
);
1084 add_cmd ("check-symtabs", class_maintenance
, maintenance_check_symtabs
,
1086 Check consistency of currently expanded symtabs."),
1089 add_cmd ("expand-symtabs", class_maintenance
, maintenance_expand_symtabs
,
1090 _("Expand symbol tables.\n\
1091 With an argument REGEXP, only expand the symbol tables with matching names."),