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 gdb_printf (_("Statistics for '%s':\n"), objfile_name (objfile
));
61 if (OBJSTAT (objfile
, n_stabs
) > 0)
62 gdb_printf (_(" Number of \"stab\" symbols read: %d\n"),
63 OBJSTAT (objfile
, n_stabs
));
64 if (objfile
->per_bfd
->n_minsyms
> 0)
65 gdb_printf (_(" Number of \"minimal\" symbols read: %d\n"),
66 objfile
->per_bfd
->n_minsyms
);
67 if (OBJSTAT (objfile
, n_syms
) > 0)
68 gdb_printf (_(" Number of \"full\" symbols read: %d\n"),
69 OBJSTAT (objfile
, n_syms
));
70 if (OBJSTAT (objfile
, n_types
) > 0)
71 gdb_printf (_(" 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 gdb_printf (_(" Number of symbol tables: %d\n"), i
);
87 gdb_printf (_(" Number of symbol tables with line tables: %d\n"),
89 gdb_printf (_(" Number of symbol tables with blockvectors: %d\n"),
92 objfile
->print_stats (false);
94 if (OBJSTAT (objfile
, sz_strtab
) > 0)
95 gdb_printf (_(" Space used by string tables: %d\n"),
96 OBJSTAT (objfile
, sz_strtab
));
97 gdb_printf (_(" Total memory used for objfile obstack: %s\n"),
98 pulongest (obstack_memory_used (&objfile
100 gdb_printf (_(" Total memory used for BFD obstack: %s\n"),
101 pulongest (obstack_memory_used (&objfile
->per_bfd
102 ->storage_obstack
)));
104 gdb_printf (_(" Total memory used for string cache: %d\n"),
105 objfile
->per_bfd
->string_cache
.memory_used ());
106 gdb_printf (_("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 gdb_printf ("\nObject file %s: ", objfile_name (objfile
));
117 gdb_printf ("Objfile at %s, bfd at %s, %d minsyms\n\n",
118 host_address_to_string (objfile
),
119 host_address_to_string (objfile
->obfd
.get ()),
120 objfile
->per_bfd
->minimal_symbol_count
);
124 if (objfile
->compunit_symtabs
!= NULL
)
126 gdb_printf ("Symtabs:\n");
127 for (compunit_symtab
*cu
: objfile
->compunits ())
129 for (symtab
*symtab
: cu
->filetabs ())
131 gdb_printf ("%s at %s",
132 symtab_to_filename_for_display (symtab
),
133 host_address_to_string (symtab
));
134 if (symtab
->compunit ()->objfile () != objfile
)
135 gdb_printf (", NOT ON CHAIN!");
143 /* Print minimal symbols from this objfile. */
146 dump_msymbols (struct objfile
*objfile
, struct ui_file
*outfile
)
148 struct gdbarch
*gdbarch
= objfile
->arch ();
152 gdb_printf (outfile
, "\nObject file %s:\n\n", objfile_name (objfile
));
153 if (objfile
->per_bfd
->minimal_symbol_count
== 0)
155 gdb_printf (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 ())
171 case mst_text_gnu_ifunc
:
172 case mst_data_gnu_ifunc
:
175 case mst_solib_trampoline
:
200 gdb_printf (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_raw_address ()
205 + objfile
->section_offsets
[msymbol
->section_index ()]);
206 gdb_puts (paddress (gdbarch
, addr
), outfile
);
207 gdb_printf (outfile
, " %s", msymbol
->linkage_name ());
210 if (section
->the_bfd_section
!= NULL
)
211 gdb_printf (outfile
, " section %s",
212 bfd_section_name (section
->the_bfd_section
));
214 gdb_printf (outfile
, " spurious section %ld",
215 (long) (section
- objfile
->sections
));
217 if (msymbol
->demangled_name () != NULL
)
219 gdb_printf (outfile
, " %s", msymbol
->demangled_name ());
221 if (msymbol
->filename
)
222 gdb_printf (outfile
, " %s", msymbol
->filename
);
223 gdb_puts ("\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 gdb_printf (outfile
, "\n");
235 dump_symtab_1 (struct symtab
*symtab
, struct ui_file
*outfile
)
237 struct objfile
*objfile
= symtab
->compunit ()->objfile ();
238 struct gdbarch
*gdbarch
= objfile
->arch ();
239 struct mdict_iterator miter
;
244 gdb_printf (outfile
, "\nSymtab for file %s at %s\n",
245 symtab_to_filename_for_display (symtab
),
246 host_address_to_string (symtab
));
248 if (symtab
->compunit ()->dirname () != NULL
)
249 gdb_printf (outfile
, "Compilation directory is %s\n",
250 symtab
->compunit ()->dirname ());
251 gdb_printf (outfile
, "Read from object file %s (%s)\n",
252 objfile_name (objfile
),
253 host_address_to_string (objfile
));
254 gdb_printf (outfile
, "Language: %s\n",
255 language_str (symtab
->language ()));
257 /* First print the line table. */
258 l
= symtab
->linetable ();
261 gdb_printf (outfile
, "\nLine table:\n\n");
263 for (int i
= 0; i
< len
; i
++)
265 gdb_printf (outfile
, " line %d at ", l
->item
[i
].line
);
266 gdb_puts (paddress (gdbarch
, l
->item
[i
].pc
), outfile
);
267 if (l
->item
[i
].is_stmt
)
268 gdb_printf (outfile
, "\t(stmt)");
269 gdb_printf (outfile
, "\n");
272 /* Now print the block info, but only for compunit symtabs since we will
273 print lots of duplicate info otherwise. */
274 if (is_main_symtab_of_compunit_symtab (symtab
))
276 gdb_printf (outfile
, "\nBlockvector:\n\n");
277 const blockvector
*bv
= symtab
->compunit ()->blockvector ();
278 for (int i
= 0; i
< bv
->num_blocks (); i
++)
280 const block
*b
= bv
->block (i
);
281 depth
= block_depth (b
) * 2;
282 gdb_printf (outfile
, "%*sblock #%03d, object at %s",
284 host_address_to_string (b
));
285 if (b
->superblock ())
286 gdb_printf (outfile
, " under %s",
287 host_address_to_string (b
->superblock ()));
288 /* drow/2002-07-10: We could save the total symbols count
289 even if we're using a hashtable, but nothing else but this message
291 gdb_printf (outfile
, ", %d syms/buckets in ",
292 mdict_size (b
->multidict ()));
293 gdb_puts (paddress (gdbarch
, b
->start ()), outfile
);
294 gdb_printf (outfile
, "..");
295 gdb_puts (paddress (gdbarch
, b
->end ()), outfile
);
298 gdb_printf (outfile
, ", function %s",
299 b
->function ()->linkage_name ());
300 if (b
->function ()->demangled_name () != NULL
)
302 gdb_printf (outfile
, ", %s",
303 b
->function ()->demangled_name ());
306 gdb_printf (outfile
, "\n");
307 /* Now print each symbol in this block (in no particular order, if
308 we're using a hashtable). Note that we only want this
309 block, not any blocks from included symtabs. */
310 ALL_DICT_SYMBOLS (b
->multidict (), miter
, sym
)
314 print_symbol (gdbarch
, sym
, depth
+ 1, outfile
);
316 catch (const gdb_exception_error
&ex
)
318 exception_fprintf (gdb_stderr
, ex
,
319 "Error printing symbol:\n");
323 gdb_printf (outfile
, "\n");
327 compunit_symtab
*compunit
= symtab
->compunit ();
328 const char *compunit_filename
329 = symtab_to_filename_for_display (compunit
->primary_filetab ());
332 "\nBlockvector same as owning compunit: %s\n\n",
336 /* Print info about the user of this compunit_symtab, and the
337 compunit_symtabs included by this one. */
338 if (is_main_symtab_of_compunit_symtab (symtab
))
340 struct compunit_symtab
*cust
= symtab
->compunit ();
342 if (cust
->user
!= nullptr)
345 = host_address_to_string (cust
->user
->primary_filetab ());
346 gdb_printf (outfile
, "Compunit user: %s\n", addr
);
348 if (cust
->includes
!= nullptr)
349 for (int i
= 0; ; ++i
)
351 struct compunit_symtab
*include
= cust
->includes
[i
];
352 if (include
== nullptr)
355 = host_address_to_string (include
->primary_filetab ());
356 gdb_printf (outfile
, "Compunit include: %s\n", addr
);
362 dump_symtab (struct symtab
*symtab
, struct ui_file
*outfile
)
364 /* Set the current language to the language of the symtab we're dumping
365 because certain routines used during dump_symtab() use the current
366 language to print an image of the symbol. We'll restore it later.
367 But use only real languages, not placeholders. */
368 if (symtab
->language () != language_unknown
369 && symtab
->language () != language_auto
)
371 scoped_restore_current_language save_lang
;
372 set_language (symtab
->language ());
373 dump_symtab_1 (symtab
, outfile
);
376 dump_symtab_1 (symtab
, outfile
);
380 maintenance_print_symbols (const char *args
, int from_tty
)
382 struct ui_file
*outfile
= gdb_stdout
;
383 char *address_arg
= NULL
, *source_arg
= NULL
, *objfile_arg
= NULL
;
388 gdb_argv
argv (args
);
390 for (i
= 0; argv
!= NULL
&& argv
[i
] != NULL
; ++i
)
392 if (strcmp (argv
[i
], "-pc") == 0)
394 if (argv
[i
+ 1] == NULL
)
395 error (_("Missing pc value"));
396 address_arg
= argv
[++i
];
398 else if (strcmp (argv
[i
], "-source") == 0)
400 if (argv
[i
+ 1] == NULL
)
401 error (_("Missing source file"));
402 source_arg
= argv
[++i
];
404 else if (strcmp (argv
[i
], "-objfile") == 0)
406 if (argv
[i
+ 1] == NULL
)
407 error (_("Missing objfile name"));
408 objfile_arg
= argv
[++i
];
410 else if (strcmp (argv
[i
], "--") == 0)
412 /* End of options. */
416 else if (argv
[i
][0] == '-')
418 /* Future proofing: Don't allow OUTFILE to begin with "-". */
419 error (_("Unknown option: %s"), argv
[i
]);
426 if (address_arg
!= NULL
&& source_arg
!= NULL
)
427 error (_("Must specify at most one of -pc and -source"));
429 stdio_file arg_outfile
;
431 if (argv
!= NULL
&& argv
[outfile_idx
] != NULL
)
433 if (argv
[outfile_idx
+ 1] != NULL
)
434 error (_("Junk at end of command"));
435 gdb::unique_xmalloc_ptr
<char> outfile_name
436 (tilde_expand (argv
[outfile_idx
]));
437 if (!arg_outfile
.open (outfile_name
.get (), FOPEN_WT
))
438 perror_with_name (outfile_name
.get ());
439 outfile
= &arg_outfile
;
442 if (address_arg
!= NULL
)
444 CORE_ADDR pc
= parse_and_eval_address (address_arg
);
445 struct symtab
*s
= find_pc_line_symtab (pc
);
448 error (_("No symtab for address: %s"), address_arg
);
449 dump_symtab (s
, outfile
);
455 for (objfile
*objfile
: current_program_space
->objfiles ())
457 int print_for_objfile
= 1;
459 if (objfile_arg
!= NULL
)
461 = compare_filenames_for_search (objfile_name (objfile
),
463 if (!print_for_objfile
)
466 for (compunit_symtab
*cu
: objfile
->compunits ())
468 for (symtab
*s
: cu
->filetabs ())
470 int print_for_source
= 0;
473 if (source_arg
!= NULL
)
476 = compare_filenames_for_search
477 (symtab_to_filename_for_display (s
), source_arg
);
480 if (source_arg
== NULL
482 dump_symtab (s
, outfile
);
487 if (source_arg
!= NULL
&& !found
)
488 error (_("No symtab for source file: %s"), source_arg
);
492 /* Print symbol SYMBOL on OUTFILE. DEPTH says how far to indent. */
495 print_symbol (struct gdbarch
*gdbarch
, struct symbol
*symbol
,
496 int depth
, ui_file
*outfile
)
498 struct obj_section
*section
;
500 if (symbol
->is_objfile_owned ())
501 section
= symbol
->obj_section (symbol
->objfile ());
505 print_spaces (depth
, outfile
);
506 if (symbol
->domain () == LABEL_DOMAIN
)
508 gdb_printf (outfile
, "label %s at ", symbol
->print_name ());
509 gdb_puts (paddress (gdbarch
, symbol
->value_address ()),
512 gdb_printf (outfile
, " section %s\n",
513 bfd_section_name (section
->the_bfd_section
));
515 gdb_printf (outfile
, "\n");
519 if (symbol
->domain () == STRUCT_DOMAIN
)
521 if (symbol
->type ()->name ())
523 current_language
->print_type (symbol
->type (), "", outfile
, 1, depth
,
524 &type_print_raw_options
);
528 gdb_printf (outfile
, "%s %s = ",
529 (symbol
->type ()->code () == TYPE_CODE_ENUM
531 : (symbol
->type ()->code () == TYPE_CODE_STRUCT
532 ? "struct" : "union")),
533 symbol
->linkage_name ());
534 current_language
->print_type (symbol
->type (), "", outfile
, 1, depth
,
535 &type_print_raw_options
);
537 gdb_printf (outfile
, ";\n");
541 if (symbol
->aclass () == LOC_TYPEDEF
)
542 gdb_printf (outfile
, "typedef ");
545 /* Print details of types, except for enums where it's clutter. */
546 current_language
->print_type (symbol
->type (), symbol
->print_name (),
548 symbol
->type ()->code () != TYPE_CODE_ENUM
,
550 &type_print_raw_options
);
551 gdb_printf (outfile
, "; ");
554 gdb_printf (outfile
, "%s ", symbol
->print_name ());
556 switch (symbol
->aclass ())
559 gdb_printf (outfile
, "const %s (%s)",
560 plongest (symbol
->value_longest ()),
561 hex_string (symbol
->value_longest ()));
564 case LOC_CONST_BYTES
:
567 struct type
*type
= check_typedef (symbol
->type ());
569 gdb_printf (outfile
, "const %s hex bytes:",
570 pulongest (TYPE_LENGTH (type
)));
571 for (i
= 0; i
< TYPE_LENGTH (type
); i
++)
572 gdb_printf (outfile
, " %02x",
573 (unsigned) symbol
->value_bytes ()[i
]);
578 gdb_printf (outfile
, "static at ");
579 gdb_puts (paddress (gdbarch
, symbol
->value_address ()), outfile
);
581 gdb_printf (outfile
, " section %s",
582 bfd_section_name (section
->the_bfd_section
));
586 if (symbol
->is_argument ())
587 gdb_printf (outfile
, "parameter register %s",
588 plongest (symbol
->value_longest ()));
590 gdb_printf (outfile
, "register %s",
591 plongest (symbol
->value_longest ()));
595 gdb_printf (outfile
, "arg at offset %s",
596 hex_string (symbol
->value_longest ()));
600 gdb_printf (outfile
, "reference arg at %s",
601 hex_string (symbol
->value_longest ()));
604 case LOC_REGPARM_ADDR
:
605 gdb_printf (outfile
, "address parameter register %s",
606 plongest (symbol
->value_longest ()));
610 gdb_printf (outfile
, "local at offset %s",
611 hex_string (symbol
->value_longest ()));
618 gdb_printf (outfile
, "label at ");
619 gdb_puts (paddress (gdbarch
, symbol
->value_address ()), outfile
);
621 gdb_printf (outfile
, " section %s",
622 bfd_section_name (section
->the_bfd_section
));
627 (outfile
, "block object %s, %s..%s",
628 host_address_to_string (symbol
->value_block ()),
629 paddress (gdbarch
, symbol
->value_block()->start ()),
630 paddress (gdbarch
, symbol
->value_block()->end ()));
632 gdb_printf (outfile
, " section %s",
633 bfd_section_name (section
->the_bfd_section
));
637 gdb_printf (outfile
, "computed at runtime");
641 gdb_printf (outfile
, "unresolved");
644 case LOC_OPTIMIZED_OUT
:
645 gdb_printf (outfile
, "optimized out");
649 gdb_printf (outfile
, "botched symbol class %x",
654 gdb_printf (outfile
, "\n");
658 maintenance_print_msymbols (const char *args
, int from_tty
)
660 struct ui_file
*outfile
= gdb_stdout
;
661 char *objfile_arg
= NULL
;
666 gdb_argv
argv (args
);
668 for (i
= 0; argv
!= NULL
&& argv
[i
] != NULL
; ++i
)
670 if (strcmp (argv
[i
], "-objfile") == 0)
672 if (argv
[i
+ 1] == NULL
)
673 error (_("Missing objfile name"));
674 objfile_arg
= argv
[++i
];
676 else if (strcmp (argv
[i
], "--") == 0)
678 /* End of options. */
682 else if (argv
[i
][0] == '-')
684 /* Future proofing: Don't allow OUTFILE to begin with "-". */
685 error (_("Unknown option: %s"), argv
[i
]);
692 stdio_file arg_outfile
;
694 if (argv
!= NULL
&& argv
[outfile_idx
] != NULL
)
696 if (argv
[outfile_idx
+ 1] != NULL
)
697 error (_("Junk at end of command"));
698 gdb::unique_xmalloc_ptr
<char> outfile_name
699 (tilde_expand (argv
[outfile_idx
]));
700 if (!arg_outfile
.open (outfile_name
.get (), FOPEN_WT
))
701 perror_with_name (outfile_name
.get ());
702 outfile
= &arg_outfile
;
705 for (objfile
*objfile
: current_program_space
->objfiles ())
708 if (objfile_arg
== NULL
709 || compare_filenames_for_search (objfile_name (objfile
), objfile_arg
))
710 dump_msymbols (objfile
, outfile
);
715 maintenance_print_objfiles (const char *regexp
, int from_tty
)
722 for (struct program_space
*pspace
: program_spaces
)
723 for (objfile
*objfile
: pspace
->objfiles ())
727 || re_exec (objfile_name (objfile
)))
728 dump_objfile (objfile
);
732 /* List all the symbol tables whose names match REGEXP (optional). */
735 maintenance_info_symtabs (const char *regexp
, int from_tty
)
742 for (struct program_space
*pspace
: program_spaces
)
743 for (objfile
*objfile
: pspace
->objfiles ())
745 /* We don't want to print anything for this objfile until we
746 actually find a symtab whose name matches. */
747 int printed_objfile_start
= 0;
749 for (compunit_symtab
*cust
: objfile
->compunits ())
751 int printed_compunit_symtab_start
= 0;
753 for (symtab
*symtab
: cust
->filetabs ())
758 || re_exec (symtab_to_filename_for_display (symtab
)))
760 if (! printed_objfile_start
)
762 gdb_printf ("{ objfile %s ", objfile_name (objfile
));
763 gdb_stdout
->wrap_here (2);
764 gdb_printf ("((struct objfile *) %s)\n",
765 host_address_to_string (objfile
));
766 printed_objfile_start
= 1;
768 if (! printed_compunit_symtab_start
)
770 gdb_printf (" { ((struct compunit_symtab *) %s)\n",
771 host_address_to_string (cust
));
772 gdb_printf (" debugformat %s\n",
773 cust
->debugformat ());
774 gdb_printf (" producer %s\n",
775 (cust
->producer () != nullptr
776 ? cust
->producer () : "(null)"));
777 gdb_printf (" name %s\n", cust
->name
);
778 gdb_printf (" dirname %s\n",
779 (cust
->dirname () != NULL
780 ? cust
->dirname () : "(null)"));
781 gdb_printf (" blockvector"
782 " ((struct blockvector *) %s)\n",
783 host_address_to_string
784 (cust
->blockvector ()));
786 " ((struct compunit_symtab *) %s)\n",
787 cust
->user
!= nullptr
788 ? host_address_to_string (cust
->user
)
790 if (cust
->includes
!= nullptr)
792 gdb_printf (" ( includes\n");
793 for (int i
= 0; ; ++i
)
795 struct compunit_symtab
*include
797 if (include
== nullptr)
800 = host_address_to_string (include
);
801 gdb_printf (" (%s %s)\n",
802 "(struct compunit_symtab *)",
807 printed_compunit_symtab_start
= 1;
810 gdb_printf ("\t{ symtab %s ",
811 symtab_to_filename_for_display (symtab
));
812 gdb_stdout
->wrap_here (4);
813 gdb_printf ("((struct symtab *) %s)\n",
814 host_address_to_string (symtab
));
815 gdb_printf ("\t fullname %s\n",
816 symtab
->fullname
!= NULL
820 "linetable ((struct linetable *) %s)\n",
821 host_address_to_string
822 (symtab
->linetable ()));
823 gdb_printf ("\t}\n");
827 if (printed_compunit_symtab_start
)
831 if (printed_objfile_start
)
836 /* Check consistency of symtabs.
837 An example of what this checks for is NULL blockvectors.
838 They can happen if there's a bug during debug info reading.
839 GDB assumes they are always non-NULL.
841 Note: This does not check for psymtab vs symtab consistency.
842 Use "maint check-psymtabs" for that. */
845 maintenance_check_symtabs (const char *ignore
, int from_tty
)
847 for (struct program_space
*pspace
: program_spaces
)
848 for (objfile
*objfile
: pspace
->objfiles ())
850 /* We don't want to print anything for this objfile until we
851 actually find something worth printing. */
852 int printed_objfile_start
= 0;
854 for (compunit_symtab
*cust
: objfile
->compunits ())
856 int found_something
= 0;
857 struct symtab
*symtab
= cust
->primary_filetab ();
861 if (cust
->blockvector () == NULL
)
863 /* Add more checks here. */
867 if (! printed_objfile_start
)
869 gdb_printf ("{ objfile %s ", objfile_name (objfile
));
870 gdb_stdout
->wrap_here (2);
871 gdb_printf ("((struct objfile *) %s)\n",
872 host_address_to_string (objfile
));
873 printed_objfile_start
= 1;
875 gdb_printf (" { symtab %s\n",
876 symtab_to_filename_for_display (symtab
));
877 if (cust
->blockvector () == NULL
)
878 gdb_printf (" NULL blockvector\n");
883 if (printed_objfile_start
)
888 /* Expand all symbol tables whose name matches an optional regexp. */
891 maintenance_expand_symtabs (const char *args
, int from_tty
)
895 /* We use buildargv here so that we handle spaces in the regexp
896 in a way that allows adding more arguments later. */
897 gdb_argv
argv (args
);
905 error (_("Extra arguments after regexp."));
912 for (struct program_space
*pspace
: program_spaces
)
913 for (objfile
*objfile
: pspace
->objfiles ())
914 objfile
->expand_symtabs_matching
915 ([&] (const char *filename
, bool basenames
)
917 /* KISS: Only apply the regexp to the complete file name. */
919 && (regexp
== NULL
|| re_exec (filename
)));
924 SEARCH_GLOBAL_BLOCK
| SEARCH_STATIC_BLOCK
,
930 /* Return the nexting depth of a block within other blocks in its symtab. */
933 block_depth (const struct block
*block
)
937 while ((block
= block
->superblock ()) != NULL
)
945 /* Used by MAINTENANCE_INFO_LINE_TABLES to print the information about a
946 single line table. */
949 maintenance_print_one_line_table (struct symtab
*symtab
, void *data
)
951 struct linetable
*linetable
;
952 struct objfile
*objfile
;
954 objfile
= symtab
->compunit ()->objfile ();
955 gdb_printf (_("objfile: %ps ((struct objfile *) %s)\n"),
956 styled_string (file_name_style
.style (),
957 objfile_name (objfile
)),
958 host_address_to_string (objfile
));
959 gdb_printf (_("compunit_symtab: %s ((struct compunit_symtab *) %s)\n"),
960 symtab
->compunit ()->name
,
961 host_address_to_string (symtab
->compunit ()));
962 gdb_printf (_("symtab: %ps ((struct symtab *) %s)\n"),
963 styled_string (file_name_style
.style (),
964 symtab_to_fullname (symtab
)),
965 host_address_to_string (symtab
));
966 linetable
= symtab
->linetable ();
967 gdb_printf (_("linetable: ((struct linetable *) %s):\n"),
968 host_address_to_string (linetable
));
970 if (linetable
== NULL
)
971 gdb_printf (_("No line table.\n"));
972 else if (linetable
->nitems
<= 0)
973 gdb_printf (_("Line table has no lines.\n"));
976 /* Leave space for 6 digits of index and line number. After that the
977 tables will just not format as well. */
978 struct ui_out
*uiout
= current_uiout
;
979 ui_out_emit_table
table_emitter (uiout
, 5, -1, "line-table");
980 uiout
->table_header (6, ui_left
, "index", _("INDEX"));
981 uiout
->table_header (6, ui_left
, "line", _("LINE"));
982 uiout
->table_header (18, ui_left
, "address", _("ADDRESS"));
983 uiout
->table_header (7, ui_left
, "is-stmt", _("IS-STMT"));
984 uiout
->table_header (12, ui_left
, "prologue-end", _("PROLOGUE-END"));
985 uiout
->table_body ();
987 for (int i
= 0; i
< linetable
->nitems
; ++i
)
989 struct linetable_entry
*item
;
991 item
= &linetable
->item
[i
];
992 ui_out_emit_tuple
tuple_emitter (uiout
, nullptr);
993 uiout
->field_signed ("index", i
);
995 uiout
->field_signed ("line", item
->line
);
997 uiout
->field_string ("line", _("END"));
998 uiout
->field_core_addr ("address", objfile
->arch (),
1000 uiout
->field_string ("is-stmt", item
->is_stmt
? "Y" : "");
1001 uiout
->field_string ("prologue-end", item
->prologue_end
? "Y" : "");
1009 /* Implement the 'maint info line-table' command. */
1012 maintenance_info_line_tables (const char *regexp
, int from_tty
)
1019 for (struct program_space
*pspace
: program_spaces
)
1020 for (objfile
*objfile
: pspace
->objfiles ())
1022 for (compunit_symtab
*cust
: objfile
->compunits ())
1024 for (symtab
*symtab
: cust
->filetabs ())
1029 || re_exec (symtab_to_filename_for_display (symtab
)))
1031 maintenance_print_one_line_table (symtab
, NULL
);
1041 /* Do early runtime initializations. */
1043 void _initialize_symmisc ();
1045 _initialize_symmisc ()
1047 add_cmd ("symbols", class_maintenance
, maintenance_print_symbols
, _("\
1048 Print dump of current symbol definitions.\n\
1049 Usage: mt print symbols [-pc ADDRESS] [--] [OUTFILE]\n\
1050 mt print symbols [-objfile OBJFILE] [-source SOURCE] [--] [OUTFILE]\n\
1051 Entries in the full symbol table are dumped to file OUTFILE,\n\
1052 or the terminal if OUTFILE is unspecified.\n\
1053 If ADDRESS is provided, dump only the file for that address.\n\
1054 If SOURCE is provided, dump only that file's symbols.\n\
1055 If OBJFILE is provided, dump only that file's minimal symbols."),
1056 &maintenanceprintlist
);
1058 add_cmd ("msymbols", class_maintenance
, maintenance_print_msymbols
, _("\
1059 Print dump of current minimal symbol definitions.\n\
1060 Usage: mt print msymbols [-objfile OBJFILE] [--] [OUTFILE]\n\
1061 Entries in the minimal symbol table are dumped to file OUTFILE,\n\
1062 or the terminal if OUTFILE is unspecified.\n\
1063 If OBJFILE is provided, dump only that file's minimal symbols."),
1064 &maintenanceprintlist
);
1066 add_cmd ("objfiles", class_maintenance
, maintenance_print_objfiles
,
1067 _("Print dump of current object file definitions.\n\
1068 With an argument REGEXP, list the object files with matching names."),
1069 &maintenanceprintlist
);
1071 add_cmd ("symtabs", class_maintenance
, maintenance_info_symtabs
, _("\
1072 List the full symbol tables for all object files.\n\
1073 This does not include information about individual symbols, blocks, or\n\
1074 linetables --- just the symbol table structures themselves.\n\
1075 With an argument REGEXP, list the symbol tables with matching names."),
1076 &maintenanceinfolist
);
1078 add_cmd ("line-table", class_maintenance
, maintenance_info_line_tables
, _("\
1079 List the contents of all line tables, from all symbol tables.\n\
1080 With an argument REGEXP, list just the line tables for the symbol\n\
1081 tables with matching names."),
1082 &maintenanceinfolist
);
1084 add_cmd ("check-symtabs", class_maintenance
, maintenance_check_symtabs
,
1086 Check consistency of currently expanded symtabs."),
1089 add_cmd ("expand-symtabs", class_maintenance
, maintenance_expand_symtabs
,
1090 _("Expand symbol tables.\n\
1091 With an argument REGEXP, only expand the symbol tables with matching names."),