1 /* Do various things to symbol tables (other than lookup), for GDB.
3 Copyright (C) 1986-2022 Free Software Foundation, Inc.
5 This file is part of GDB.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
24 #include "filenames.h"
27 #include "breakpoint.h"
29 #include "gdbsupport/gdb_obstack.h"
33 #include "gdbsupport/gdb_regex.h"
35 #include "dictionary.h"
36 #include "typeprint.h"
39 #include "readline/tilde.h"
40 #include <cli/cli-style.h>
41 #include "gdbsupport/buildargv.h"
43 /* Prototypes for local functions */
45 static int block_depth (const struct block
*);
47 static void print_symbol (struct gdbarch
*gdbarch
, struct symbol
*symbol
,
48 int depth
, ui_file
*outfile
);
52 print_objfile_statistics (void)
54 int i
, linetables
, blockvectors
;
56 for (struct program_space
*pspace
: program_spaces
)
57 for (objfile
*objfile
: pspace
->objfiles ())
60 printf_filtered (_("Statistics for '%s':\n"), objfile_name (objfile
));
61 if (OBJSTAT (objfile
, n_stabs
) > 0)
62 printf_filtered (_(" Number of \"stab\" symbols read: %d\n"),
63 OBJSTAT (objfile
, n_stabs
));
64 if (objfile
->per_bfd
->n_minsyms
> 0)
65 printf_filtered (_(" Number of \"minimal\" symbols read: %d\n"),
66 objfile
->per_bfd
->n_minsyms
);
67 if (OBJSTAT (objfile
, n_syms
) > 0)
68 printf_filtered (_(" Number of \"full\" symbols read: %d\n"),
69 OBJSTAT (objfile
, n_syms
));
70 if (OBJSTAT (objfile
, n_types
) > 0)
71 printf_filtered (_(" Number of \"types\" defined: %d\n"),
72 OBJSTAT (objfile
, n_types
));
75 for (compunit_symtab
*cu
: objfile
->compunits ())
77 for (symtab
*s
: cu
->filetabs ())
80 if (s
->linetable () != NULL
)
84 blockvectors
= std::distance (objfile
->compunits ().begin (),
85 objfile
->compunits ().end ());
86 printf_filtered (_(" Number of symbol tables: %d\n"), i
);
87 printf_filtered (_(" Number of symbol tables with line tables: %d\n"),
89 printf_filtered (_(" Number of symbol tables with blockvectors: %d\n"),
92 objfile
->print_stats (false);
94 if (OBJSTAT (objfile
, sz_strtab
) > 0)
95 printf_filtered (_(" Space used by string tables: %d\n"),
96 OBJSTAT (objfile
, sz_strtab
));
97 printf_filtered (_(" Total memory used for objfile obstack: %s\n"),
98 pulongest (obstack_memory_used (&objfile
100 printf_filtered (_(" Total memory used for BFD obstack: %s\n"),
101 pulongest (obstack_memory_used (&objfile
->per_bfd
102 ->storage_obstack
)));
104 printf_filtered (_(" Total memory used for string cache: %d\n"),
105 objfile
->per_bfd
->string_cache
.memory_used ());
106 printf_filtered (_("Byte cache statistics for '%s':\n"),
107 objfile_name (objfile
));
108 objfile
->per_bfd
->string_cache
.print_statistics ("string cache");
109 objfile
->print_stats (true);
114 dump_objfile (struct objfile
*objfile
)
116 printf_filtered ("\nObject file %s: ", objfile_name (objfile
));
117 printf_filtered ("Objfile at %s, bfd at %s, %d minsyms\n\n",
118 host_address_to_string (objfile
),
119 host_address_to_string (objfile
->obfd
),
120 objfile
->per_bfd
->minimal_symbol_count
);
124 if (objfile
->compunit_symtabs
!= NULL
)
126 printf_filtered ("Symtabs:\n");
127 for (compunit_symtab
*cu
: objfile
->compunits ())
129 for (symtab
*symtab
: cu
->filetabs ())
131 printf_filtered ("%s at %s",
132 symtab_to_filename_for_display (symtab
),
133 host_address_to_string (symtab
));
134 if (symtab
->objfile () != objfile
)
135 printf_filtered (", NOT ON CHAIN!");
136 printf_filtered ("\n");
139 printf_filtered ("\n\n");
143 /* Print minimal symbols from this objfile. */
146 dump_msymbols (struct objfile
*objfile
, struct ui_file
*outfile
)
148 struct gdbarch
*gdbarch
= objfile
->arch ();
152 fprintf_filtered (outfile
, "\nObject file %s:\n\n", objfile_name (objfile
));
153 if (objfile
->per_bfd
->minimal_symbol_count
== 0)
155 fprintf_filtered (outfile
, "No minimal symbols found.\n");
159 for (minimal_symbol
*msymbol
: objfile
->msymbols ())
161 struct obj_section
*section
= msymbol
->obj_section (objfile
);
163 switch (MSYMBOL_TYPE (msymbol
))
171 case mst_text_gnu_ifunc
:
172 case mst_data_gnu_ifunc
:
175 case mst_solib_trampoline
:
200 fprintf_filtered (outfile
, "[%2d] %c ", index
, ms_type
);
202 /* Use the relocated address as shown in the symbol here -- do
203 not try to respect copy relocations. */
204 CORE_ADDR addr
= (msymbol
->value
.address
205 + objfile
->section_offsets
[msymbol
->section_index ()]);
206 fputs_filtered (paddress (gdbarch
, addr
), outfile
);
207 fprintf_filtered (outfile
, " %s", msymbol
->linkage_name ());
210 if (section
->the_bfd_section
!= NULL
)
211 fprintf_filtered (outfile
, " section %s",
212 bfd_section_name (section
->the_bfd_section
));
214 fprintf_filtered (outfile
, " spurious section %ld",
215 (long) (section
- objfile
->sections
));
217 if (msymbol
->demangled_name () != NULL
)
219 fprintf_filtered (outfile
, " %s", msymbol
->demangled_name ());
221 if (msymbol
->filename
)
222 fprintf_filtered (outfile
, " %s", msymbol
->filename
);
223 fputs_filtered ("\n", outfile
);
226 if (objfile
->per_bfd
->minimal_symbol_count
!= index
)
228 warning (_("internal error: minimal symbol count %d != %d"),
229 objfile
->per_bfd
->minimal_symbol_count
, index
);
231 fprintf_filtered (outfile
, "\n");
235 dump_symtab_1 (struct symtab
*symtab
, struct ui_file
*outfile
)
237 struct objfile
*objfile
= symtab
->objfile ();
238 struct gdbarch
*gdbarch
= objfile
->arch ();
240 struct mdict_iterator miter
;
243 const struct blockvector
*bv
;
245 const struct block
*b
;
248 fprintf_filtered (outfile
, "\nSymtab for file %s at %s\n",
249 symtab_to_filename_for_display (symtab
),
250 host_address_to_string (symtab
));
252 if (symtab
->dirname () != NULL
)
253 fprintf_filtered (outfile
, "Compilation directory is %s\n",
255 fprintf_filtered (outfile
, "Read from object file %s (%s)\n",
256 objfile_name (objfile
),
257 host_address_to_string (objfile
));
258 fprintf_filtered (outfile
, "Language: %s\n",
259 language_str (symtab
->language ()));
261 /* First print the line table. */
262 l
= symtab
->linetable ();
265 fprintf_filtered (outfile
, "\nLine table:\n\n");
267 for (i
= 0; i
< len
; i
++)
269 fprintf_filtered (outfile
, " line %d at ", l
->item
[i
].line
);
270 fputs_filtered (paddress (gdbarch
, l
->item
[i
].pc
), outfile
);
271 if (l
->item
[i
].is_stmt
)
272 fprintf_filtered (outfile
, "\t(stmt)");
273 fprintf_filtered (outfile
, "\n");
276 /* Now print the block info, but only for compunit symtabs since we will
277 print lots of duplicate info otherwise. */
278 if (is_main_symtab_of_compunit_symtab (symtab
))
280 fprintf_filtered (outfile
, "\nBlockvector:\n\n");
281 bv
= symtab
->blockvector ();
282 len
= BLOCKVECTOR_NBLOCKS (bv
);
283 for (i
= 0; i
< len
; i
++)
285 b
= BLOCKVECTOR_BLOCK (bv
, i
);
286 depth
= block_depth (b
) * 2;
287 fprintf_filtered (outfile
, "%*sblock #%03d, object at %s",
289 host_address_to_string (b
));
290 if (BLOCK_SUPERBLOCK (b
))
291 fprintf_filtered (outfile
, " under %s",
292 host_address_to_string (BLOCK_SUPERBLOCK (b
)));
293 /* drow/2002-07-10: We could save the total symbols count
294 even if we're using a hashtable, but nothing else but this message
296 fprintf_filtered (outfile
, ", %d syms/buckets in ",
297 mdict_size (BLOCK_MULTIDICT (b
)));
298 fputs_filtered (paddress (gdbarch
, BLOCK_START (b
)), outfile
);
299 fprintf_filtered (outfile
, "..");
300 fputs_filtered (paddress (gdbarch
, BLOCK_END (b
)), outfile
);
301 if (BLOCK_FUNCTION (b
))
303 fprintf_filtered (outfile
, ", function %s",
304 BLOCK_FUNCTION (b
)->linkage_name ());
305 if (BLOCK_FUNCTION (b
)->demangled_name () != NULL
)
307 fprintf_filtered (outfile
, ", %s",
308 BLOCK_FUNCTION (b
)->demangled_name ());
311 fprintf_filtered (outfile
, "\n");
312 /* Now print each symbol in this block (in no particular order, if
313 we're using a hashtable). Note that we only want this
314 block, not any blocks from included symtabs. */
315 ALL_DICT_SYMBOLS (BLOCK_MULTIDICT (b
), miter
, sym
)
319 print_symbol (gdbarch
, sym
, depth
+ 1, outfile
);
321 catch (const gdb_exception_error
&ex
)
323 exception_fprintf (gdb_stderr
, ex
,
324 "Error printing symbol:\n");
328 fprintf_filtered (outfile
, "\n");
332 compunit_symtab
*compunit
= symtab
->compunit ();
333 const char *compunit_filename
334 = symtab_to_filename_for_display (compunit
->primary_filetab ());
336 fprintf_filtered (outfile
,
337 "\nBlockvector same as owning compunit: %s\n\n",
341 /* Print info about the user of this compunit_symtab, and the
342 compunit_symtabs included by this one. */
343 if (is_main_symtab_of_compunit_symtab (symtab
))
345 struct compunit_symtab
*cust
= symtab
->compunit ();
347 if (cust
->user
!= nullptr)
350 = host_address_to_string (cust
->user
->primary_filetab ());
351 fprintf_filtered (outfile
, "Compunit user: %s\n", addr
);
353 if (cust
->includes
!= nullptr)
356 struct compunit_symtab
*include
= cust
->includes
[i
];
357 if (include
== nullptr)
360 = host_address_to_string (include
->primary_filetab ());
361 fprintf_filtered (outfile
, "Compunit include: %s\n", addr
);
367 dump_symtab (struct symtab
*symtab
, struct ui_file
*outfile
)
369 /* Set the current language to the language of the symtab we're dumping
370 because certain routines used during dump_symtab() use the current
371 language to print an image of the symbol. We'll restore it later.
372 But use only real languages, not placeholders. */
373 if (symtab
->language () != language_unknown
374 && symtab
->language () != language_auto
)
376 scoped_restore_current_language save_lang
;
377 set_language (symtab
->language ());
378 dump_symtab_1 (symtab
, outfile
);
381 dump_symtab_1 (symtab
, outfile
);
385 maintenance_print_symbols (const char *args
, int from_tty
)
387 struct ui_file
*outfile
= gdb_stdout
;
388 char *address_arg
= NULL
, *source_arg
= NULL
, *objfile_arg
= NULL
;
393 gdb_argv
argv (args
);
395 for (i
= 0; argv
!= NULL
&& argv
[i
] != NULL
; ++i
)
397 if (strcmp (argv
[i
], "-pc") == 0)
399 if (argv
[i
+ 1] == NULL
)
400 error (_("Missing pc value"));
401 address_arg
= argv
[++i
];
403 else if (strcmp (argv
[i
], "-source") == 0)
405 if (argv
[i
+ 1] == NULL
)
406 error (_("Missing source file"));
407 source_arg
= argv
[++i
];
409 else if (strcmp (argv
[i
], "-objfile") == 0)
411 if (argv
[i
+ 1] == NULL
)
412 error (_("Missing objfile name"));
413 objfile_arg
= argv
[++i
];
415 else if (strcmp (argv
[i
], "--") == 0)
417 /* End of options. */
421 else if (argv
[i
][0] == '-')
423 /* Future proofing: Don't allow OUTFILE to begin with "-". */
424 error (_("Unknown option: %s"), argv
[i
]);
431 if (address_arg
!= NULL
&& source_arg
!= NULL
)
432 error (_("Must specify at most one of -pc and -source"));
434 stdio_file arg_outfile
;
436 if (argv
!= NULL
&& argv
[outfile_idx
] != NULL
)
438 if (argv
[outfile_idx
+ 1] != NULL
)
439 error (_("Junk at end of command"));
440 gdb::unique_xmalloc_ptr
<char> outfile_name
441 (tilde_expand (argv
[outfile_idx
]));
442 if (!arg_outfile
.open (outfile_name
.get (), FOPEN_WT
))
443 perror_with_name (outfile_name
.get ());
444 outfile
= &arg_outfile
;
447 if (address_arg
!= NULL
)
449 CORE_ADDR pc
= parse_and_eval_address (address_arg
);
450 struct symtab
*s
= find_pc_line_symtab (pc
);
453 error (_("No symtab for address: %s"), address_arg
);
454 dump_symtab (s
, outfile
);
460 for (objfile
*objfile
: current_program_space
->objfiles ())
462 int print_for_objfile
= 1;
464 if (objfile_arg
!= NULL
)
466 = compare_filenames_for_search (objfile_name (objfile
),
468 if (!print_for_objfile
)
471 for (compunit_symtab
*cu
: objfile
->compunits ())
473 for (symtab
*s
: cu
->filetabs ())
475 int print_for_source
= 0;
478 if (source_arg
!= NULL
)
481 = compare_filenames_for_search
482 (symtab_to_filename_for_display (s
), source_arg
);
485 if (source_arg
== NULL
487 dump_symtab (s
, outfile
);
492 if (source_arg
!= NULL
&& !found
)
493 error (_("No symtab for source file: %s"), source_arg
);
497 /* Print symbol SYMBOL on OUTFILE. DEPTH says how far to indent. */
500 print_symbol (struct gdbarch
*gdbarch
, struct symbol
*symbol
,
501 int depth
, ui_file
*outfile
)
503 struct obj_section
*section
;
505 if (symbol
->is_objfile_owned ())
506 section
= symbol
->obj_section (symbol_objfile (symbol
));
510 print_spaces_filtered (depth
, outfile
);
511 if (symbol
->domain () == LABEL_DOMAIN
)
513 fprintf_filtered (outfile
, "label %s at ", symbol
->print_name ());
514 fputs_filtered (paddress (gdbarch
, SYMBOL_VALUE_ADDRESS (symbol
)),
517 fprintf_filtered (outfile
, " section %s\n",
518 bfd_section_name (section
->the_bfd_section
));
520 fprintf_filtered (outfile
, "\n");
524 if (symbol
->domain () == STRUCT_DOMAIN
)
526 if (symbol
->type ()->name ())
528 current_language
->print_type (symbol
->type (), "", outfile
, 1, depth
,
529 &type_print_raw_options
);
533 fprintf_filtered (outfile
, "%s %s = ",
534 (symbol
->type ()->code () == TYPE_CODE_ENUM
536 : (symbol
->type ()->code () == TYPE_CODE_STRUCT
537 ? "struct" : "union")),
538 symbol
->linkage_name ());
539 current_language
->print_type (symbol
->type (), "", outfile
, 1, depth
,
540 &type_print_raw_options
);
542 fprintf_filtered (outfile
, ";\n");
546 if (symbol
->aclass () == LOC_TYPEDEF
)
547 fprintf_filtered (outfile
, "typedef ");
550 /* Print details of types, except for enums where it's clutter. */
551 current_language
->print_type (symbol
->type (), symbol
->print_name (),
553 symbol
->type ()->code () != TYPE_CODE_ENUM
,
555 &type_print_raw_options
);
556 fprintf_filtered (outfile
, "; ");
559 fprintf_filtered (outfile
, "%s ", symbol
->print_name ());
561 switch (symbol
->aclass ())
564 fprintf_filtered (outfile
, "const %s (%s)",
565 plongest (SYMBOL_VALUE (symbol
)),
566 hex_string (SYMBOL_VALUE (symbol
)));
569 case LOC_CONST_BYTES
:
572 struct type
*type
= check_typedef (symbol
->type ());
574 fprintf_filtered (outfile
, "const %s hex bytes:",
575 pulongest (TYPE_LENGTH (type
)));
576 for (i
= 0; i
< TYPE_LENGTH (type
); i
++)
577 fprintf_filtered (outfile
, " %02x",
578 (unsigned) SYMBOL_VALUE_BYTES (symbol
)[i
]);
583 fprintf_filtered (outfile
, "static at ");
584 fputs_filtered (paddress (gdbarch
, SYMBOL_VALUE_ADDRESS (symbol
)),
587 fprintf_filtered (outfile
, " section %s",
588 bfd_section_name (section
->the_bfd_section
));
592 if (symbol
->is_argument ())
593 fprintf_filtered (outfile
, "parameter register %s",
594 plongest (SYMBOL_VALUE (symbol
)));
596 fprintf_filtered (outfile
, "register %s",
597 plongest (SYMBOL_VALUE (symbol
)));
601 fprintf_filtered (outfile
, "arg at offset %s",
602 hex_string (SYMBOL_VALUE (symbol
)));
606 fprintf_filtered (outfile
, "reference arg at %s",
607 hex_string (SYMBOL_VALUE (symbol
)));
610 case LOC_REGPARM_ADDR
:
611 fprintf_filtered (outfile
, "address parameter register %s",
612 plongest (SYMBOL_VALUE (symbol
)));
616 fprintf_filtered (outfile
, "local at offset %s",
617 hex_string (SYMBOL_VALUE (symbol
)));
624 fprintf_filtered (outfile
, "label at ");
625 fputs_filtered (paddress (gdbarch
, SYMBOL_VALUE_ADDRESS (symbol
)),
628 fprintf_filtered (outfile
, " section %s",
629 bfd_section_name (section
->the_bfd_section
));
634 (outfile
, "block object %s, %s..%s",
635 host_address_to_string (SYMBOL_BLOCK_VALUE (symbol
)),
636 paddress (gdbarch
, BLOCK_START (SYMBOL_BLOCK_VALUE (symbol
))),
637 paddress (gdbarch
, BLOCK_END (SYMBOL_BLOCK_VALUE (symbol
))));
639 fprintf_filtered (outfile
, " section %s",
640 bfd_section_name (section
->the_bfd_section
));
644 fprintf_filtered (outfile
, "computed at runtime");
648 fprintf_filtered (outfile
, "unresolved");
651 case LOC_OPTIMIZED_OUT
:
652 fprintf_filtered (outfile
, "optimized out");
656 fprintf_filtered (outfile
, "botched symbol class %x",
661 fprintf_filtered (outfile
, "\n");
665 maintenance_print_msymbols (const char *args
, int from_tty
)
667 struct ui_file
*outfile
= gdb_stdout
;
668 char *objfile_arg
= NULL
;
673 gdb_argv
argv (args
);
675 for (i
= 0; argv
!= NULL
&& argv
[i
] != NULL
; ++i
)
677 if (strcmp (argv
[i
], "-objfile") == 0)
679 if (argv
[i
+ 1] == NULL
)
680 error (_("Missing objfile name"));
681 objfile_arg
= argv
[++i
];
683 else if (strcmp (argv
[i
], "--") == 0)
685 /* End of options. */
689 else if (argv
[i
][0] == '-')
691 /* Future proofing: Don't allow OUTFILE to begin with "-". */
692 error (_("Unknown option: %s"), argv
[i
]);
699 stdio_file arg_outfile
;
701 if (argv
!= NULL
&& argv
[outfile_idx
] != NULL
)
703 if (argv
[outfile_idx
+ 1] != NULL
)
704 error (_("Junk at end of command"));
705 gdb::unique_xmalloc_ptr
<char> outfile_name
706 (tilde_expand (argv
[outfile_idx
]));
707 if (!arg_outfile
.open (outfile_name
.get (), FOPEN_WT
))
708 perror_with_name (outfile_name
.get ());
709 outfile
= &arg_outfile
;
712 for (objfile
*objfile
: current_program_space
->objfiles ())
715 if (objfile_arg
== NULL
716 || compare_filenames_for_search (objfile_name (objfile
), objfile_arg
))
717 dump_msymbols (objfile
, outfile
);
722 maintenance_print_objfiles (const char *regexp
, int from_tty
)
729 for (struct program_space
*pspace
: program_spaces
)
730 for (objfile
*objfile
: pspace
->objfiles ())
734 || re_exec (objfile_name (objfile
)))
735 dump_objfile (objfile
);
739 /* List all the symbol tables whose names match REGEXP (optional). */
742 maintenance_info_symtabs (const char *regexp
, int from_tty
)
749 for (struct program_space
*pspace
: program_spaces
)
750 for (objfile
*objfile
: pspace
->objfiles ())
752 /* We don't want to print anything for this objfile until we
753 actually find a symtab whose name matches. */
754 int printed_objfile_start
= 0;
756 for (compunit_symtab
*cust
: objfile
->compunits ())
758 int printed_compunit_symtab_start
= 0;
760 for (symtab
*symtab
: cust
->filetabs ())
765 || re_exec (symtab_to_filename_for_display (symtab
)))
767 if (! printed_objfile_start
)
769 printf_filtered ("{ objfile %s ", objfile_name (objfile
));
770 gdb_stdout
->wrap_here (2);
771 printf_filtered ("((struct objfile *) %s)\n",
772 host_address_to_string (objfile
));
773 printed_objfile_start
= 1;
775 if (! printed_compunit_symtab_start
)
777 printf_filtered (" { ((struct compunit_symtab *) %s)\n",
778 host_address_to_string (cust
));
779 printf_filtered (" debugformat %s\n",
780 cust
->debugformat ());
781 printf_filtered (" producer %s\n",
782 (cust
->producer () != nullptr
783 ? cust
->producer () : "(null)"));
784 printf_filtered (" dirname %s\n",
785 (cust
->dirname () != NULL
786 ? cust
->dirname () : "(null)"));
787 printf_filtered (" blockvector"
788 " ((struct blockvector *) %s)\n",
789 host_address_to_string
790 (cust
->blockvector ()));
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
));
818 gdb_stdout
->wrap_here (4);
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
828 (symtab
->linetable ()));
829 printf_filtered ("\t}\n");
833 if (printed_compunit_symtab_start
)
834 printf_filtered (" }\n");
837 if (printed_objfile_start
)
838 printf_filtered ("}\n");
842 /* Check consistency of symtabs.
843 An example of what this checks for is NULL blockvectors.
844 They can happen if there's a bug during debug info reading.
845 GDB assumes they are always non-NULL.
847 Note: This does not check for psymtab vs symtab consistency.
848 Use "maint check-psymtabs" for that. */
851 maintenance_check_symtabs (const char *ignore
, int from_tty
)
853 for (struct program_space
*pspace
: program_spaces
)
854 for (objfile
*objfile
: pspace
->objfiles ())
856 /* We don't want to print anything for this objfile until we
857 actually find something worth printing. */
858 int printed_objfile_start
= 0;
860 for (compunit_symtab
*cust
: objfile
->compunits ())
862 int found_something
= 0;
863 struct symtab
*symtab
= cust
->primary_filetab ();
867 if (cust
->blockvector () == NULL
)
869 /* Add more checks here. */
873 if (! printed_objfile_start
)
875 printf_filtered ("{ objfile %s ", objfile_name (objfile
));
876 gdb_stdout
->wrap_here (2);
877 printf_filtered ("((struct objfile *) %s)\n",
878 host_address_to_string (objfile
));
879 printed_objfile_start
= 1;
881 printf_filtered (" { symtab %s\n",
882 symtab_to_filename_for_display (symtab
));
883 if (cust
->blockvector () == NULL
)
884 printf_filtered (" NULL blockvector\n");
885 printf_filtered (" }\n");
889 if (printed_objfile_start
)
890 printf_filtered ("}\n");
894 /* Expand all symbol tables whose name matches an optional regexp. */
897 maintenance_expand_symtabs (const char *args
, int from_tty
)
901 /* We use buildargv here so that we handle spaces in the regexp
902 in a way that allows adding more arguments later. */
903 gdb_argv
argv (args
);
911 error (_("Extra arguments after regexp."));
918 for (struct program_space
*pspace
: program_spaces
)
919 for (objfile
*objfile
: pspace
->objfiles ())
920 objfile
->expand_symtabs_matching
921 ([&] (const char *filename
, bool basenames
)
923 /* KISS: Only apply the regexp to the complete file name. */
925 && (regexp
== NULL
|| re_exec (filename
)));
930 SEARCH_GLOBAL_BLOCK
| SEARCH_STATIC_BLOCK
,
936 /* Return the nexting depth of a block within other blocks in its symtab. */
939 block_depth (const struct block
*block
)
943 while ((block
= BLOCK_SUPERBLOCK (block
)) != NULL
)
951 /* Used by MAINTENANCE_INFO_LINE_TABLES to print the information about a
952 single line table. */
955 maintenance_print_one_line_table (struct symtab
*symtab
, void *data
)
957 struct linetable
*linetable
;
958 struct objfile
*objfile
;
960 objfile
= symtab
->compunit ()->objfile ();
961 printf_filtered (_("objfile: %ps ((struct objfile *) %s)\n"),
962 styled_string (file_name_style
.style (),
963 objfile_name (objfile
)),
964 host_address_to_string (objfile
));
965 printf_filtered (_("compunit_symtab: %s ((struct compunit_symtab *) %s)\n"),
966 symtab
->compunit ()->name
,
967 host_address_to_string (symtab
->compunit ()));
968 printf_filtered (_("symtab: %ps ((struct symtab *) %s)\n"),
969 styled_string (file_name_style
.style (),
970 symtab_to_fullname (symtab
)),
971 host_address_to_string (symtab
));
972 linetable
= symtab
->linetable ();
973 printf_filtered (_("linetable: ((struct linetable *) %s):\n"),
974 host_address_to_string (linetable
));
976 if (linetable
== NULL
)
977 printf_filtered (_("No line table.\n"));
978 else if (linetable
->nitems
<= 0)
979 printf_filtered (_("Line table has no lines.\n"));
982 /* Leave space for 6 digits of index and line number. After that the
983 tables will just not format as well. */
984 struct ui_out
*uiout
= current_uiout
;
985 ui_out_emit_table
table_emitter (uiout
, 4, -1, "line-table");
986 uiout
->table_header (6, ui_left
, "index", _("INDEX"));
987 uiout
->table_header (6, ui_left
, "line", _("LINE"));
988 uiout
->table_header (18, ui_left
, "address", _("ADDRESS"));
989 uiout
->table_header (1, ui_left
, "is-stmt", _("IS-STMT"));
990 uiout
->table_body ();
992 for (int i
= 0; i
< linetable
->nitems
; ++i
)
994 struct linetable_entry
*item
;
996 item
= &linetable
->item
[i
];
997 ui_out_emit_tuple
tuple_emitter (uiout
, nullptr);
998 uiout
->field_signed ("index", i
);
1000 uiout
->field_signed ("line", item
->line
);
1002 uiout
->field_string ("line", _("END"));
1003 uiout
->field_core_addr ("address", objfile
->arch (),
1005 uiout
->field_string ("is-stmt", item
->is_stmt
? "Y" : "");
1013 /* Implement the 'maint info line-table' command. */
1016 maintenance_info_line_tables (const char *regexp
, int from_tty
)
1023 for (struct program_space
*pspace
: program_spaces
)
1024 for (objfile
*objfile
: pspace
->objfiles ())
1026 for (compunit_symtab
*cust
: objfile
->compunits ())
1028 for (symtab
*symtab
: cust
->filetabs ())
1033 || re_exec (symtab_to_filename_for_display (symtab
)))
1035 maintenance_print_one_line_table (symtab
, NULL
);
1036 printf_filtered ("\n");
1045 /* Do early runtime initializations. */
1047 void _initialize_symmisc ();
1049 _initialize_symmisc ()
1051 add_cmd ("symbols", class_maintenance
, maintenance_print_symbols
, _("\
1052 Print dump of current symbol definitions.\n\
1053 Usage: mt print symbols [-pc ADDRESS] [--] [OUTFILE]\n\
1054 mt print symbols [-objfile OBJFILE] [-source SOURCE] [--] [OUTFILE]\n\
1055 Entries in the full symbol table are dumped to file OUTFILE,\n\
1056 or the terminal if OUTFILE is unspecified.\n\
1057 If ADDRESS is provided, dump only the file for that address.\n\
1058 If SOURCE is provided, dump only that file's symbols.\n\
1059 If OBJFILE is provided, dump only that file's minimal symbols."),
1060 &maintenanceprintlist
);
1062 add_cmd ("msymbols", class_maintenance
, maintenance_print_msymbols
, _("\
1063 Print dump of current minimal symbol definitions.\n\
1064 Usage: mt print msymbols [-objfile OBJFILE] [--] [OUTFILE]\n\
1065 Entries in the minimal symbol table are dumped to file OUTFILE,\n\
1066 or the terminal if OUTFILE is unspecified.\n\
1067 If OBJFILE is provided, dump only that file's minimal symbols."),
1068 &maintenanceprintlist
);
1070 add_cmd ("objfiles", class_maintenance
, maintenance_print_objfiles
,
1071 _("Print dump of current object file definitions.\n\
1072 With an argument REGEXP, list the object files with matching names."),
1073 &maintenanceprintlist
);
1075 add_cmd ("symtabs", class_maintenance
, maintenance_info_symtabs
, _("\
1076 List the full symbol tables for all object files.\n\
1077 This does not include information about individual symbols, blocks, or\n\
1078 linetables --- just the symbol table structures themselves.\n\
1079 With an argument REGEXP, list the symbol tables with matching names."),
1080 &maintenanceinfolist
);
1082 add_cmd ("line-table", class_maintenance
, maintenance_info_line_tables
, _("\
1083 List the contents of all line tables, from all symbol tables.\n\
1084 With an argument REGEXP, list just the line tables for the symbol\n\
1085 tables with matching names."),
1086 &maintenanceinfolist
);
1088 add_cmd ("check-symtabs", class_maintenance
, maintenance_check_symtabs
,
1090 Check consistency of currently expanded symtabs."),
1093 add_cmd ("expand-symtabs", class_maintenance
, maintenance_expand_symtabs
,
1094 _("Expand symbol tables.\n\
1095 With an argument REGEXP, only expand the symbol tables with matching names."),