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 /* Prototypes for local functions */
46 static int block_depth (const struct block
*);
48 static void print_symbol (struct gdbarch
*gdbarch
, struct symbol
*symbol
,
49 int depth
, ui_file
*outfile
);
53 print_symbol_bcache_statistics (void)
55 for (struct program_space
*pspace
: program_spaces
)
56 for (objfile
*objfile
: pspace
->objfiles ())
59 printf_filtered (_("Byte cache statistics for '%s':\n"),
60 objfile_name (objfile
));
61 objfile
->partial_symtabs
->psymbol_cache
.print_statistics
62 ("partial symbol cache");
63 objfile
->per_bfd
->string_cache
.print_statistics ("string cache");
67 /* Count the number of partial symbols in OBJFILE. */
70 count_psyms (struct objfile
*objfile
)
73 for (partial_symtab
*pst
: objfile
->psymtabs ())
75 count
+= pst
->global_psymbols
.size ();
76 count
+= pst
->static_psymbols
.size ();
82 print_objfile_statistics (void)
84 int i
, linetables
, blockvectors
;
86 for (struct program_space
*pspace
: program_spaces
)
87 for (objfile
*objfile
: pspace
->objfiles ())
90 printf_filtered (_("Statistics for '%s':\n"), objfile_name (objfile
));
91 if (OBJSTAT (objfile
, n_stabs
) > 0)
92 printf_filtered (_(" Number of \"stab\" symbols read: %d\n"),
93 OBJSTAT (objfile
, n_stabs
));
94 if (objfile
->per_bfd
->n_minsyms
> 0)
95 printf_filtered (_(" Number of \"minimal\" symbols read: %d\n"),
96 objfile
->per_bfd
->n_minsyms
);
98 int n_psyms
= count_psyms (objfile
);
100 printf_filtered (_(" Number of \"partial\" symbols read: %d\n"),
102 if (OBJSTAT (objfile
, n_syms
) > 0)
103 printf_filtered (_(" Number of \"full\" symbols read: %d\n"),
104 OBJSTAT (objfile
, n_syms
));
105 if (OBJSTAT (objfile
, n_types
) > 0)
106 printf_filtered (_(" Number of \"types\" defined: %d\n"),
107 OBJSTAT (objfile
, n_types
));
109 objfile
->sf
->qf
->print_stats (objfile
);
111 for (compunit_symtab
*cu
: objfile
->compunits ())
113 for (symtab
*s
: compunit_filetabs (cu
))
116 if (SYMTAB_LINETABLE (s
) != NULL
)
120 blockvectors
= std::distance (objfile
->compunits ().begin (),
121 objfile
->compunits ().end ());
122 printf_filtered (_(" Number of symbol tables: %d\n"), i
);
123 printf_filtered (_(" Number of symbol tables with line tables: %d\n"),
125 printf_filtered (_(" Number of symbol tables with blockvectors: %d\n"),
128 if (OBJSTAT (objfile
, sz_strtab
) > 0)
129 printf_filtered (_(" Space used by string tables: %d\n"),
130 OBJSTAT (objfile
, sz_strtab
));
131 printf_filtered (_(" Total memory used for objfile obstack: %s\n"),
132 pulongest (obstack_memory_used (&objfile
133 ->objfile_obstack
)));
134 printf_filtered (_(" Total memory used for BFD obstack: %s\n"),
135 pulongest (obstack_memory_used (&objfile
->per_bfd
136 ->storage_obstack
)));
138 (_(" Total memory used for psymbol cache: %d\n"),
139 objfile
->partial_symtabs
->psymbol_cache
.memory_used ());
140 printf_filtered (_(" Total memory used for string cache: %d\n"),
141 objfile
->per_bfd
->string_cache
.memory_used ());
146 dump_objfile (struct objfile
*objfile
)
148 printf_filtered ("\nObject file %s: ", objfile_name (objfile
));
149 printf_filtered ("Objfile at ");
150 gdb_print_host_address (objfile
, gdb_stdout
);
151 printf_filtered (", bfd at ");
152 gdb_print_host_address (objfile
->obfd
, gdb_stdout
);
153 printf_filtered (", %d minsyms\n\n",
154 objfile
->per_bfd
->minimal_symbol_count
);
157 objfile
->sf
->qf
->dump (objfile
);
159 if (objfile
->compunit_symtabs
!= NULL
)
161 printf_filtered ("Symtabs:\n");
162 for (compunit_symtab
*cu
: objfile
->compunits ())
164 for (symtab
*symtab
: compunit_filetabs (cu
))
166 printf_filtered ("%s at ",
167 symtab_to_filename_for_display (symtab
));
168 gdb_print_host_address (symtab
, gdb_stdout
);
169 printf_filtered (", ");
170 if (SYMTAB_OBJFILE (symtab
) != objfile
)
172 printf_filtered ("NOT ON CHAIN! ");
177 printf_filtered ("\n\n");
181 /* Print minimal symbols from this objfile. */
184 dump_msymbols (struct objfile
*objfile
, struct ui_file
*outfile
)
186 struct gdbarch
*gdbarch
= objfile
->arch ();
190 fprintf_filtered (outfile
, "\nObject file %s:\n\n", objfile_name (objfile
));
191 if (objfile
->per_bfd
->minimal_symbol_count
== 0)
193 fprintf_filtered (outfile
, "No minimal symbols found.\n");
197 for (minimal_symbol
*msymbol
: objfile
->msymbols ())
199 struct obj_section
*section
= msymbol
->obj_section (objfile
);
201 switch (MSYMBOL_TYPE (msymbol
))
209 case mst_text_gnu_ifunc
:
210 case mst_data_gnu_ifunc
:
213 case mst_solib_trampoline
:
238 fprintf_filtered (outfile
, "[%2d] %c ", index
, ms_type
);
240 /* Use the relocated address as shown in the symbol here -- do
241 not try to respect copy relocations. */
242 CORE_ADDR addr
= (msymbol
->value
.address
243 + objfile
->section_offsets
[msymbol
->section
]);
244 fputs_filtered (paddress (gdbarch
, addr
), outfile
);
245 fprintf_filtered (outfile
, " %s", msymbol
->linkage_name ());
248 if (section
->the_bfd_section
!= NULL
)
249 fprintf_filtered (outfile
, " section %s",
250 bfd_section_name (section
->the_bfd_section
));
252 fprintf_filtered (outfile
, " spurious section %ld",
253 (long) (section
- objfile
->sections
));
255 if (msymbol
->demangled_name () != NULL
)
257 fprintf_filtered (outfile
, " %s", msymbol
->demangled_name ());
259 if (msymbol
->filename
)
260 fprintf_filtered (outfile
, " %s", msymbol
->filename
);
261 fputs_filtered ("\n", outfile
);
264 if (objfile
->per_bfd
->minimal_symbol_count
!= index
)
266 warning (_("internal error: minimal symbol count %d != %d"),
267 objfile
->per_bfd
->minimal_symbol_count
, index
);
269 fprintf_filtered (outfile
, "\n");
273 dump_symtab_1 (struct symtab
*symtab
, struct ui_file
*outfile
)
275 struct objfile
*objfile
= SYMTAB_OBJFILE (symtab
);
276 struct gdbarch
*gdbarch
= objfile
->arch ();
278 struct mdict_iterator miter
;
281 const struct blockvector
*bv
;
283 const struct block
*b
;
286 fprintf_filtered (outfile
, "\nSymtab for file %s at %s\n",
287 symtab_to_filename_for_display (symtab
),
288 host_address_to_string (symtab
));
290 if (SYMTAB_DIRNAME (symtab
) != NULL
)
291 fprintf_filtered (outfile
, "Compilation directory is %s\n",
292 SYMTAB_DIRNAME (symtab
));
293 fprintf_filtered (outfile
, "Read from object file %s (",
294 objfile_name (objfile
));
295 gdb_print_host_address (objfile
, outfile
);
296 fprintf_filtered (outfile
, ")\n");
297 fprintf_filtered (outfile
, "Language: %s\n",
298 language_str (symtab
->language
));
300 /* First print the line table. */
301 l
= SYMTAB_LINETABLE (symtab
);
304 fprintf_filtered (outfile
, "\nLine table:\n\n");
306 for (i
= 0; i
< len
; i
++)
308 fprintf_filtered (outfile
, " line %d at ", l
->item
[i
].line
);
309 fputs_filtered (paddress (gdbarch
, l
->item
[i
].pc
), outfile
);
310 if (l
->item
[i
].is_stmt
)
311 fprintf_filtered (outfile
, "\t(stmt)");
312 fprintf_filtered (outfile
, "\n");
315 /* Now print the block info, but only for compunit symtabs since we will
316 print lots of duplicate info otherwise. */
317 if (is_main_symtab_of_compunit_symtab (symtab
))
319 fprintf_filtered (outfile
, "\nBlockvector:\n\n");
320 bv
= SYMTAB_BLOCKVECTOR (symtab
);
321 len
= BLOCKVECTOR_NBLOCKS (bv
);
322 for (i
= 0; i
< len
; i
++)
324 b
= BLOCKVECTOR_BLOCK (bv
, i
);
325 depth
= block_depth (b
) * 2;
326 print_spaces (depth
, outfile
);
327 fprintf_filtered (outfile
, "block #%03d, object at ", i
);
328 gdb_print_host_address (b
, outfile
);
329 if (BLOCK_SUPERBLOCK (b
))
331 fprintf_filtered (outfile
, " under ");
332 gdb_print_host_address (BLOCK_SUPERBLOCK (b
), outfile
);
334 /* drow/2002-07-10: We could save the total symbols count
335 even if we're using a hashtable, but nothing else but this message
337 fprintf_filtered (outfile
, ", %d syms/buckets in ",
338 mdict_size (BLOCK_MULTIDICT (b
)));
339 fputs_filtered (paddress (gdbarch
, BLOCK_START (b
)), outfile
);
340 fprintf_filtered (outfile
, "..");
341 fputs_filtered (paddress (gdbarch
, BLOCK_END (b
)), outfile
);
342 if (BLOCK_FUNCTION (b
))
344 fprintf_filtered (outfile
, ", function %s",
345 BLOCK_FUNCTION (b
)->linkage_name ());
346 if (BLOCK_FUNCTION (b
)->demangled_name () != NULL
)
348 fprintf_filtered (outfile
, ", %s",
349 BLOCK_FUNCTION (b
)->demangled_name ());
352 fprintf_filtered (outfile
, "\n");
353 /* Now print each symbol in this block (in no particular order, if
354 we're using a hashtable). Note that we only want this
355 block, not any blocks from included symtabs. */
356 ALL_DICT_SYMBOLS (BLOCK_MULTIDICT (b
), miter
, sym
)
360 print_symbol (gdbarch
, sym
, depth
+ 1, outfile
);
362 catch (const gdb_exception_error
&ex
)
364 exception_fprintf (gdb_stderr
, ex
,
365 "Error printing symbol:\n");
369 fprintf_filtered (outfile
, "\n");
373 const char *compunit_filename
374 = symtab_to_filename_for_display (COMPUNIT_FILETABS (SYMTAB_COMPUNIT (symtab
)));
376 fprintf_filtered (outfile
,
377 "\nBlockvector same as owning compunit: %s\n\n",
381 /* Print info about the user of this compunit_symtab, and the
382 compunit_symtabs included by this one. */
383 if (is_main_symtab_of_compunit_symtab (symtab
))
385 struct compunit_symtab
*cust
= SYMTAB_COMPUNIT (symtab
);
387 if (cust
->user
!= nullptr)
390 = host_address_to_string (COMPUNIT_FILETABS (cust
->user
));
391 fprintf_filtered (outfile
, "Compunit user: %s\n", addr
);
393 if (cust
->includes
!= nullptr)
396 struct compunit_symtab
*include
= cust
->includes
[i
];
397 if (include
== nullptr)
400 = host_address_to_string (COMPUNIT_FILETABS (include
));
401 fprintf_filtered (outfile
, "Compunit include: %s\n", addr
);
407 dump_symtab (struct symtab
*symtab
, struct ui_file
*outfile
)
409 /* Set the current language to the language of the symtab we're dumping
410 because certain routines used during dump_symtab() use the current
411 language to print an image of the symbol. We'll restore it later.
412 But use only real languages, not placeholders. */
413 if (symtab
->language
!= language_unknown
414 && symtab
->language
!= language_auto
)
416 scoped_restore_current_language save_lang
;
417 set_language (symtab
->language
);
418 dump_symtab_1 (symtab
, outfile
);
421 dump_symtab_1 (symtab
, outfile
);
425 maintenance_print_symbols (const char *args
, int from_tty
)
427 struct ui_file
*outfile
= gdb_stdout
;
428 char *address_arg
= NULL
, *source_arg
= NULL
, *objfile_arg
= NULL
;
433 gdb_argv
argv (args
);
435 for (i
= 0; argv
!= NULL
&& argv
[i
] != NULL
; ++i
)
437 if (strcmp (argv
[i
], "-pc") == 0)
439 if (argv
[i
+ 1] == NULL
)
440 error (_("Missing pc value"));
441 address_arg
= argv
[++i
];
443 else if (strcmp (argv
[i
], "-source") == 0)
445 if (argv
[i
+ 1] == NULL
)
446 error (_("Missing source file"));
447 source_arg
= argv
[++i
];
449 else if (strcmp (argv
[i
], "-objfile") == 0)
451 if (argv
[i
+ 1] == NULL
)
452 error (_("Missing objfile name"));
453 objfile_arg
= argv
[++i
];
455 else if (strcmp (argv
[i
], "--") == 0)
457 /* End of options. */
461 else if (argv
[i
][0] == '-')
463 /* Future proofing: Don't allow OUTFILE to begin with "-". */
464 error (_("Unknown option: %s"), argv
[i
]);
471 if (address_arg
!= NULL
&& source_arg
!= NULL
)
472 error (_("Must specify at most one of -pc and -source"));
474 stdio_file arg_outfile
;
476 if (argv
!= NULL
&& argv
[outfile_idx
] != NULL
)
478 if (argv
[outfile_idx
+ 1] != NULL
)
479 error (_("Junk at end of command"));
480 gdb::unique_xmalloc_ptr
<char> outfile_name
481 (tilde_expand (argv
[outfile_idx
]));
482 if (!arg_outfile
.open (outfile_name
.get (), FOPEN_WT
))
483 perror_with_name (outfile_name
.get ());
484 outfile
= &arg_outfile
;
487 if (address_arg
!= NULL
)
489 CORE_ADDR pc
= parse_and_eval_address (address_arg
);
490 struct symtab
*s
= find_pc_line_symtab (pc
);
493 error (_("No symtab for address: %s"), address_arg
);
494 dump_symtab (s
, outfile
);
500 for (objfile
*objfile
: current_program_space
->objfiles ())
502 int print_for_objfile
= 1;
504 if (objfile_arg
!= NULL
)
506 = compare_filenames_for_search (objfile_name (objfile
),
508 if (!print_for_objfile
)
511 for (compunit_symtab
*cu
: objfile
->compunits ())
513 for (symtab
*s
: compunit_filetabs (cu
))
515 int print_for_source
= 0;
518 if (source_arg
!= NULL
)
521 = compare_filenames_for_search
522 (symtab_to_filename_for_display (s
), source_arg
);
525 if (source_arg
== NULL
527 dump_symtab (s
, outfile
);
532 if (source_arg
!= NULL
&& !found
)
533 error (_("No symtab for source file: %s"), source_arg
);
537 /* Print symbol SYMBOL on OUTFILE. DEPTH says how far to indent. */
540 print_symbol (struct gdbarch
*gdbarch
, struct symbol
*symbol
,
541 int depth
, ui_file
*outfile
)
543 struct obj_section
*section
;
545 if (SYMBOL_OBJFILE_OWNED (symbol
))
546 section
= symbol
->obj_section (symbol_objfile (symbol
));
550 print_spaces (depth
, outfile
);
551 if (SYMBOL_DOMAIN (symbol
) == LABEL_DOMAIN
)
553 fprintf_filtered (outfile
, "label %s at ", symbol
->print_name ());
554 fputs_filtered (paddress (gdbarch
, SYMBOL_VALUE_ADDRESS (symbol
)),
557 fprintf_filtered (outfile
, " section %s\n",
558 bfd_section_name (section
->the_bfd_section
));
560 fprintf_filtered (outfile
, "\n");
564 if (SYMBOL_DOMAIN (symbol
) == STRUCT_DOMAIN
)
566 if (SYMBOL_TYPE (symbol
)->name ())
568 LA_PRINT_TYPE (SYMBOL_TYPE (symbol
), "", outfile
, 1, depth
,
569 &type_print_raw_options
);
573 fprintf_filtered (outfile
, "%s %s = ",
574 (SYMBOL_TYPE (symbol
)->code () == TYPE_CODE_ENUM
576 : (SYMBOL_TYPE (symbol
)->code () == TYPE_CODE_STRUCT
577 ? "struct" : "union")),
578 symbol
->linkage_name ());
579 LA_PRINT_TYPE (SYMBOL_TYPE (symbol
), "", outfile
, 1, depth
,
580 &type_print_raw_options
);
582 fprintf_filtered (outfile
, ";\n");
586 if (SYMBOL_CLASS (symbol
) == LOC_TYPEDEF
)
587 fprintf_filtered (outfile
, "typedef ");
588 if (SYMBOL_TYPE (symbol
))
590 /* Print details of types, except for enums where it's clutter. */
591 LA_PRINT_TYPE (SYMBOL_TYPE (symbol
), symbol
->print_name (),
593 SYMBOL_TYPE (symbol
)->code () != TYPE_CODE_ENUM
,
595 &type_print_raw_options
);
596 fprintf_filtered (outfile
, "; ");
599 fprintf_filtered (outfile
, "%s ", symbol
->print_name ());
601 switch (SYMBOL_CLASS (symbol
))
604 fprintf_filtered (outfile
, "const %s (%s)",
605 plongest (SYMBOL_VALUE (symbol
)),
606 hex_string (SYMBOL_VALUE (symbol
)));
609 case LOC_CONST_BYTES
:
612 struct type
*type
= check_typedef (SYMBOL_TYPE (symbol
));
614 fprintf_filtered (outfile
, "const %s hex bytes:",
615 pulongest (TYPE_LENGTH (type
)));
616 for (i
= 0; i
< TYPE_LENGTH (type
); i
++)
617 fprintf_filtered (outfile
, " %02x",
618 (unsigned) SYMBOL_VALUE_BYTES (symbol
)[i
]);
623 fprintf_filtered (outfile
, "static at ");
624 fputs_filtered (paddress (gdbarch
, SYMBOL_VALUE_ADDRESS (symbol
)),
627 fprintf_filtered (outfile
, " section %s",
628 bfd_section_name (section
->the_bfd_section
));
632 if (SYMBOL_IS_ARGUMENT (symbol
))
633 fprintf_filtered (outfile
, "parameter register %s",
634 plongest (SYMBOL_VALUE (symbol
)));
636 fprintf_filtered (outfile
, "register %s",
637 plongest (SYMBOL_VALUE (symbol
)));
641 fprintf_filtered (outfile
, "arg at offset %s",
642 hex_string (SYMBOL_VALUE (symbol
)));
646 fprintf_filtered (outfile
, "reference arg at %s",
647 hex_string (SYMBOL_VALUE (symbol
)));
650 case LOC_REGPARM_ADDR
:
651 fprintf_filtered (outfile
, "address parameter register %s",
652 plongest (SYMBOL_VALUE (symbol
)));
656 fprintf_filtered (outfile
, "local at offset %s",
657 hex_string (SYMBOL_VALUE (symbol
)));
664 fprintf_filtered (outfile
, "label at ");
665 fputs_filtered (paddress (gdbarch
, SYMBOL_VALUE_ADDRESS (symbol
)),
668 fprintf_filtered (outfile
, " section %s",
669 bfd_section_name (section
->the_bfd_section
));
673 fprintf_filtered (outfile
, "block object ");
674 gdb_print_host_address (SYMBOL_BLOCK_VALUE (symbol
), outfile
);
675 fprintf_filtered (outfile
, ", ");
676 fputs_filtered (paddress (gdbarch
,
677 BLOCK_START (SYMBOL_BLOCK_VALUE (symbol
))),
679 fprintf_filtered (outfile
, "..");
680 fputs_filtered (paddress (gdbarch
,
681 BLOCK_END (SYMBOL_BLOCK_VALUE (symbol
))),
684 fprintf_filtered (outfile
, " section %s",
685 bfd_section_name (section
->the_bfd_section
));
689 fprintf_filtered (outfile
, "computed at runtime");
693 fprintf_filtered (outfile
, "unresolved");
696 case LOC_OPTIMIZED_OUT
:
697 fprintf_filtered (outfile
, "optimized out");
701 fprintf_filtered (outfile
, "botched symbol class %x",
702 SYMBOL_CLASS (symbol
));
706 fprintf_filtered (outfile
, "\n");
710 maintenance_print_msymbols (const char *args
, int from_tty
)
712 struct ui_file
*outfile
= gdb_stdout
;
713 char *objfile_arg
= NULL
;
718 gdb_argv
argv (args
);
720 for (i
= 0; argv
!= NULL
&& argv
[i
] != NULL
; ++i
)
722 if (strcmp (argv
[i
], "-objfile") == 0)
724 if (argv
[i
+ 1] == NULL
)
725 error (_("Missing objfile name"));
726 objfile_arg
= argv
[++i
];
728 else if (strcmp (argv
[i
], "--") == 0)
730 /* End of options. */
734 else if (argv
[i
][0] == '-')
736 /* Future proofing: Don't allow OUTFILE to begin with "-". */
737 error (_("Unknown option: %s"), argv
[i
]);
744 stdio_file arg_outfile
;
746 if (argv
!= NULL
&& argv
[outfile_idx
] != NULL
)
748 if (argv
[outfile_idx
+ 1] != NULL
)
749 error (_("Junk at end of command"));
750 gdb::unique_xmalloc_ptr
<char> outfile_name
751 (tilde_expand (argv
[outfile_idx
]));
752 if (!arg_outfile
.open (outfile_name
.get (), FOPEN_WT
))
753 perror_with_name (outfile_name
.get ());
754 outfile
= &arg_outfile
;
757 for (objfile
*objfile
: current_program_space
->objfiles ())
760 if (objfile_arg
== NULL
761 || compare_filenames_for_search (objfile_name (objfile
), objfile_arg
))
762 dump_msymbols (objfile
, outfile
);
767 maintenance_print_objfiles (const char *regexp
, int from_tty
)
774 for (struct program_space
*pspace
: program_spaces
)
775 for (objfile
*objfile
: pspace
->objfiles ())
779 || re_exec (objfile_name (objfile
)))
780 dump_objfile (objfile
);
784 /* List all the symbol tables whose names match REGEXP (optional). */
787 maintenance_info_symtabs (const char *regexp
, int from_tty
)
794 for (struct program_space
*pspace
: program_spaces
)
795 for (objfile
*objfile
: pspace
->objfiles ())
797 /* We don't want to print anything for this objfile until we
798 actually find a symtab whose name matches. */
799 int printed_objfile_start
= 0;
801 for (compunit_symtab
*cust
: objfile
->compunits ())
803 int printed_compunit_symtab_start
= 0;
805 for (symtab
*symtab
: compunit_filetabs (cust
))
810 || re_exec (symtab_to_filename_for_display (symtab
)))
812 if (! printed_objfile_start
)
814 printf_filtered ("{ objfile %s ", objfile_name (objfile
));
816 printf_filtered ("((struct objfile *) %s)\n",
817 host_address_to_string (objfile
));
818 printed_objfile_start
= 1;
820 if (! printed_compunit_symtab_start
)
822 printf_filtered (" { ((struct compunit_symtab *) %s)\n",
823 host_address_to_string (cust
));
824 printf_filtered (" debugformat %s\n",
825 COMPUNIT_DEBUGFORMAT (cust
));
826 printf_filtered (" producer %s\n",
827 COMPUNIT_PRODUCER (cust
) != NULL
828 ? COMPUNIT_PRODUCER (cust
)
830 printf_filtered (" dirname %s\n",
831 COMPUNIT_DIRNAME (cust
) != NULL
832 ? COMPUNIT_DIRNAME (cust
)
834 printf_filtered (" blockvector"
835 " ((struct blockvector *) %s)\n",
836 host_address_to_string
837 (COMPUNIT_BLOCKVECTOR (cust
)));
838 printf_filtered (" user"
839 " ((struct compunit_symtab *) %s)\n",
840 cust
->user
!= nullptr
841 ? host_address_to_string (cust
->user
)
843 if (cust
->includes
!= nullptr)
845 printf_filtered (" ( includes\n");
846 for (int i
= 0; ; ++i
)
848 struct compunit_symtab
*include
850 if (include
== nullptr)
853 = host_address_to_string (include
);
854 printf_filtered (" (%s %s)\n",
855 "(struct compunit_symtab *)",
858 printf_filtered (" )\n");
860 printed_compunit_symtab_start
= 1;
863 printf_filtered ("\t{ symtab %s ",
864 symtab_to_filename_for_display (symtab
));
866 printf_filtered ("((struct symtab *) %s)\n",
867 host_address_to_string (symtab
));
868 printf_filtered ("\t fullname %s\n",
869 symtab
->fullname
!= NULL
872 printf_filtered ("\t "
873 "linetable ((struct linetable *) %s)\n",
874 host_address_to_string (symtab
->linetable
));
875 printf_filtered ("\t}\n");
879 if (printed_compunit_symtab_start
)
880 printf_filtered (" }\n");
883 if (printed_objfile_start
)
884 printf_filtered ("}\n");
888 /* Check consistency of symtabs.
889 An example of what this checks for is NULL blockvectors.
890 They can happen if there's a bug during debug info reading.
891 GDB assumes they are always non-NULL.
893 Note: This does not check for psymtab vs symtab consistency.
894 Use "maint check-psymtabs" for that. */
897 maintenance_check_symtabs (const char *ignore
, int from_tty
)
899 for (struct program_space
*pspace
: program_spaces
)
900 for (objfile
*objfile
: pspace
->objfiles ())
902 /* We don't want to print anything for this objfile until we
903 actually find something worth printing. */
904 int printed_objfile_start
= 0;
906 for (compunit_symtab
*cust
: objfile
->compunits ())
908 int found_something
= 0;
909 struct symtab
*symtab
= compunit_primary_filetab (cust
);
913 if (COMPUNIT_BLOCKVECTOR (cust
) == NULL
)
915 /* Add more checks here. */
919 if (! printed_objfile_start
)
921 printf_filtered ("{ objfile %s ", objfile_name (objfile
));
923 printf_filtered ("((struct objfile *) %s)\n",
924 host_address_to_string (objfile
));
925 printed_objfile_start
= 1;
927 printf_filtered (" { symtab %s\n",
928 symtab_to_filename_for_display (symtab
));
929 if (COMPUNIT_BLOCKVECTOR (cust
) == NULL
)
930 printf_filtered (" NULL blockvector\n");
931 printf_filtered (" }\n");
935 if (printed_objfile_start
)
936 printf_filtered ("}\n");
940 /* Expand all symbol tables whose name matches an optional regexp. */
943 maintenance_expand_symtabs (const char *args
, int from_tty
)
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."));
964 for (struct program_space
*pspace
: program_spaces
)
965 for (objfile
*objfile
: pspace
->objfiles ())
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
)));
986 /* Return the nexting depth of a block within other blocks in its symtab. */
989 block_depth (const struct block
*block
)
993 while ((block
= BLOCK_SUPERBLOCK (block
)) != NULL
)
1001 /* Used by MAINTENANCE_INFO_LINE_TABLES to print the information about a
1002 single line table. */
1005 maintenance_print_one_line_table (struct symtab
*symtab
, void *data
)
1007 struct linetable
*linetable
;
1008 struct objfile
*objfile
;
1010 objfile
= symtab
->compunit_symtab
->objfile
;
1011 printf_filtered (_("objfile: %s ((struct objfile *) %s)\n"),
1012 objfile_name (objfile
),
1013 host_address_to_string (objfile
));
1014 printf_filtered (_("compunit_symtab: ((struct compunit_symtab *) %s)\n"),
1015 host_address_to_string (symtab
->compunit_symtab
));
1016 printf_filtered (_("symtab: %s ((struct symtab *) %s)\n"),
1017 symtab_to_fullname (symtab
),
1018 host_address_to_string (symtab
));
1019 linetable
= SYMTAB_LINETABLE (symtab
);
1020 printf_filtered (_("linetable: ((struct linetable *) %s):\n"),
1021 host_address_to_string (linetable
));
1023 if (linetable
== NULL
)
1024 printf_filtered (_("No line table.\n"));
1025 else if (linetable
->nitems
<= 0)
1026 printf_filtered (_("Line table has no lines.\n"));
1029 /* Leave space for 6 digits of index and line number. After that the
1030 tables will just not format as well. */
1031 struct ui_out
*uiout
= current_uiout
;
1032 ui_out_emit_table
table_emitter (uiout
, 4, -1, "line-table");
1033 uiout
->table_header (6, ui_left
, "index", _("INDEX"));
1034 uiout
->table_header (6, ui_left
, "line", _("LINE"));
1035 uiout
->table_header (18, ui_left
, "address", _("ADDRESS"));
1036 uiout
->table_header (1, ui_left
, "is-stmt", _("IS-STMT"));
1037 uiout
->table_body ();
1039 for (int i
= 0; i
< linetable
->nitems
; ++i
)
1041 struct linetable_entry
*item
;
1043 item
= &linetable
->item
[i
];
1044 ui_out_emit_tuple
tuple_emitter (uiout
, nullptr);
1045 uiout
->field_signed ("index", i
);
1047 uiout
->field_signed ("line", item
->line
);
1049 uiout
->field_string ("line", _("END"));
1050 uiout
->field_core_addr ("address", objfile
->arch (),
1052 uiout
->field_string ("is-stmt", item
->is_stmt
? "Y" : "");
1060 /* Implement the 'maint info line-table' command. */
1063 maintenance_info_line_tables (const char *regexp
, int from_tty
)
1070 for (struct program_space
*pspace
: program_spaces
)
1071 for (objfile
*objfile
: pspace
->objfiles ())
1073 for (compunit_symtab
*cust
: objfile
->compunits ())
1075 for (symtab
*symtab
: compunit_filetabs (cust
))
1080 || re_exec (symtab_to_filename_for_display (symtab
)))
1081 maintenance_print_one_line_table (symtab
, NULL
);
1089 /* Do early runtime initializations. */
1091 void _initialize_symmisc ();
1093 _initialize_symmisc ()
1095 add_cmd ("symbols", class_maintenance
, maintenance_print_symbols
, _("\
1096 Print dump of current symbol definitions.\n\
1097 Usage: mt print symbols [-pc ADDRESS] [--] [OUTFILE]\n\
1098 mt print symbols [-objfile OBJFILE] [-source SOURCE] [--] [OUTFILE]\n\
1099 Entries in the full symbol table are dumped to file OUTFILE,\n\
1100 or the terminal if OUTFILE is unspecified.\n\
1101 If ADDRESS is provided, dump only the file for that address.\n\
1102 If SOURCE is provided, dump only that file's symbols.\n\
1103 If OBJFILE is provided, dump only that file's minimal symbols."),
1104 &maintenanceprintlist
);
1106 add_cmd ("msymbols", class_maintenance
, maintenance_print_msymbols
, _("\
1107 Print dump of current minimal symbol definitions.\n\
1108 Usage: mt print msymbols [-objfile OBJFILE] [--] [OUTFILE]\n\
1109 Entries in the minimal symbol table are dumped to file OUTFILE,\n\
1110 or the terminal if OUTFILE is unspecified.\n\
1111 If OBJFILE is provided, dump only that file's minimal symbols."),
1112 &maintenanceprintlist
);
1114 add_cmd ("objfiles", class_maintenance
, maintenance_print_objfiles
,
1115 _("Print dump of current object file definitions.\n\
1116 With an argument REGEXP, list the object files with matching names."),
1117 &maintenanceprintlist
);
1119 add_cmd ("symtabs", class_maintenance
, maintenance_info_symtabs
, _("\
1120 List the full symbol tables for all object files.\n\
1121 This does not include information about individual symbols, blocks, or\n\
1122 linetables --- just the symbol table structures themselves.\n\
1123 With an argument REGEXP, list the symbol tables with matching names."),
1124 &maintenanceinfolist
);
1126 add_cmd ("line-table", class_maintenance
, maintenance_info_line_tables
, _("\
1127 List the contents of all line tables, from all symbol tables.\n\
1128 With an argument REGEXP, list just the line tables for the symbol\n\
1129 tables with matching names."),
1130 &maintenanceinfolist
);
1132 add_cmd ("check-symtabs", class_maintenance
, maintenance_check_symtabs
,
1134 Check consistency of currently expanded symtabs."),
1137 add_cmd ("expand-symtabs", class_maintenance
, maintenance_expand_symtabs
,
1138 _("Expand symbol tables.\n\
1139 With an argument REGEXP, only expand the symbol tables with matching names."),