1 /* Do various things to symbol tables (other than lookup), for GDB.
3 Copyright (C) 1986-2021 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/tilde.h"
44 /* Unfortunately for debugging, stderr is usually a macro. This is painful
45 when calling functions that take FILE *'s from the debugger.
46 So we make a variable which has the same value and which is accessible when
47 debugging GDB with itself. Because stdin et al need not be constants,
48 we initialize them in the _initialize_symmisc function at the bottom
54 /* Prototypes for local functions */
56 static int block_depth (const struct block
*);
58 static void print_symbol (struct gdbarch
*gdbarch
, struct symbol
*symbol
,
59 int depth
, ui_file
*outfile
);
63 print_symbol_bcache_statistics (void)
65 for (struct program_space
*pspace
: program_spaces
)
66 for (objfile
*objfile
: pspace
->objfiles ())
69 printf_filtered (_("Byte cache statistics for '%s':\n"),
70 objfile_name (objfile
));
71 objfile
->partial_symtabs
->psymbol_cache
.print_statistics
72 ("partial symbol cache");
73 objfile
->per_bfd
->string_cache
.print_statistics ("string cache");
77 /* Count the number of partial symbols in OBJFILE. */
80 count_psyms (struct objfile
*objfile
)
83 for (partial_symtab
*pst
: objfile
->psymtabs ())
85 count
+= pst
->global_psymbols
.size ();
86 count
+= pst
->static_psymbols
.size ();
92 print_objfile_statistics (void)
94 int i
, linetables
, blockvectors
;
96 for (struct program_space
*pspace
: program_spaces
)
97 for (objfile
*objfile
: pspace
->objfiles ())
100 printf_filtered (_("Statistics for '%s':\n"), objfile_name (objfile
));
101 if (OBJSTAT (objfile
, n_stabs
) > 0)
102 printf_filtered (_(" Number of \"stab\" symbols read: %d\n"),
103 OBJSTAT (objfile
, n_stabs
));
104 if (objfile
->per_bfd
->n_minsyms
> 0)
105 printf_filtered (_(" Number of \"minimal\" symbols read: %d\n"),
106 objfile
->per_bfd
->n_minsyms
);
108 int n_psyms
= count_psyms (objfile
);
110 printf_filtered (_(" Number of \"partial\" symbols read: %d\n"),
112 if (OBJSTAT (objfile
, n_syms
) > 0)
113 printf_filtered (_(" Number of \"full\" symbols read: %d\n"),
114 OBJSTAT (objfile
, n_syms
));
115 if (OBJSTAT (objfile
, n_types
) > 0)
116 printf_filtered (_(" Number of \"types\" defined: %d\n"),
117 OBJSTAT (objfile
, n_types
));
119 objfile
->sf
->qf
->print_stats (objfile
);
121 for (compunit_symtab
*cu
: objfile
->compunits ())
123 for (symtab
*s
: compunit_filetabs (cu
))
126 if (SYMTAB_LINETABLE (s
) != NULL
)
130 blockvectors
= std::distance (objfile
->compunits ().begin (),
131 objfile
->compunits ().end ());
132 printf_filtered (_(" Number of symbol tables: %d\n"), i
);
133 printf_filtered (_(" Number of symbol tables with line tables: %d\n"),
135 printf_filtered (_(" Number of symbol tables with blockvectors: %d\n"),
138 if (OBJSTAT (objfile
, sz_strtab
) > 0)
139 printf_filtered (_(" Space used by string tables: %d\n"),
140 OBJSTAT (objfile
, sz_strtab
));
141 printf_filtered (_(" Total memory used for objfile obstack: %s\n"),
142 pulongest (obstack_memory_used (&objfile
143 ->objfile_obstack
)));
144 printf_filtered (_(" Total memory used for BFD obstack: %s\n"),
145 pulongest (obstack_memory_used (&objfile
->per_bfd
146 ->storage_obstack
)));
148 (_(" Total memory used for psymbol cache: %d\n"),
149 objfile
->partial_symtabs
->psymbol_cache
.memory_used ());
150 printf_filtered (_(" Total memory used for string cache: %d\n"),
151 objfile
->per_bfd
->string_cache
.memory_used ());
156 dump_objfile (struct objfile
*objfile
)
158 printf_filtered ("\nObject file %s: ", objfile_name (objfile
));
159 printf_filtered ("Objfile at ");
160 gdb_print_host_address (objfile
, gdb_stdout
);
161 printf_filtered (", bfd at ");
162 gdb_print_host_address (objfile
->obfd
, gdb_stdout
);
163 printf_filtered (", %d minsyms\n\n",
164 objfile
->per_bfd
->minimal_symbol_count
);
167 objfile
->sf
->qf
->dump (objfile
);
169 if (objfile
->compunit_symtabs
!= NULL
)
171 printf_filtered ("Symtabs:\n");
172 for (compunit_symtab
*cu
: objfile
->compunits ())
174 for (symtab
*symtab
: compunit_filetabs (cu
))
176 printf_filtered ("%s at ",
177 symtab_to_filename_for_display (symtab
));
178 gdb_print_host_address (symtab
, gdb_stdout
);
179 printf_filtered (", ");
180 if (SYMTAB_OBJFILE (symtab
) != objfile
)
182 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
= objfile
->arch ();
200 fprintf_filtered (outfile
, "\nObject file %s:\n\n", objfile_name (objfile
));
201 if (objfile
->per_bfd
->minimal_symbol_count
== 0)
203 fprintf_filtered (outfile
, "No minimal symbols found.\n");
207 for (minimal_symbol
*msymbol
: objfile
->msymbols ())
209 struct obj_section
*section
= MSYMBOL_OBJ_SECTION (objfile
, msymbol
);
211 switch (MSYMBOL_TYPE (msymbol
))
219 case mst_text_gnu_ifunc
:
220 case mst_data_gnu_ifunc
:
223 case mst_solib_trampoline
:
248 fprintf_filtered (outfile
, "[%2d] %c ", index
, ms_type
);
250 /* Use the relocated address as shown in the symbol here -- do
251 not try to respect copy relocations. */
252 CORE_ADDR addr
= (msymbol
->value
.address
253 + objfile
->section_offsets
[msymbol
->section
]);
254 fputs_filtered (paddress (gdbarch
, addr
), outfile
);
255 fprintf_filtered (outfile
, " %s", msymbol
->linkage_name ());
258 if (section
->the_bfd_section
!= NULL
)
259 fprintf_filtered (outfile
, " section %s",
260 bfd_section_name (section
->the_bfd_section
));
262 fprintf_filtered (outfile
, " spurious section %ld",
263 (long) (section
- objfile
->sections
));
265 if (msymbol
->demangled_name () != NULL
)
267 fprintf_filtered (outfile
, " %s", msymbol
->demangled_name ());
269 if (msymbol
->filename
)
270 fprintf_filtered (outfile
, " %s", msymbol
->filename
);
271 fputs_filtered ("\n", outfile
);
274 if (objfile
->per_bfd
->minimal_symbol_count
!= index
)
276 warning (_("internal error: minimal symbol count %d != %d"),
277 objfile
->per_bfd
->minimal_symbol_count
, index
);
279 fprintf_filtered (outfile
, "\n");
283 dump_symtab_1 (struct symtab
*symtab
, struct ui_file
*outfile
)
285 struct objfile
*objfile
= SYMTAB_OBJFILE (symtab
);
286 struct gdbarch
*gdbarch
= objfile
->arch ();
288 struct mdict_iterator miter
;
291 const struct blockvector
*bv
;
293 const struct block
*b
;
296 fprintf_filtered (outfile
, "\nSymtab for file %s at %s\n",
297 symtab_to_filename_for_display (symtab
),
298 host_address_to_string (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 if (l
->item
[i
].is_stmt
)
321 fprintf_filtered (outfile
, "\t(stmt)");
322 fprintf_filtered (outfile
, "\n");
325 /* Now print the block info, but only for compunit symtabs since we will
326 print lots of duplicate info otherwise. */
327 if (is_main_symtab_of_compunit_symtab (symtab
))
329 fprintf_filtered (outfile
, "\nBlockvector:\n\n");
330 bv
= SYMTAB_BLOCKVECTOR (symtab
);
331 len
= BLOCKVECTOR_NBLOCKS (bv
);
332 for (i
= 0; i
< len
; i
++)
334 b
= BLOCKVECTOR_BLOCK (bv
, i
);
335 depth
= block_depth (b
) * 2;
336 print_spaces (depth
, outfile
);
337 fprintf_filtered (outfile
, "block #%03d, object at ", i
);
338 gdb_print_host_address (b
, outfile
);
339 if (BLOCK_SUPERBLOCK (b
))
341 fprintf_filtered (outfile
, " under ");
342 gdb_print_host_address (BLOCK_SUPERBLOCK (b
), outfile
);
344 /* drow/2002-07-10: We could save the total symbols count
345 even if we're using a hashtable, but nothing else but this message
347 fprintf_filtered (outfile
, ", %d syms/buckets in ",
348 mdict_size (BLOCK_MULTIDICT (b
)));
349 fputs_filtered (paddress (gdbarch
, BLOCK_START (b
)), outfile
);
350 fprintf_filtered (outfile
, "..");
351 fputs_filtered (paddress (gdbarch
, BLOCK_END (b
)), outfile
);
352 if (BLOCK_FUNCTION (b
))
354 fprintf_filtered (outfile
, ", function %s",
355 BLOCK_FUNCTION (b
)->linkage_name ());
356 if (BLOCK_FUNCTION (b
)->demangled_name () != NULL
)
358 fprintf_filtered (outfile
, ", %s",
359 BLOCK_FUNCTION (b
)->demangled_name ());
362 fprintf_filtered (outfile
, "\n");
363 /* Now print each symbol in this block (in no particular order, if
364 we're using a hashtable). Note that we only want this
365 block, not any blocks from included symtabs. */
366 ALL_DICT_SYMBOLS (BLOCK_MULTIDICT (b
), miter
, sym
)
370 print_symbol (gdbarch
, sym
, depth
+ 1, outfile
);
372 catch (const gdb_exception_error
&ex
)
374 exception_fprintf (gdb_stderr
, ex
,
375 "Error printing symbol:\n");
379 fprintf_filtered (outfile
, "\n");
383 const char *compunit_filename
384 = symtab_to_filename_for_display (COMPUNIT_FILETABS (SYMTAB_COMPUNIT (symtab
)));
386 fprintf_filtered (outfile
,
387 "\nBlockvector same as owning compunit: %s\n\n",
391 /* Print info about the user of this compunit_symtab, and the
392 compunit_symtabs included by this one. */
393 if (is_main_symtab_of_compunit_symtab (symtab
))
395 struct compunit_symtab
*cust
= SYMTAB_COMPUNIT (symtab
);
397 if (cust
->user
!= nullptr)
400 = host_address_to_string (COMPUNIT_FILETABS (cust
->user
));
401 fprintf_filtered (outfile
, "Compunit user: %s\n", addr
);
403 if (cust
->includes
!= nullptr)
406 struct compunit_symtab
*include
= cust
->includes
[i
];
407 if (include
== nullptr)
410 = host_address_to_string (COMPUNIT_FILETABS (include
));
411 fprintf_filtered (outfile
, "Compunit include: %s\n", addr
);
417 dump_symtab (struct symtab
*symtab
, struct ui_file
*outfile
)
419 /* Set the current language to the language of the symtab we're dumping
420 because certain routines used during dump_symtab() use the current
421 language to print an image of the symbol. We'll restore it later.
422 But use only real languages, not placeholders. */
423 if (symtab
->language
!= language_unknown
424 && symtab
->language
!= language_auto
)
426 scoped_restore_current_language save_lang
;
427 set_language (symtab
->language
);
428 dump_symtab_1 (symtab
, outfile
);
431 dump_symtab_1 (symtab
, outfile
);
435 maintenance_print_symbols (const char *args
, int from_tty
)
437 struct ui_file
*outfile
= gdb_stdout
;
438 char *address_arg
= NULL
, *source_arg
= NULL
, *objfile_arg
= NULL
;
443 gdb_argv
argv (args
);
445 for (i
= 0; argv
!= NULL
&& argv
[i
] != NULL
; ++i
)
447 if (strcmp (argv
[i
], "-pc") == 0)
449 if (argv
[i
+ 1] == NULL
)
450 error (_("Missing pc value"));
451 address_arg
= argv
[++i
];
453 else if (strcmp (argv
[i
], "-source") == 0)
455 if (argv
[i
+ 1] == NULL
)
456 error (_("Missing source file"));
457 source_arg
= argv
[++i
];
459 else if (strcmp (argv
[i
], "-objfile") == 0)
461 if (argv
[i
+ 1] == NULL
)
462 error (_("Missing objfile name"));
463 objfile_arg
= argv
[++i
];
465 else if (strcmp (argv
[i
], "--") == 0)
467 /* End of options. */
471 else if (argv
[i
][0] == '-')
473 /* Future proofing: Don't allow OUTFILE to begin with "-". */
474 error (_("Unknown option: %s"), argv
[i
]);
481 if (address_arg
!= NULL
&& source_arg
!= NULL
)
482 error (_("Must specify at most one of -pc and -source"));
484 stdio_file arg_outfile
;
486 if (argv
!= NULL
&& argv
[outfile_idx
] != NULL
)
488 if (argv
[outfile_idx
+ 1] != NULL
)
489 error (_("Junk at end of command"));
490 gdb::unique_xmalloc_ptr
<char> outfile_name
491 (tilde_expand (argv
[outfile_idx
]));
492 if (!arg_outfile
.open (outfile_name
.get (), FOPEN_WT
))
493 perror_with_name (outfile_name
.get ());
494 outfile
= &arg_outfile
;
497 if (address_arg
!= NULL
)
499 CORE_ADDR pc
= parse_and_eval_address (address_arg
);
500 struct symtab
*s
= find_pc_line_symtab (pc
);
503 error (_("No symtab for address: %s"), address_arg
);
504 dump_symtab (s
, outfile
);
510 for (objfile
*objfile
: current_program_space
->objfiles ())
512 int print_for_objfile
= 1;
514 if (objfile_arg
!= NULL
)
516 = compare_filenames_for_search (objfile_name (objfile
),
518 if (!print_for_objfile
)
521 for (compunit_symtab
*cu
: objfile
->compunits ())
523 for (symtab
*s
: compunit_filetabs (cu
))
525 int print_for_source
= 0;
528 if (source_arg
!= NULL
)
531 = compare_filenames_for_search
532 (symtab_to_filename_for_display (s
), source_arg
);
535 if (source_arg
== NULL
537 dump_symtab (s
, outfile
);
542 if (source_arg
!= NULL
&& !found
)
543 error (_("No symtab for source file: %s"), source_arg
);
547 /* Print symbol SYMBOL on OUTFILE. DEPTH says how far to indent. */
550 print_symbol (struct gdbarch
*gdbarch
, struct symbol
*symbol
,
551 int depth
, ui_file
*outfile
)
553 struct obj_section
*section
;
555 if (SYMBOL_OBJFILE_OWNED (symbol
))
556 section
= SYMBOL_OBJ_SECTION (symbol_objfile (symbol
), symbol
);
560 print_spaces (depth
, outfile
);
561 if (SYMBOL_DOMAIN (symbol
) == LABEL_DOMAIN
)
563 fprintf_filtered (outfile
, "label %s at ", symbol
->print_name ());
564 fputs_filtered (paddress (gdbarch
, SYMBOL_VALUE_ADDRESS (symbol
)),
567 fprintf_filtered (outfile
, " section %s\n",
568 bfd_section_name (section
->the_bfd_section
));
570 fprintf_filtered (outfile
, "\n");
574 if (SYMBOL_DOMAIN (symbol
) == STRUCT_DOMAIN
)
576 if (SYMBOL_TYPE (symbol
)->name ())
578 LA_PRINT_TYPE (SYMBOL_TYPE (symbol
), "", outfile
, 1, depth
,
579 &type_print_raw_options
);
583 fprintf_filtered (outfile
, "%s %s = ",
584 (SYMBOL_TYPE (symbol
)->code () == TYPE_CODE_ENUM
586 : (SYMBOL_TYPE (symbol
)->code () == TYPE_CODE_STRUCT
587 ? "struct" : "union")),
588 symbol
->linkage_name ());
589 LA_PRINT_TYPE (SYMBOL_TYPE (symbol
), "", outfile
, 1, depth
,
590 &type_print_raw_options
);
592 fprintf_filtered (outfile
, ";\n");
596 if (SYMBOL_CLASS (symbol
) == LOC_TYPEDEF
)
597 fprintf_filtered (outfile
, "typedef ");
598 if (SYMBOL_TYPE (symbol
))
600 /* Print details of types, except for enums where it's clutter. */
601 LA_PRINT_TYPE (SYMBOL_TYPE (symbol
), symbol
->print_name (),
603 SYMBOL_TYPE (symbol
)->code () != TYPE_CODE_ENUM
,
605 &type_print_raw_options
);
606 fprintf_filtered (outfile
, "; ");
609 fprintf_filtered (outfile
, "%s ", symbol
->print_name ());
611 switch (SYMBOL_CLASS (symbol
))
614 fprintf_filtered (outfile
, "const %s (%s)",
615 plongest (SYMBOL_VALUE (symbol
)),
616 hex_string (SYMBOL_VALUE (symbol
)));
619 case LOC_CONST_BYTES
:
622 struct type
*type
= check_typedef (SYMBOL_TYPE (symbol
));
624 fprintf_filtered (outfile
, "const %s hex bytes:",
625 pulongest (TYPE_LENGTH (type
)));
626 for (i
= 0; i
< TYPE_LENGTH (type
); i
++)
627 fprintf_filtered (outfile
, " %02x",
628 (unsigned) SYMBOL_VALUE_BYTES (symbol
)[i
]);
633 fprintf_filtered (outfile
, "static 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 if (SYMBOL_IS_ARGUMENT (symbol
))
643 fprintf_filtered (outfile
, "parameter register %s",
644 plongest (SYMBOL_VALUE (symbol
)));
646 fprintf_filtered (outfile
, "register %s",
647 plongest (SYMBOL_VALUE (symbol
)));
651 fprintf_filtered (outfile
, "arg at offset %s",
652 hex_string (SYMBOL_VALUE (symbol
)));
656 fprintf_filtered (outfile
, "reference arg at %s",
657 hex_string (SYMBOL_VALUE (symbol
)));
660 case LOC_REGPARM_ADDR
:
661 fprintf_filtered (outfile
, "address parameter register %s",
662 plongest (SYMBOL_VALUE (symbol
)));
666 fprintf_filtered (outfile
, "local at offset %s",
667 hex_string (SYMBOL_VALUE (symbol
)));
674 fprintf_filtered (outfile
, "label at ");
675 fputs_filtered (paddress (gdbarch
, SYMBOL_VALUE_ADDRESS (symbol
)),
678 fprintf_filtered (outfile
, " section %s",
679 bfd_section_name (section
->the_bfd_section
));
683 fprintf_filtered (outfile
, "block object ");
684 gdb_print_host_address (SYMBOL_BLOCK_VALUE (symbol
), outfile
);
685 fprintf_filtered (outfile
, ", ");
686 fputs_filtered (paddress (gdbarch
,
687 BLOCK_START (SYMBOL_BLOCK_VALUE (symbol
))),
689 fprintf_filtered (outfile
, "..");
690 fputs_filtered (paddress (gdbarch
,
691 BLOCK_END (SYMBOL_BLOCK_VALUE (symbol
))),
694 fprintf_filtered (outfile
, " section %s",
695 bfd_section_name (section
->the_bfd_section
));
699 fprintf_filtered (outfile
, "computed at runtime");
703 fprintf_filtered (outfile
, "unresolved");
706 case LOC_OPTIMIZED_OUT
:
707 fprintf_filtered (outfile
, "optimized out");
711 fprintf_filtered (outfile
, "botched symbol class %x",
712 SYMBOL_CLASS (symbol
));
716 fprintf_filtered (outfile
, "\n");
720 maintenance_print_msymbols (const char *args
, int from_tty
)
722 struct ui_file
*outfile
= gdb_stdout
;
723 char *objfile_arg
= NULL
;
728 gdb_argv
argv (args
);
730 for (i
= 0; argv
!= NULL
&& argv
[i
] != NULL
; ++i
)
732 if (strcmp (argv
[i
], "-objfile") == 0)
734 if (argv
[i
+ 1] == NULL
)
735 error (_("Missing objfile name"));
736 objfile_arg
= argv
[++i
];
738 else if (strcmp (argv
[i
], "--") == 0)
740 /* End of options. */
744 else if (argv
[i
][0] == '-')
746 /* Future proofing: Don't allow OUTFILE to begin with "-". */
747 error (_("Unknown option: %s"), argv
[i
]);
754 stdio_file arg_outfile
;
756 if (argv
!= NULL
&& argv
[outfile_idx
] != NULL
)
758 if (argv
[outfile_idx
+ 1] != NULL
)
759 error (_("Junk at end of command"));
760 gdb::unique_xmalloc_ptr
<char> outfile_name
761 (tilde_expand (argv
[outfile_idx
]));
762 if (!arg_outfile
.open (outfile_name
.get (), FOPEN_WT
))
763 perror_with_name (outfile_name
.get ());
764 outfile
= &arg_outfile
;
767 for (objfile
*objfile
: current_program_space
->objfiles ())
770 if (objfile_arg
== NULL
771 || compare_filenames_for_search (objfile_name (objfile
), objfile_arg
))
772 dump_msymbols (objfile
, outfile
);
777 maintenance_print_objfiles (const char *regexp
, int from_tty
)
784 for (struct program_space
*pspace
: program_spaces
)
785 for (objfile
*objfile
: pspace
->objfiles ())
789 || re_exec (objfile_name (objfile
)))
790 dump_objfile (objfile
);
794 /* List all the symbol tables whose names match REGEXP (optional). */
797 maintenance_info_symtabs (const char *regexp
, int from_tty
)
804 for (struct program_space
*pspace
: program_spaces
)
805 for (objfile
*objfile
: pspace
->objfiles ())
807 /* We don't want to print anything for this objfile until we
808 actually find a symtab whose name matches. */
809 int printed_objfile_start
= 0;
811 for (compunit_symtab
*cust
: objfile
->compunits ())
813 int printed_compunit_symtab_start
= 0;
815 for (symtab
*symtab
: compunit_filetabs (cust
))
820 || re_exec (symtab_to_filename_for_display (symtab
)))
822 if (! printed_objfile_start
)
824 printf_filtered ("{ objfile %s ", objfile_name (objfile
));
826 printf_filtered ("((struct objfile *) %s)\n",
827 host_address_to_string (objfile
));
828 printed_objfile_start
= 1;
830 if (! printed_compunit_symtab_start
)
832 printf_filtered (" { ((struct compunit_symtab *) %s)\n",
833 host_address_to_string (cust
));
834 printf_filtered (" debugformat %s\n",
835 COMPUNIT_DEBUGFORMAT (cust
));
836 printf_filtered (" producer %s\n",
837 COMPUNIT_PRODUCER (cust
) != NULL
838 ? COMPUNIT_PRODUCER (cust
)
840 printf_filtered (" dirname %s\n",
841 COMPUNIT_DIRNAME (cust
) != NULL
842 ? COMPUNIT_DIRNAME (cust
)
844 printf_filtered (" blockvector"
845 " ((struct blockvector *) %s)\n",
846 host_address_to_string
847 (COMPUNIT_BLOCKVECTOR (cust
)));
848 printf_filtered (" user"
849 " ((struct compunit_symtab *) %s)\n",
850 cust
->user
!= nullptr
851 ? host_address_to_string (cust
->user
)
853 if (cust
->includes
!= nullptr)
855 printf_filtered (" ( includes\n");
856 for (int i
= 0; ; ++i
)
858 struct compunit_symtab
*include
860 if (include
== nullptr)
863 = host_address_to_string (include
);
864 printf_filtered (" (%s %s)\n",
865 "(struct compunit_symtab *)",
868 printf_filtered (" )\n");
870 printed_compunit_symtab_start
= 1;
873 printf_filtered ("\t{ symtab %s ",
874 symtab_to_filename_for_display (symtab
));
876 printf_filtered ("((struct symtab *) %s)\n",
877 host_address_to_string (symtab
));
878 printf_filtered ("\t fullname %s\n",
879 symtab
->fullname
!= NULL
882 printf_filtered ("\t "
883 "linetable ((struct linetable *) %s)\n",
884 host_address_to_string (symtab
->linetable
));
885 printf_filtered ("\t}\n");
889 if (printed_compunit_symtab_start
)
890 printf_filtered (" }\n");
893 if (printed_objfile_start
)
894 printf_filtered ("}\n");
898 /* Check consistency of symtabs.
899 An example of what this checks for is NULL blockvectors.
900 They can happen if there's a bug during debug info reading.
901 GDB assumes they are always non-NULL.
903 Note: This does not check for psymtab vs symtab consistency.
904 Use "maint check-psymtabs" for that. */
907 maintenance_check_symtabs (const char *ignore
, int from_tty
)
909 for (struct program_space
*pspace
: program_spaces
)
910 for (objfile
*objfile
: pspace
->objfiles ())
912 /* We don't want to print anything for this objfile until we
913 actually find something worth printing. */
914 int printed_objfile_start
= 0;
916 for (compunit_symtab
*cust
: objfile
->compunits ())
918 int found_something
= 0;
919 struct symtab
*symtab
= compunit_primary_filetab (cust
);
923 if (COMPUNIT_BLOCKVECTOR (cust
) == NULL
)
925 /* Add more checks here. */
929 if (! printed_objfile_start
)
931 printf_filtered ("{ objfile %s ", objfile_name (objfile
));
933 printf_filtered ("((struct objfile *) %s)\n",
934 host_address_to_string (objfile
));
935 printed_objfile_start
= 1;
937 printf_filtered (" { symtab %s\n",
938 symtab_to_filename_for_display (symtab
));
939 if (COMPUNIT_BLOCKVECTOR (cust
) == NULL
)
940 printf_filtered (" NULL blockvector\n");
941 printf_filtered (" }\n");
945 if (printed_objfile_start
)
946 printf_filtered ("}\n");
950 /* Expand all symbol tables whose name matches an optional regexp. */
953 maintenance_expand_symtabs (const char *args
, int from_tty
)
957 /* We use buildargv here so that we handle spaces in the regexp
958 in a way that allows adding more arguments later. */
959 gdb_argv
argv (args
);
967 error (_("Extra arguments after regexp."));
974 for (struct program_space
*pspace
: program_spaces
)
975 for (objfile
*objfile
: pspace
->objfiles ())
979 objfile
->sf
->qf
->expand_symtabs_matching
981 [&] (const char *filename
, bool basenames
)
983 /* KISS: Only apply the regexp to the complete file name. */
985 && (regexp
== NULL
|| re_exec (filename
)));
996 /* Return the nexting depth of a block within other blocks in its symtab. */
999 block_depth (const struct block
*block
)
1003 while ((block
= BLOCK_SUPERBLOCK (block
)) != NULL
)
1011 /* Used by MAINTENANCE_INFO_LINE_TABLES to print the information about a
1012 single line table. */
1015 maintenance_print_one_line_table (struct symtab
*symtab
, void *data
)
1017 struct linetable
*linetable
;
1018 struct objfile
*objfile
;
1020 objfile
= symtab
->compunit_symtab
->objfile
;
1021 printf_filtered (_("objfile: %s ((struct objfile *) %s)\n"),
1022 objfile_name (objfile
),
1023 host_address_to_string (objfile
));
1024 printf_filtered (_("compunit_symtab: ((struct compunit_symtab *) %s)\n"),
1025 host_address_to_string (symtab
->compunit_symtab
));
1026 printf_filtered (_("symtab: %s ((struct symtab *) %s)\n"),
1027 symtab_to_fullname (symtab
),
1028 host_address_to_string (symtab
));
1029 linetable
= SYMTAB_LINETABLE (symtab
);
1030 printf_filtered (_("linetable: ((struct linetable *) %s):\n"),
1031 host_address_to_string (linetable
));
1033 if (linetable
== NULL
)
1034 printf_filtered (_("No line table.\n"));
1035 else if (linetable
->nitems
<= 0)
1036 printf_filtered (_("Line table has no lines.\n"));
1039 /* Leave space for 6 digits of index and line number. After that the
1040 tables will just not format as well. */
1041 struct ui_out
*uiout
= current_uiout
;
1042 ui_out_emit_table
table_emitter (uiout
, 4, -1, "line-table");
1043 uiout
->table_header (6, ui_left
, "index", _("INDEX"));
1044 uiout
->table_header (6, ui_left
, "line", _("LINE"));
1045 uiout
->table_header (18, ui_left
, "address", _("ADDRESS"));
1046 uiout
->table_header (1, ui_left
, "is-stmt", _("IS-STMT"));
1047 uiout
->table_body ();
1049 for (int i
= 0; i
< linetable
->nitems
; ++i
)
1051 struct linetable_entry
*item
;
1053 item
= &linetable
->item
[i
];
1054 ui_out_emit_tuple
tuple_emitter (uiout
, nullptr);
1055 uiout
->field_signed ("index", i
);
1057 uiout
->field_signed ("line", item
->line
);
1059 uiout
->field_string ("line", _("END"));
1060 uiout
->field_core_addr ("address", objfile
->arch (),
1062 uiout
->field_string ("is-stmt", item
->is_stmt
? "Y" : "");
1070 /* Implement the 'maint info line-table' command. */
1073 maintenance_info_line_tables (const char *regexp
, int from_tty
)
1080 for (struct program_space
*pspace
: program_spaces
)
1081 for (objfile
*objfile
: pspace
->objfiles ())
1083 for (compunit_symtab
*cust
: objfile
->compunits ())
1085 for (symtab
*symtab
: compunit_filetabs (cust
))
1090 || re_exec (symtab_to_filename_for_display (symtab
)))
1091 maintenance_print_one_line_table (symtab
, NULL
);
1099 /* Do early runtime initializations. */
1101 void _initialize_symmisc ();
1103 _initialize_symmisc ()
1109 add_cmd ("symbols", class_maintenance
, maintenance_print_symbols
, _("\
1110 Print dump of current symbol definitions.\n\
1111 Usage: mt print symbols [-pc ADDRESS] [--] [OUTFILE]\n\
1112 mt print symbols [-objfile OBJFILE] [-source SOURCE] [--] [OUTFILE]\n\
1113 Entries in the full symbol table are dumped to file OUTFILE,\n\
1114 or the terminal if OUTFILE is unspecified.\n\
1115 If ADDRESS is provided, dump only the file for that address.\n\
1116 If SOURCE is provided, dump only that file's symbols.\n\
1117 If OBJFILE is provided, dump only that file's minimal symbols."),
1118 &maintenanceprintlist
);
1120 add_cmd ("msymbols", class_maintenance
, maintenance_print_msymbols
, _("\
1121 Print dump of current minimal symbol definitions.\n\
1122 Usage: mt print msymbols [-objfile OBJFILE] [--] [OUTFILE]\n\
1123 Entries in the minimal symbol table are dumped to file OUTFILE,\n\
1124 or the terminal if OUTFILE is unspecified.\n\
1125 If OBJFILE is provided, dump only that file's minimal symbols."),
1126 &maintenanceprintlist
);
1128 add_cmd ("objfiles", class_maintenance
, maintenance_print_objfiles
,
1129 _("Print dump of current object file definitions.\n\
1130 With an argument REGEXP, list the object files with matching names."),
1131 &maintenanceprintlist
);
1133 add_cmd ("symtabs", class_maintenance
, maintenance_info_symtabs
, _("\
1134 List the full symbol tables for all object files.\n\
1135 This does not include information about individual symbols, blocks, or\n\
1136 linetables --- just the symbol table structures themselves.\n\
1137 With an argument REGEXP, list the symbol tables with matching names."),
1138 &maintenanceinfolist
);
1140 add_cmd ("line-table", class_maintenance
, maintenance_info_line_tables
, _("\
1141 List the contents of all line tables, from all symbol tables.\n\
1142 With an argument REGEXP, list just the line tables for the symbol\n\
1143 tables with matching names."),
1144 &maintenanceinfolist
);
1146 add_cmd ("check-symtabs", class_maintenance
, maintenance_check_symtabs
,
1148 Check consistency of currently expanded symtabs."),
1151 add_cmd ("expand-symtabs", class_maintenance
, maintenance_expand_symtabs
,
1152 _("Expand symbol tables.\n\
1153 With an argument REGEXP, only expand the symbol tables with matching names."),