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"
40 #include <cli/cli-style.h>
42 /* Prototypes for local functions */
44 static int block_depth (const struct block
*);
46 static void print_symbol (struct gdbarch
*gdbarch
, struct symbol
*symbol
,
47 int depth
, ui_file
*outfile
);
51 print_objfile_statistics (void)
53 int i
, linetables
, blockvectors
;
55 for (struct program_space
*pspace
: program_spaces
)
56 for (objfile
*objfile
: pspace
->objfiles ())
59 printf_filtered (_("Statistics for '%s':\n"), objfile_name (objfile
));
60 if (OBJSTAT (objfile
, n_stabs
) > 0)
61 printf_filtered (_(" Number of \"stab\" symbols read: %d\n"),
62 OBJSTAT (objfile
, n_stabs
));
63 if (objfile
->per_bfd
->n_minsyms
> 0)
64 printf_filtered (_(" Number of \"minimal\" symbols read: %d\n"),
65 objfile
->per_bfd
->n_minsyms
);
66 if (OBJSTAT (objfile
, n_syms
) > 0)
67 printf_filtered (_(" Number of \"full\" symbols read: %d\n"),
68 OBJSTAT (objfile
, n_syms
));
69 if (OBJSTAT (objfile
, n_types
) > 0)
70 printf_filtered (_(" Number of \"types\" defined: %d\n"),
71 OBJSTAT (objfile
, n_types
));
74 for (compunit_symtab
*cu
: objfile
->compunits ())
76 for (symtab
*s
: compunit_filetabs (cu
))
79 if (SYMTAB_LINETABLE (s
) != NULL
)
83 blockvectors
= std::distance (objfile
->compunits ().begin (),
84 objfile
->compunits ().end ());
85 printf_filtered (_(" Number of symbol tables: %d\n"), i
);
86 printf_filtered (_(" Number of symbol tables with line tables: %d\n"),
88 printf_filtered (_(" Number of symbol tables with blockvectors: %d\n"),
91 objfile
->print_stats (false);
93 if (OBJSTAT (objfile
, sz_strtab
) > 0)
94 printf_filtered (_(" Space used by string tables: %d\n"),
95 OBJSTAT (objfile
, sz_strtab
));
96 printf_filtered (_(" Total memory used for objfile obstack: %s\n"),
97 pulongest (obstack_memory_used (&objfile
99 printf_filtered (_(" Total memory used for BFD obstack: %s\n"),
100 pulongest (obstack_memory_used (&objfile
->per_bfd
101 ->storage_obstack
)));
103 printf_filtered (_(" Total memory used for string cache: %d\n"),
104 objfile
->per_bfd
->string_cache
.memory_used ());
105 printf_filtered (_("Byte cache statistics for '%s':\n"),
106 objfile_name (objfile
));
107 objfile
->per_bfd
->string_cache
.print_statistics ("string cache");
108 objfile
->print_stats (true);
113 dump_objfile (struct objfile
*objfile
)
115 printf_filtered ("\nObject file %s: ", objfile_name (objfile
));
116 printf_filtered ("Objfile at %s, bfd at %s, %d minsyms\n\n",
117 host_address_to_string (objfile
),
118 host_address_to_string (objfile
->obfd
),
119 objfile
->per_bfd
->minimal_symbol_count
);
123 if (objfile
->compunit_symtabs
!= NULL
)
125 printf_filtered ("Symtabs:\n");
126 for (compunit_symtab
*cu
: objfile
->compunits ())
128 for (symtab
*symtab
: compunit_filetabs (cu
))
130 printf_filtered ("%s at %s",
131 symtab_to_filename_for_display (symtab
),
132 host_address_to_string (symtab
));
133 if (SYMTAB_OBJFILE (symtab
) != objfile
)
134 printf_filtered (", NOT ON CHAIN!");
135 printf_filtered ("\n");
138 printf_filtered ("\n\n");
142 /* Print minimal symbols from this objfile. */
145 dump_msymbols (struct objfile
*objfile
, struct ui_file
*outfile
)
147 struct gdbarch
*gdbarch
= objfile
->arch ();
151 fprintf_filtered (outfile
, "\nObject file %s:\n\n", objfile_name (objfile
));
152 if (objfile
->per_bfd
->minimal_symbol_count
== 0)
154 fprintf_filtered (outfile
, "No minimal symbols found.\n");
158 for (minimal_symbol
*msymbol
: objfile
->msymbols ())
160 struct obj_section
*section
= msymbol
->obj_section (objfile
);
162 switch (MSYMBOL_TYPE (msymbol
))
170 case mst_text_gnu_ifunc
:
171 case mst_data_gnu_ifunc
:
174 case mst_solib_trampoline
:
199 fprintf_filtered (outfile
, "[%2d] %c ", index
, ms_type
);
201 /* Use the relocated address as shown in the symbol here -- do
202 not try to respect copy relocations. */
203 CORE_ADDR addr
= (msymbol
->value
.address
204 + objfile
->section_offsets
[msymbol
->section_index ()]);
205 fputs_filtered (paddress (gdbarch
, addr
), outfile
);
206 fprintf_filtered (outfile
, " %s", msymbol
->linkage_name ());
209 if (section
->the_bfd_section
!= NULL
)
210 fprintf_filtered (outfile
, " section %s",
211 bfd_section_name (section
->the_bfd_section
));
213 fprintf_filtered (outfile
, " spurious section %ld",
214 (long) (section
- objfile
->sections
));
216 if (msymbol
->demangled_name () != NULL
)
218 fprintf_filtered (outfile
, " %s", msymbol
->demangled_name ());
220 if (msymbol
->filename
)
221 fprintf_filtered (outfile
, " %s", msymbol
->filename
);
222 fputs_filtered ("\n", outfile
);
225 if (objfile
->per_bfd
->minimal_symbol_count
!= index
)
227 warning (_("internal error: minimal symbol count %d != %d"),
228 objfile
->per_bfd
->minimal_symbol_count
, index
);
230 fprintf_filtered (outfile
, "\n");
234 dump_symtab_1 (struct symtab
*symtab
, struct ui_file
*outfile
)
236 struct objfile
*objfile
= SYMTAB_OBJFILE (symtab
);
237 struct gdbarch
*gdbarch
= objfile
->arch ();
239 struct mdict_iterator miter
;
242 const struct blockvector
*bv
;
244 const struct block
*b
;
247 fprintf_filtered (outfile
, "\nSymtab for file %s at %s\n",
248 symtab_to_filename_for_display (symtab
),
249 host_address_to_string (symtab
));
251 if (SYMTAB_DIRNAME (symtab
) != NULL
)
252 fprintf_filtered (outfile
, "Compilation directory is %s\n",
253 SYMTAB_DIRNAME (symtab
));
254 fprintf_filtered (outfile
, "Read from object file %s (%s)\n",
255 objfile_name (objfile
),
256 host_address_to_string (objfile
));
257 fprintf_filtered (outfile
, "Language: %s\n",
258 language_str (symtab
->language
));
260 /* First print the line table. */
261 l
= SYMTAB_LINETABLE (symtab
);
264 fprintf_filtered (outfile
, "\nLine table:\n\n");
266 for (i
= 0; i
< len
; i
++)
268 fprintf_filtered (outfile
, " line %d at ", l
->item
[i
].line
);
269 fputs_filtered (paddress (gdbarch
, l
->item
[i
].pc
), outfile
);
270 if (l
->item
[i
].is_stmt
)
271 fprintf_filtered (outfile
, "\t(stmt)");
272 fprintf_filtered (outfile
, "\n");
275 /* Now print the block info, but only for compunit symtabs since we will
276 print lots of duplicate info otherwise. */
277 if (is_main_symtab_of_compunit_symtab (symtab
))
279 fprintf_filtered (outfile
, "\nBlockvector:\n\n");
280 bv
= SYMTAB_BLOCKVECTOR (symtab
);
281 len
= BLOCKVECTOR_NBLOCKS (bv
);
282 for (i
= 0; i
< len
; i
++)
284 b
= BLOCKVECTOR_BLOCK (bv
, i
);
285 depth
= block_depth (b
) * 2;
286 fprintf_filtered (outfile
, "%*sblock #%03d, object at %s",
288 host_address_to_string (b
));
289 if (BLOCK_SUPERBLOCK (b
))
290 fprintf_filtered (outfile
, " under %s",
291 host_address_to_string (BLOCK_SUPERBLOCK (b
)));
292 /* drow/2002-07-10: We could save the total symbols count
293 even if we're using a hashtable, but nothing else but this message
295 fprintf_filtered (outfile
, ", %d syms/buckets in ",
296 mdict_size (BLOCK_MULTIDICT (b
)));
297 fputs_filtered (paddress (gdbarch
, BLOCK_START (b
)), outfile
);
298 fprintf_filtered (outfile
, "..");
299 fputs_filtered (paddress (gdbarch
, BLOCK_END (b
)), outfile
);
300 if (BLOCK_FUNCTION (b
))
302 fprintf_filtered (outfile
, ", function %s",
303 BLOCK_FUNCTION (b
)->linkage_name ());
304 if (BLOCK_FUNCTION (b
)->demangled_name () != NULL
)
306 fprintf_filtered (outfile
, ", %s",
307 BLOCK_FUNCTION (b
)->demangled_name ());
310 fprintf_filtered (outfile
, "\n");
311 /* Now print each symbol in this block (in no particular order, if
312 we're using a hashtable). Note that we only want this
313 block, not any blocks from included symtabs. */
314 ALL_DICT_SYMBOLS (BLOCK_MULTIDICT (b
), miter
, sym
)
318 print_symbol (gdbarch
, sym
, depth
+ 1, outfile
);
320 catch (const gdb_exception_error
&ex
)
322 exception_fprintf (gdb_stderr
, ex
,
323 "Error printing symbol:\n");
327 fprintf_filtered (outfile
, "\n");
331 const char *compunit_filename
332 = symtab_to_filename_for_display (COMPUNIT_FILETABS (SYMTAB_COMPUNIT (symtab
)));
334 fprintf_filtered (outfile
,
335 "\nBlockvector same as owning compunit: %s\n\n",
339 /* Print info about the user of this compunit_symtab, and the
340 compunit_symtabs included by this one. */
341 if (is_main_symtab_of_compunit_symtab (symtab
))
343 struct compunit_symtab
*cust
= SYMTAB_COMPUNIT (symtab
);
345 if (cust
->user
!= nullptr)
348 = host_address_to_string (COMPUNIT_FILETABS (cust
->user
));
349 fprintf_filtered (outfile
, "Compunit user: %s\n", addr
);
351 if (cust
->includes
!= nullptr)
354 struct compunit_symtab
*include
= cust
->includes
[i
];
355 if (include
== nullptr)
358 = host_address_to_string (COMPUNIT_FILETABS (include
));
359 fprintf_filtered (outfile
, "Compunit include: %s\n", addr
);
365 dump_symtab (struct symtab
*symtab
, struct ui_file
*outfile
)
367 /* Set the current language to the language of the symtab we're dumping
368 because certain routines used during dump_symtab() use the current
369 language to print an image of the symbol. We'll restore it later.
370 But use only real languages, not placeholders. */
371 if (symtab
->language
!= language_unknown
372 && symtab
->language
!= language_auto
)
374 scoped_restore_current_language save_lang
;
375 set_language (symtab
->language
);
376 dump_symtab_1 (symtab
, outfile
);
379 dump_symtab_1 (symtab
, outfile
);
383 maintenance_print_symbols (const char *args
, int from_tty
)
385 struct ui_file
*outfile
= gdb_stdout
;
386 char *address_arg
= NULL
, *source_arg
= NULL
, *objfile_arg
= NULL
;
391 gdb_argv
argv (args
);
393 for (i
= 0; argv
!= NULL
&& argv
[i
] != NULL
; ++i
)
395 if (strcmp (argv
[i
], "-pc") == 0)
397 if (argv
[i
+ 1] == NULL
)
398 error (_("Missing pc value"));
399 address_arg
= argv
[++i
];
401 else if (strcmp (argv
[i
], "-source") == 0)
403 if (argv
[i
+ 1] == NULL
)
404 error (_("Missing source file"));
405 source_arg
= argv
[++i
];
407 else if (strcmp (argv
[i
], "-objfile") == 0)
409 if (argv
[i
+ 1] == NULL
)
410 error (_("Missing objfile name"));
411 objfile_arg
= argv
[++i
];
413 else if (strcmp (argv
[i
], "--") == 0)
415 /* End of options. */
419 else if (argv
[i
][0] == '-')
421 /* Future proofing: Don't allow OUTFILE to begin with "-". */
422 error (_("Unknown option: %s"), argv
[i
]);
429 if (address_arg
!= NULL
&& source_arg
!= NULL
)
430 error (_("Must specify at most one of -pc and -source"));
432 stdio_file arg_outfile
;
434 if (argv
!= NULL
&& argv
[outfile_idx
] != NULL
)
436 if (argv
[outfile_idx
+ 1] != NULL
)
437 error (_("Junk at end of command"));
438 gdb::unique_xmalloc_ptr
<char> outfile_name
439 (tilde_expand (argv
[outfile_idx
]));
440 if (!arg_outfile
.open (outfile_name
.get (), FOPEN_WT
))
441 perror_with_name (outfile_name
.get ());
442 outfile
= &arg_outfile
;
445 if (address_arg
!= NULL
)
447 CORE_ADDR pc
= parse_and_eval_address (address_arg
);
448 struct symtab
*s
= find_pc_line_symtab (pc
);
451 error (_("No symtab for address: %s"), address_arg
);
452 dump_symtab (s
, outfile
);
458 for (objfile
*objfile
: current_program_space
->objfiles ())
460 int print_for_objfile
= 1;
462 if (objfile_arg
!= NULL
)
464 = compare_filenames_for_search (objfile_name (objfile
),
466 if (!print_for_objfile
)
469 for (compunit_symtab
*cu
: objfile
->compunits ())
471 for (symtab
*s
: compunit_filetabs (cu
))
473 int print_for_source
= 0;
476 if (source_arg
!= NULL
)
479 = compare_filenames_for_search
480 (symtab_to_filename_for_display (s
), source_arg
);
483 if (source_arg
== NULL
485 dump_symtab (s
, outfile
);
490 if (source_arg
!= NULL
&& !found
)
491 error (_("No symtab for source file: %s"), source_arg
);
495 /* Print symbol SYMBOL on OUTFILE. DEPTH says how far to indent. */
498 print_symbol (struct gdbarch
*gdbarch
, struct symbol
*symbol
,
499 int depth
, ui_file
*outfile
)
501 struct obj_section
*section
;
503 if (SYMBOL_OBJFILE_OWNED (symbol
))
504 section
= symbol
->obj_section (symbol_objfile (symbol
));
508 print_spaces_filtered (depth
, outfile
);
509 if (SYMBOL_DOMAIN (symbol
) == LABEL_DOMAIN
)
511 fprintf_filtered (outfile
, "label %s at ", symbol
->print_name ());
512 fputs_filtered (paddress (gdbarch
, SYMBOL_VALUE_ADDRESS (symbol
)),
515 fprintf_filtered (outfile
, " section %s\n",
516 bfd_section_name (section
->the_bfd_section
));
518 fprintf_filtered (outfile
, "\n");
522 if (SYMBOL_DOMAIN (symbol
) == STRUCT_DOMAIN
)
524 if (SYMBOL_TYPE (symbol
)->name ())
526 LA_PRINT_TYPE (SYMBOL_TYPE (symbol
), "", outfile
, 1, depth
,
527 &type_print_raw_options
);
531 fprintf_filtered (outfile
, "%s %s = ",
532 (SYMBOL_TYPE (symbol
)->code () == TYPE_CODE_ENUM
534 : (SYMBOL_TYPE (symbol
)->code () == TYPE_CODE_STRUCT
535 ? "struct" : "union")),
536 symbol
->linkage_name ());
537 LA_PRINT_TYPE (SYMBOL_TYPE (symbol
), "", outfile
, 1, depth
,
538 &type_print_raw_options
);
540 fprintf_filtered (outfile
, ";\n");
544 if (SYMBOL_CLASS (symbol
) == LOC_TYPEDEF
)
545 fprintf_filtered (outfile
, "typedef ");
546 if (SYMBOL_TYPE (symbol
))
548 /* Print details of types, except for enums where it's clutter. */
549 LA_PRINT_TYPE (SYMBOL_TYPE (symbol
), symbol
->print_name (),
551 SYMBOL_TYPE (symbol
)->code () != TYPE_CODE_ENUM
,
553 &type_print_raw_options
);
554 fprintf_filtered (outfile
, "; ");
557 fprintf_filtered (outfile
, "%s ", symbol
->print_name ());
559 switch (SYMBOL_CLASS (symbol
))
562 fprintf_filtered (outfile
, "const %s (%s)",
563 plongest (SYMBOL_VALUE (symbol
)),
564 hex_string (SYMBOL_VALUE (symbol
)));
567 case LOC_CONST_BYTES
:
570 struct type
*type
= check_typedef (SYMBOL_TYPE (symbol
));
572 fprintf_filtered (outfile
, "const %s hex bytes:",
573 pulongest (TYPE_LENGTH (type
)));
574 for (i
= 0; i
< TYPE_LENGTH (type
); i
++)
575 fprintf_filtered (outfile
, " %02x",
576 (unsigned) SYMBOL_VALUE_BYTES (symbol
)[i
]);
581 fprintf_filtered (outfile
, "static at ");
582 fputs_filtered (paddress (gdbarch
, SYMBOL_VALUE_ADDRESS (symbol
)),
585 fprintf_filtered (outfile
, " section %s",
586 bfd_section_name (section
->the_bfd_section
));
590 if (SYMBOL_IS_ARGUMENT (symbol
))
591 fprintf_filtered (outfile
, "parameter register %s",
592 plongest (SYMBOL_VALUE (symbol
)));
594 fprintf_filtered (outfile
, "register %s",
595 plongest (SYMBOL_VALUE (symbol
)));
599 fprintf_filtered (outfile
, "arg at offset %s",
600 hex_string (SYMBOL_VALUE (symbol
)));
604 fprintf_filtered (outfile
, "reference arg at %s",
605 hex_string (SYMBOL_VALUE (symbol
)));
608 case LOC_REGPARM_ADDR
:
609 fprintf_filtered (outfile
, "address parameter register %s",
610 plongest (SYMBOL_VALUE (symbol
)));
614 fprintf_filtered (outfile
, "local at offset %s",
615 hex_string (SYMBOL_VALUE (symbol
)));
622 fprintf_filtered (outfile
, "label at ");
623 fputs_filtered (paddress (gdbarch
, SYMBOL_VALUE_ADDRESS (symbol
)),
626 fprintf_filtered (outfile
, " section %s",
627 bfd_section_name (section
->the_bfd_section
));
632 (outfile
, "block object %s, %s..%s",
633 host_address_to_string (SYMBOL_BLOCK_VALUE (symbol
)),
634 paddress (gdbarch
, BLOCK_START (SYMBOL_BLOCK_VALUE (symbol
))),
635 paddress (gdbarch
, BLOCK_END (SYMBOL_BLOCK_VALUE (symbol
))));
637 fprintf_filtered (outfile
, " section %s",
638 bfd_section_name (section
->the_bfd_section
));
642 fprintf_filtered (outfile
, "computed at runtime");
646 fprintf_filtered (outfile
, "unresolved");
649 case LOC_OPTIMIZED_OUT
:
650 fprintf_filtered (outfile
, "optimized out");
654 fprintf_filtered (outfile
, "botched symbol class %x",
655 SYMBOL_CLASS (symbol
));
659 fprintf_filtered (outfile
, "\n");
663 maintenance_print_msymbols (const char *args
, int from_tty
)
665 struct ui_file
*outfile
= gdb_stdout
;
666 char *objfile_arg
= NULL
;
671 gdb_argv
argv (args
);
673 for (i
= 0; argv
!= NULL
&& argv
[i
] != NULL
; ++i
)
675 if (strcmp (argv
[i
], "-objfile") == 0)
677 if (argv
[i
+ 1] == NULL
)
678 error (_("Missing objfile name"));
679 objfile_arg
= argv
[++i
];
681 else if (strcmp (argv
[i
], "--") == 0)
683 /* End of options. */
687 else if (argv
[i
][0] == '-')
689 /* Future proofing: Don't allow OUTFILE to begin with "-". */
690 error (_("Unknown option: %s"), argv
[i
]);
697 stdio_file arg_outfile
;
699 if (argv
!= NULL
&& argv
[outfile_idx
] != NULL
)
701 if (argv
[outfile_idx
+ 1] != NULL
)
702 error (_("Junk at end of command"));
703 gdb::unique_xmalloc_ptr
<char> outfile_name
704 (tilde_expand (argv
[outfile_idx
]));
705 if (!arg_outfile
.open (outfile_name
.get (), FOPEN_WT
))
706 perror_with_name (outfile_name
.get ());
707 outfile
= &arg_outfile
;
710 for (objfile
*objfile
: current_program_space
->objfiles ())
713 if (objfile_arg
== NULL
714 || compare_filenames_for_search (objfile_name (objfile
), objfile_arg
))
715 dump_msymbols (objfile
, outfile
);
720 maintenance_print_objfiles (const char *regexp
, int from_tty
)
727 for (struct program_space
*pspace
: program_spaces
)
728 for (objfile
*objfile
: pspace
->objfiles ())
732 || re_exec (objfile_name (objfile
)))
733 dump_objfile (objfile
);
737 /* List all the symbol tables whose names match REGEXP (optional). */
740 maintenance_info_symtabs (const char *regexp
, int from_tty
)
747 for (struct program_space
*pspace
: program_spaces
)
748 for (objfile
*objfile
: pspace
->objfiles ())
750 /* We don't want to print anything for this objfile until we
751 actually find a symtab whose name matches. */
752 int printed_objfile_start
= 0;
754 for (compunit_symtab
*cust
: objfile
->compunits ())
756 int printed_compunit_symtab_start
= 0;
758 for (symtab
*symtab
: compunit_filetabs (cust
))
763 || re_exec (symtab_to_filename_for_display (symtab
)))
765 if (! printed_objfile_start
)
767 printf_filtered ("{ objfile %s ", objfile_name (objfile
));
769 printf_filtered ("((struct objfile *) %s)\n",
770 host_address_to_string (objfile
));
771 printed_objfile_start
= 1;
773 if (! printed_compunit_symtab_start
)
775 printf_filtered (" { ((struct compunit_symtab *) %s)\n",
776 host_address_to_string (cust
));
777 printf_filtered (" debugformat %s\n",
778 COMPUNIT_DEBUGFORMAT (cust
));
779 printf_filtered (" producer %s\n",
780 COMPUNIT_PRODUCER (cust
) != NULL
781 ? COMPUNIT_PRODUCER (cust
)
783 printf_filtered (" dirname %s\n",
784 COMPUNIT_DIRNAME (cust
) != NULL
785 ? COMPUNIT_DIRNAME (cust
)
787 printf_filtered (" blockvector"
788 " ((struct blockvector *) %s)\n",
789 host_address_to_string
790 (COMPUNIT_BLOCKVECTOR (cust
)));
791 printf_filtered (" user"
792 " ((struct compunit_symtab *) %s)\n",
793 cust
->user
!= nullptr
794 ? host_address_to_string (cust
->user
)
796 if (cust
->includes
!= nullptr)
798 printf_filtered (" ( includes\n");
799 for (int i
= 0; ; ++i
)
801 struct compunit_symtab
*include
803 if (include
== nullptr)
806 = host_address_to_string (include
);
807 printf_filtered (" (%s %s)\n",
808 "(struct compunit_symtab *)",
811 printf_filtered (" )\n");
813 printed_compunit_symtab_start
= 1;
816 printf_filtered ("\t{ symtab %s ",
817 symtab_to_filename_for_display (symtab
));
819 printf_filtered ("((struct symtab *) %s)\n",
820 host_address_to_string (symtab
));
821 printf_filtered ("\t fullname %s\n",
822 symtab
->fullname
!= NULL
825 printf_filtered ("\t "
826 "linetable ((struct linetable *) %s)\n",
827 host_address_to_string (symtab
->linetable
));
828 printf_filtered ("\t}\n");
832 if (printed_compunit_symtab_start
)
833 printf_filtered (" }\n");
836 if (printed_objfile_start
)
837 printf_filtered ("}\n");
841 /* Check consistency of symtabs.
842 An example of what this checks for is NULL blockvectors.
843 They can happen if there's a bug during debug info reading.
844 GDB assumes they are always non-NULL.
846 Note: This does not check for psymtab vs symtab consistency.
847 Use "maint check-psymtabs" for that. */
850 maintenance_check_symtabs (const char *ignore
, int from_tty
)
852 for (struct program_space
*pspace
: program_spaces
)
853 for (objfile
*objfile
: pspace
->objfiles ())
855 /* We don't want to print anything for this objfile until we
856 actually find something worth printing. */
857 int printed_objfile_start
= 0;
859 for (compunit_symtab
*cust
: objfile
->compunits ())
861 int found_something
= 0;
862 struct symtab
*symtab
= compunit_primary_filetab (cust
);
866 if (COMPUNIT_BLOCKVECTOR (cust
) == NULL
)
868 /* Add more checks here. */
872 if (! printed_objfile_start
)
874 printf_filtered ("{ objfile %s ", objfile_name (objfile
));
876 printf_filtered ("((struct objfile *) %s)\n",
877 host_address_to_string (objfile
));
878 printed_objfile_start
= 1;
880 printf_filtered (" { symtab %s\n",
881 symtab_to_filename_for_display (symtab
));
882 if (COMPUNIT_BLOCKVECTOR (cust
) == NULL
)
883 printf_filtered (" NULL blockvector\n");
884 printf_filtered (" }\n");
888 if (printed_objfile_start
)
889 printf_filtered ("}\n");
893 /* Expand all symbol tables whose name matches an optional regexp. */
896 maintenance_expand_symtabs (const char *args
, int from_tty
)
900 /* We use buildargv here so that we handle spaces in the regexp
901 in a way that allows adding more arguments later. */
902 gdb_argv
argv (args
);
910 error (_("Extra arguments after regexp."));
917 for (struct program_space
*pspace
: program_spaces
)
918 for (objfile
*objfile
: pspace
->objfiles ())
919 objfile
->expand_symtabs_matching
920 ([&] (const char *filename
, bool basenames
)
922 /* KISS: Only apply the regexp to the complete file name. */
924 && (regexp
== NULL
|| re_exec (filename
)));
929 SEARCH_GLOBAL_BLOCK
| SEARCH_STATIC_BLOCK
,
935 /* Return the nexting depth of a block within other blocks in its symtab. */
938 block_depth (const struct block
*block
)
942 while ((block
= BLOCK_SUPERBLOCK (block
)) != NULL
)
950 /* Used by MAINTENANCE_INFO_LINE_TABLES to print the information about a
951 single line table. */
954 maintenance_print_one_line_table (struct symtab
*symtab
, void *data
)
956 struct linetable
*linetable
;
957 struct objfile
*objfile
;
959 objfile
= symtab
->compunit_symtab
->objfile
;
960 printf_filtered (_("objfile: %ps ((struct objfile *) %s)\n"),
961 styled_string (file_name_style
.style (),
962 objfile_name (objfile
)),
963 host_address_to_string (objfile
));
964 printf_filtered (_("compunit_symtab: %s ((struct compunit_symtab *) %s)\n"),
965 symtab
->compunit_symtab
->name
,
966 host_address_to_string (symtab
->compunit_symtab
));
967 printf_filtered (_("symtab: %ps ((struct symtab *) %s)\n"),
968 styled_string (file_name_style
.style (),
969 symtab_to_fullname (symtab
)),
970 host_address_to_string (symtab
));
971 linetable
= SYMTAB_LINETABLE (symtab
);
972 printf_filtered (_("linetable: ((struct linetable *) %s):\n"),
973 host_address_to_string (linetable
));
975 if (linetable
== NULL
)
976 printf_filtered (_("No line table.\n"));
977 else if (linetable
->nitems
<= 0)
978 printf_filtered (_("Line table has no lines.\n"));
981 /* Leave space for 6 digits of index and line number. After that the
982 tables will just not format as well. */
983 struct ui_out
*uiout
= current_uiout
;
984 ui_out_emit_table
table_emitter (uiout
, 4, -1, "line-table");
985 uiout
->table_header (6, ui_left
, "index", _("INDEX"));
986 uiout
->table_header (6, ui_left
, "line", _("LINE"));
987 uiout
->table_header (18, ui_left
, "address", _("ADDRESS"));
988 uiout
->table_header (1, ui_left
, "is-stmt", _("IS-STMT"));
989 uiout
->table_body ();
991 for (int i
= 0; i
< linetable
->nitems
; ++i
)
993 struct linetable_entry
*item
;
995 item
= &linetable
->item
[i
];
996 ui_out_emit_tuple
tuple_emitter (uiout
, nullptr);
997 uiout
->field_signed ("index", i
);
999 uiout
->field_signed ("line", item
->line
);
1001 uiout
->field_string ("line", _("END"));
1002 uiout
->field_core_addr ("address", objfile
->arch (),
1004 uiout
->field_string ("is-stmt", item
->is_stmt
? "Y" : "");
1012 /* Implement the 'maint info line-table' command. */
1015 maintenance_info_line_tables (const char *regexp
, int from_tty
)
1022 for (struct program_space
*pspace
: program_spaces
)
1023 for (objfile
*objfile
: pspace
->objfiles ())
1025 for (compunit_symtab
*cust
: objfile
->compunits ())
1027 for (symtab
*symtab
: compunit_filetabs (cust
))
1032 || re_exec (symtab_to_filename_for_display (symtab
)))
1034 maintenance_print_one_line_table (symtab
, NULL
);
1035 printf_filtered ("\n");
1044 /* Do early runtime initializations. */
1046 void _initialize_symmisc ();
1048 _initialize_symmisc ()
1050 add_cmd ("symbols", class_maintenance
, maintenance_print_symbols
, _("\
1051 Print dump of current symbol definitions.\n\
1052 Usage: mt print symbols [-pc ADDRESS] [--] [OUTFILE]\n\
1053 mt print symbols [-objfile OBJFILE] [-source SOURCE] [--] [OUTFILE]\n\
1054 Entries in the full symbol table are dumped to file OUTFILE,\n\
1055 or the terminal if OUTFILE is unspecified.\n\
1056 If ADDRESS is provided, dump only the file for that address.\n\
1057 If SOURCE is provided, dump only that file's symbols.\n\
1058 If OBJFILE is provided, dump only that file's minimal symbols."),
1059 &maintenanceprintlist
);
1061 add_cmd ("msymbols", class_maintenance
, maintenance_print_msymbols
, _("\
1062 Print dump of current minimal symbol definitions.\n\
1063 Usage: mt print msymbols [-objfile OBJFILE] [--] [OUTFILE]\n\
1064 Entries in the minimal symbol table are dumped to file OUTFILE,\n\
1065 or the terminal if OUTFILE is unspecified.\n\
1066 If OBJFILE is provided, dump only that file's minimal symbols."),
1067 &maintenanceprintlist
);
1069 add_cmd ("objfiles", class_maintenance
, maintenance_print_objfiles
,
1070 _("Print dump of current object file definitions.\n\
1071 With an argument REGEXP, list the object files with matching names."),
1072 &maintenanceprintlist
);
1074 add_cmd ("symtabs", class_maintenance
, maintenance_info_symtabs
, _("\
1075 List the full symbol tables for all object files.\n\
1076 This does not include information about individual symbols, blocks, or\n\
1077 linetables --- just the symbol table structures themselves.\n\
1078 With an argument REGEXP, list the symbol tables with matching names."),
1079 &maintenanceinfolist
);
1081 add_cmd ("line-table", class_maintenance
, maintenance_info_line_tables
, _("\
1082 List the contents of all line tables, from all symbol tables.\n\
1083 With an argument REGEXP, list just the line tables for the symbol\n\
1084 tables with matching names."),
1085 &maintenanceinfolist
);
1087 add_cmd ("check-symtabs", class_maintenance
, maintenance_check_symtabs
,
1089 Check consistency of currently expanded symtabs."),
1092 add_cmd ("expand-symtabs", class_maintenance
, maintenance_expand_symtabs
,
1093 _("Expand symbol tables.\n\
1094 With an argument REGEXP, only expand the symbol tables with matching names."),