1 /* Do various things to symbol tables (other than lookup), for GDB.
3 Copyright (C) 1986-2017 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 void _initialize_symmisc (void);
59 struct print_symbol_args
61 struct gdbarch
*gdbarch
;
62 struct symbol
*symbol
;
64 struct ui_file
*outfile
;
67 static int print_symbol (void *);
71 print_symbol_bcache_statistics (void)
73 struct program_space
*pspace
;
74 struct objfile
*objfile
;
77 ALL_PSPACE_OBJFILES (pspace
, objfile
)
80 printf_filtered (_("Byte cache statistics for '%s':\n"),
81 objfile_name (objfile
));
82 print_bcache_statistics (psymbol_bcache_get_bcache (objfile
->psymbol_cache
),
83 "partial symbol cache");
84 print_bcache_statistics (objfile
->per_bfd
->macro_cache
,
85 "preprocessor macro cache");
86 print_bcache_statistics (objfile
->per_bfd
->filename_cache
,
92 print_objfile_statistics (void)
94 struct program_space
*pspace
;
95 struct objfile
*objfile
;
96 struct compunit_symtab
*cu
;
98 int i
, linetables
, blockvectors
;
101 ALL_PSPACE_OBJFILES (pspace
, objfile
)
104 printf_filtered (_("Statistics for '%s':\n"), objfile_name (objfile
));
105 if (OBJSTAT (objfile
, n_stabs
) > 0)
106 printf_filtered (_(" Number of \"stab\" symbols read: %d\n"),
107 OBJSTAT (objfile
, n_stabs
));
108 if (objfile
->per_bfd
->n_minsyms
> 0)
109 printf_filtered (_(" Number of \"minimal\" symbols read: %d\n"),
110 objfile
->per_bfd
->n_minsyms
);
111 if (OBJSTAT (objfile
, n_psyms
) > 0)
112 printf_filtered (_(" Number of \"partial\" symbols read: %d\n"),
113 OBJSTAT (objfile
, n_psyms
));
114 if (OBJSTAT (objfile
, n_syms
) > 0)
115 printf_filtered (_(" Number of \"full\" symbols read: %d\n"),
116 OBJSTAT (objfile
, n_syms
));
117 if (OBJSTAT (objfile
, n_types
) > 0)
118 printf_filtered (_(" Number of \"types\" defined: %d\n"),
119 OBJSTAT (objfile
, n_types
));
121 objfile
->sf
->qf
->print_stats (objfile
);
122 i
= linetables
= blockvectors
= 0;
123 ALL_OBJFILE_FILETABS (objfile
, cu
, s
)
126 if (SYMTAB_LINETABLE (s
) != NULL
)
129 ALL_OBJFILE_COMPUNITS (objfile
, cu
)
131 printf_filtered (_(" Number of symbol tables: %d\n"), i
);
132 printf_filtered (_(" Number of symbol tables with line tables: %d\n"),
134 printf_filtered (_(" Number of symbol tables with blockvectors: %d\n"),
137 if (OBJSTAT (objfile
, sz_strtab
) > 0)
138 printf_filtered (_(" Space used by string tables: %d\n"),
139 OBJSTAT (objfile
, sz_strtab
));
140 printf_filtered (_(" Total memory used for objfile obstack: %s\n"),
141 pulongest (obstack_memory_used (&objfile
142 ->objfile_obstack
)));
143 printf_filtered (_(" Total memory used for BFD obstack: %s\n"),
144 pulongest (obstack_memory_used (&objfile
->per_bfd
145 ->storage_obstack
)));
146 printf_filtered (_(" Total memory used for psymbol cache: %d\n"),
147 bcache_memory_used (psymbol_bcache_get_bcache
148 (objfile
->psymbol_cache
)));
149 printf_filtered (_(" Total memory used for macro cache: %d\n"),
150 bcache_memory_used (objfile
->per_bfd
->macro_cache
));
151 printf_filtered (_(" Total memory used for file name cache: %d\n"),
152 bcache_memory_used (objfile
->per_bfd
->filename_cache
));
157 dump_objfile (struct objfile
*objfile
)
159 struct compunit_symtab
*cust
;
160 struct symtab
*symtab
;
162 printf_filtered ("\nObject file %s: ", objfile_name (objfile
));
163 printf_filtered ("Objfile at ");
164 gdb_print_host_address (objfile
, gdb_stdout
);
165 printf_filtered (", bfd at ");
166 gdb_print_host_address (objfile
->obfd
, gdb_stdout
);
167 printf_filtered (", %d minsyms\n\n",
168 objfile
->per_bfd
->minimal_symbol_count
);
171 objfile
->sf
->qf
->dump (objfile
);
173 if (objfile
->compunit_symtabs
!= NULL
)
175 printf_filtered ("Symtabs:\n");
176 ALL_OBJFILE_FILETABS (objfile
, cust
, symtab
)
178 printf_filtered ("%s at ", symtab_to_filename_for_display (symtab
));
179 gdb_print_host_address (symtab
, gdb_stdout
);
180 printf_filtered (", ");
181 if (SYMTAB_OBJFILE (symtab
) != objfile
)
183 printf_filtered ("NOT ON CHAIN! ");
187 printf_filtered ("\n\n");
191 /* Print minimal symbols from this objfile. */
194 dump_msymbols (struct objfile
*objfile
, struct ui_file
*outfile
)
196 struct gdbarch
*gdbarch
= get_objfile_arch (objfile
);
197 struct minimal_symbol
*msymbol
;
201 fprintf_filtered (outfile
, "\nObject file %s:\n\n", objfile_name (objfile
));
202 if (objfile
->per_bfd
->minimal_symbol_count
== 0)
204 fprintf_filtered (outfile
, "No minimal symbols found.\n");
208 ALL_OBJFILE_MSYMBOLS (objfile
, msymbol
)
210 struct obj_section
*section
= MSYMBOL_OBJ_SECTION (objfile
, msymbol
);
212 switch (MSYMBOL_TYPE (msymbol
))
220 case mst_text_gnu_ifunc
:
223 case mst_solib_trampoline
:
248 fprintf_filtered (outfile
, "[%2d] %c ", index
, ms_type
);
249 fputs_filtered (paddress (gdbarch
, MSYMBOL_VALUE_ADDRESS (objfile
,
252 fprintf_filtered (outfile
, " %s", MSYMBOL_LINKAGE_NAME (msymbol
));
255 if (section
->the_bfd_section
!= NULL
)
256 fprintf_filtered (outfile
, " section %s",
257 bfd_section_name (objfile
->obfd
,
258 section
->the_bfd_section
));
260 fprintf_filtered (outfile
, " spurious section %ld",
261 (long) (section
- objfile
->sections
));
263 if (MSYMBOL_DEMANGLED_NAME (msymbol
) != NULL
)
265 fprintf_filtered (outfile
, " %s", MSYMBOL_DEMANGLED_NAME (msymbol
));
267 if (msymbol
->filename
)
268 fprintf_filtered (outfile
, " %s", msymbol
->filename
);
269 fputs_filtered ("\n", outfile
);
272 if (objfile
->per_bfd
->minimal_symbol_count
!= index
)
274 warning (_("internal error: minimal symbol count %d != %d"),
275 objfile
->per_bfd
->minimal_symbol_count
, index
);
277 fprintf_filtered (outfile
, "\n");
281 dump_symtab_1 (struct symtab
*symtab
, struct ui_file
*outfile
)
283 struct objfile
*objfile
= SYMTAB_OBJFILE (symtab
);
284 struct gdbarch
*gdbarch
= get_objfile_arch (objfile
);
286 struct dict_iterator iter
;
289 const struct blockvector
*bv
;
294 fprintf_filtered (outfile
, "\nSymtab for file %s\n",
295 symtab_to_filename_for_display (symtab
));
296 if (SYMTAB_DIRNAME (symtab
) != NULL
)
297 fprintf_filtered (outfile
, "Compilation directory is %s\n",
298 SYMTAB_DIRNAME (symtab
));
299 fprintf_filtered (outfile
, "Read from object file %s (",
300 objfile_name (objfile
));
301 gdb_print_host_address (objfile
, outfile
);
302 fprintf_filtered (outfile
, ")\n");
303 fprintf_filtered (outfile
, "Language: %s\n",
304 language_str (symtab
->language
));
306 /* First print the line table. */
307 l
= SYMTAB_LINETABLE (symtab
);
310 fprintf_filtered (outfile
, "\nLine table:\n\n");
312 for (i
= 0; i
< len
; i
++)
314 fprintf_filtered (outfile
, " line %d at ", l
->item
[i
].line
);
315 fputs_filtered (paddress (gdbarch
, l
->item
[i
].pc
), outfile
);
316 fprintf_filtered (outfile
, "\n");
319 /* Now print the block info, but only for compunit symtabs since we will
320 print lots of duplicate info otherwise. */
321 if (symtab
== COMPUNIT_FILETABS (SYMTAB_COMPUNIT (symtab
)))
323 fprintf_filtered (outfile
, "\nBlockvector:\n\n");
324 bv
= SYMTAB_BLOCKVECTOR (symtab
);
325 len
= BLOCKVECTOR_NBLOCKS (bv
);
326 for (i
= 0; i
< len
; i
++)
328 b
= BLOCKVECTOR_BLOCK (bv
, i
);
329 depth
= block_depth (b
) * 2;
330 print_spaces (depth
, outfile
);
331 fprintf_filtered (outfile
, "block #%03d, object at ", i
);
332 gdb_print_host_address (b
, outfile
);
333 if (BLOCK_SUPERBLOCK (b
))
335 fprintf_filtered (outfile
, " under ");
336 gdb_print_host_address (BLOCK_SUPERBLOCK (b
), outfile
);
338 /* drow/2002-07-10: We could save the total symbols count
339 even if we're using a hashtable, but nothing else but this message
341 fprintf_filtered (outfile
, ", %d syms/buckets in ",
342 dict_size (BLOCK_DICT (b
)));
343 fputs_filtered (paddress (gdbarch
, BLOCK_START (b
)), outfile
);
344 fprintf_filtered (outfile
, "..");
345 fputs_filtered (paddress (gdbarch
, BLOCK_END (b
)), outfile
);
346 if (BLOCK_FUNCTION (b
))
348 fprintf_filtered (outfile
, ", function %s",
349 SYMBOL_LINKAGE_NAME (BLOCK_FUNCTION (b
)));
350 if (SYMBOL_DEMANGLED_NAME (BLOCK_FUNCTION (b
)) != NULL
)
352 fprintf_filtered (outfile
, ", %s",
353 SYMBOL_DEMANGLED_NAME (BLOCK_FUNCTION (b
)));
356 fprintf_filtered (outfile
, "\n");
357 /* Now print each symbol in this block (in no particular order, if
358 we're using a hashtable). Note that we only want this
359 block, not any blocks from included symtabs. */
360 ALL_DICT_SYMBOLS (BLOCK_DICT (b
), iter
, sym
)
362 struct print_symbol_args s
;
368 catch_errors (print_symbol
, &s
, "Error printing symbol:\n",
372 fprintf_filtered (outfile
, "\n");
376 const char *compunit_filename
377 = symtab_to_filename_for_display (COMPUNIT_FILETABS (SYMTAB_COMPUNIT (symtab
)));
379 fprintf_filtered (outfile
,
380 "\nBlockvector same as owning compunit: %s\n\n",
386 dump_symtab (struct symtab
*symtab
, struct ui_file
*outfile
)
388 /* Set the current language to the language of the symtab we're dumping
389 because certain routines used during dump_symtab() use the current
390 language to print an image of the symbol. We'll restore it later.
391 But use only real languages, not placeholders. */
392 if (symtab
->language
!= language_unknown
393 && symtab
->language
!= language_auto
)
395 enum language saved_lang
;
397 saved_lang
= set_language (symtab
->language
);
399 dump_symtab_1 (symtab
, outfile
);
401 set_language (saved_lang
);
404 dump_symtab_1 (symtab
, outfile
);
408 maintenance_print_symbols (char *args
, int from_tty
)
410 struct ui_file
*outfile
= gdb_stdout
;
411 struct cleanup
*cleanups
;
412 char *address_arg
= NULL
, *source_arg
= NULL
, *objfile_arg
= NULL
;
417 gdb_argv
argv (args
);
418 cleanups
= make_cleanup (null_cleanup
, NULL
);
420 for (i
= 0; argv
!= NULL
&& argv
[i
] != NULL
; ++i
)
422 if (strcmp (argv
[i
], "-pc") == 0)
424 if (argv
[i
+ 1] == NULL
)
425 error (_("Missing pc value"));
426 address_arg
= argv
[++i
];
428 else if (strcmp (argv
[i
], "-source") == 0)
430 if (argv
[i
+ 1] == NULL
)
431 error (_("Missing source file"));
432 source_arg
= argv
[++i
];
434 else if (strcmp (argv
[i
], "-objfile") == 0)
436 if (argv
[i
+ 1] == NULL
)
437 error (_("Missing objfile name"));
438 objfile_arg
= argv
[++i
];
440 else if (strcmp (argv
[i
], "--") == 0)
442 /* End of options. */
446 else if (argv
[i
][0] == '-')
448 /* Future proofing: Don't allow OUTFILE to begin with "-". */
449 error (_("Unknown option: %s"), argv
[i
]);
456 if (address_arg
!= NULL
&& source_arg
!= NULL
)
457 error (_("Must specify at most one of -pc and -source"));
459 stdio_file arg_outfile
;
461 if (argv
!= NULL
&& argv
[outfile_idx
] != NULL
)
465 if (argv
[outfile_idx
+ 1] != NULL
)
466 error (_("Junk at end of command"));
467 outfile_name
= tilde_expand (argv
[outfile_idx
]);
468 make_cleanup (xfree
, outfile_name
);
469 if (!arg_outfile
.open (outfile_name
, FOPEN_WT
))
470 perror_with_name (outfile_name
);
471 outfile
= &arg_outfile
;
474 if (address_arg
!= NULL
)
476 CORE_ADDR pc
= parse_and_eval_address (address_arg
);
477 struct symtab
*s
= find_pc_line_symtab (pc
);
480 error (_("No symtab for address: %s"), address_arg
);
481 dump_symtab (s
, outfile
);
485 struct objfile
*objfile
;
486 struct compunit_symtab
*cu
;
490 ALL_OBJFILES (objfile
)
492 int print_for_objfile
= 1;
494 if (objfile_arg
!= NULL
)
496 = compare_filenames_for_search (objfile_name (objfile
),
498 if (!print_for_objfile
)
501 ALL_OBJFILE_FILETABS (objfile
, cu
, s
)
503 int print_for_source
= 0;
506 if (source_arg
!= NULL
)
509 = compare_filenames_for_search
510 (symtab_to_filename_for_display (s
), source_arg
);
513 if (source_arg
== NULL
515 dump_symtab (s
, outfile
);
519 if (source_arg
!= NULL
&& !found
)
520 error (_("No symtab for source file: %s"), source_arg
);
523 do_cleanups (cleanups
);
526 /* Print symbol ARGS->SYMBOL on ARGS->OUTFILE. ARGS->DEPTH says how
527 far to indent. ARGS is really a struct print_symbol_args *, but is
528 declared as char * to get it past catch_errors. Returns 0 for error,
532 print_symbol (void *args
)
534 struct gdbarch
*gdbarch
= ((struct print_symbol_args
*) args
)->gdbarch
;
535 struct symbol
*symbol
= ((struct print_symbol_args
*) args
)->symbol
;
536 int depth
= ((struct print_symbol_args
*) args
)->depth
;
537 struct ui_file
*outfile
= ((struct print_symbol_args
*) args
)->outfile
;
538 struct obj_section
*section
;
540 if (SYMBOL_OBJFILE_OWNED (symbol
))
541 section
= SYMBOL_OBJ_SECTION (symbol_objfile (symbol
), symbol
);
545 print_spaces (depth
, outfile
);
546 if (SYMBOL_DOMAIN (symbol
) == LABEL_DOMAIN
)
548 fprintf_filtered (outfile
, "label %s at ", SYMBOL_PRINT_NAME (symbol
));
549 fputs_filtered (paddress (gdbarch
, SYMBOL_VALUE_ADDRESS (symbol
)),
552 fprintf_filtered (outfile
, " section %s\n",
553 bfd_section_name (section
->the_bfd_section
->owner
,
554 section
->the_bfd_section
));
556 fprintf_filtered (outfile
, "\n");
559 if (SYMBOL_DOMAIN (symbol
) == STRUCT_DOMAIN
)
561 if (TYPE_TAG_NAME (SYMBOL_TYPE (symbol
)))
563 LA_PRINT_TYPE (SYMBOL_TYPE (symbol
), "", outfile
, 1, depth
,
564 &type_print_raw_options
);
568 fprintf_filtered (outfile
, "%s %s = ",
569 (TYPE_CODE (SYMBOL_TYPE (symbol
)) == TYPE_CODE_ENUM
571 : (TYPE_CODE (SYMBOL_TYPE (symbol
)) == TYPE_CODE_STRUCT
572 ? "struct" : "union")),
573 SYMBOL_LINKAGE_NAME (symbol
));
574 LA_PRINT_TYPE (SYMBOL_TYPE (symbol
), "", outfile
, 1, depth
,
575 &type_print_raw_options
);
577 fprintf_filtered (outfile
, ";\n");
581 if (SYMBOL_CLASS (symbol
) == LOC_TYPEDEF
)
582 fprintf_filtered (outfile
, "typedef ");
583 if (SYMBOL_TYPE (symbol
))
585 /* Print details of types, except for enums where it's clutter. */
586 LA_PRINT_TYPE (SYMBOL_TYPE (symbol
), SYMBOL_PRINT_NAME (symbol
),
588 TYPE_CODE (SYMBOL_TYPE (symbol
)) != TYPE_CODE_ENUM
,
590 &type_print_raw_options
);
591 fprintf_filtered (outfile
, "; ");
594 fprintf_filtered (outfile
, "%s ", SYMBOL_PRINT_NAME (symbol
));
596 switch (SYMBOL_CLASS (symbol
))
599 fprintf_filtered (outfile
, "const %s (%s)",
600 plongest (SYMBOL_VALUE (symbol
)),
601 hex_string (SYMBOL_VALUE (symbol
)));
604 case LOC_CONST_BYTES
:
607 struct type
*type
= check_typedef (SYMBOL_TYPE (symbol
));
609 fprintf_filtered (outfile
, "const %u hex bytes:",
611 for (i
= 0; i
< TYPE_LENGTH (type
); i
++)
612 fprintf_filtered (outfile
, " %02x",
613 (unsigned) SYMBOL_VALUE_BYTES (symbol
)[i
]);
618 fprintf_filtered (outfile
, "static at ");
619 fputs_filtered (paddress (gdbarch
, SYMBOL_VALUE_ADDRESS (symbol
)),
622 fprintf_filtered (outfile
, " section %s",
623 bfd_section_name (section
->the_bfd_section
->owner
,
624 section
->the_bfd_section
));
628 if (SYMBOL_IS_ARGUMENT (symbol
))
629 fprintf_filtered (outfile
, "parameter register %s",
630 plongest (SYMBOL_VALUE (symbol
)));
632 fprintf_filtered (outfile
, "register %s",
633 plongest (SYMBOL_VALUE (symbol
)));
637 fprintf_filtered (outfile
, "arg at offset %s",
638 hex_string (SYMBOL_VALUE (symbol
)));
642 fprintf_filtered (outfile
, "reference arg at %s",
643 hex_string (SYMBOL_VALUE (symbol
)));
646 case LOC_REGPARM_ADDR
:
647 fprintf_filtered (outfile
, "address parameter register %s",
648 plongest (SYMBOL_VALUE (symbol
)));
652 fprintf_filtered (outfile
, "local at offset %s",
653 hex_string (SYMBOL_VALUE (symbol
)));
660 fprintf_filtered (outfile
, "label at ");
661 fputs_filtered (paddress (gdbarch
, SYMBOL_VALUE_ADDRESS (symbol
)),
664 fprintf_filtered (outfile
, " section %s",
665 bfd_section_name (section
->the_bfd_section
->owner
,
666 section
->the_bfd_section
));
670 fprintf_filtered (outfile
, "block object ");
671 gdb_print_host_address (SYMBOL_BLOCK_VALUE (symbol
), outfile
);
672 fprintf_filtered (outfile
, ", ");
673 fputs_filtered (paddress (gdbarch
,
674 BLOCK_START (SYMBOL_BLOCK_VALUE (symbol
))),
676 fprintf_filtered (outfile
, "..");
677 fputs_filtered (paddress (gdbarch
,
678 BLOCK_END (SYMBOL_BLOCK_VALUE (symbol
))),
681 fprintf_filtered (outfile
, " section %s",
682 bfd_section_name (section
->the_bfd_section
->owner
,
683 section
->the_bfd_section
));
687 fprintf_filtered (outfile
, "computed at runtime");
691 fprintf_filtered (outfile
, "unresolved");
694 case LOC_OPTIMIZED_OUT
:
695 fprintf_filtered (outfile
, "optimized out");
699 fprintf_filtered (outfile
, "botched symbol class %x",
700 SYMBOL_CLASS (symbol
));
704 fprintf_filtered (outfile
, "\n");
709 maintenance_print_msymbols (char *args
, int from_tty
)
711 struct ui_file
*outfile
= gdb_stdout
;
712 struct cleanup
*cleanups
;
713 char *objfile_arg
= NULL
;
714 struct objfile
*objfile
;
719 gdb_argv
argv (args
);
720 cleanups
= make_cleanup (null_cleanup
, NULL
);
722 for (i
= 0; argv
!= NULL
&& argv
[i
] != NULL
; ++i
)
724 if (strcmp (argv
[i
], "-objfile") == 0)
726 if (argv
[i
+ 1] == NULL
)
727 error (_("Missing objfile name"));
728 objfile_arg
= argv
[++i
];
730 else if (strcmp (argv
[i
], "--") == 0)
732 /* End of options. */
736 else if (argv
[i
][0] == '-')
738 /* Future proofing: Don't allow OUTFILE to begin with "-". */
739 error (_("Unknown option: %s"), argv
[i
]);
746 stdio_file arg_outfile
;
748 if (argv
!= NULL
&& argv
[outfile_idx
] != NULL
)
752 if (argv
[outfile_idx
+ 1] != NULL
)
753 error (_("Junk at end of command"));
754 outfile_name
= tilde_expand (argv
[outfile_idx
]);
755 make_cleanup (xfree
, outfile_name
);
756 if (!arg_outfile
.open (outfile_name
, FOPEN_WT
))
757 perror_with_name (outfile_name
);
758 outfile
= &arg_outfile
;
761 ALL_OBJFILES (objfile
)
764 if (objfile_arg
== NULL
765 || compare_filenames_for_search (objfile_name (objfile
), objfile_arg
))
766 dump_msymbols (objfile
, outfile
);
769 do_cleanups (cleanups
);
773 maintenance_print_objfiles (char *regexp
, int from_tty
)
775 struct program_space
*pspace
;
776 struct objfile
*objfile
;
784 ALL_PSPACE_OBJFILES (pspace
, objfile
)
788 || re_exec (objfile_name (objfile
)))
789 dump_objfile (objfile
);
793 /* List all the symbol tables whose names match REGEXP (optional). */
796 maintenance_info_symtabs (char *regexp
, int from_tty
)
798 struct program_space
*pspace
;
799 struct objfile
*objfile
;
807 ALL_PSPACE_OBJFILES (pspace
, objfile
)
809 struct compunit_symtab
*cust
;
810 struct symtab
*symtab
;
812 /* We don't want to print anything for this objfile until we
813 actually find a symtab whose name matches. */
814 int printed_objfile_start
= 0;
816 ALL_OBJFILE_COMPUNITS (objfile
, cust
)
818 int printed_compunit_symtab_start
= 0;
820 ALL_COMPUNIT_FILETABS (cust
, symtab
)
825 || re_exec (symtab_to_filename_for_display (symtab
)))
827 if (! printed_objfile_start
)
829 printf_filtered ("{ objfile %s ", objfile_name (objfile
));
831 printf_filtered ("((struct objfile *) %s)\n",
832 host_address_to_string (objfile
));
833 printed_objfile_start
= 1;
835 if (! printed_compunit_symtab_start
)
837 printf_filtered (" { ((struct compunit_symtab *) %s)\n",
838 host_address_to_string (cust
));
839 printf_filtered (" debugformat %s\n",
840 COMPUNIT_DEBUGFORMAT (cust
));
841 printf_filtered (" producer %s\n",
842 COMPUNIT_PRODUCER (cust
) != NULL
843 ? COMPUNIT_PRODUCER (cust
)
845 printf_filtered (" dirname %s\n",
846 COMPUNIT_DIRNAME (cust
) != NULL
847 ? COMPUNIT_DIRNAME (cust
)
849 printf_filtered (" blockvector"
850 " ((struct blockvector *) %s)\n",
851 host_address_to_string
852 (COMPUNIT_BLOCKVECTOR (cust
)));
853 printed_compunit_symtab_start
= 1;
856 printf_filtered ("\t{ symtab %s ",
857 symtab_to_filename_for_display (symtab
));
859 printf_filtered ("((struct symtab *) %s)\n",
860 host_address_to_string (symtab
));
861 printf_filtered ("\t fullname %s\n",
862 symtab
->fullname
!= NULL
865 printf_filtered ("\t "
866 "linetable ((struct linetable *) %s)\n",
867 host_address_to_string (symtab
->linetable
));
868 printf_filtered ("\t}\n");
872 if (printed_compunit_symtab_start
)
873 printf_filtered (" }\n");
876 if (printed_objfile_start
)
877 printf_filtered ("}\n");
881 /* Check consistency of symtabs.
882 An example of what this checks for is NULL blockvectors.
883 They can happen if there's a bug during debug info reading.
884 GDB assumes they are always non-NULL.
886 Note: This does not check for psymtab vs symtab consistency.
887 Use "maint check-psymtabs" for that. */
890 maintenance_check_symtabs (char *ignore
, int from_tty
)
892 struct program_space
*pspace
;
893 struct objfile
*objfile
;
896 ALL_PSPACE_OBJFILES (pspace
, objfile
)
898 struct compunit_symtab
*cust
;
900 /* We don't want to print anything for this objfile until we
901 actually find something worth printing. */
902 int printed_objfile_start
= 0;
904 ALL_OBJFILE_COMPUNITS (objfile
, cust
)
906 int found_something
= 0;
907 struct symtab
*symtab
= compunit_primary_filetab (cust
);
911 if (COMPUNIT_BLOCKVECTOR (cust
) == NULL
)
913 /* Add more checks here. */
917 if (! printed_objfile_start
)
919 printf_filtered ("{ objfile %s ", objfile_name (objfile
));
921 printf_filtered ("((struct objfile *) %s)\n",
922 host_address_to_string (objfile
));
923 printed_objfile_start
= 1;
925 printf_filtered (" { symtab %s\n",
926 symtab_to_filename_for_display (symtab
));
927 if (COMPUNIT_BLOCKVECTOR (cust
) == NULL
)
928 printf_filtered (" NULL blockvector\n");
929 printf_filtered (" }\n");
933 if (printed_objfile_start
)
934 printf_filtered ("}\n");
938 /* Expand all symbol tables whose name matches an optional regexp. */
941 maintenance_expand_symtabs (char *args
, int from_tty
)
943 struct program_space
*pspace
;
944 struct objfile
*objfile
;
947 /* We use buildargv here so that we handle spaces in the regexp
948 in a way that allows adding more arguments later. */
949 gdb_argv
argv (args
);
957 error (_("Extra arguments after regexp."));
965 ALL_PSPACE_OBJFILES (pspace
, objfile
)
969 objfile
->sf
->qf
->expand_symtabs_matching
971 [&] (const char *filename
, bool basenames
)
973 /* KISS: Only apply the regexp to the complete file name. */
975 && (regexp
== NULL
|| re_exec (filename
)));
977 [] (const char *symname
)
979 /* Since we're not searching on symbols, just return true. */
989 /* Return the nexting depth of a block within other blocks in its symtab. */
992 block_depth (struct block
*block
)
996 while ((block
= BLOCK_SUPERBLOCK (block
)) != NULL
)
1004 /* Used by MAINTENANCE_INFO_LINE_TABLES to print the information about a
1005 single line table. */
1008 maintenance_print_one_line_table (struct symtab
*symtab
, void *data
)
1010 struct linetable
*linetable
;
1011 struct objfile
*objfile
;
1013 objfile
= symtab
->compunit_symtab
->objfile
;
1014 printf_filtered (_("objfile: %s ((struct objfile *) %s)\n"),
1015 objfile_name (objfile
),
1016 host_address_to_string (objfile
));
1017 printf_filtered (_("compunit_symtab: ((struct compunit_symtab *) %s)\n"),
1018 host_address_to_string (symtab
->compunit_symtab
));
1019 printf_filtered (_("symtab: %s ((struct symtab *) %s)\n"),
1020 symtab_to_fullname (symtab
),
1021 host_address_to_string (symtab
));
1022 linetable
= SYMTAB_LINETABLE (symtab
);
1023 printf_filtered (_("linetable: ((struct linetable *) %s):\n"),
1024 host_address_to_string (linetable
));
1026 if (linetable
== NULL
)
1027 printf_filtered (_("No line table.\n"));
1028 else if (linetable
->nitems
<= 0)
1029 printf_filtered (_("Line table has no lines.\n"));
1034 /* Leave space for 6 digits of index and line number. After that the
1035 tables will just not format as well. */
1036 printf_filtered (_("%-6s %6s %s\n"),
1037 _("INDEX"), _("LINE"), _("ADDRESS"));
1039 for (i
= 0; i
< linetable
->nitems
; ++i
)
1041 struct linetable_entry
*item
;
1043 item
= &linetable
->item
[i
];
1044 printf_filtered (_("%-6d %6d %s\n"), i
, item
->line
,
1045 core_addr_to_string (item
->pc
));
1052 /* Implement the 'maint info line-table' command. */
1055 maintenance_info_line_tables (char *regexp
, int from_tty
)
1057 struct program_space
*pspace
;
1058 struct objfile
*objfile
;
1065 ALL_PSPACES (pspace
)
1066 ALL_PSPACE_OBJFILES (pspace
, objfile
)
1068 struct compunit_symtab
*cust
;
1069 struct symtab
*symtab
;
1071 ALL_OBJFILE_COMPUNITS (objfile
, cust
)
1073 ALL_COMPUNIT_FILETABS (cust
, symtab
)
1078 || re_exec (symtab_to_filename_for_display (symtab
)))
1079 maintenance_print_one_line_table (symtab
, NULL
);
1087 /* Do early runtime initializations. */
1090 _initialize_symmisc (void)
1096 add_cmd ("symbols", class_maintenance
, maintenance_print_symbols
, _("\
1097 Print dump of current symbol definitions.\n\
1098 Usage: mt print symbols [-pc address] [--] [outfile]\n\
1099 mt print symbols [-objfile objfile] [-source source] [--] [outfile]\n\
1100 Entries in the full symbol table are dumped to file OUTFILE,\n\
1101 or the terminal if OUTFILE is unspecified.\n\
1102 If ADDRESS is provided, dump only the file for that address.\n\
1103 If SOURCE is provided, dump only that file's symbols.\n\
1104 If OBJFILE is provided, dump only that file's minimal symbols."),
1105 &maintenanceprintlist
);
1107 add_cmd ("msymbols", class_maintenance
, maintenance_print_msymbols
, _("\
1108 Print dump of current minimal symbol definitions.\n\
1109 Usage: mt print msymbols [-objfile objfile] [--] [outfile]\n\
1110 Entries in the minimal symbol table are dumped to file OUTFILE,\n\
1111 or the terminal if OUTFILE is unspecified.\n\
1112 If OBJFILE is provided, dump only that file's minimal symbols."),
1113 &maintenanceprintlist
);
1115 add_cmd ("objfiles", class_maintenance
, maintenance_print_objfiles
,
1116 _("Print dump of current object file definitions.\n\
1117 With an argument REGEXP, list the object files with matching names."),
1118 &maintenanceprintlist
);
1120 add_cmd ("symtabs", class_maintenance
, maintenance_info_symtabs
, _("\
1121 List the full symbol tables for all object files.\n\
1122 This does not include information about individual symbols, blocks, or\n\
1123 linetables --- just the symbol table structures themselves.\n\
1124 With an argument REGEXP, list the symbol tables with matching names."),
1125 &maintenanceinfolist
);
1127 add_cmd ("line-table", class_maintenance
, maintenance_info_line_tables
, _("\
1128 List the contents of all line tables, from all symbol tables.\n\
1129 With an argument REGEXP, list just the line tables for the symbol\n\
1130 tables with matching names."),
1131 &maintenanceinfolist
);
1133 add_cmd ("check-symtabs", class_maintenance
, maintenance_check_symtabs
,
1135 Check consistency of currently expanded symtabs."),
1138 add_cmd ("expand-symtabs", class_maintenance
, maintenance_expand_symtabs
,
1139 _("Expand symbol tables.\n\
1140 With an argument REGEXP, only expand the symbol tables with matching names."),