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
= objfile
->arch ();
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
= objfile
->arch ();
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
)));
989 /* Return the nexting depth of a block within other blocks in its symtab. */
992 block_depth (const struct block
*block
)
996 while ((block
= BLOCK_SUPERBLOCK (block
)) != NULL
)
1004 /* Used by MAINTENANCE_INFO_LINE_TABLES to print the information about a
1005 single line table. */
1008 maintenance_print_one_line_table (struct symtab
*symtab
, void *data
)
1010 struct linetable
*linetable
;
1011 struct objfile
*objfile
;
1013 objfile
= symtab
->compunit_symtab
->objfile
;
1014 printf_filtered (_("objfile: %s ((struct objfile *) %s)\n"),
1015 objfile_name (objfile
),
1016 host_address_to_string (objfile
));
1017 printf_filtered (_("compunit_symtab: ((struct compunit_symtab *) %s)\n"),
1018 host_address_to_string (symtab
->compunit_symtab
));
1019 printf_filtered (_("symtab: %s ((struct symtab *) %s)\n"),
1020 symtab_to_fullname (symtab
),
1021 host_address_to_string (symtab
));
1022 linetable
= SYMTAB_LINETABLE (symtab
);
1023 printf_filtered (_("linetable: ((struct linetable *) %s):\n"),
1024 host_address_to_string (linetable
));
1026 if (linetable
== NULL
)
1027 printf_filtered (_("No line table.\n"));
1028 else if (linetable
->nitems
<= 0)
1029 printf_filtered (_("Line table has no lines.\n"));
1032 /* Leave space for 6 digits of index and line number. After that the
1033 tables will just not format as well. */
1034 struct ui_out
*uiout
= current_uiout
;
1035 ui_out_emit_table
table_emitter (uiout
, 4, -1, "line-table");
1036 uiout
->table_header (6, ui_left
, "index", _("INDEX"));
1037 uiout
->table_header (6, ui_left
, "line", _("LINE"));
1038 uiout
->table_header (18, ui_left
, "address", _("ADDRESS"));
1039 uiout
->table_header (1, ui_left
, "is-stmt", _("IS-STMT"));
1040 uiout
->table_body ();
1042 for (int i
= 0; i
< linetable
->nitems
; ++i
)
1044 struct linetable_entry
*item
;
1046 item
= &linetable
->item
[i
];
1047 ui_out_emit_tuple
tuple_emitter (uiout
, nullptr);
1048 uiout
->field_signed ("index", i
);
1050 uiout
->field_signed ("line", item
->line
);
1052 uiout
->field_string ("line", _("END"));
1053 uiout
->field_core_addr ("address", objfile
->arch (),
1055 uiout
->field_string ("is-stmt", item
->is_stmt
? "Y" : "");
1063 /* Implement the 'maint info line-table' command. */
1066 maintenance_info_line_tables (const char *regexp
, int from_tty
)
1068 struct program_space
*pspace
;
1075 ALL_PSPACES (pspace
)
1076 for (objfile
*objfile
: pspace
->objfiles ())
1078 for (compunit_symtab
*cust
: objfile
->compunits ())
1080 for (symtab
*symtab
: compunit_filetabs (cust
))
1085 || re_exec (symtab_to_filename_for_display (symtab
)))
1086 maintenance_print_one_line_table (symtab
, NULL
);
1094 /* Do early runtime initializations. */
1096 void _initialize_symmisc ();
1098 _initialize_symmisc ()
1104 add_cmd ("symbols", class_maintenance
, maintenance_print_symbols
, _("\
1105 Print dump of current symbol definitions.\n\
1106 Usage: mt print symbols [-pc ADDRESS] [--] [OUTFILE]\n\
1107 mt print symbols [-objfile OBJFILE] [-source SOURCE] [--] [OUTFILE]\n\
1108 Entries in the full symbol table are dumped to file OUTFILE,\n\
1109 or the terminal if OUTFILE is unspecified.\n\
1110 If ADDRESS is provided, dump only the file for that address.\n\
1111 If SOURCE is provided, dump only that file's symbols.\n\
1112 If OBJFILE is provided, dump only that file's minimal symbols."),
1113 &maintenanceprintlist
);
1115 add_cmd ("msymbols", class_maintenance
, maintenance_print_msymbols
, _("\
1116 Print dump of current minimal symbol definitions.\n\
1117 Usage: mt print msymbols [-objfile OBJFILE] [--] [OUTFILE]\n\
1118 Entries in the minimal symbol table are dumped to file OUTFILE,\n\
1119 or the terminal if OUTFILE is unspecified.\n\
1120 If OBJFILE is provided, dump only that file's minimal symbols."),
1121 &maintenanceprintlist
);
1123 add_cmd ("objfiles", class_maintenance
, maintenance_print_objfiles
,
1124 _("Print dump of current object file definitions.\n\
1125 With an argument REGEXP, list the object files with matching names."),
1126 &maintenanceprintlist
);
1128 add_cmd ("symtabs", class_maintenance
, maintenance_info_symtabs
, _("\
1129 List the full symbol tables for all object files.\n\
1130 This does not include information about individual symbols, blocks, or\n\
1131 linetables --- just the symbol table structures themselves.\n\
1132 With an argument REGEXP, list the symbol tables with matching names."),
1133 &maintenanceinfolist
);
1135 add_cmd ("line-table", class_maintenance
, maintenance_info_line_tables
, _("\
1136 List the contents of all line tables, from all symbol tables.\n\
1137 With an argument REGEXP, list just the line tables for the symbol\n\
1138 tables with matching names."),
1139 &maintenanceinfolist
);
1141 add_cmd ("check-symtabs", class_maintenance
, maintenance_check_symtabs
,
1143 Check consistency of currently expanded symtabs."),
1146 add_cmd ("expand-symtabs", class_maintenance
, maintenance_expand_symtabs
,
1147 _("Expand symbol tables.\n\
1148 With an argument REGEXP, only expand the symbol tables with matching names."),