1 /* Do various things to symbol tables (other than lookup), for GDB.
3 Copyright (C) 1986-2020 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"
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 (const struct block
*);
57 static void print_symbol (struct gdbarch
*gdbarch
, struct symbol
*symbol
,
58 int depth
, ui_file
*outfile
);
62 print_symbol_bcache_statistics (void)
64 struct program_space
*pspace
;
67 for (objfile
*objfile
: pspace
->objfiles ())
70 printf_filtered (_("Byte cache statistics for '%s':\n"),
71 objfile_name (objfile
));
72 objfile
->partial_symtabs
->psymbol_cache
.print_statistics
73 ("partial symbol cache");
74 objfile
->per_bfd
->string_cache
.print_statistics ("string cache");
79 print_objfile_statistics (void)
81 struct program_space
*pspace
;
82 int i
, linetables
, blockvectors
;
85 for (objfile
*objfile
: pspace
->objfiles ())
88 printf_filtered (_("Statistics for '%s':\n"), objfile_name (objfile
));
89 if (OBJSTAT (objfile
, n_stabs
) > 0)
90 printf_filtered (_(" Number of \"stab\" symbols read: %d\n"),
91 OBJSTAT (objfile
, n_stabs
));
92 if (objfile
->per_bfd
->n_minsyms
> 0)
93 printf_filtered (_(" Number of \"minimal\" symbols read: %d\n"),
94 objfile
->per_bfd
->n_minsyms
);
95 if (OBJSTAT (objfile
, n_psyms
) > 0)
96 printf_filtered (_(" Number of \"partial\" symbols read: %d\n"),
97 OBJSTAT (objfile
, n_psyms
));
98 if (OBJSTAT (objfile
, n_syms
) > 0)
99 printf_filtered (_(" Number of \"full\" symbols read: %d\n"),
100 OBJSTAT (objfile
, n_syms
));
101 if (OBJSTAT (objfile
, n_types
) > 0)
102 printf_filtered (_(" Number of \"types\" defined: %d\n"),
103 OBJSTAT (objfile
, n_types
));
105 objfile
->sf
->qf
->print_stats (objfile
);
107 for (compunit_symtab
*cu
: objfile
->compunits ())
109 for (symtab
*s
: compunit_filetabs (cu
))
112 if (SYMTAB_LINETABLE (s
) != NULL
)
116 blockvectors
= std::distance (objfile
->compunits ().begin (),
117 objfile
->compunits ().end ());
118 printf_filtered (_(" Number of symbol tables: %d\n"), i
);
119 printf_filtered (_(" Number of symbol tables with line tables: %d\n"),
121 printf_filtered (_(" Number of symbol tables with blockvectors: %d\n"),
124 if (OBJSTAT (objfile
, sz_strtab
) > 0)
125 printf_filtered (_(" Space used by string tables: %d\n"),
126 OBJSTAT (objfile
, sz_strtab
));
127 printf_filtered (_(" Total memory used for objfile obstack: %s\n"),
128 pulongest (obstack_memory_used (&objfile
129 ->objfile_obstack
)));
130 printf_filtered (_(" Total memory used for BFD obstack: %s\n"),
131 pulongest (obstack_memory_used (&objfile
->per_bfd
132 ->storage_obstack
)));
134 (_(" Total memory used for psymbol cache: %d\n"),
135 objfile
->partial_symtabs
->psymbol_cache
.memory_used ());
136 printf_filtered (_(" Total memory used for string cache: %d\n"),
137 objfile
->per_bfd
->string_cache
.memory_used ());
142 dump_objfile (struct objfile
*objfile
)
144 printf_filtered ("\nObject file %s: ", objfile_name (objfile
));
145 printf_filtered ("Objfile at ");
146 gdb_print_host_address (objfile
, gdb_stdout
);
147 printf_filtered (", bfd at ");
148 gdb_print_host_address (objfile
->obfd
, gdb_stdout
);
149 printf_filtered (", %d minsyms\n\n",
150 objfile
->per_bfd
->minimal_symbol_count
);
153 objfile
->sf
->qf
->dump (objfile
);
155 if (objfile
->compunit_symtabs
!= NULL
)
157 printf_filtered ("Symtabs:\n");
158 for (compunit_symtab
*cu
: objfile
->compunits ())
160 for (symtab
*symtab
: compunit_filetabs (cu
))
162 printf_filtered ("%s at ",
163 symtab_to_filename_for_display (symtab
));
164 gdb_print_host_address (symtab
, gdb_stdout
);
165 printf_filtered (", ");
166 if (SYMTAB_OBJFILE (symtab
) != objfile
)
168 printf_filtered ("NOT ON CHAIN! ");
173 printf_filtered ("\n\n");
177 /* Print minimal symbols from this objfile. */
180 dump_msymbols (struct objfile
*objfile
, struct ui_file
*outfile
)
182 struct gdbarch
*gdbarch
= get_objfile_arch (objfile
);
186 fprintf_filtered (outfile
, "\nObject file %s:\n\n", objfile_name (objfile
));
187 if (objfile
->per_bfd
->minimal_symbol_count
== 0)
189 fprintf_filtered (outfile
, "No minimal symbols found.\n");
193 for (minimal_symbol
*msymbol
: objfile
->msymbols ())
195 struct obj_section
*section
= MSYMBOL_OBJ_SECTION (objfile
, msymbol
);
197 switch (MSYMBOL_TYPE (msymbol
))
205 case mst_text_gnu_ifunc
:
206 case mst_data_gnu_ifunc
:
209 case mst_solib_trampoline
:
234 fprintf_filtered (outfile
, "[%2d] %c ", index
, ms_type
);
236 /* Use the relocated address as shown in the symbol here -- do
237 not try to respect copy relocations. */
238 CORE_ADDR addr
= (msymbol
->value
.address
239 + objfile
->section_offsets
[msymbol
->section
]);
240 fputs_filtered (paddress (gdbarch
, addr
), outfile
);
241 fprintf_filtered (outfile
, " %s", msymbol
->linkage_name ());
244 if (section
->the_bfd_section
!= NULL
)
245 fprintf_filtered (outfile
, " section %s",
246 bfd_section_name (section
->the_bfd_section
));
248 fprintf_filtered (outfile
, " spurious section %ld",
249 (long) (section
- objfile
->sections
));
251 if (msymbol
->demangled_name () != NULL
)
253 fprintf_filtered (outfile
, " %s", msymbol
->demangled_name ());
255 if (msymbol
->filename
)
256 fprintf_filtered (outfile
, " %s", msymbol
->filename
);
257 fputs_filtered ("\n", outfile
);
260 if (objfile
->per_bfd
->minimal_symbol_count
!= index
)
262 warning (_("internal error: minimal symbol count %d != %d"),
263 objfile
->per_bfd
->minimal_symbol_count
, index
);
265 fprintf_filtered (outfile
, "\n");
269 dump_symtab_1 (struct symtab
*symtab
, struct ui_file
*outfile
)
271 struct objfile
*objfile
= SYMTAB_OBJFILE (symtab
);
272 struct gdbarch
*gdbarch
= get_objfile_arch (objfile
);
274 struct mdict_iterator miter
;
277 const struct blockvector
*bv
;
279 const struct block
*b
;
282 fprintf_filtered (outfile
, "\nSymtab for file %s at %s\n",
283 symtab_to_filename_for_display (symtab
),
284 host_address_to_string (symtab
));
286 if (SYMTAB_DIRNAME (symtab
) != NULL
)
287 fprintf_filtered (outfile
, "Compilation directory is %s\n",
288 SYMTAB_DIRNAME (symtab
));
289 fprintf_filtered (outfile
, "Read from object file %s (",
290 objfile_name (objfile
));
291 gdb_print_host_address (objfile
, outfile
);
292 fprintf_filtered (outfile
, ")\n");
293 fprintf_filtered (outfile
, "Language: %s\n",
294 language_str (symtab
->language
));
296 /* First print the line table. */
297 l
= SYMTAB_LINETABLE (symtab
);
300 fprintf_filtered (outfile
, "\nLine table:\n\n");
302 for (i
= 0; i
< len
; i
++)
304 fprintf_filtered (outfile
, " line %d at ", l
->item
[i
].line
);
305 fputs_filtered (paddress (gdbarch
, l
->item
[i
].pc
), outfile
);
306 if (l
->item
[i
].is_stmt
)
307 fprintf_filtered (outfile
, "\t(stmt)");
308 fprintf_filtered (outfile
, "\n");
311 /* Now print the block info, but only for compunit symtabs since we will
312 print lots of duplicate info otherwise. */
313 if (is_main_symtab_of_compunit_symtab (symtab
))
315 fprintf_filtered (outfile
, "\nBlockvector:\n\n");
316 bv
= SYMTAB_BLOCKVECTOR (symtab
);
317 len
= BLOCKVECTOR_NBLOCKS (bv
);
318 for (i
= 0; i
< len
; i
++)
320 b
= BLOCKVECTOR_BLOCK (bv
, i
);
321 depth
= block_depth (b
) * 2;
322 print_spaces (depth
, outfile
);
323 fprintf_filtered (outfile
, "block #%03d, object at ", i
);
324 gdb_print_host_address (b
, outfile
);
325 if (BLOCK_SUPERBLOCK (b
))
327 fprintf_filtered (outfile
, " under ");
328 gdb_print_host_address (BLOCK_SUPERBLOCK (b
), outfile
);
330 /* drow/2002-07-10: We could save the total symbols count
331 even if we're using a hashtable, but nothing else but this message
333 fprintf_filtered (outfile
, ", %d syms/buckets in ",
334 mdict_size (BLOCK_MULTIDICT (b
)));
335 fputs_filtered (paddress (gdbarch
, BLOCK_START (b
)), outfile
);
336 fprintf_filtered (outfile
, "..");
337 fputs_filtered (paddress (gdbarch
, BLOCK_END (b
)), outfile
);
338 if (BLOCK_FUNCTION (b
))
340 fprintf_filtered (outfile
, ", function %s",
341 BLOCK_FUNCTION (b
)->linkage_name ());
342 if (BLOCK_FUNCTION (b
)->demangled_name () != NULL
)
344 fprintf_filtered (outfile
, ", %s",
345 BLOCK_FUNCTION (b
)->demangled_name ());
348 fprintf_filtered (outfile
, "\n");
349 /* Now print each symbol in this block (in no particular order, if
350 we're using a hashtable). Note that we only want this
351 block, not any blocks from included symtabs. */
352 ALL_DICT_SYMBOLS (BLOCK_MULTIDICT (b
), miter
, sym
)
356 print_symbol (gdbarch
, sym
, depth
+ 1, outfile
);
358 catch (const gdb_exception_error
&ex
)
360 exception_fprintf (gdb_stderr
, ex
,
361 "Error printing symbol:\n");
365 fprintf_filtered (outfile
, "\n");
369 const char *compunit_filename
370 = symtab_to_filename_for_display (COMPUNIT_FILETABS (SYMTAB_COMPUNIT (symtab
)));
372 fprintf_filtered (outfile
,
373 "\nBlockvector same as owning compunit: %s\n\n",
377 /* Print info about the user of this compunit_symtab, and the
378 compunit_symtabs included by this one. */
379 if (is_main_symtab_of_compunit_symtab (symtab
))
381 struct compunit_symtab
*cust
= SYMTAB_COMPUNIT (symtab
);
383 if (cust
->user
!= nullptr)
386 = host_address_to_string (COMPUNIT_FILETABS (cust
->user
));
387 fprintf_filtered (outfile
, "Compunit user: %s\n", addr
);
389 if (cust
->includes
!= nullptr)
392 struct compunit_symtab
*include
= cust
->includes
[i
];
393 if (include
== nullptr)
396 = host_address_to_string (COMPUNIT_FILETABS (include
));
397 fprintf_filtered (outfile
, "Compunit include: %s\n", addr
);
403 dump_symtab (struct symtab
*symtab
, struct ui_file
*outfile
)
405 /* Set the current language to the language of the symtab we're dumping
406 because certain routines used during dump_symtab() use the current
407 language to print an image of the symbol. We'll restore it later.
408 But use only real languages, not placeholders. */
409 if (symtab
->language
!= language_unknown
410 && symtab
->language
!= language_auto
)
412 scoped_restore_current_language save_lang
;
413 set_language (symtab
->language
);
414 dump_symtab_1 (symtab
, outfile
);
417 dump_symtab_1 (symtab
, outfile
);
421 maintenance_print_symbols (const char *args
, int from_tty
)
423 struct ui_file
*outfile
= gdb_stdout
;
424 char *address_arg
= NULL
, *source_arg
= NULL
, *objfile_arg
= NULL
;
429 gdb_argv
argv (args
);
431 for (i
= 0; argv
!= NULL
&& argv
[i
] != NULL
; ++i
)
433 if (strcmp (argv
[i
], "-pc") == 0)
435 if (argv
[i
+ 1] == NULL
)
436 error (_("Missing pc value"));
437 address_arg
= argv
[++i
];
439 else if (strcmp (argv
[i
], "-source") == 0)
441 if (argv
[i
+ 1] == NULL
)
442 error (_("Missing source file"));
443 source_arg
= argv
[++i
];
445 else if (strcmp (argv
[i
], "-objfile") == 0)
447 if (argv
[i
+ 1] == NULL
)
448 error (_("Missing objfile name"));
449 objfile_arg
= argv
[++i
];
451 else if (strcmp (argv
[i
], "--") == 0)
453 /* End of options. */
457 else if (argv
[i
][0] == '-')
459 /* Future proofing: Don't allow OUTFILE to begin with "-". */
460 error (_("Unknown option: %s"), argv
[i
]);
467 if (address_arg
!= NULL
&& source_arg
!= NULL
)
468 error (_("Must specify at most one of -pc and -source"));
470 stdio_file arg_outfile
;
472 if (argv
!= NULL
&& argv
[outfile_idx
] != NULL
)
474 if (argv
[outfile_idx
+ 1] != NULL
)
475 error (_("Junk at end of command"));
476 gdb::unique_xmalloc_ptr
<char> outfile_name
477 (tilde_expand (argv
[outfile_idx
]));
478 if (!arg_outfile
.open (outfile_name
.get (), FOPEN_WT
))
479 perror_with_name (outfile_name
.get ());
480 outfile
= &arg_outfile
;
483 if (address_arg
!= NULL
)
485 CORE_ADDR pc
= parse_and_eval_address (address_arg
);
486 struct symtab
*s
= find_pc_line_symtab (pc
);
489 error (_("No symtab for address: %s"), address_arg
);
490 dump_symtab (s
, outfile
);
496 for (objfile
*objfile
: current_program_space
->objfiles ())
498 int print_for_objfile
= 1;
500 if (objfile_arg
!= NULL
)
502 = compare_filenames_for_search (objfile_name (objfile
),
504 if (!print_for_objfile
)
507 for (compunit_symtab
*cu
: objfile
->compunits ())
509 for (symtab
*s
: compunit_filetabs (cu
))
511 int print_for_source
= 0;
514 if (source_arg
!= NULL
)
517 = compare_filenames_for_search
518 (symtab_to_filename_for_display (s
), source_arg
);
521 if (source_arg
== NULL
523 dump_symtab (s
, outfile
);
528 if (source_arg
!= NULL
&& !found
)
529 error (_("No symtab for source file: %s"), source_arg
);
533 /* Print symbol SYMBOL on OUTFILE. DEPTH says how far to indent. */
536 print_symbol (struct gdbarch
*gdbarch
, struct symbol
*symbol
,
537 int depth
, ui_file
*outfile
)
539 struct obj_section
*section
;
541 if (SYMBOL_OBJFILE_OWNED (symbol
))
542 section
= SYMBOL_OBJ_SECTION (symbol_objfile (symbol
), symbol
);
546 print_spaces (depth
, outfile
);
547 if (SYMBOL_DOMAIN (symbol
) == LABEL_DOMAIN
)
549 fprintf_filtered (outfile
, "label %s at ", symbol
->print_name ());
550 fputs_filtered (paddress (gdbarch
, SYMBOL_VALUE_ADDRESS (symbol
)),
553 fprintf_filtered (outfile
, " section %s\n",
554 bfd_section_name (section
->the_bfd_section
));
556 fprintf_filtered (outfile
, "\n");
560 if (SYMBOL_DOMAIN (symbol
) == STRUCT_DOMAIN
)
562 if (TYPE_NAME (SYMBOL_TYPE (symbol
)))
564 LA_PRINT_TYPE (SYMBOL_TYPE (symbol
), "", outfile
, 1, depth
,
565 &type_print_raw_options
);
569 fprintf_filtered (outfile
, "%s %s = ",
570 (TYPE_CODE (SYMBOL_TYPE (symbol
)) == TYPE_CODE_ENUM
572 : (TYPE_CODE (SYMBOL_TYPE (symbol
)) == TYPE_CODE_STRUCT
573 ? "struct" : "union")),
574 symbol
->linkage_name ());
575 LA_PRINT_TYPE (SYMBOL_TYPE (symbol
), "", outfile
, 1, depth
,
576 &type_print_raw_options
);
578 fprintf_filtered (outfile
, ";\n");
582 if (SYMBOL_CLASS (symbol
) == LOC_TYPEDEF
)
583 fprintf_filtered (outfile
, "typedef ");
584 if (SYMBOL_TYPE (symbol
))
586 /* Print details of types, except for enums where it's clutter. */
587 LA_PRINT_TYPE (SYMBOL_TYPE (symbol
), symbol
->print_name (),
589 TYPE_CODE (SYMBOL_TYPE (symbol
)) != TYPE_CODE_ENUM
,
591 &type_print_raw_options
);
592 fprintf_filtered (outfile
, "; ");
595 fprintf_filtered (outfile
, "%s ", symbol
->print_name ());
597 switch (SYMBOL_CLASS (symbol
))
600 fprintf_filtered (outfile
, "const %s (%s)",
601 plongest (SYMBOL_VALUE (symbol
)),
602 hex_string (SYMBOL_VALUE (symbol
)));
605 case LOC_CONST_BYTES
:
608 struct type
*type
= check_typedef (SYMBOL_TYPE (symbol
));
610 fprintf_filtered (outfile
, "const %s hex bytes:",
611 pulongest (TYPE_LENGTH (type
)));
612 for (i
= 0; i
< TYPE_LENGTH (type
); i
++)
613 fprintf_filtered (outfile
, " %02x",
614 (unsigned) SYMBOL_VALUE_BYTES (symbol
)[i
]);
619 fprintf_filtered (outfile
, "static at ");
620 fputs_filtered (paddress (gdbarch
, SYMBOL_VALUE_ADDRESS (symbol
)),
623 fprintf_filtered (outfile
, " section %s",
624 bfd_section_name (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
));
669 fprintf_filtered (outfile
, "block object ");
670 gdb_print_host_address (SYMBOL_BLOCK_VALUE (symbol
), outfile
);
671 fprintf_filtered (outfile
, ", ");
672 fputs_filtered (paddress (gdbarch
,
673 BLOCK_START (SYMBOL_BLOCK_VALUE (symbol
))),
675 fprintf_filtered (outfile
, "..");
676 fputs_filtered (paddress (gdbarch
,
677 BLOCK_END (SYMBOL_BLOCK_VALUE (symbol
))),
680 fprintf_filtered (outfile
, " section %s",
681 bfd_section_name (section
->the_bfd_section
));
685 fprintf_filtered (outfile
, "computed at runtime");
689 fprintf_filtered (outfile
, "unresolved");
692 case LOC_OPTIMIZED_OUT
:
693 fprintf_filtered (outfile
, "optimized out");
697 fprintf_filtered (outfile
, "botched symbol class %x",
698 SYMBOL_CLASS (symbol
));
702 fprintf_filtered (outfile
, "\n");
706 maintenance_print_msymbols (const char *args
, int from_tty
)
708 struct ui_file
*outfile
= gdb_stdout
;
709 char *objfile_arg
= NULL
;
714 gdb_argv
argv (args
);
716 for (i
= 0; argv
!= NULL
&& argv
[i
] != NULL
; ++i
)
718 if (strcmp (argv
[i
], "-objfile") == 0)
720 if (argv
[i
+ 1] == NULL
)
721 error (_("Missing objfile name"));
722 objfile_arg
= argv
[++i
];
724 else if (strcmp (argv
[i
], "--") == 0)
726 /* End of options. */
730 else if (argv
[i
][0] == '-')
732 /* Future proofing: Don't allow OUTFILE to begin with "-". */
733 error (_("Unknown option: %s"), argv
[i
]);
740 stdio_file arg_outfile
;
742 if (argv
!= NULL
&& argv
[outfile_idx
] != NULL
)
744 if (argv
[outfile_idx
+ 1] != NULL
)
745 error (_("Junk at end of command"));
746 gdb::unique_xmalloc_ptr
<char> outfile_name
747 (tilde_expand (argv
[outfile_idx
]));
748 if (!arg_outfile
.open (outfile_name
.get (), FOPEN_WT
))
749 perror_with_name (outfile_name
.get ());
750 outfile
= &arg_outfile
;
753 for (objfile
*objfile
: current_program_space
->objfiles ())
756 if (objfile_arg
== NULL
757 || compare_filenames_for_search (objfile_name (objfile
), objfile_arg
))
758 dump_msymbols (objfile
, outfile
);
763 maintenance_print_objfiles (const char *regexp
, int from_tty
)
765 struct program_space
*pspace
;
773 for (objfile
*objfile
: pspace
->objfiles ())
777 || re_exec (objfile_name (objfile
)))
778 dump_objfile (objfile
);
782 /* List all the symbol tables whose names match REGEXP (optional). */
785 maintenance_info_symtabs (const char *regexp
, int from_tty
)
787 struct program_space
*pspace
;
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 struct program_space
*pspace
;
902 for (objfile
*objfile
: pspace
->objfiles ())
904 /* We don't want to print anything for this objfile until we
905 actually find something worth printing. */
906 int printed_objfile_start
= 0;
908 for (compunit_symtab
*cust
: objfile
->compunits ())
910 int found_something
= 0;
911 struct symtab
*symtab
= compunit_primary_filetab (cust
);
915 if (COMPUNIT_BLOCKVECTOR (cust
) == NULL
)
917 /* Add more checks here. */
921 if (! printed_objfile_start
)
923 printf_filtered ("{ objfile %s ", objfile_name (objfile
));
925 printf_filtered ("((struct objfile *) %s)\n",
926 host_address_to_string (objfile
));
927 printed_objfile_start
= 1;
929 printf_filtered (" { symtab %s\n",
930 symtab_to_filename_for_display (symtab
));
931 if (COMPUNIT_BLOCKVECTOR (cust
) == NULL
)
932 printf_filtered (" NULL blockvector\n");
933 printf_filtered (" }\n");
937 if (printed_objfile_start
)
938 printf_filtered ("}\n");
942 /* Expand all symbol tables whose name matches an optional regexp. */
945 maintenance_expand_symtabs (const char *args
, int from_tty
)
947 struct program_space
*pspace
;
950 /* We use buildargv here so that we handle spaces in the regexp
951 in a way that allows adding more arguments later. */
952 gdb_argv
argv (args
);
960 error (_("Extra arguments after regexp."));
968 for (objfile
*objfile
: pspace
->objfiles ())
972 objfile
->sf
->qf
->expand_symtabs_matching
974 [&] (const char *filename
, bool basenames
)
976 /* KISS: Only apply the regexp to the complete file name. */
978 && (regexp
== NULL
|| re_exec (filename
)));
980 lookup_name_info::match_any (),
981 [] (const char *symname
)
983 /* Since we're not searching on symbols, just return true. */
993 /* Return the nexting depth of a block within other blocks in its symtab. */
996 block_depth (const struct block
*block
)
1000 while ((block
= BLOCK_SUPERBLOCK (block
)) != NULL
)
1008 /* Used by MAINTENANCE_INFO_LINE_TABLES to print the information about a
1009 single line table. */
1012 maintenance_print_one_line_table (struct symtab
*symtab
, void *data
)
1014 struct linetable
*linetable
;
1015 struct objfile
*objfile
;
1017 objfile
= symtab
->compunit_symtab
->objfile
;
1018 printf_filtered (_("objfile: %s ((struct objfile *) %s)\n"),
1019 objfile_name (objfile
),
1020 host_address_to_string (objfile
));
1021 printf_filtered (_("compunit_symtab: ((struct compunit_symtab *) %s)\n"),
1022 host_address_to_string (symtab
->compunit_symtab
));
1023 printf_filtered (_("symtab: %s ((struct symtab *) %s)\n"),
1024 symtab_to_fullname (symtab
),
1025 host_address_to_string (symtab
));
1026 linetable
= SYMTAB_LINETABLE (symtab
);
1027 printf_filtered (_("linetable: ((struct linetable *) %s):\n"),
1028 host_address_to_string (linetable
));
1030 if (linetable
== NULL
)
1031 printf_filtered (_("No line table.\n"));
1032 else if (linetable
->nitems
<= 0)
1033 printf_filtered (_("Line table has no lines.\n"));
1036 /* Leave space for 6 digits of index and line number. After that the
1037 tables will just not format as well. */
1038 struct ui_out
*uiout
= current_uiout
;
1039 ui_out_emit_table
table_emitter (uiout
, 4, -1, "line-table");
1040 uiout
->table_header (6, ui_left
, "index", _("INDEX"));
1041 uiout
->table_header (6, ui_left
, "line", _("LINE"));
1042 uiout
->table_header (18, ui_left
, "address", _("ADDRESS"));
1043 uiout
->table_header (1, ui_left
, "is-stmt", _("IS-STMT"));
1044 uiout
->table_body ();
1046 for (int i
= 0; i
< linetable
->nitems
; ++i
)
1048 struct linetable_entry
*item
;
1050 item
= &linetable
->item
[i
];
1051 ui_out_emit_tuple
tuple_emitter (uiout
, nullptr);
1052 uiout
->field_signed ("index", i
);
1054 uiout
->field_signed ("line", item
->line
);
1056 uiout
->field_string ("line", _("END"));
1057 uiout
->field_core_addr ("address", get_objfile_arch (objfile
),
1059 uiout
->field_string ("is-stmt", item
->is_stmt
? "Y" : "");
1067 /* Implement the 'maint info line-table' command. */
1070 maintenance_info_line_tables (const char *regexp
, int from_tty
)
1072 struct program_space
*pspace
;
1079 ALL_PSPACES (pspace
)
1080 for (objfile
*objfile
: pspace
->objfiles ())
1082 for (compunit_symtab
*cust
: objfile
->compunits ())
1084 for (symtab
*symtab
: compunit_filetabs (cust
))
1089 || re_exec (symtab_to_filename_for_display (symtab
)))
1090 maintenance_print_one_line_table (symtab
, NULL
);
1098 /* Do early runtime initializations. */
1100 void _initialize_symmisc ();
1102 _initialize_symmisc ()
1108 add_cmd ("symbols", class_maintenance
, maintenance_print_symbols
, _("\
1109 Print dump of current symbol definitions.\n\
1110 Usage: mt print symbols [-pc ADDRESS] [--] [OUTFILE]\n\
1111 mt print symbols [-objfile OBJFILE] [-source SOURCE] [--] [OUTFILE]\n\
1112 Entries in the full symbol table are dumped to file OUTFILE,\n\
1113 or the terminal if OUTFILE is unspecified.\n\
1114 If ADDRESS is provided, dump only the file for that address.\n\
1115 If SOURCE is provided, dump only that file's symbols.\n\
1116 If OBJFILE is provided, dump only that file's minimal symbols."),
1117 &maintenanceprintlist
);
1119 add_cmd ("msymbols", class_maintenance
, maintenance_print_msymbols
, _("\
1120 Print dump of current minimal symbol definitions.\n\
1121 Usage: mt print msymbols [-objfile OBJFILE] [--] [OUTFILE]\n\
1122 Entries in the minimal symbol table are dumped to file OUTFILE,\n\
1123 or the terminal if OUTFILE is unspecified.\n\
1124 If OBJFILE is provided, dump only that file's minimal symbols."),
1125 &maintenanceprintlist
);
1127 add_cmd ("objfiles", class_maintenance
, maintenance_print_objfiles
,
1128 _("Print dump of current object file definitions.\n\
1129 With an argument REGEXP, list the object files with matching names."),
1130 &maintenanceprintlist
);
1132 add_cmd ("symtabs", class_maintenance
, maintenance_info_symtabs
, _("\
1133 List the full symbol tables for all object files.\n\
1134 This does not include information about individual symbols, blocks, or\n\
1135 linetables --- just the symbol table structures themselves.\n\
1136 With an argument REGEXP, list the symbol tables with matching names."),
1137 &maintenanceinfolist
);
1139 add_cmd ("line-table", class_maintenance
, maintenance_info_line_tables
, _("\
1140 List the contents of all line tables, from all symbol tables.\n\
1141 With an argument REGEXP, list just the line tables for the symbol\n\
1142 tables with matching names."),
1143 &maintenanceinfolist
);
1145 add_cmd ("check-symtabs", class_maintenance
, maintenance_check_symtabs
,
1147 Check consistency of currently expanded symtabs."),
1150 add_cmd ("expand-symtabs", class_maintenance
, maintenance_expand_symtabs
,
1151 _("Expand symbol tables.\n\
1152 With an argument REGEXP, only expand the symbol tables with matching names."),