1 /* Do various things to symbol tables (other than lookup), for GDB.
3 Copyright (C) 1986-2022 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 "gdbsupport/gdb_obstack.h"
33 #include "gdbsupport/gdb_regex.h"
35 #include "dictionary.h"
36 #include "typeprint.h"
39 #include "readline/tilde.h"
40 #include <cli/cli-style.h>
41 #include "gdbsupport/buildargv.h"
43 /* Prototypes for local functions */
45 static int block_depth (const struct block
*);
47 static void print_symbol (struct gdbarch
*gdbarch
, struct symbol
*symbol
,
48 int depth
, ui_file
*outfile
);
52 print_objfile_statistics (void)
54 int i
, linetables
, blockvectors
;
56 for (struct program_space
*pspace
: program_spaces
)
57 for (objfile
*objfile
: pspace
->objfiles ())
60 printf_filtered (_("Statistics for '%s':\n"), objfile_name (objfile
));
61 if (OBJSTAT (objfile
, n_stabs
) > 0)
62 printf_filtered (_(" Number of \"stab\" symbols read: %d\n"),
63 OBJSTAT (objfile
, n_stabs
));
64 if (objfile
->per_bfd
->n_minsyms
> 0)
65 printf_filtered (_(" Number of \"minimal\" symbols read: %d\n"),
66 objfile
->per_bfd
->n_minsyms
);
67 if (OBJSTAT (objfile
, n_syms
) > 0)
68 printf_filtered (_(" Number of \"full\" symbols read: %d\n"),
69 OBJSTAT (objfile
, n_syms
));
70 if (OBJSTAT (objfile
, n_types
) > 0)
71 printf_filtered (_(" Number of \"types\" defined: %d\n"),
72 OBJSTAT (objfile
, n_types
));
75 for (compunit_symtab
*cu
: objfile
->compunits ())
77 for (symtab
*s
: compunit_filetabs (cu
))
80 if (SYMTAB_LINETABLE (s
) != NULL
)
84 blockvectors
= std::distance (objfile
->compunits ().begin (),
85 objfile
->compunits ().end ());
86 printf_filtered (_(" Number of symbol tables: %d\n"), i
);
87 printf_filtered (_(" Number of symbol tables with line tables: %d\n"),
89 printf_filtered (_(" Number of symbol tables with blockvectors: %d\n"),
92 objfile
->print_stats (false);
94 if (OBJSTAT (objfile
, sz_strtab
) > 0)
95 printf_filtered (_(" Space used by string tables: %d\n"),
96 OBJSTAT (objfile
, sz_strtab
));
97 printf_filtered (_(" Total memory used for objfile obstack: %s\n"),
98 pulongest (obstack_memory_used (&objfile
100 printf_filtered (_(" Total memory used for BFD obstack: %s\n"),
101 pulongest (obstack_memory_used (&objfile
->per_bfd
102 ->storage_obstack
)));
104 printf_filtered (_(" Total memory used for string cache: %d\n"),
105 objfile
->per_bfd
->string_cache
.memory_used ());
106 printf_filtered (_("Byte cache statistics for '%s':\n"),
107 objfile_name (objfile
));
108 objfile
->per_bfd
->string_cache
.print_statistics ("string cache");
109 objfile
->print_stats (true);
114 dump_objfile (struct objfile
*objfile
)
116 printf_filtered ("\nObject file %s: ", objfile_name (objfile
));
117 printf_filtered ("Objfile at %s, bfd at %s, %d minsyms\n\n",
118 host_address_to_string (objfile
),
119 host_address_to_string (objfile
->obfd
),
120 objfile
->per_bfd
->minimal_symbol_count
);
124 if (objfile
->compunit_symtabs
!= NULL
)
126 printf_filtered ("Symtabs:\n");
127 for (compunit_symtab
*cu
: objfile
->compunits ())
129 for (symtab
*symtab
: compunit_filetabs (cu
))
131 printf_filtered ("%s at %s",
132 symtab_to_filename_for_display (symtab
),
133 host_address_to_string (symtab
));
134 if (SYMTAB_OBJFILE (symtab
) != objfile
)
135 printf_filtered (", NOT ON CHAIN!");
136 printf_filtered ("\n");
139 printf_filtered ("\n\n");
143 /* Print minimal symbols from this objfile. */
146 dump_msymbols (struct objfile
*objfile
, struct ui_file
*outfile
)
148 struct gdbarch
*gdbarch
= objfile
->arch ();
152 fprintf_filtered (outfile
, "\nObject file %s:\n\n", objfile_name (objfile
));
153 if (objfile
->per_bfd
->minimal_symbol_count
== 0)
155 fprintf_filtered (outfile
, "No minimal symbols found.\n");
159 for (minimal_symbol
*msymbol
: objfile
->msymbols ())
161 struct obj_section
*section
= msymbol
->obj_section (objfile
);
163 switch (MSYMBOL_TYPE (msymbol
))
171 case mst_text_gnu_ifunc
:
172 case mst_data_gnu_ifunc
:
175 case mst_solib_trampoline
:
200 fprintf_filtered (outfile
, "[%2d] %c ", index
, ms_type
);
202 /* Use the relocated address as shown in the symbol here -- do
203 not try to respect copy relocations. */
204 CORE_ADDR addr
= (msymbol
->value
.address
205 + objfile
->section_offsets
[msymbol
->section_index ()]);
206 fputs_filtered (paddress (gdbarch
, addr
), outfile
);
207 fprintf_filtered (outfile
, " %s", msymbol
->linkage_name ());
210 if (section
->the_bfd_section
!= NULL
)
211 fprintf_filtered (outfile
, " section %s",
212 bfd_section_name (section
->the_bfd_section
));
214 fprintf_filtered (outfile
, " spurious section %ld",
215 (long) (section
- objfile
->sections
));
217 if (msymbol
->demangled_name () != NULL
)
219 fprintf_filtered (outfile
, " %s", msymbol
->demangled_name ());
221 if (msymbol
->filename
)
222 fprintf_filtered (outfile
, " %s", msymbol
->filename
);
223 fputs_filtered ("\n", outfile
);
226 if (objfile
->per_bfd
->minimal_symbol_count
!= index
)
228 warning (_("internal error: minimal symbol count %d != %d"),
229 objfile
->per_bfd
->minimal_symbol_count
, index
);
231 fprintf_filtered (outfile
, "\n");
235 dump_symtab_1 (struct symtab
*symtab
, struct ui_file
*outfile
)
237 struct objfile
*objfile
= SYMTAB_OBJFILE (symtab
);
238 struct gdbarch
*gdbarch
= objfile
->arch ();
240 struct mdict_iterator miter
;
243 const struct blockvector
*bv
;
245 const struct block
*b
;
248 fprintf_filtered (outfile
, "\nSymtab for file %s at %s\n",
249 symtab_to_filename_for_display (symtab
),
250 host_address_to_string (symtab
));
252 if (SYMTAB_DIRNAME (symtab
) != NULL
)
253 fprintf_filtered (outfile
, "Compilation directory is %s\n",
254 SYMTAB_DIRNAME (symtab
));
255 fprintf_filtered (outfile
, "Read from object file %s (%s)\n",
256 objfile_name (objfile
),
257 host_address_to_string (objfile
));
258 fprintf_filtered (outfile
, "Language: %s\n",
259 language_str (symtab
->language
));
261 /* First print the line table. */
262 l
= SYMTAB_LINETABLE (symtab
);
265 fprintf_filtered (outfile
, "\nLine table:\n\n");
267 for (i
= 0; i
< len
; i
++)
269 fprintf_filtered (outfile
, " line %d at ", l
->item
[i
].line
);
270 fputs_filtered (paddress (gdbarch
, l
->item
[i
].pc
), outfile
);
271 if (l
->item
[i
].is_stmt
)
272 fprintf_filtered (outfile
, "\t(stmt)");
273 fprintf_filtered (outfile
, "\n");
276 /* Now print the block info, but only for compunit symtabs since we will
277 print lots of duplicate info otherwise. */
278 if (is_main_symtab_of_compunit_symtab (symtab
))
280 fprintf_filtered (outfile
, "\nBlockvector:\n\n");
281 bv
= SYMTAB_BLOCKVECTOR (symtab
);
282 len
= BLOCKVECTOR_NBLOCKS (bv
);
283 for (i
= 0; i
< len
; i
++)
285 b
= BLOCKVECTOR_BLOCK (bv
, i
);
286 depth
= block_depth (b
) * 2;
287 fprintf_filtered (outfile
, "%*sblock #%03d, object at %s",
289 host_address_to_string (b
));
290 if (BLOCK_SUPERBLOCK (b
))
291 fprintf_filtered (outfile
, " under %s",
292 host_address_to_string (BLOCK_SUPERBLOCK (b
)));
293 /* drow/2002-07-10: We could save the total symbols count
294 even if we're using a hashtable, but nothing else but this message
296 fprintf_filtered (outfile
, ", %d syms/buckets in ",
297 mdict_size (BLOCK_MULTIDICT (b
)));
298 fputs_filtered (paddress (gdbarch
, BLOCK_START (b
)), outfile
);
299 fprintf_filtered (outfile
, "..");
300 fputs_filtered (paddress (gdbarch
, BLOCK_END (b
)), outfile
);
301 if (BLOCK_FUNCTION (b
))
303 fprintf_filtered (outfile
, ", function %s",
304 BLOCK_FUNCTION (b
)->linkage_name ());
305 if (BLOCK_FUNCTION (b
)->demangled_name () != NULL
)
307 fprintf_filtered (outfile
, ", %s",
308 BLOCK_FUNCTION (b
)->demangled_name ());
311 fprintf_filtered (outfile
, "\n");
312 /* Now print each symbol in this block (in no particular order, if
313 we're using a hashtable). Note that we only want this
314 block, not any blocks from included symtabs. */
315 ALL_DICT_SYMBOLS (BLOCK_MULTIDICT (b
), miter
, sym
)
319 print_symbol (gdbarch
, sym
, depth
+ 1, outfile
);
321 catch (const gdb_exception_error
&ex
)
323 exception_fprintf (gdb_stderr
, ex
,
324 "Error printing symbol:\n");
328 fprintf_filtered (outfile
, "\n");
332 const char *compunit_filename
333 = symtab_to_filename_for_display (COMPUNIT_FILETABS (SYMTAB_COMPUNIT (symtab
)));
335 fprintf_filtered (outfile
,
336 "\nBlockvector same as owning compunit: %s\n\n",
340 /* Print info about the user of this compunit_symtab, and the
341 compunit_symtabs included by this one. */
342 if (is_main_symtab_of_compunit_symtab (symtab
))
344 struct compunit_symtab
*cust
= SYMTAB_COMPUNIT (symtab
);
346 if (cust
->user
!= nullptr)
349 = host_address_to_string (COMPUNIT_FILETABS (cust
->user
));
350 fprintf_filtered (outfile
, "Compunit user: %s\n", addr
);
352 if (cust
->includes
!= nullptr)
355 struct compunit_symtab
*include
= cust
->includes
[i
];
356 if (include
== nullptr)
359 = host_address_to_string (COMPUNIT_FILETABS (include
));
360 fprintf_filtered (outfile
, "Compunit include: %s\n", addr
);
366 dump_symtab (struct symtab
*symtab
, struct ui_file
*outfile
)
368 /* Set the current language to the language of the symtab we're dumping
369 because certain routines used during dump_symtab() use the current
370 language to print an image of the symbol. We'll restore it later.
371 But use only real languages, not placeholders. */
372 if (symtab
->language
!= language_unknown
373 && symtab
->language
!= language_auto
)
375 scoped_restore_current_language save_lang
;
376 set_language (symtab
->language
);
377 dump_symtab_1 (symtab
, outfile
);
380 dump_symtab_1 (symtab
, outfile
);
384 maintenance_print_symbols (const char *args
, int from_tty
)
386 struct ui_file
*outfile
= gdb_stdout
;
387 char *address_arg
= NULL
, *source_arg
= NULL
, *objfile_arg
= NULL
;
392 gdb_argv
argv (args
);
394 for (i
= 0; argv
!= NULL
&& argv
[i
] != NULL
; ++i
)
396 if (strcmp (argv
[i
], "-pc") == 0)
398 if (argv
[i
+ 1] == NULL
)
399 error (_("Missing pc value"));
400 address_arg
= argv
[++i
];
402 else if (strcmp (argv
[i
], "-source") == 0)
404 if (argv
[i
+ 1] == NULL
)
405 error (_("Missing source file"));
406 source_arg
= argv
[++i
];
408 else if (strcmp (argv
[i
], "-objfile") == 0)
410 if (argv
[i
+ 1] == NULL
)
411 error (_("Missing objfile name"));
412 objfile_arg
= argv
[++i
];
414 else if (strcmp (argv
[i
], "--") == 0)
416 /* End of options. */
420 else if (argv
[i
][0] == '-')
422 /* Future proofing: Don't allow OUTFILE to begin with "-". */
423 error (_("Unknown option: %s"), argv
[i
]);
430 if (address_arg
!= NULL
&& source_arg
!= NULL
)
431 error (_("Must specify at most one of -pc and -source"));
433 stdio_file arg_outfile
;
435 if (argv
!= NULL
&& argv
[outfile_idx
] != NULL
)
437 if (argv
[outfile_idx
+ 1] != NULL
)
438 error (_("Junk at end of command"));
439 gdb::unique_xmalloc_ptr
<char> outfile_name
440 (tilde_expand (argv
[outfile_idx
]));
441 if (!arg_outfile
.open (outfile_name
.get (), FOPEN_WT
))
442 perror_with_name (outfile_name
.get ());
443 outfile
= &arg_outfile
;
446 if (address_arg
!= NULL
)
448 CORE_ADDR pc
= parse_and_eval_address (address_arg
);
449 struct symtab
*s
= find_pc_line_symtab (pc
);
452 error (_("No symtab for address: %s"), address_arg
);
453 dump_symtab (s
, outfile
);
459 for (objfile
*objfile
: current_program_space
->objfiles ())
461 int print_for_objfile
= 1;
463 if (objfile_arg
!= NULL
)
465 = compare_filenames_for_search (objfile_name (objfile
),
467 if (!print_for_objfile
)
470 for (compunit_symtab
*cu
: objfile
->compunits ())
472 for (symtab
*s
: compunit_filetabs (cu
))
474 int print_for_source
= 0;
477 if (source_arg
!= NULL
)
480 = compare_filenames_for_search
481 (symtab_to_filename_for_display (s
), source_arg
);
484 if (source_arg
== NULL
486 dump_symtab (s
, outfile
);
491 if (source_arg
!= NULL
&& !found
)
492 error (_("No symtab for source file: %s"), source_arg
);
496 /* Print symbol SYMBOL on OUTFILE. DEPTH says how far to indent. */
499 print_symbol (struct gdbarch
*gdbarch
, struct symbol
*symbol
,
500 int depth
, ui_file
*outfile
)
502 struct obj_section
*section
;
504 if (SYMBOL_OBJFILE_OWNED (symbol
))
505 section
= symbol
->obj_section (symbol_objfile (symbol
));
509 print_spaces_filtered (depth
, outfile
);
510 if (SYMBOL_DOMAIN (symbol
) == LABEL_DOMAIN
)
512 fprintf_filtered (outfile
, "label %s at ", symbol
->print_name ());
513 fputs_filtered (paddress (gdbarch
, SYMBOL_VALUE_ADDRESS (symbol
)),
516 fprintf_filtered (outfile
, " section %s\n",
517 bfd_section_name (section
->the_bfd_section
));
519 fprintf_filtered (outfile
, "\n");
523 if (SYMBOL_DOMAIN (symbol
) == STRUCT_DOMAIN
)
525 if (SYMBOL_TYPE (symbol
)->name ())
527 LA_PRINT_TYPE (SYMBOL_TYPE (symbol
), "", outfile
, 1, depth
,
528 &type_print_raw_options
);
532 fprintf_filtered (outfile
, "%s %s = ",
533 (SYMBOL_TYPE (symbol
)->code () == TYPE_CODE_ENUM
535 : (SYMBOL_TYPE (symbol
)->code () == TYPE_CODE_STRUCT
536 ? "struct" : "union")),
537 symbol
->linkage_name ());
538 LA_PRINT_TYPE (SYMBOL_TYPE (symbol
), "", outfile
, 1, depth
,
539 &type_print_raw_options
);
541 fprintf_filtered (outfile
, ";\n");
545 if (SYMBOL_CLASS (symbol
) == LOC_TYPEDEF
)
546 fprintf_filtered (outfile
, "typedef ");
547 if (SYMBOL_TYPE (symbol
))
549 /* Print details of types, except for enums where it's clutter. */
550 LA_PRINT_TYPE (SYMBOL_TYPE (symbol
), symbol
->print_name (),
552 SYMBOL_TYPE (symbol
)->code () != TYPE_CODE_ENUM
,
554 &type_print_raw_options
);
555 fprintf_filtered (outfile
, "; ");
558 fprintf_filtered (outfile
, "%s ", symbol
->print_name ());
560 switch (SYMBOL_CLASS (symbol
))
563 fprintf_filtered (outfile
, "const %s (%s)",
564 plongest (SYMBOL_VALUE (symbol
)),
565 hex_string (SYMBOL_VALUE (symbol
)));
568 case LOC_CONST_BYTES
:
571 struct type
*type
= check_typedef (SYMBOL_TYPE (symbol
));
573 fprintf_filtered (outfile
, "const %s hex bytes:",
574 pulongest (TYPE_LENGTH (type
)));
575 for (i
= 0; i
< TYPE_LENGTH (type
); i
++)
576 fprintf_filtered (outfile
, " %02x",
577 (unsigned) SYMBOL_VALUE_BYTES (symbol
)[i
]);
582 fprintf_filtered (outfile
, "static at ");
583 fputs_filtered (paddress (gdbarch
, SYMBOL_VALUE_ADDRESS (symbol
)),
586 fprintf_filtered (outfile
, " section %s",
587 bfd_section_name (section
->the_bfd_section
));
591 if (SYMBOL_IS_ARGUMENT (symbol
))
592 fprintf_filtered (outfile
, "parameter register %s",
593 plongest (SYMBOL_VALUE (symbol
)));
595 fprintf_filtered (outfile
, "register %s",
596 plongest (SYMBOL_VALUE (symbol
)));
600 fprintf_filtered (outfile
, "arg at offset %s",
601 hex_string (SYMBOL_VALUE (symbol
)));
605 fprintf_filtered (outfile
, "reference arg at %s",
606 hex_string (SYMBOL_VALUE (symbol
)));
609 case LOC_REGPARM_ADDR
:
610 fprintf_filtered (outfile
, "address parameter register %s",
611 plongest (SYMBOL_VALUE (symbol
)));
615 fprintf_filtered (outfile
, "local at offset %s",
616 hex_string (SYMBOL_VALUE (symbol
)));
623 fprintf_filtered (outfile
, "label at ");
624 fputs_filtered (paddress (gdbarch
, SYMBOL_VALUE_ADDRESS (symbol
)),
627 fprintf_filtered (outfile
, " section %s",
628 bfd_section_name (section
->the_bfd_section
));
633 (outfile
, "block object %s, %s..%s",
634 host_address_to_string (SYMBOL_BLOCK_VALUE (symbol
)),
635 paddress (gdbarch
, BLOCK_START (SYMBOL_BLOCK_VALUE (symbol
))),
636 paddress (gdbarch
, BLOCK_END (SYMBOL_BLOCK_VALUE (symbol
))));
638 fprintf_filtered (outfile
, " section %s",
639 bfd_section_name (section
->the_bfd_section
));
643 fprintf_filtered (outfile
, "computed at runtime");
647 fprintf_filtered (outfile
, "unresolved");
650 case LOC_OPTIMIZED_OUT
:
651 fprintf_filtered (outfile
, "optimized out");
655 fprintf_filtered (outfile
, "botched symbol class %x",
656 SYMBOL_CLASS (symbol
));
660 fprintf_filtered (outfile
, "\n");
664 maintenance_print_msymbols (const char *args
, int from_tty
)
666 struct ui_file
*outfile
= gdb_stdout
;
667 char *objfile_arg
= NULL
;
672 gdb_argv
argv (args
);
674 for (i
= 0; argv
!= NULL
&& argv
[i
] != NULL
; ++i
)
676 if (strcmp (argv
[i
], "-objfile") == 0)
678 if (argv
[i
+ 1] == NULL
)
679 error (_("Missing objfile name"));
680 objfile_arg
= argv
[++i
];
682 else if (strcmp (argv
[i
], "--") == 0)
684 /* End of options. */
688 else if (argv
[i
][0] == '-')
690 /* Future proofing: Don't allow OUTFILE to begin with "-". */
691 error (_("Unknown option: %s"), argv
[i
]);
698 stdio_file arg_outfile
;
700 if (argv
!= NULL
&& argv
[outfile_idx
] != NULL
)
702 if (argv
[outfile_idx
+ 1] != NULL
)
703 error (_("Junk at end of command"));
704 gdb::unique_xmalloc_ptr
<char> outfile_name
705 (tilde_expand (argv
[outfile_idx
]));
706 if (!arg_outfile
.open (outfile_name
.get (), FOPEN_WT
))
707 perror_with_name (outfile_name
.get ());
708 outfile
= &arg_outfile
;
711 for (objfile
*objfile
: current_program_space
->objfiles ())
714 if (objfile_arg
== NULL
715 || compare_filenames_for_search (objfile_name (objfile
), objfile_arg
))
716 dump_msymbols (objfile
, outfile
);
721 maintenance_print_objfiles (const char *regexp
, int from_tty
)
728 for (struct program_space
*pspace
: program_spaces
)
729 for (objfile
*objfile
: pspace
->objfiles ())
733 || re_exec (objfile_name (objfile
)))
734 dump_objfile (objfile
);
738 /* List all the symbol tables whose names match REGEXP (optional). */
741 maintenance_info_symtabs (const char *regexp
, int from_tty
)
748 for (struct program_space
*pspace
: program_spaces
)
749 for (objfile
*objfile
: pspace
->objfiles ())
751 /* We don't want to print anything for this objfile until we
752 actually find a symtab whose name matches. */
753 int printed_objfile_start
= 0;
755 for (compunit_symtab
*cust
: objfile
->compunits ())
757 int printed_compunit_symtab_start
= 0;
759 for (symtab
*symtab
: compunit_filetabs (cust
))
764 || re_exec (symtab_to_filename_for_display (symtab
)))
766 if (! printed_objfile_start
)
768 printf_filtered ("{ objfile %s ", objfile_name (objfile
));
770 printf_filtered ("((struct objfile *) %s)\n",
771 host_address_to_string (objfile
));
772 printed_objfile_start
= 1;
774 if (! printed_compunit_symtab_start
)
776 printf_filtered (" { ((struct compunit_symtab *) %s)\n",
777 host_address_to_string (cust
));
778 printf_filtered (" debugformat %s\n",
779 COMPUNIT_DEBUGFORMAT (cust
));
780 printf_filtered (" producer %s\n",
781 COMPUNIT_PRODUCER (cust
) != NULL
782 ? COMPUNIT_PRODUCER (cust
)
784 printf_filtered (" dirname %s\n",
785 COMPUNIT_DIRNAME (cust
) != NULL
786 ? COMPUNIT_DIRNAME (cust
)
788 printf_filtered (" blockvector"
789 " ((struct blockvector *) %s)\n",
790 host_address_to_string
791 (COMPUNIT_BLOCKVECTOR (cust
)));
792 printf_filtered (" user"
793 " ((struct compunit_symtab *) %s)\n",
794 cust
->user
!= nullptr
795 ? host_address_to_string (cust
->user
)
797 if (cust
->includes
!= nullptr)
799 printf_filtered (" ( includes\n");
800 for (int i
= 0; ; ++i
)
802 struct compunit_symtab
*include
804 if (include
== nullptr)
807 = host_address_to_string (include
);
808 printf_filtered (" (%s %s)\n",
809 "(struct compunit_symtab *)",
812 printf_filtered (" )\n");
814 printed_compunit_symtab_start
= 1;
817 printf_filtered ("\t{ symtab %s ",
818 symtab_to_filename_for_display (symtab
));
820 printf_filtered ("((struct symtab *) %s)\n",
821 host_address_to_string (symtab
));
822 printf_filtered ("\t fullname %s\n",
823 symtab
->fullname
!= NULL
826 printf_filtered ("\t "
827 "linetable ((struct linetable *) %s)\n",
828 host_address_to_string (symtab
->linetable
));
829 printf_filtered ("\t}\n");
833 if (printed_compunit_symtab_start
)
834 printf_filtered (" }\n");
837 if (printed_objfile_start
)
838 printf_filtered ("}\n");
842 /* Check consistency of symtabs.
843 An example of what this checks for is NULL blockvectors.
844 They can happen if there's a bug during debug info reading.
845 GDB assumes they are always non-NULL.
847 Note: This does not check for psymtab vs symtab consistency.
848 Use "maint check-psymtabs" for that. */
851 maintenance_check_symtabs (const char *ignore
, int from_tty
)
853 for (struct program_space
*pspace
: program_spaces
)
854 for (objfile
*objfile
: pspace
->objfiles ())
856 /* We don't want to print anything for this objfile until we
857 actually find something worth printing. */
858 int printed_objfile_start
= 0;
860 for (compunit_symtab
*cust
: objfile
->compunits ())
862 int found_something
= 0;
863 struct symtab
*symtab
= compunit_primary_filetab (cust
);
867 if (COMPUNIT_BLOCKVECTOR (cust
) == NULL
)
869 /* Add more checks here. */
873 if (! printed_objfile_start
)
875 printf_filtered ("{ objfile %s ", objfile_name (objfile
));
877 printf_filtered ("((struct objfile *) %s)\n",
878 host_address_to_string (objfile
));
879 printed_objfile_start
= 1;
881 printf_filtered (" { symtab %s\n",
882 symtab_to_filename_for_display (symtab
));
883 if (COMPUNIT_BLOCKVECTOR (cust
) == NULL
)
884 printf_filtered (" NULL blockvector\n");
885 printf_filtered (" }\n");
889 if (printed_objfile_start
)
890 printf_filtered ("}\n");
894 /* Expand all symbol tables whose name matches an optional regexp. */
897 maintenance_expand_symtabs (const char *args
, int from_tty
)
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."));
918 for (struct program_space
*pspace
: program_spaces
)
919 for (objfile
*objfile
: pspace
->objfiles ())
920 objfile
->expand_symtabs_matching
921 ([&] (const char *filename
, bool basenames
)
923 /* KISS: Only apply the regexp to the complete file name. */
925 && (regexp
== NULL
|| re_exec (filename
)));
930 SEARCH_GLOBAL_BLOCK
| SEARCH_STATIC_BLOCK
,
936 /* Return the nexting depth of a block within other blocks in its symtab. */
939 block_depth (const 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: %ps ((struct objfile *) %s)\n"),
962 styled_string (file_name_style
.style (),
963 objfile_name (objfile
)),
964 host_address_to_string (objfile
));
965 printf_filtered (_("compunit_symtab: %s ((struct compunit_symtab *) %s)\n"),
966 symtab
->compunit_symtab
->name
,
967 host_address_to_string (symtab
->compunit_symtab
));
968 printf_filtered (_("symtab: %ps ((struct symtab *) %s)\n"),
969 styled_string (file_name_style
.style (),
970 symtab_to_fullname (symtab
)),
971 host_address_to_string (symtab
));
972 linetable
= SYMTAB_LINETABLE (symtab
);
973 printf_filtered (_("linetable: ((struct linetable *) %s):\n"),
974 host_address_to_string (linetable
));
976 if (linetable
== NULL
)
977 printf_filtered (_("No line table.\n"));
978 else if (linetable
->nitems
<= 0)
979 printf_filtered (_("Line table has no lines.\n"));
982 /* Leave space for 6 digits of index and line number. After that the
983 tables will just not format as well. */
984 struct ui_out
*uiout
= current_uiout
;
985 ui_out_emit_table
table_emitter (uiout
, 4, -1, "line-table");
986 uiout
->table_header (6, ui_left
, "index", _("INDEX"));
987 uiout
->table_header (6, ui_left
, "line", _("LINE"));
988 uiout
->table_header (18, ui_left
, "address", _("ADDRESS"));
989 uiout
->table_header (1, ui_left
, "is-stmt", _("IS-STMT"));
990 uiout
->table_body ();
992 for (int i
= 0; i
< linetable
->nitems
; ++i
)
994 struct linetable_entry
*item
;
996 item
= &linetable
->item
[i
];
997 ui_out_emit_tuple
tuple_emitter (uiout
, nullptr);
998 uiout
->field_signed ("index", i
);
1000 uiout
->field_signed ("line", item
->line
);
1002 uiout
->field_string ("line", _("END"));
1003 uiout
->field_core_addr ("address", objfile
->arch (),
1005 uiout
->field_string ("is-stmt", item
->is_stmt
? "Y" : "");
1013 /* Implement the 'maint info line-table' command. */
1016 maintenance_info_line_tables (const char *regexp
, int from_tty
)
1023 for (struct program_space
*pspace
: program_spaces
)
1024 for (objfile
*objfile
: pspace
->objfiles ())
1026 for (compunit_symtab
*cust
: objfile
->compunits ())
1028 for (symtab
*symtab
: compunit_filetabs (cust
))
1033 || re_exec (symtab_to_filename_for_display (symtab
)))
1035 maintenance_print_one_line_table (symtab
, NULL
);
1036 printf_filtered ("\n");
1045 /* Do early runtime initializations. */
1047 void _initialize_symmisc ();
1049 _initialize_symmisc ()
1051 add_cmd ("symbols", class_maintenance
, maintenance_print_symbols
, _("\
1052 Print dump of current symbol definitions.\n\
1053 Usage: mt print symbols [-pc ADDRESS] [--] [OUTFILE]\n\
1054 mt print symbols [-objfile OBJFILE] [-source SOURCE] [--] [OUTFILE]\n\
1055 Entries in the full symbol table are dumped to file OUTFILE,\n\
1056 or the terminal if OUTFILE is unspecified.\n\
1057 If ADDRESS is provided, dump only the file for that address.\n\
1058 If SOURCE is provided, dump only that file's symbols.\n\
1059 If OBJFILE is provided, dump only that file's minimal symbols."),
1060 &maintenanceprintlist
);
1062 add_cmd ("msymbols", class_maintenance
, maintenance_print_msymbols
, _("\
1063 Print dump of current minimal symbol definitions.\n\
1064 Usage: mt print msymbols [-objfile OBJFILE] [--] [OUTFILE]\n\
1065 Entries in the minimal symbol table are dumped to file OUTFILE,\n\
1066 or the terminal if OUTFILE is unspecified.\n\
1067 If OBJFILE is provided, dump only that file's minimal symbols."),
1068 &maintenanceprintlist
);
1070 add_cmd ("objfiles", class_maintenance
, maintenance_print_objfiles
,
1071 _("Print dump of current object file definitions.\n\
1072 With an argument REGEXP, list the object files with matching names."),
1073 &maintenanceprintlist
);
1075 add_cmd ("symtabs", class_maintenance
, maintenance_info_symtabs
, _("\
1076 List the full symbol tables for all object files.\n\
1077 This does not include information about individual symbols, blocks, or\n\
1078 linetables --- just the symbol table structures themselves.\n\
1079 With an argument REGEXP, list the symbol tables with matching names."),
1080 &maintenanceinfolist
);
1082 add_cmd ("line-table", class_maintenance
, maintenance_info_line_tables
, _("\
1083 List the contents of all line tables, from all symbol tables.\n\
1084 With an argument REGEXP, list just the line tables for the symbol\n\
1085 tables with matching names."),
1086 &maintenanceinfolist
);
1088 add_cmd ("check-symtabs", class_maintenance
, maintenance_check_symtabs
,
1090 Check consistency of currently expanded symtabs."),
1093 add_cmd ("expand-symtabs", class_maintenance
, maintenance_expand_symtabs
,
1094 _("Expand symbol tables.\n\
1095 With an argument REGEXP, only expand the symbol tables with matching names."),