1 /* Do various things to symbol tables (other than lookup), for GDB.
3 Copyright (C) 1986-2016 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"
44 #define DEV_TTY "/dev/tty"
47 /* Unfortunately for debugging, stderr is usually a macro. This is painful
48 when calling functions that take FILE *'s from the debugger.
49 So we make a variable which has the same value and which is accessible when
50 debugging GDB with itself. Because stdin et al need not be constants,
51 we initialize them in the _initialize_symmisc function at the bottom
57 /* Prototypes for local functions */
59 static int block_depth (struct block
*);
61 void _initialize_symmisc (void);
63 struct print_symbol_args
65 struct gdbarch
*gdbarch
;
66 struct symbol
*symbol
;
68 struct ui_file
*outfile
;
71 static int print_symbol (void *);
75 print_symbol_bcache_statistics (void)
77 struct program_space
*pspace
;
78 struct objfile
*objfile
;
81 ALL_PSPACE_OBJFILES (pspace
, objfile
)
84 printf_filtered (_("Byte cache statistics for '%s':\n"),
85 objfile_name (objfile
));
86 print_bcache_statistics (psymbol_bcache_get_bcache (objfile
->psymbol_cache
),
87 "partial symbol cache");
88 print_bcache_statistics (objfile
->per_bfd
->macro_cache
,
89 "preprocessor macro cache");
90 print_bcache_statistics (objfile
->per_bfd
->filename_cache
,
96 print_objfile_statistics (void)
98 struct program_space
*pspace
;
99 struct objfile
*objfile
;
100 struct compunit_symtab
*cu
;
102 int i
, linetables
, blockvectors
;
105 ALL_PSPACE_OBJFILES (pspace
, objfile
)
108 printf_filtered (_("Statistics for '%s':\n"), objfile_name (objfile
));
109 if (OBJSTAT (objfile
, n_stabs
) > 0)
110 printf_filtered (_(" Number of \"stab\" symbols read: %d\n"),
111 OBJSTAT (objfile
, n_stabs
));
112 if (objfile
->per_bfd
->n_minsyms
> 0)
113 printf_filtered (_(" Number of \"minimal\" symbols read: %d\n"),
114 objfile
->per_bfd
->n_minsyms
);
115 if (OBJSTAT (objfile
, n_psyms
) > 0)
116 printf_filtered (_(" Number of \"partial\" symbols read: %d\n"),
117 OBJSTAT (objfile
, n_psyms
));
118 if (OBJSTAT (objfile
, n_syms
) > 0)
119 printf_filtered (_(" Number of \"full\" symbols read: %d\n"),
120 OBJSTAT (objfile
, n_syms
));
121 if (OBJSTAT (objfile
, n_types
) > 0)
122 printf_filtered (_(" Number of \"types\" defined: %d\n"),
123 OBJSTAT (objfile
, n_types
));
125 objfile
->sf
->qf
->print_stats (objfile
);
126 i
= linetables
= blockvectors
= 0;
127 ALL_OBJFILE_FILETABS (objfile
, cu
, s
)
130 if (SYMTAB_LINETABLE (s
) != NULL
)
133 ALL_OBJFILE_COMPUNITS (objfile
, cu
)
135 printf_filtered (_(" Number of symbol tables: %d\n"), i
);
136 printf_filtered (_(" Number of symbol tables with line tables: %d\n"),
138 printf_filtered (_(" Number of symbol tables with blockvectors: %d\n"),
141 if (OBJSTAT (objfile
, sz_strtab
) > 0)
142 printf_filtered (_(" Space used by a.out string tables: %d\n"),
143 OBJSTAT (objfile
, sz_strtab
));
144 printf_filtered (_(" Total memory used for objfile obstack: %s\n"),
145 pulongest (obstack_memory_used (&objfile
146 ->objfile_obstack
)));
147 printf_filtered (_(" Total memory used for BFD obstack: %s\n"),
148 pulongest (obstack_memory_used (&objfile
->per_bfd
149 ->storage_obstack
)));
150 printf_filtered (_(" Total memory used for psymbol cache: %d\n"),
151 bcache_memory_used (psymbol_bcache_get_bcache
152 (objfile
->psymbol_cache
)));
153 printf_filtered (_(" Total memory used for macro cache: %d\n"),
154 bcache_memory_used (objfile
->per_bfd
->macro_cache
));
155 printf_filtered (_(" Total memory used for file name cache: %d\n"),
156 bcache_memory_used (objfile
->per_bfd
->filename_cache
));
161 dump_objfile (struct objfile
*objfile
)
163 struct compunit_symtab
*cust
;
164 struct symtab
*symtab
;
166 printf_filtered ("\nObject file %s: ", objfile_name (objfile
));
167 printf_filtered ("Objfile at ");
168 gdb_print_host_address (objfile
, gdb_stdout
);
169 printf_filtered (", bfd at ");
170 gdb_print_host_address (objfile
->obfd
, gdb_stdout
);
171 printf_filtered (", %d minsyms\n\n",
172 objfile
->per_bfd
->minimal_symbol_count
);
175 objfile
->sf
->qf
->dump (objfile
);
177 if (objfile
->compunit_symtabs
!= NULL
)
179 printf_filtered ("Symtabs:\n");
180 ALL_OBJFILE_FILETABS (objfile
, cust
, symtab
)
182 printf_filtered ("%s at ", symtab_to_filename_for_display (symtab
));
183 gdb_print_host_address (symtab
, gdb_stdout
);
184 printf_filtered (", ");
185 if (SYMTAB_OBJFILE (symtab
) != objfile
)
187 printf_filtered ("NOT ON CHAIN! ");
191 printf_filtered ("\n\n");
195 /* Print minimal symbols from this objfile. */
198 dump_msymbols (struct objfile
*objfile
, struct ui_file
*outfile
)
200 struct gdbarch
*gdbarch
= get_objfile_arch (objfile
);
201 struct minimal_symbol
*msymbol
;
205 fprintf_filtered (outfile
, "\nObject file %s:\n\n", objfile_name (objfile
));
206 if (objfile
->per_bfd
->minimal_symbol_count
== 0)
208 fprintf_filtered (outfile
, "No minimal symbols found.\n");
212 ALL_OBJFILE_MSYMBOLS (objfile
, msymbol
)
214 struct obj_section
*section
= MSYMBOL_OBJ_SECTION (objfile
, msymbol
);
216 switch (MSYMBOL_TYPE (msymbol
))
224 case mst_text_gnu_ifunc
:
227 case mst_solib_trampoline
:
252 fprintf_filtered (outfile
, "[%2d] %c ", index
, ms_type
);
253 fputs_filtered (paddress (gdbarch
, MSYMBOL_VALUE_ADDRESS (objfile
,
256 fprintf_filtered (outfile
, " %s", MSYMBOL_LINKAGE_NAME (msymbol
));
259 if (section
->the_bfd_section
!= NULL
)
260 fprintf_filtered (outfile
, " section %s",
261 bfd_section_name (objfile
->obfd
,
262 section
->the_bfd_section
));
264 fprintf_filtered (outfile
, " spurious section %ld",
265 (long) (section
- objfile
->sections
));
267 if (MSYMBOL_DEMANGLED_NAME (msymbol
) != NULL
)
269 fprintf_filtered (outfile
, " %s", MSYMBOL_DEMANGLED_NAME (msymbol
));
271 if (msymbol
->filename
)
272 fprintf_filtered (outfile
, " %s", msymbol
->filename
);
273 fputs_filtered ("\n", outfile
);
276 if (objfile
->per_bfd
->minimal_symbol_count
!= index
)
278 warning (_("internal error: minimal symbol count %d != %d"),
279 objfile
->per_bfd
->minimal_symbol_count
, index
);
281 fprintf_filtered (outfile
, "\n");
285 dump_symtab_1 (struct symtab
*symtab
, struct ui_file
*outfile
)
287 struct objfile
*objfile
= SYMTAB_OBJFILE (symtab
);
288 struct gdbarch
*gdbarch
= get_objfile_arch (objfile
);
290 struct dict_iterator iter
;
293 const struct blockvector
*bv
;
298 fprintf_filtered (outfile
, "\nSymtab for file %s\n",
299 symtab_to_filename_for_display (symtab
));
300 if (SYMTAB_DIRNAME (symtab
) != NULL
)
301 fprintf_filtered (outfile
, "Compilation directory is %s\n",
302 SYMTAB_DIRNAME (symtab
));
303 fprintf_filtered (outfile
, "Read from object file %s (",
304 objfile_name (objfile
));
305 gdb_print_host_address (objfile
, outfile
);
306 fprintf_filtered (outfile
, ")\n");
307 fprintf_filtered (outfile
, "Language: %s\n",
308 language_str (symtab
->language
));
310 /* First print the line table. */
311 l
= SYMTAB_LINETABLE (symtab
);
314 fprintf_filtered (outfile
, "\nLine table:\n\n");
316 for (i
= 0; i
< len
; i
++)
318 fprintf_filtered (outfile
, " line %d at ", l
->item
[i
].line
);
319 fputs_filtered (paddress (gdbarch
, l
->item
[i
].pc
), outfile
);
320 fprintf_filtered (outfile
, "\n");
323 /* Now print the block info, but only for compunit symtabs since we will
324 print lots of duplicate info otherwise. */
325 if (symtab
== COMPUNIT_FILETABS (SYMTAB_COMPUNIT (symtab
)))
327 fprintf_filtered (outfile
, "\nBlockvector:\n\n");
328 bv
= SYMTAB_BLOCKVECTOR (symtab
);
329 len
= BLOCKVECTOR_NBLOCKS (bv
);
330 for (i
= 0; i
< len
; i
++)
332 b
= BLOCKVECTOR_BLOCK (bv
, i
);
333 depth
= block_depth (b
) * 2;
334 print_spaces (depth
, outfile
);
335 fprintf_filtered (outfile
, "block #%03d, object at ", i
);
336 gdb_print_host_address (b
, outfile
);
337 if (BLOCK_SUPERBLOCK (b
))
339 fprintf_filtered (outfile
, " under ");
340 gdb_print_host_address (BLOCK_SUPERBLOCK (b
), outfile
);
342 /* drow/2002-07-10: We could save the total symbols count
343 even if we're using a hashtable, but nothing else but this message
345 fprintf_filtered (outfile
, ", %d syms/buckets in ",
346 dict_size (BLOCK_DICT (b
)));
347 fputs_filtered (paddress (gdbarch
, BLOCK_START (b
)), outfile
);
348 fprintf_filtered (outfile
, "..");
349 fputs_filtered (paddress (gdbarch
, BLOCK_END (b
)), outfile
);
350 if (BLOCK_FUNCTION (b
))
352 fprintf_filtered (outfile
, ", function %s",
353 SYMBOL_LINKAGE_NAME (BLOCK_FUNCTION (b
)));
354 if (SYMBOL_DEMANGLED_NAME (BLOCK_FUNCTION (b
)) != NULL
)
356 fprintf_filtered (outfile
, ", %s",
357 SYMBOL_DEMANGLED_NAME (BLOCK_FUNCTION (b
)));
360 fprintf_filtered (outfile
, "\n");
361 /* Now print each symbol in this block (in no particular order, if
362 we're using a hashtable). Note that we only want this
363 block, not any blocks from included symtabs. */
364 ALL_DICT_SYMBOLS (BLOCK_DICT (b
), iter
, sym
)
366 struct print_symbol_args s
;
372 catch_errors (print_symbol
, &s
, "Error printing symbol:\n",
376 fprintf_filtered (outfile
, "\n");
380 fprintf_filtered (outfile
, "\nBlockvector same as previous symtab\n\n");
385 dump_symtab (struct symtab
*symtab
, struct ui_file
*outfile
)
387 /* Set the current language to the language of the symtab we're dumping
388 because certain routines used during dump_symtab() use the current
389 language to print an image of the symbol. We'll restore it later.
390 But use only real languages, not placeholders. */
391 if (symtab
->language
!= language_unknown
392 && symtab
->language
!= language_auto
)
394 enum language saved_lang
;
396 saved_lang
= set_language (symtab
->language
);
398 dump_symtab_1 (symtab
, outfile
);
400 set_language (saved_lang
);
403 dump_symtab_1 (symtab
, outfile
);
407 maintenance_print_symbols (char *args
, int from_tty
)
410 struct ui_file
*outfile
;
411 struct cleanup
*cleanups
;
412 char *symname
= NULL
;
413 char *filename
= DEV_TTY
;
414 struct objfile
*objfile
;
415 struct compunit_symtab
*cu
;
422 error (_("Arguments missing: an output file name "
423 "and an optional symbol file name"));
425 argv
= gdb_buildargv (args
);
426 cleanups
= make_cleanup_freeargv (argv
);
431 /* If a second arg is supplied, it is a source file name to match on. */
438 filename
= tilde_expand (filename
);
439 make_cleanup (xfree
, filename
);
441 outfile
= gdb_fopen (filename
, FOPEN_WT
);
443 perror_with_name (filename
);
444 make_cleanup_ui_file_delete (outfile
);
446 ALL_FILETABS (objfile
, cu
, s
)
450 || filename_cmp (symname
, symtab_to_filename_for_display (s
)) == 0)
451 dump_symtab (s
, outfile
);
453 do_cleanups (cleanups
);
456 /* Print symbol ARGS->SYMBOL on ARGS->OUTFILE. ARGS->DEPTH says how
457 far to indent. ARGS is really a struct print_symbol_args *, but is
458 declared as char * to get it past catch_errors. Returns 0 for error,
462 print_symbol (void *args
)
464 struct gdbarch
*gdbarch
= ((struct print_symbol_args
*) args
)->gdbarch
;
465 struct symbol
*symbol
= ((struct print_symbol_args
*) args
)->symbol
;
466 int depth
= ((struct print_symbol_args
*) args
)->depth
;
467 struct ui_file
*outfile
= ((struct print_symbol_args
*) args
)->outfile
;
468 struct obj_section
*section
;
470 if (SYMBOL_OBJFILE_OWNED (symbol
))
471 section
= SYMBOL_OBJ_SECTION (symbol_objfile (symbol
), symbol
);
475 print_spaces (depth
, outfile
);
476 if (SYMBOL_DOMAIN (symbol
) == LABEL_DOMAIN
)
478 fprintf_filtered (outfile
, "label %s at ", SYMBOL_PRINT_NAME (symbol
));
479 fputs_filtered (paddress (gdbarch
, SYMBOL_VALUE_ADDRESS (symbol
)),
482 fprintf_filtered (outfile
, " section %s\n",
483 bfd_section_name (section
->the_bfd_section
->owner
,
484 section
->the_bfd_section
));
486 fprintf_filtered (outfile
, "\n");
489 if (SYMBOL_DOMAIN (symbol
) == STRUCT_DOMAIN
)
491 if (TYPE_TAG_NAME (SYMBOL_TYPE (symbol
)))
493 LA_PRINT_TYPE (SYMBOL_TYPE (symbol
), "", outfile
, 1, depth
,
494 &type_print_raw_options
);
498 fprintf_filtered (outfile
, "%s %s = ",
499 (TYPE_CODE (SYMBOL_TYPE (symbol
)) == TYPE_CODE_ENUM
501 : (TYPE_CODE (SYMBOL_TYPE (symbol
)) == TYPE_CODE_STRUCT
502 ? "struct" : "union")),
503 SYMBOL_LINKAGE_NAME (symbol
));
504 LA_PRINT_TYPE (SYMBOL_TYPE (symbol
), "", outfile
, 1, depth
,
505 &type_print_raw_options
);
507 fprintf_filtered (outfile
, ";\n");
511 if (SYMBOL_CLASS (symbol
) == LOC_TYPEDEF
)
512 fprintf_filtered (outfile
, "typedef ");
513 if (SYMBOL_TYPE (symbol
))
515 /* Print details of types, except for enums where it's clutter. */
516 LA_PRINT_TYPE (SYMBOL_TYPE (symbol
), SYMBOL_PRINT_NAME (symbol
),
518 TYPE_CODE (SYMBOL_TYPE (symbol
)) != TYPE_CODE_ENUM
,
520 &type_print_raw_options
);
521 fprintf_filtered (outfile
, "; ");
524 fprintf_filtered (outfile
, "%s ", SYMBOL_PRINT_NAME (symbol
));
526 switch (SYMBOL_CLASS (symbol
))
529 fprintf_filtered (outfile
, "const %s (%s)",
530 plongest (SYMBOL_VALUE (symbol
)),
531 hex_string (SYMBOL_VALUE (symbol
)));
534 case LOC_CONST_BYTES
:
537 struct type
*type
= check_typedef (SYMBOL_TYPE (symbol
));
539 fprintf_filtered (outfile
, "const %u hex bytes:",
541 for (i
= 0; i
< TYPE_LENGTH (type
); i
++)
542 fprintf_filtered (outfile
, " %02x",
543 (unsigned) SYMBOL_VALUE_BYTES (symbol
)[i
]);
548 fprintf_filtered (outfile
, "static at ");
549 fputs_filtered (paddress (gdbarch
, SYMBOL_VALUE_ADDRESS (symbol
)),
552 fprintf_filtered (outfile
, " section %s",
553 bfd_section_name (section
->the_bfd_section
->owner
,
554 section
->the_bfd_section
));
558 if (SYMBOL_IS_ARGUMENT (symbol
))
559 fprintf_filtered (outfile
, "parameter register %s",
560 plongest (SYMBOL_VALUE (symbol
)));
562 fprintf_filtered (outfile
, "register %s",
563 plongest (SYMBOL_VALUE (symbol
)));
567 fprintf_filtered (outfile
, "arg at offset %s",
568 hex_string (SYMBOL_VALUE (symbol
)));
572 fprintf_filtered (outfile
, "reference arg at %s",
573 hex_string (SYMBOL_VALUE (symbol
)));
576 case LOC_REGPARM_ADDR
:
577 fprintf_filtered (outfile
, "address parameter register %s",
578 plongest (SYMBOL_VALUE (symbol
)));
582 fprintf_filtered (outfile
, "local at offset %s",
583 hex_string (SYMBOL_VALUE (symbol
)));
590 fprintf_filtered (outfile
, "label at ");
591 fputs_filtered (paddress (gdbarch
, SYMBOL_VALUE_ADDRESS (symbol
)),
594 fprintf_filtered (outfile
, " section %s",
595 bfd_section_name (section
->the_bfd_section
->owner
,
596 section
->the_bfd_section
));
600 fprintf_filtered (outfile
, "block object ");
601 gdb_print_host_address (SYMBOL_BLOCK_VALUE (symbol
), outfile
);
602 fprintf_filtered (outfile
, ", ");
603 fputs_filtered (paddress (gdbarch
,
604 BLOCK_START (SYMBOL_BLOCK_VALUE (symbol
))),
606 fprintf_filtered (outfile
, "..");
607 fputs_filtered (paddress (gdbarch
,
608 BLOCK_END (SYMBOL_BLOCK_VALUE (symbol
))),
611 fprintf_filtered (outfile
, " section %s",
612 bfd_section_name (section
->the_bfd_section
->owner
,
613 section
->the_bfd_section
));
617 fprintf_filtered (outfile
, "computed at runtime");
621 fprintf_filtered (outfile
, "unresolved");
624 case LOC_OPTIMIZED_OUT
:
625 fprintf_filtered (outfile
, "optimized out");
629 fprintf_filtered (outfile
, "botched symbol class %x",
630 SYMBOL_CLASS (symbol
));
634 fprintf_filtered (outfile
, "\n");
639 maintenance_print_msymbols (char *args
, int from_tty
)
642 struct ui_file
*outfile
;
643 struct cleanup
*cleanups
;
644 char *filename
= DEV_TTY
;
645 char *symname
= NULL
;
646 struct program_space
*pspace
;
647 struct objfile
*objfile
;
649 struct stat sym_st
, obj_st
;
655 error (_("print-msymbols takes an output file "
656 "name and optional symbol file name"));
658 argv
= gdb_buildargv (args
);
659 cleanups
= make_cleanup_freeargv (argv
);
664 /* If a second arg is supplied, it is a source file name to match on. */
667 symname
= gdb_realpath (argv
[1]);
668 make_cleanup (xfree
, symname
);
669 if (symname
&& stat (symname
, &sym_st
))
670 perror_with_name (symname
);
674 filename
= tilde_expand (filename
);
675 make_cleanup (xfree
, filename
);
677 outfile
= gdb_fopen (filename
, FOPEN_WT
);
679 perror_with_name (filename
);
680 make_cleanup_ui_file_delete (outfile
);
683 ALL_PSPACE_OBJFILES (pspace
, objfile
)
686 if (symname
== NULL
|| (!stat (objfile_name (objfile
), &obj_st
)
687 && sym_st
.st_dev
== obj_st
.st_dev
688 && sym_st
.st_ino
== obj_st
.st_ino
))
689 dump_msymbols (objfile
, outfile
);
691 fprintf_filtered (outfile
, "\n\n");
692 do_cleanups (cleanups
);
696 maintenance_print_objfiles (char *regexp
, int from_tty
)
698 struct program_space
*pspace
;
699 struct objfile
*objfile
;
707 ALL_PSPACE_OBJFILES (pspace
, objfile
)
711 || re_exec (objfile_name (objfile
)))
712 dump_objfile (objfile
);
716 /* List all the symbol tables whose names match REGEXP (optional). */
719 maintenance_info_symtabs (char *regexp
, int from_tty
)
721 struct program_space
*pspace
;
722 struct objfile
*objfile
;
730 ALL_PSPACE_OBJFILES (pspace
, objfile
)
732 struct compunit_symtab
*cust
;
733 struct symtab
*symtab
;
735 /* We don't want to print anything for this objfile until we
736 actually find a symtab whose name matches. */
737 int printed_objfile_start
= 0;
739 ALL_OBJFILE_COMPUNITS (objfile
, cust
)
741 int printed_compunit_symtab_start
= 0;
743 ALL_COMPUNIT_FILETABS (cust
, symtab
)
748 || re_exec (symtab_to_filename_for_display (symtab
)))
750 if (! printed_objfile_start
)
752 printf_filtered ("{ objfile %s ", objfile_name (objfile
));
754 printf_filtered ("((struct objfile *) %s)\n",
755 host_address_to_string (objfile
));
756 printed_objfile_start
= 1;
758 if (! printed_compunit_symtab_start
)
760 printf_filtered (" { ((struct compunit_symtab *) %s)\n",
761 host_address_to_string (cust
));
762 printf_filtered (" debugformat %s\n",
763 COMPUNIT_DEBUGFORMAT (cust
));
764 printf_filtered (" producer %s\n",
765 COMPUNIT_PRODUCER (cust
) != NULL
766 ? COMPUNIT_PRODUCER (cust
)
768 printf_filtered (" dirname %s\n",
769 COMPUNIT_DIRNAME (cust
) != NULL
770 ? COMPUNIT_DIRNAME (cust
)
772 printf_filtered (" blockvector"
773 " ((struct blockvector *) %s)\n",
774 host_address_to_string
775 (COMPUNIT_BLOCKVECTOR (cust
)));
776 printed_compunit_symtab_start
= 1;
779 printf_filtered ("\t{ symtab %s ",
780 symtab_to_filename_for_display (symtab
));
782 printf_filtered ("((struct symtab *) %s)\n",
783 host_address_to_string (symtab
));
784 printf_filtered ("\t fullname %s\n",
785 symtab
->fullname
!= NULL
788 printf_filtered ("\t "
789 "linetable ((struct linetable *) %s)\n",
790 host_address_to_string (symtab
->linetable
));
791 printf_filtered ("\t}\n");
795 if (printed_compunit_symtab_start
)
796 printf_filtered (" }\n");
799 if (printed_objfile_start
)
800 printf_filtered ("}\n");
804 /* Check consistency of symtabs.
805 An example of what this checks for is NULL blockvectors.
806 They can happen if there's a bug during debug info reading.
807 GDB assumes they are always non-NULL.
809 Note: This does not check for psymtab vs symtab consistency.
810 Use "maint check-psymtabs" for that. */
813 maintenance_check_symtabs (char *ignore
, int from_tty
)
815 struct program_space
*pspace
;
816 struct objfile
*objfile
;
819 ALL_PSPACE_OBJFILES (pspace
, objfile
)
821 struct compunit_symtab
*cust
;
823 /* We don't want to print anything for this objfile until we
824 actually find something worth printing. */
825 int printed_objfile_start
= 0;
827 ALL_OBJFILE_COMPUNITS (objfile
, cust
)
829 int found_something
= 0;
830 struct symtab
*symtab
= compunit_primary_filetab (cust
);
834 if (COMPUNIT_BLOCKVECTOR (cust
) == NULL
)
836 /* Add more checks here. */
840 if (! printed_objfile_start
)
842 printf_filtered ("{ objfile %s ", objfile_name (objfile
));
844 printf_filtered ("((struct objfile *) %s)\n",
845 host_address_to_string (objfile
));
846 printed_objfile_start
= 1;
848 printf_filtered (" { symtab %s\n",
849 symtab_to_filename_for_display (symtab
));
850 if (COMPUNIT_BLOCKVECTOR (cust
) == NULL
)
851 printf_filtered (" NULL blockvector\n");
852 printf_filtered (" }\n");
856 if (printed_objfile_start
)
857 printf_filtered ("}\n");
861 /* Helper function for maintenance_expand_symtabs.
862 This is the name_matcher function for expand_symtabs_matching. */
865 maintenance_expand_name_matcher (const char *symname
, void *data
)
867 /* Since we're not searching on symbols, just return TRUE. */
871 /* Helper function for maintenance_expand_symtabs.
872 This is the file_matcher function for expand_symtabs_matching. */
875 maintenance_expand_file_matcher (const char *filename
, void *data
,
878 const char *regexp
= (const char *) data
;
882 /* KISS: Only apply the regexp to the complete file name. */
886 if (regexp
== NULL
|| re_exec (filename
))
892 /* Expand all symbol tables whose name matches an optional regexp. */
895 maintenance_expand_symtabs (char *args
, int from_tty
)
897 struct program_space
*pspace
;
898 struct objfile
*objfile
;
899 struct cleanup
*cleanups
;
903 /* We use buildargv here so that we handle spaces in the regexp
904 in a way that allows adding more arguments later. */
905 argv
= gdb_buildargv (args
);
906 cleanups
= make_cleanup_freeargv (argv
);
914 error (_("Extra arguments after regexp."));
922 ALL_PSPACE_OBJFILES (pspace
, objfile
)
926 objfile
->sf
->qf
->expand_symtabs_matching
927 (objfile
, maintenance_expand_file_matcher
,
928 maintenance_expand_name_matcher
, NULL
, ALL_DOMAIN
, regexp
);
932 do_cleanups (cleanups
);
936 /* Return the nexting depth of a block within other blocks in its symtab. */
939 block_depth (struct block
*block
)
943 while ((block
= BLOCK_SUPERBLOCK (block
)) != NULL
)
951 /* Used by MAINTENANCE_INFO_LINE_TABLES to print the information about a
952 single line table. */
955 maintenance_print_one_line_table (struct symtab
*symtab
, void *data
)
957 struct linetable
*linetable
;
958 struct objfile
*objfile
;
960 objfile
= symtab
->compunit_symtab
->objfile
;
961 printf_filtered (_("objfile: %s ((struct objfile *) %s)\n"),
962 objfile_name (objfile
),
963 host_address_to_string (objfile
));
964 printf_filtered (_("compunit_symtab: ((struct compunit_symtab *) %s)\n"),
965 host_address_to_string (symtab
->compunit_symtab
));
966 printf_filtered (_("symtab: %s ((struct symtab *) %s)\n"),
967 symtab_to_fullname (symtab
),
968 host_address_to_string (symtab
));
969 linetable
= SYMTAB_LINETABLE (symtab
);
970 printf_filtered (_("linetable: ((struct linetable *) %s):\n"),
971 host_address_to_string (linetable
));
973 if (linetable
== NULL
)
974 printf_filtered (_("No line table.\n"));
975 else if (linetable
->nitems
<= 0)
976 printf_filtered (_("Line table has no lines.\n"));
981 /* Leave space for 6 digits of index and line number. After that the
982 tables will just not format as well. */
983 printf_filtered (_("%-6s %6s %s\n"),
984 _("INDEX"), _("LINE"), _("ADDRESS"));
986 for (i
= 0; i
< linetable
->nitems
; ++i
)
988 struct linetable_entry
*item
;
989 struct cleanup
*row_cleanup
;
991 item
= &linetable
->item
[i
];
992 printf_filtered (_("%-6d %6d %s\n"), i
, item
->line
,
993 core_addr_to_string (item
->pc
));
1000 /* Implement the 'maint info line-table' command. */
1003 maintenance_info_line_tables (char *regexp
, int from_tty
)
1005 struct program_space
*pspace
;
1006 struct objfile
*objfile
;
1013 ALL_PSPACES (pspace
)
1014 ALL_PSPACE_OBJFILES (pspace
, objfile
)
1016 struct compunit_symtab
*cust
;
1017 struct symtab
*symtab
;
1019 ALL_OBJFILE_COMPUNITS (objfile
, cust
)
1021 ALL_COMPUNIT_FILETABS (cust
, symtab
)
1026 || re_exec (symtab_to_filename_for_display (symtab
)))
1027 maintenance_print_one_line_table (symtab
, NULL
);
1035 /* Do early runtime initializations. */
1038 _initialize_symmisc (void)
1044 add_cmd ("symbols", class_maintenance
, maintenance_print_symbols
, _("\
1045 Print dump of current symbol definitions.\n\
1046 Entries in the full symbol table are dumped to file OUTFILE.\n\
1047 If a SOURCE file is specified, dump only that file's symbols."),
1048 &maintenanceprintlist
);
1050 add_cmd ("msymbols", class_maintenance
, maintenance_print_msymbols
, _("\
1051 Print dump of current minimal symbol definitions.\n\
1052 Entries in the minimal symbol table are dumped to file OUTFILE.\n\
1053 If a SOURCE file is specified, dump only that file's minimal symbols."),
1054 &maintenanceprintlist
);
1056 add_cmd ("objfiles", class_maintenance
, maintenance_print_objfiles
,
1057 _("Print dump of current object file definitions.\n\
1058 With an argument REGEXP, list the object files with matching names."),
1059 &maintenanceprintlist
);
1061 add_cmd ("symtabs", class_maintenance
, maintenance_info_symtabs
, _("\
1062 List the full symbol tables for all object files.\n\
1063 This does not include information about individual symbols, blocks, or\n\
1064 linetables --- just the symbol table structures themselves.\n\
1065 With an argument REGEXP, list the symbol tables with matching names."),
1066 &maintenanceinfolist
);
1068 add_cmd ("line-table", class_maintenance
, maintenance_info_line_tables
, _("\
1069 List the contents of all line tables, from all symbol tables.\n\
1070 With an argument REGEXP, list just the line tables for the symbol\n\
1071 tables with matching names."),
1072 &maintenanceinfolist
);
1074 add_cmd ("check-symtabs", class_maintenance
, maintenance_check_symtabs
,
1076 Check consistency of currently expanded symtabs."),
1079 add_cmd ("expand-symtabs", class_maintenance
, maintenance_expand_symtabs
,
1080 _("Expand symbol tables.\n\
1081 With an argument REGEXP, only expand the symbol tables with matching names."),