]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - gdb/symmisc.c
gdb: remove symtab::objfile
[thirdparty/binutils-gdb.git] / gdb / symmisc.c
1 /* Do various things to symbol tables (other than lookup), for GDB.
2
3 Copyright (C) 1986-2022 Free Software Foundation, Inc.
4
5 This file is part of GDB.
6
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.
11
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.
16
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/>. */
19
20 #include "defs.h"
21 #include "symtab.h"
22 #include "gdbtypes.h"
23 #include "bfd.h"
24 #include "filenames.h"
25 #include "symfile.h"
26 #include "objfiles.h"
27 #include "breakpoint.h"
28 #include "command.h"
29 #include "gdbsupport/gdb_obstack.h"
30 #include "language.h"
31 #include "bcache.h"
32 #include "block.h"
33 #include "gdbsupport/gdb_regex.h"
34 #include <sys/stat.h>
35 #include "dictionary.h"
36 #include "typeprint.h"
37 #include "gdbcmd.h"
38 #include "source.h"
39 #include "readline/tilde.h"
40 #include <cli/cli-style.h>
41 #include "gdbsupport/buildargv.h"
42
43 /* Prototypes for local functions */
44
45 static int block_depth (const struct block *);
46
47 static void print_symbol (struct gdbarch *gdbarch, struct symbol *symbol,
48 int depth, ui_file *outfile);
49 \f
50
51 void
52 print_objfile_statistics (void)
53 {
54 int i, linetables, blockvectors;
55
56 for (struct program_space *pspace : program_spaces)
57 for (objfile *objfile : pspace->objfiles ())
58 {
59 QUIT;
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));
73
74 i = linetables = 0;
75 for (compunit_symtab *cu : objfile->compunits ())
76 {
77 for (symtab *s : cu->filetabs ())
78 {
79 i++;
80 if (s->linetable () != NULL)
81 linetables++;
82 }
83 }
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"),
88 linetables);
89 gdb_printf (_(" Number of symbol tables with blockvectors: %d\n"),
90 blockvectors);
91
92 objfile->print_stats (false);
93
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
99 ->objfile_obstack)));
100 gdb_printf (_(" Total memory used for BFD obstack: %s\n"),
101 pulongest (obstack_memory_used (&objfile->per_bfd
102 ->storage_obstack)));
103
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);
110 }
111 }
112
113 static void
114 dump_objfile (struct objfile *objfile)
115 {
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),
120 objfile->per_bfd->minimal_symbol_count);
121
122 objfile->dump ();
123
124 if (objfile->compunit_symtabs != NULL)
125 {
126 gdb_printf ("Symtabs:\n");
127 for (compunit_symtab *cu : objfile->compunits ())
128 {
129 for (symtab *symtab : cu->filetabs ())
130 {
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!");
136 gdb_printf ("\n");
137 }
138 }
139 gdb_printf ("\n\n");
140 }
141 }
142
143 /* Print minimal symbols from this objfile. */
144
145 static void
146 dump_msymbols (struct objfile *objfile, struct ui_file *outfile)
147 {
148 struct gdbarch *gdbarch = objfile->arch ();
149 int index;
150 char ms_type;
151
152 gdb_printf (outfile, "\nObject file %s:\n\n", objfile_name (objfile));
153 if (objfile->per_bfd->minimal_symbol_count == 0)
154 {
155 gdb_printf (outfile, "No minimal symbols found.\n");
156 return;
157 }
158 index = 0;
159 for (minimal_symbol *msymbol : objfile->msymbols ())
160 {
161 struct obj_section *section = msymbol->obj_section (objfile);
162
163 switch (MSYMBOL_TYPE (msymbol))
164 {
165 case mst_unknown:
166 ms_type = 'u';
167 break;
168 case mst_text:
169 ms_type = 'T';
170 break;
171 case mst_text_gnu_ifunc:
172 case mst_data_gnu_ifunc:
173 ms_type = 'i';
174 break;
175 case mst_solib_trampoline:
176 ms_type = 'S';
177 break;
178 case mst_data:
179 ms_type = 'D';
180 break;
181 case mst_bss:
182 ms_type = 'B';
183 break;
184 case mst_abs:
185 ms_type = 'A';
186 break;
187 case mst_file_text:
188 ms_type = 't';
189 break;
190 case mst_file_data:
191 ms_type = 'd';
192 break;
193 case mst_file_bss:
194 ms_type = 'b';
195 break;
196 default:
197 ms_type = '?';
198 break;
199 }
200 gdb_printf (outfile, "[%2d] %c ", index, ms_type);
201
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 gdb_puts (paddress (gdbarch, addr), outfile);
207 gdb_printf (outfile, " %s", msymbol->linkage_name ());
208 if (section)
209 {
210 if (section->the_bfd_section != NULL)
211 gdb_printf (outfile, " section %s",
212 bfd_section_name (section->the_bfd_section));
213 else
214 gdb_printf (outfile, " spurious section %ld",
215 (long) (section - objfile->sections));
216 }
217 if (msymbol->demangled_name () != NULL)
218 {
219 gdb_printf (outfile, " %s", msymbol->demangled_name ());
220 }
221 if (msymbol->filename)
222 gdb_printf (outfile, " %s", msymbol->filename);
223 gdb_puts ("\n", outfile);
224 index++;
225 }
226 if (objfile->per_bfd->minimal_symbol_count != index)
227 {
228 warning (_("internal error: minimal symbol count %d != %d"),
229 objfile->per_bfd->minimal_symbol_count, index);
230 }
231 gdb_printf (outfile, "\n");
232 }
233
234 static void
235 dump_symtab_1 (struct symtab *symtab, struct ui_file *outfile)
236 {
237 struct objfile *objfile = symtab->compunit ()->objfile ();
238 struct gdbarch *gdbarch = objfile->arch ();
239 int i;
240 struct mdict_iterator miter;
241 int len;
242 struct linetable *l;
243 const struct blockvector *bv;
244 struct symbol *sym;
245 const struct block *b;
246 int depth;
247
248 gdb_printf (outfile, "\nSymtab for file %s at %s\n",
249 symtab_to_filename_for_display (symtab),
250 host_address_to_string (symtab));
251
252 if (symtab->compunit ()->dirname () != NULL)
253 gdb_printf (outfile, "Compilation directory is %s\n",
254 symtab->compunit ()->dirname ());
255 gdb_printf (outfile, "Read from object file %s (%s)\n",
256 objfile_name (objfile),
257 host_address_to_string (objfile));
258 gdb_printf (outfile, "Language: %s\n",
259 language_str (symtab->language ()));
260
261 /* First print the line table. */
262 l = symtab->linetable ();
263 if (l)
264 {
265 gdb_printf (outfile, "\nLine table:\n\n");
266 len = l->nitems;
267 for (i = 0; i < len; i++)
268 {
269 gdb_printf (outfile, " line %d at ", l->item[i].line);
270 gdb_puts (paddress (gdbarch, l->item[i].pc), outfile);
271 if (l->item[i].is_stmt)
272 gdb_printf (outfile, "\t(stmt)");
273 gdb_printf (outfile, "\n");
274 }
275 }
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))
279 {
280 gdb_printf (outfile, "\nBlockvector:\n\n");
281 bv = symtab->compunit ()->blockvector ();
282 len = BLOCKVECTOR_NBLOCKS (bv);
283 for (i = 0; i < len; i++)
284 {
285 b = BLOCKVECTOR_BLOCK (bv, i);
286 depth = block_depth (b) * 2;
287 gdb_printf (outfile, "%*sblock #%03d, object at %s",
288 depth, "", i,
289 host_address_to_string (b));
290 if (BLOCK_SUPERBLOCK (b))
291 gdb_printf (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
295 wants it. */
296 gdb_printf (outfile, ", %d syms/buckets in ",
297 mdict_size (BLOCK_MULTIDICT (b)));
298 gdb_puts (paddress (gdbarch, BLOCK_START (b)), outfile);
299 gdb_printf (outfile, "..");
300 gdb_puts (paddress (gdbarch, BLOCK_END (b)), outfile);
301 if (BLOCK_FUNCTION (b))
302 {
303 gdb_printf (outfile, ", function %s",
304 BLOCK_FUNCTION (b)->linkage_name ());
305 if (BLOCK_FUNCTION (b)->demangled_name () != NULL)
306 {
307 gdb_printf (outfile, ", %s",
308 BLOCK_FUNCTION (b)->demangled_name ());
309 }
310 }
311 gdb_printf (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)
316 {
317 try
318 {
319 print_symbol (gdbarch, sym, depth + 1, outfile);
320 }
321 catch (const gdb_exception_error &ex)
322 {
323 exception_fprintf (gdb_stderr, ex,
324 "Error printing symbol:\n");
325 }
326 }
327 }
328 gdb_printf (outfile, "\n");
329 }
330 else
331 {
332 compunit_symtab *compunit = symtab->compunit ();
333 const char *compunit_filename
334 = symtab_to_filename_for_display (compunit->primary_filetab ());
335
336 gdb_printf (outfile,
337 "\nBlockvector same as owning compunit: %s\n\n",
338 compunit_filename);
339 }
340
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))
344 {
345 struct compunit_symtab *cust = symtab->compunit ();
346
347 if (cust->user != nullptr)
348 {
349 const char *addr
350 = host_address_to_string (cust->user->primary_filetab ());
351 gdb_printf (outfile, "Compunit user: %s\n", addr);
352 }
353 if (cust->includes != nullptr)
354 for (i = 0; ; ++i)
355 {
356 struct compunit_symtab *include = cust->includes[i];
357 if (include == nullptr)
358 break;
359 const char *addr
360 = host_address_to_string (include->primary_filetab ());
361 gdb_printf (outfile, "Compunit include: %s\n", addr);
362 }
363 }
364 }
365
366 static void
367 dump_symtab (struct symtab *symtab, struct ui_file *outfile)
368 {
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)
375 {
376 scoped_restore_current_language save_lang;
377 set_language (symtab->language ());
378 dump_symtab_1 (symtab, outfile);
379 }
380 else
381 dump_symtab_1 (symtab, outfile);
382 }
383
384 static void
385 maintenance_print_symbols (const char *args, int from_tty)
386 {
387 struct ui_file *outfile = gdb_stdout;
388 char *address_arg = NULL, *source_arg = NULL, *objfile_arg = NULL;
389 int i, outfile_idx;
390
391 dont_repeat ();
392
393 gdb_argv argv (args);
394
395 for (i = 0; argv != NULL && argv[i] != NULL; ++i)
396 {
397 if (strcmp (argv[i], "-pc") == 0)
398 {
399 if (argv[i + 1] == NULL)
400 error (_("Missing pc value"));
401 address_arg = argv[++i];
402 }
403 else if (strcmp (argv[i], "-source") == 0)
404 {
405 if (argv[i + 1] == NULL)
406 error (_("Missing source file"));
407 source_arg = argv[++i];
408 }
409 else if (strcmp (argv[i], "-objfile") == 0)
410 {
411 if (argv[i + 1] == NULL)
412 error (_("Missing objfile name"));
413 objfile_arg = argv[++i];
414 }
415 else if (strcmp (argv[i], "--") == 0)
416 {
417 /* End of options. */
418 ++i;
419 break;
420 }
421 else if (argv[i][0] == '-')
422 {
423 /* Future proofing: Don't allow OUTFILE to begin with "-". */
424 error (_("Unknown option: %s"), argv[i]);
425 }
426 else
427 break;
428 }
429 outfile_idx = i;
430
431 if (address_arg != NULL && source_arg != NULL)
432 error (_("Must specify at most one of -pc and -source"));
433
434 stdio_file arg_outfile;
435
436 if (argv != NULL && argv[outfile_idx] != NULL)
437 {
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;
445 }
446
447 if (address_arg != NULL)
448 {
449 CORE_ADDR pc = parse_and_eval_address (address_arg);
450 struct symtab *s = find_pc_line_symtab (pc);
451
452 if (s == NULL)
453 error (_("No symtab for address: %s"), address_arg);
454 dump_symtab (s, outfile);
455 }
456 else
457 {
458 int found = 0;
459
460 for (objfile *objfile : current_program_space->objfiles ())
461 {
462 int print_for_objfile = 1;
463
464 if (objfile_arg != NULL)
465 print_for_objfile
466 = compare_filenames_for_search (objfile_name (objfile),
467 objfile_arg);
468 if (!print_for_objfile)
469 continue;
470
471 for (compunit_symtab *cu : objfile->compunits ())
472 {
473 for (symtab *s : cu->filetabs ())
474 {
475 int print_for_source = 0;
476
477 QUIT;
478 if (source_arg != NULL)
479 {
480 print_for_source
481 = compare_filenames_for_search
482 (symtab_to_filename_for_display (s), source_arg);
483 found = 1;
484 }
485 if (source_arg == NULL
486 || print_for_source)
487 dump_symtab (s, outfile);
488 }
489 }
490 }
491
492 if (source_arg != NULL && !found)
493 error (_("No symtab for source file: %s"), source_arg);
494 }
495 }
496
497 /* Print symbol SYMBOL on OUTFILE. DEPTH says how far to indent. */
498
499 static void
500 print_symbol (struct gdbarch *gdbarch, struct symbol *symbol,
501 int depth, ui_file *outfile)
502 {
503 struct obj_section *section;
504
505 if (symbol->is_objfile_owned ())
506 section = symbol->obj_section (symbol_objfile (symbol));
507 else
508 section = NULL;
509
510 print_spaces (depth, outfile);
511 if (symbol->domain () == LABEL_DOMAIN)
512 {
513 gdb_printf (outfile, "label %s at ", symbol->print_name ());
514 gdb_puts (paddress (gdbarch, SYMBOL_VALUE_ADDRESS (symbol)),
515 outfile);
516 if (section)
517 gdb_printf (outfile, " section %s\n",
518 bfd_section_name (section->the_bfd_section));
519 else
520 gdb_printf (outfile, "\n");
521 return;
522 }
523
524 if (symbol->domain () == STRUCT_DOMAIN)
525 {
526 if (symbol->type ()->name ())
527 {
528 current_language->print_type (symbol->type (), "", outfile, 1, depth,
529 &type_print_raw_options);
530 }
531 else
532 {
533 gdb_printf (outfile, "%s %s = ",
534 (symbol->type ()->code () == TYPE_CODE_ENUM
535 ? "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);
541 }
542 gdb_printf (outfile, ";\n");
543 }
544 else
545 {
546 if (symbol->aclass () == LOC_TYPEDEF)
547 gdb_printf (outfile, "typedef ");
548 if (symbol->type ())
549 {
550 /* Print details of types, except for enums where it's clutter. */
551 current_language->print_type (symbol->type (), symbol->print_name (),
552 outfile,
553 symbol->type ()->code () != TYPE_CODE_ENUM,
554 depth,
555 &type_print_raw_options);
556 gdb_printf (outfile, "; ");
557 }
558 else
559 gdb_printf (outfile, "%s ", symbol->print_name ());
560
561 switch (symbol->aclass ())
562 {
563 case LOC_CONST:
564 gdb_printf (outfile, "const %s (%s)",
565 plongest (SYMBOL_VALUE (symbol)),
566 hex_string (SYMBOL_VALUE (symbol)));
567 break;
568
569 case LOC_CONST_BYTES:
570 {
571 unsigned i;
572 struct type *type = check_typedef (symbol->type ());
573
574 gdb_printf (outfile, "const %s hex bytes:",
575 pulongest (TYPE_LENGTH (type)));
576 for (i = 0; i < TYPE_LENGTH (type); i++)
577 gdb_printf (outfile, " %02x",
578 (unsigned) SYMBOL_VALUE_BYTES (symbol)[i]);
579 }
580 break;
581
582 case LOC_STATIC:
583 gdb_printf (outfile, "static at ");
584 gdb_puts (paddress (gdbarch, SYMBOL_VALUE_ADDRESS (symbol)),
585 outfile);
586 if (section)
587 gdb_printf (outfile, " section %s",
588 bfd_section_name (section->the_bfd_section));
589 break;
590
591 case LOC_REGISTER:
592 if (symbol->is_argument ())
593 gdb_printf (outfile, "parameter register %s",
594 plongest (SYMBOL_VALUE (symbol)));
595 else
596 gdb_printf (outfile, "register %s",
597 plongest (SYMBOL_VALUE (symbol)));
598 break;
599
600 case LOC_ARG:
601 gdb_printf (outfile, "arg at offset %s",
602 hex_string (SYMBOL_VALUE (symbol)));
603 break;
604
605 case LOC_REF_ARG:
606 gdb_printf (outfile, "reference arg at %s",
607 hex_string (SYMBOL_VALUE (symbol)));
608 break;
609
610 case LOC_REGPARM_ADDR:
611 gdb_printf (outfile, "address parameter register %s",
612 plongest (SYMBOL_VALUE (symbol)));
613 break;
614
615 case LOC_LOCAL:
616 gdb_printf (outfile, "local at offset %s",
617 hex_string (SYMBOL_VALUE (symbol)));
618 break;
619
620 case LOC_TYPEDEF:
621 break;
622
623 case LOC_LABEL:
624 gdb_printf (outfile, "label at ");
625 gdb_puts (paddress (gdbarch, SYMBOL_VALUE_ADDRESS (symbol)),
626 outfile);
627 if (section)
628 gdb_printf (outfile, " section %s",
629 bfd_section_name (section->the_bfd_section));
630 break;
631
632 case LOC_BLOCK:
633 gdb_printf
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))));
638 if (section)
639 gdb_printf (outfile, " section %s",
640 bfd_section_name (section->the_bfd_section));
641 break;
642
643 case LOC_COMPUTED:
644 gdb_printf (outfile, "computed at runtime");
645 break;
646
647 case LOC_UNRESOLVED:
648 gdb_printf (outfile, "unresolved");
649 break;
650
651 case LOC_OPTIMIZED_OUT:
652 gdb_printf (outfile, "optimized out");
653 break;
654
655 default:
656 gdb_printf (outfile, "botched symbol class %x",
657 symbol->aclass ());
658 break;
659 }
660 }
661 gdb_printf (outfile, "\n");
662 }
663
664 static void
665 maintenance_print_msymbols (const char *args, int from_tty)
666 {
667 struct ui_file *outfile = gdb_stdout;
668 char *objfile_arg = NULL;
669 int i, outfile_idx;
670
671 dont_repeat ();
672
673 gdb_argv argv (args);
674
675 for (i = 0; argv != NULL && argv[i] != NULL; ++i)
676 {
677 if (strcmp (argv[i], "-objfile") == 0)
678 {
679 if (argv[i + 1] == NULL)
680 error (_("Missing objfile name"));
681 objfile_arg = argv[++i];
682 }
683 else if (strcmp (argv[i], "--") == 0)
684 {
685 /* End of options. */
686 ++i;
687 break;
688 }
689 else if (argv[i][0] == '-')
690 {
691 /* Future proofing: Don't allow OUTFILE to begin with "-". */
692 error (_("Unknown option: %s"), argv[i]);
693 }
694 else
695 break;
696 }
697 outfile_idx = i;
698
699 stdio_file arg_outfile;
700
701 if (argv != NULL && argv[outfile_idx] != NULL)
702 {
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;
710 }
711
712 for (objfile *objfile : current_program_space->objfiles ())
713 {
714 QUIT;
715 if (objfile_arg == NULL
716 || compare_filenames_for_search (objfile_name (objfile), objfile_arg))
717 dump_msymbols (objfile, outfile);
718 }
719 }
720
721 static void
722 maintenance_print_objfiles (const char *regexp, int from_tty)
723 {
724 dont_repeat ();
725
726 if (regexp)
727 re_comp (regexp);
728
729 for (struct program_space *pspace : program_spaces)
730 for (objfile *objfile : pspace->objfiles ())
731 {
732 QUIT;
733 if (! regexp
734 || re_exec (objfile_name (objfile)))
735 dump_objfile (objfile);
736 }
737 }
738
739 /* List all the symbol tables whose names match REGEXP (optional). */
740
741 static void
742 maintenance_info_symtabs (const char *regexp, int from_tty)
743 {
744 dont_repeat ();
745
746 if (regexp)
747 re_comp (regexp);
748
749 for (struct program_space *pspace : program_spaces)
750 for (objfile *objfile : pspace->objfiles ())
751 {
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;
755
756 for (compunit_symtab *cust : objfile->compunits ())
757 {
758 int printed_compunit_symtab_start = 0;
759
760 for (symtab *symtab : cust->filetabs ())
761 {
762 QUIT;
763
764 if (! regexp
765 || re_exec (symtab_to_filename_for_display (symtab)))
766 {
767 if (! printed_objfile_start)
768 {
769 gdb_printf ("{ objfile %s ", objfile_name (objfile));
770 gdb_stdout->wrap_here (2);
771 gdb_printf ("((struct objfile *) %s)\n",
772 host_address_to_string (objfile));
773 printed_objfile_start = 1;
774 }
775 if (! printed_compunit_symtab_start)
776 {
777 gdb_printf (" { ((struct compunit_symtab *) %s)\n",
778 host_address_to_string (cust));
779 gdb_printf (" debugformat %s\n",
780 cust->debugformat ());
781 gdb_printf (" producer %s\n",
782 (cust->producer () != nullptr
783 ? cust->producer () : "(null)"));
784 gdb_printf (" name %s\n", cust->name);
785 gdb_printf (" dirname %s\n",
786 (cust->dirname () != NULL
787 ? cust->dirname () : "(null)"));
788 gdb_printf (" blockvector"
789 " ((struct blockvector *) %s)\n",
790 host_address_to_string
791 (cust->blockvector ()));
792 gdb_printf (" user"
793 " ((struct compunit_symtab *) %s)\n",
794 cust->user != nullptr
795 ? host_address_to_string (cust->user)
796 : "(null)");
797 if (cust->includes != nullptr)
798 {
799 gdb_printf (" ( includes\n");
800 for (int i = 0; ; ++i)
801 {
802 struct compunit_symtab *include
803 = cust->includes[i];
804 if (include == nullptr)
805 break;
806 const char *addr
807 = host_address_to_string (include);
808 gdb_printf (" (%s %s)\n",
809 "(struct compunit_symtab *)",
810 addr);
811 }
812 gdb_printf (" )\n");
813 }
814 printed_compunit_symtab_start = 1;
815 }
816
817 gdb_printf ("\t{ symtab %s ",
818 symtab_to_filename_for_display (symtab));
819 gdb_stdout->wrap_here (4);
820 gdb_printf ("((struct symtab *) %s)\n",
821 host_address_to_string (symtab));
822 gdb_printf ("\t fullname %s\n",
823 symtab->fullname != NULL
824 ? symtab->fullname
825 : "(null)");
826 gdb_printf ("\t "
827 "linetable ((struct linetable *) %s)\n",
828 host_address_to_string
829 (symtab->linetable ()));
830 gdb_printf ("\t}\n");
831 }
832 }
833
834 if (printed_compunit_symtab_start)
835 gdb_printf (" }\n");
836 }
837
838 if (printed_objfile_start)
839 gdb_printf ("}\n");
840 }
841 }
842
843 /* Check consistency of symtabs.
844 An example of what this checks for is NULL blockvectors.
845 They can happen if there's a bug during debug info reading.
846 GDB assumes they are always non-NULL.
847
848 Note: This does not check for psymtab vs symtab consistency.
849 Use "maint check-psymtabs" for that. */
850
851 static void
852 maintenance_check_symtabs (const char *ignore, int from_tty)
853 {
854 for (struct program_space *pspace : program_spaces)
855 for (objfile *objfile : pspace->objfiles ())
856 {
857 /* We don't want to print anything for this objfile until we
858 actually find something worth printing. */
859 int printed_objfile_start = 0;
860
861 for (compunit_symtab *cust : objfile->compunits ())
862 {
863 int found_something = 0;
864 struct symtab *symtab = cust->primary_filetab ();
865
866 QUIT;
867
868 if (cust->blockvector () == NULL)
869 found_something = 1;
870 /* Add more checks here. */
871
872 if (found_something)
873 {
874 if (! printed_objfile_start)
875 {
876 gdb_printf ("{ objfile %s ", objfile_name (objfile));
877 gdb_stdout->wrap_here (2);
878 gdb_printf ("((struct objfile *) %s)\n",
879 host_address_to_string (objfile));
880 printed_objfile_start = 1;
881 }
882 gdb_printf (" { symtab %s\n",
883 symtab_to_filename_for_display (symtab));
884 if (cust->blockvector () == NULL)
885 gdb_printf (" NULL blockvector\n");
886 gdb_printf (" }\n");
887 }
888 }
889
890 if (printed_objfile_start)
891 gdb_printf ("}\n");
892 }
893 }
894
895 /* Expand all symbol tables whose name matches an optional regexp. */
896
897 static void
898 maintenance_expand_symtabs (const char *args, int from_tty)
899 {
900 char *regexp = NULL;
901
902 /* We use buildargv here so that we handle spaces in the regexp
903 in a way that allows adding more arguments later. */
904 gdb_argv argv (args);
905
906 if (argv != NULL)
907 {
908 if (argv[0] != NULL)
909 {
910 regexp = argv[0];
911 if (argv[1] != NULL)
912 error (_("Extra arguments after regexp."));
913 }
914 }
915
916 if (regexp)
917 re_comp (regexp);
918
919 for (struct program_space *pspace : program_spaces)
920 for (objfile *objfile : pspace->objfiles ())
921 objfile->expand_symtabs_matching
922 ([&] (const char *filename, bool basenames)
923 {
924 /* KISS: Only apply the regexp to the complete file name. */
925 return (!basenames
926 && (regexp == NULL || re_exec (filename)));
927 },
928 NULL,
929 NULL,
930 NULL,
931 SEARCH_GLOBAL_BLOCK | SEARCH_STATIC_BLOCK,
932 UNDEF_DOMAIN,
933 ALL_DOMAIN);
934 }
935 \f
936
937 /* Return the nexting depth of a block within other blocks in its symtab. */
938
939 static int
940 block_depth (const struct block *block)
941 {
942 int i = 0;
943
944 while ((block = BLOCK_SUPERBLOCK (block)) != NULL)
945 {
946 i++;
947 }
948 return i;
949 }
950 \f
951
952 /* Used by MAINTENANCE_INFO_LINE_TABLES to print the information about a
953 single line table. */
954
955 static int
956 maintenance_print_one_line_table (struct symtab *symtab, void *data)
957 {
958 struct linetable *linetable;
959 struct objfile *objfile;
960
961 objfile = symtab->compunit ()->objfile ();
962 gdb_printf (_("objfile: %ps ((struct objfile *) %s)\n"),
963 styled_string (file_name_style.style (),
964 objfile_name (objfile)),
965 host_address_to_string (objfile));
966 gdb_printf (_("compunit_symtab: %s ((struct compunit_symtab *) %s)\n"),
967 symtab->compunit ()->name,
968 host_address_to_string (symtab->compunit ()));
969 gdb_printf (_("symtab: %ps ((struct symtab *) %s)\n"),
970 styled_string (file_name_style.style (),
971 symtab_to_fullname (symtab)),
972 host_address_to_string (symtab));
973 linetable = symtab->linetable ();
974 gdb_printf (_("linetable: ((struct linetable *) %s):\n"),
975 host_address_to_string (linetable));
976
977 if (linetable == NULL)
978 gdb_printf (_("No line table.\n"));
979 else if (linetable->nitems <= 0)
980 gdb_printf (_("Line table has no lines.\n"));
981 else
982 {
983 /* Leave space for 6 digits of index and line number. After that the
984 tables will just not format as well. */
985 struct ui_out *uiout = current_uiout;
986 ui_out_emit_table table_emitter (uiout, 5, -1, "line-table");
987 uiout->table_header (6, ui_left, "index", _("INDEX"));
988 uiout->table_header (6, ui_left, "line", _("LINE"));
989 uiout->table_header (18, ui_left, "address", _("ADDRESS"));
990 uiout->table_header (7, ui_left, "is-stmt", _("IS-STMT"));
991 uiout->table_header (12, ui_left, "prologue-end", _("PROLOGUE-END"));
992 uiout->table_body ();
993
994 for (int i = 0; i < linetable->nitems; ++i)
995 {
996 struct linetable_entry *item;
997
998 item = &linetable->item [i];
999 ui_out_emit_tuple tuple_emitter (uiout, nullptr);
1000 uiout->field_signed ("index", i);
1001 if (item->line > 0)
1002 uiout->field_signed ("line", item->line);
1003 else
1004 uiout->field_string ("line", _("END"));
1005 uiout->field_core_addr ("address", objfile->arch (),
1006 item->pc);
1007 uiout->field_string ("is-stmt", item->is_stmt ? "Y" : "");
1008 uiout->field_string ("prologue-end", item->prologue_end ? "Y" : "");
1009 uiout->text ("\n");
1010 }
1011 }
1012
1013 return 0;
1014 }
1015
1016 /* Implement the 'maint info line-table' command. */
1017
1018 static void
1019 maintenance_info_line_tables (const char *regexp, int from_tty)
1020 {
1021 dont_repeat ();
1022
1023 if (regexp != NULL)
1024 re_comp (regexp);
1025
1026 for (struct program_space *pspace : program_spaces)
1027 for (objfile *objfile : pspace->objfiles ())
1028 {
1029 for (compunit_symtab *cust : objfile->compunits ())
1030 {
1031 for (symtab *symtab : cust->filetabs ())
1032 {
1033 QUIT;
1034
1035 if (regexp == NULL
1036 || re_exec (symtab_to_filename_for_display (symtab)))
1037 {
1038 maintenance_print_one_line_table (symtab, NULL);
1039 gdb_printf ("\n");
1040 }
1041 }
1042 }
1043 }
1044 }
1045
1046 \f
1047
1048 /* Do early runtime initializations. */
1049
1050 void _initialize_symmisc ();
1051 void
1052 _initialize_symmisc ()
1053 {
1054 add_cmd ("symbols", class_maintenance, maintenance_print_symbols, _("\
1055 Print dump of current symbol definitions.\n\
1056 Usage: mt print symbols [-pc ADDRESS] [--] [OUTFILE]\n\
1057 mt print symbols [-objfile OBJFILE] [-source SOURCE] [--] [OUTFILE]\n\
1058 Entries in the full symbol table are dumped to file OUTFILE,\n\
1059 or the terminal if OUTFILE is unspecified.\n\
1060 If ADDRESS is provided, dump only the file for that address.\n\
1061 If SOURCE is provided, dump only that file's symbols.\n\
1062 If OBJFILE is provided, dump only that file's minimal symbols."),
1063 &maintenanceprintlist);
1064
1065 add_cmd ("msymbols", class_maintenance, maintenance_print_msymbols, _("\
1066 Print dump of current minimal symbol definitions.\n\
1067 Usage: mt print msymbols [-objfile OBJFILE] [--] [OUTFILE]\n\
1068 Entries in the minimal symbol table are dumped to file OUTFILE,\n\
1069 or the terminal if OUTFILE is unspecified.\n\
1070 If OBJFILE is provided, dump only that file's minimal symbols."),
1071 &maintenanceprintlist);
1072
1073 add_cmd ("objfiles", class_maintenance, maintenance_print_objfiles,
1074 _("Print dump of current object file definitions.\n\
1075 With an argument REGEXP, list the object files with matching names."),
1076 &maintenanceprintlist);
1077
1078 add_cmd ("symtabs", class_maintenance, maintenance_info_symtabs, _("\
1079 List the full symbol tables for all object files.\n\
1080 This does not include information about individual symbols, blocks, or\n\
1081 linetables --- just the symbol table structures themselves.\n\
1082 With an argument REGEXP, list the symbol tables with matching names."),
1083 &maintenanceinfolist);
1084
1085 add_cmd ("line-table", class_maintenance, maintenance_info_line_tables, _("\
1086 List the contents of all line tables, from all symbol tables.\n\
1087 With an argument REGEXP, list just the line tables for the symbol\n\
1088 tables with matching names."),
1089 &maintenanceinfolist);
1090
1091 add_cmd ("check-symtabs", class_maintenance, maintenance_check_symtabs,
1092 _("\
1093 Check consistency of currently expanded symtabs."),
1094 &maintenancelist);
1095
1096 add_cmd ("expand-symtabs", class_maintenance, maintenance_expand_symtabs,
1097 _("Expand symbol tables.\n\
1098 With an argument REGEXP, only expand the symbol tables with matching names."),
1099 &maintenancelist);
1100 }