]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - gdb/symmisc.c
Merge/shared string_printf and string_vprintf unit tests
[thirdparty/binutils-gdb.git] / gdb / symmisc.c
1 /* Do various things to symbol tables (other than lookup), for GDB.
2
3 Copyright (C) 1986-2017 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 "gdb_obstack.h"
30 #include "language.h"
31 #include "bcache.h"
32 #include "block.h"
33 #include "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/readline.h"
40
41 #include "psymtab.h"
42
43 /* Unfortunately for debugging, stderr is usually a macro. This is painful
44 when calling functions that take FILE *'s from the debugger.
45 So we make a variable which has the same value and which is accessible when
46 debugging GDB with itself. Because stdin et al need not be constants,
47 we initialize them in the _initialize_symmisc function at the bottom
48 of the file. */
49 FILE *std_in;
50 FILE *std_out;
51 FILE *std_err;
52
53 /* Prototypes for local functions */
54
55 static int block_depth (struct block *);
56
57 static void print_symbol (struct gdbarch *gdbarch, struct symbol *symbol,
58 int depth, ui_file *outfile);
59 \f
60
61 void
62 print_symbol_bcache_statistics (void)
63 {
64 struct program_space *pspace;
65 struct objfile *objfile;
66
67 ALL_PSPACES (pspace)
68 ALL_PSPACE_OBJFILES (pspace, objfile)
69 {
70 QUIT;
71 printf_filtered (_("Byte cache statistics for '%s':\n"),
72 objfile_name (objfile));
73 print_bcache_statistics (psymbol_bcache_get_bcache (objfile->psymbol_cache),
74 "partial symbol cache");
75 print_bcache_statistics (objfile->per_bfd->macro_cache,
76 "preprocessor macro cache");
77 print_bcache_statistics (objfile->per_bfd->filename_cache,
78 "file name cache");
79 }
80 }
81
82 void
83 print_objfile_statistics (void)
84 {
85 struct program_space *pspace;
86 struct objfile *objfile;
87 struct compunit_symtab *cu;
88 struct symtab *s;
89 int i, linetables, blockvectors;
90
91 ALL_PSPACES (pspace)
92 ALL_PSPACE_OBJFILES (pspace, objfile)
93 {
94 QUIT;
95 printf_filtered (_("Statistics for '%s':\n"), objfile_name (objfile));
96 if (OBJSTAT (objfile, n_stabs) > 0)
97 printf_filtered (_(" Number of \"stab\" symbols read: %d\n"),
98 OBJSTAT (objfile, n_stabs));
99 if (objfile->per_bfd->n_minsyms > 0)
100 printf_filtered (_(" Number of \"minimal\" symbols read: %d\n"),
101 objfile->per_bfd->n_minsyms);
102 if (OBJSTAT (objfile, n_psyms) > 0)
103 printf_filtered (_(" Number of \"partial\" symbols read: %d\n"),
104 OBJSTAT (objfile, n_psyms));
105 if (OBJSTAT (objfile, n_syms) > 0)
106 printf_filtered (_(" Number of \"full\" symbols read: %d\n"),
107 OBJSTAT (objfile, n_syms));
108 if (OBJSTAT (objfile, n_types) > 0)
109 printf_filtered (_(" Number of \"types\" defined: %d\n"),
110 OBJSTAT (objfile, n_types));
111 if (objfile->sf)
112 objfile->sf->qf->print_stats (objfile);
113 i = linetables = blockvectors = 0;
114 ALL_OBJFILE_FILETABS (objfile, cu, s)
115 {
116 i++;
117 if (SYMTAB_LINETABLE (s) != NULL)
118 linetables++;
119 }
120 ALL_OBJFILE_COMPUNITS (objfile, cu)
121 blockvectors++;
122 printf_filtered (_(" Number of symbol tables: %d\n"), i);
123 printf_filtered (_(" Number of symbol tables with line tables: %d\n"),
124 linetables);
125 printf_filtered (_(" Number of symbol tables with blockvectors: %d\n"),
126 blockvectors);
127
128 if (OBJSTAT (objfile, sz_strtab) > 0)
129 printf_filtered (_(" Space used by string tables: %d\n"),
130 OBJSTAT (objfile, sz_strtab));
131 printf_filtered (_(" Total memory used for objfile obstack: %s\n"),
132 pulongest (obstack_memory_used (&objfile
133 ->objfile_obstack)));
134 printf_filtered (_(" Total memory used for BFD obstack: %s\n"),
135 pulongest (obstack_memory_used (&objfile->per_bfd
136 ->storage_obstack)));
137 printf_filtered (_(" Total memory used for psymbol cache: %d\n"),
138 bcache_memory_used (psymbol_bcache_get_bcache
139 (objfile->psymbol_cache)));
140 printf_filtered (_(" Total memory used for macro cache: %d\n"),
141 bcache_memory_used (objfile->per_bfd->macro_cache));
142 printf_filtered (_(" Total memory used for file name cache: %d\n"),
143 bcache_memory_used (objfile->per_bfd->filename_cache));
144 }
145 }
146
147 static void
148 dump_objfile (struct objfile *objfile)
149 {
150 struct compunit_symtab *cust;
151 struct symtab *symtab;
152
153 printf_filtered ("\nObject file %s: ", objfile_name (objfile));
154 printf_filtered ("Objfile at ");
155 gdb_print_host_address (objfile, gdb_stdout);
156 printf_filtered (", bfd at ");
157 gdb_print_host_address (objfile->obfd, gdb_stdout);
158 printf_filtered (", %d minsyms\n\n",
159 objfile->per_bfd->minimal_symbol_count);
160
161 if (objfile->sf)
162 objfile->sf->qf->dump (objfile);
163
164 if (objfile->compunit_symtabs != NULL)
165 {
166 printf_filtered ("Symtabs:\n");
167 ALL_OBJFILE_FILETABS (objfile, cust, symtab)
168 {
169 printf_filtered ("%s at ", symtab_to_filename_for_display (symtab));
170 gdb_print_host_address (symtab, gdb_stdout);
171 printf_filtered (", ");
172 if (SYMTAB_OBJFILE (symtab) != objfile)
173 {
174 printf_filtered ("NOT ON CHAIN! ");
175 }
176 wrap_here (" ");
177 }
178 printf_filtered ("\n\n");
179 }
180 }
181
182 /* Print minimal symbols from this objfile. */
183
184 static void
185 dump_msymbols (struct objfile *objfile, struct ui_file *outfile)
186 {
187 struct gdbarch *gdbarch = get_objfile_arch (objfile);
188 struct minimal_symbol *msymbol;
189 int index;
190 char ms_type;
191
192 fprintf_filtered (outfile, "\nObject file %s:\n\n", objfile_name (objfile));
193 if (objfile->per_bfd->minimal_symbol_count == 0)
194 {
195 fprintf_filtered (outfile, "No minimal symbols found.\n");
196 return;
197 }
198 index = 0;
199 ALL_OBJFILE_MSYMBOLS (objfile, msymbol)
200 {
201 struct obj_section *section = MSYMBOL_OBJ_SECTION (objfile, msymbol);
202
203 switch (MSYMBOL_TYPE (msymbol))
204 {
205 case mst_unknown:
206 ms_type = 'u';
207 break;
208 case mst_text:
209 ms_type = 'T';
210 break;
211 case mst_text_gnu_ifunc:
212 ms_type = 'i';
213 break;
214 case mst_solib_trampoline:
215 ms_type = 'S';
216 break;
217 case mst_data:
218 ms_type = 'D';
219 break;
220 case mst_bss:
221 ms_type = 'B';
222 break;
223 case mst_abs:
224 ms_type = 'A';
225 break;
226 case mst_file_text:
227 ms_type = 't';
228 break;
229 case mst_file_data:
230 ms_type = 'd';
231 break;
232 case mst_file_bss:
233 ms_type = 'b';
234 break;
235 default:
236 ms_type = '?';
237 break;
238 }
239 fprintf_filtered (outfile, "[%2d] %c ", index, ms_type);
240 fputs_filtered (paddress (gdbarch, MSYMBOL_VALUE_ADDRESS (objfile,
241 msymbol)),
242 outfile);
243 fprintf_filtered (outfile, " %s", MSYMBOL_LINKAGE_NAME (msymbol));
244 if (section)
245 {
246 if (section->the_bfd_section != NULL)
247 fprintf_filtered (outfile, " section %s",
248 bfd_section_name (objfile->obfd,
249 section->the_bfd_section));
250 else
251 fprintf_filtered (outfile, " spurious section %ld",
252 (long) (section - objfile->sections));
253 }
254 if (MSYMBOL_DEMANGLED_NAME (msymbol) != NULL)
255 {
256 fprintf_filtered (outfile, " %s", MSYMBOL_DEMANGLED_NAME (msymbol));
257 }
258 if (msymbol->filename)
259 fprintf_filtered (outfile, " %s", msymbol->filename);
260 fputs_filtered ("\n", outfile);
261 index++;
262 }
263 if (objfile->per_bfd->minimal_symbol_count != index)
264 {
265 warning (_("internal error: minimal symbol count %d != %d"),
266 objfile->per_bfd->minimal_symbol_count, index);
267 }
268 fprintf_filtered (outfile, "\n");
269 }
270
271 static void
272 dump_symtab_1 (struct symtab *symtab, struct ui_file *outfile)
273 {
274 struct objfile *objfile = SYMTAB_OBJFILE (symtab);
275 struct gdbarch *gdbarch = get_objfile_arch (objfile);
276 int i;
277 struct dict_iterator iter;
278 int len;
279 struct linetable *l;
280 const struct blockvector *bv;
281 struct symbol *sym;
282 struct block *b;
283 int depth;
284
285 fprintf_filtered (outfile, "\nSymtab for file %s\n",
286 symtab_to_filename_for_display (symtab));
287 if (SYMTAB_DIRNAME (symtab) != NULL)
288 fprintf_filtered (outfile, "Compilation directory is %s\n",
289 SYMTAB_DIRNAME (symtab));
290 fprintf_filtered (outfile, "Read from object file %s (",
291 objfile_name (objfile));
292 gdb_print_host_address (objfile, outfile);
293 fprintf_filtered (outfile, ")\n");
294 fprintf_filtered (outfile, "Language: %s\n",
295 language_str (symtab->language));
296
297 /* First print the line table. */
298 l = SYMTAB_LINETABLE (symtab);
299 if (l)
300 {
301 fprintf_filtered (outfile, "\nLine table:\n\n");
302 len = l->nitems;
303 for (i = 0; i < len; i++)
304 {
305 fprintf_filtered (outfile, " line %d at ", l->item[i].line);
306 fputs_filtered (paddress (gdbarch, l->item[i].pc), outfile);
307 fprintf_filtered (outfile, "\n");
308 }
309 }
310 /* Now print the block info, but only for compunit symtabs since we will
311 print lots of duplicate info otherwise. */
312 if (symtab == COMPUNIT_FILETABS (SYMTAB_COMPUNIT (symtab)))
313 {
314 fprintf_filtered (outfile, "\nBlockvector:\n\n");
315 bv = SYMTAB_BLOCKVECTOR (symtab);
316 len = BLOCKVECTOR_NBLOCKS (bv);
317 for (i = 0; i < len; i++)
318 {
319 b = BLOCKVECTOR_BLOCK (bv, i);
320 depth = block_depth (b) * 2;
321 print_spaces (depth, outfile);
322 fprintf_filtered (outfile, "block #%03d, object at ", i);
323 gdb_print_host_address (b, outfile);
324 if (BLOCK_SUPERBLOCK (b))
325 {
326 fprintf_filtered (outfile, " under ");
327 gdb_print_host_address (BLOCK_SUPERBLOCK (b), outfile);
328 }
329 /* drow/2002-07-10: We could save the total symbols count
330 even if we're using a hashtable, but nothing else but this message
331 wants it. */
332 fprintf_filtered (outfile, ", %d syms/buckets in ",
333 dict_size (BLOCK_DICT (b)));
334 fputs_filtered (paddress (gdbarch, BLOCK_START (b)), outfile);
335 fprintf_filtered (outfile, "..");
336 fputs_filtered (paddress (gdbarch, BLOCK_END (b)), outfile);
337 if (BLOCK_FUNCTION (b))
338 {
339 fprintf_filtered (outfile, ", function %s",
340 SYMBOL_LINKAGE_NAME (BLOCK_FUNCTION (b)));
341 if (SYMBOL_DEMANGLED_NAME (BLOCK_FUNCTION (b)) != NULL)
342 {
343 fprintf_filtered (outfile, ", %s",
344 SYMBOL_DEMANGLED_NAME (BLOCK_FUNCTION (b)));
345 }
346 }
347 fprintf_filtered (outfile, "\n");
348 /* Now print each symbol in this block (in no particular order, if
349 we're using a hashtable). Note that we only want this
350 block, not any blocks from included symtabs. */
351 ALL_DICT_SYMBOLS (BLOCK_DICT (b), iter, sym)
352 {
353 TRY
354 {
355 print_symbol (gdbarch, sym, depth + 1, outfile);
356 }
357 CATCH (ex, RETURN_MASK_ERROR)
358 {
359 exception_fprintf (gdb_stderr, ex,
360 "Error printing symbol:\n");
361 }
362 END_CATCH
363 }
364 }
365 fprintf_filtered (outfile, "\n");
366 }
367 else
368 {
369 const char *compunit_filename
370 = symtab_to_filename_for_display (COMPUNIT_FILETABS (SYMTAB_COMPUNIT (symtab)));
371
372 fprintf_filtered (outfile,
373 "\nBlockvector same as owning compunit: %s\n\n",
374 compunit_filename);
375 }
376 }
377
378 static void
379 dump_symtab (struct symtab *symtab, struct ui_file *outfile)
380 {
381 /* Set the current language to the language of the symtab we're dumping
382 because certain routines used during dump_symtab() use the current
383 language to print an image of the symbol. We'll restore it later.
384 But use only real languages, not placeholders. */
385 if (symtab->language != language_unknown
386 && symtab->language != language_auto)
387 {
388 enum language saved_lang;
389
390 saved_lang = set_language (symtab->language);
391
392 dump_symtab_1 (symtab, outfile);
393
394 set_language (saved_lang);
395 }
396 else
397 dump_symtab_1 (symtab, outfile);
398 }
399
400 static void
401 maintenance_print_symbols (const char *args, int from_tty)
402 {
403 struct ui_file *outfile = gdb_stdout;
404 char *address_arg = NULL, *source_arg = NULL, *objfile_arg = NULL;
405 int i, outfile_idx;
406
407 dont_repeat ();
408
409 gdb_argv argv (args);
410
411 for (i = 0; argv != NULL && argv[i] != NULL; ++i)
412 {
413 if (strcmp (argv[i], "-pc") == 0)
414 {
415 if (argv[i + 1] == NULL)
416 error (_("Missing pc value"));
417 address_arg = argv[++i];
418 }
419 else if (strcmp (argv[i], "-source") == 0)
420 {
421 if (argv[i + 1] == NULL)
422 error (_("Missing source file"));
423 source_arg = argv[++i];
424 }
425 else if (strcmp (argv[i], "-objfile") == 0)
426 {
427 if (argv[i + 1] == NULL)
428 error (_("Missing objfile name"));
429 objfile_arg = argv[++i];
430 }
431 else if (strcmp (argv[i], "--") == 0)
432 {
433 /* End of options. */
434 ++i;
435 break;
436 }
437 else if (argv[i][0] == '-')
438 {
439 /* Future proofing: Don't allow OUTFILE to begin with "-". */
440 error (_("Unknown option: %s"), argv[i]);
441 }
442 else
443 break;
444 }
445 outfile_idx = i;
446
447 if (address_arg != NULL && source_arg != NULL)
448 error (_("Must specify at most one of -pc and -source"));
449
450 stdio_file arg_outfile;
451
452 if (argv != NULL && argv[outfile_idx] != NULL)
453 {
454 if (argv[outfile_idx + 1] != NULL)
455 error (_("Junk at end of command"));
456 gdb::unique_xmalloc_ptr<char> outfile_name
457 (tilde_expand (argv[outfile_idx]));
458 if (!arg_outfile.open (outfile_name.get (), FOPEN_WT))
459 perror_with_name (outfile_name.get ());
460 outfile = &arg_outfile;
461 }
462
463 if (address_arg != NULL)
464 {
465 CORE_ADDR pc = parse_and_eval_address (address_arg);
466 struct symtab *s = find_pc_line_symtab (pc);
467
468 if (s == NULL)
469 error (_("No symtab for address: %s"), address_arg);
470 dump_symtab (s, outfile);
471 }
472 else
473 {
474 struct objfile *objfile;
475 struct compunit_symtab *cu;
476 struct symtab *s;
477 int found = 0;
478
479 ALL_OBJFILES (objfile)
480 {
481 int print_for_objfile = 1;
482
483 if (objfile_arg != NULL)
484 print_for_objfile
485 = compare_filenames_for_search (objfile_name (objfile),
486 objfile_arg);
487 if (!print_for_objfile)
488 continue;
489
490 ALL_OBJFILE_FILETABS (objfile, cu, s)
491 {
492 int print_for_source = 0;
493
494 QUIT;
495 if (source_arg != NULL)
496 {
497 print_for_source
498 = compare_filenames_for_search
499 (symtab_to_filename_for_display (s), source_arg);
500 found = 1;
501 }
502 if (source_arg == NULL
503 || print_for_source)
504 dump_symtab (s, outfile);
505 }
506 }
507
508 if (source_arg != NULL && !found)
509 error (_("No symtab for source file: %s"), source_arg);
510 }
511 }
512
513 /* Print symbol SYMBOL on OUTFILE. DEPTH says how far to indent. */
514
515 static void
516 print_symbol (struct gdbarch *gdbarch, struct symbol *symbol,
517 int depth, ui_file *outfile)
518 {
519 struct obj_section *section;
520
521 if (SYMBOL_OBJFILE_OWNED (symbol))
522 section = SYMBOL_OBJ_SECTION (symbol_objfile (symbol), symbol);
523 else
524 section = NULL;
525
526 print_spaces (depth, outfile);
527 if (SYMBOL_DOMAIN (symbol) == LABEL_DOMAIN)
528 {
529 fprintf_filtered (outfile, "label %s at ", SYMBOL_PRINT_NAME (symbol));
530 fputs_filtered (paddress (gdbarch, SYMBOL_VALUE_ADDRESS (symbol)),
531 outfile);
532 if (section)
533 fprintf_filtered (outfile, " section %s\n",
534 bfd_section_name (section->the_bfd_section->owner,
535 section->the_bfd_section));
536 else
537 fprintf_filtered (outfile, "\n");
538 return;
539 }
540
541 if (SYMBOL_DOMAIN (symbol) == STRUCT_DOMAIN)
542 {
543 if (TYPE_TAG_NAME (SYMBOL_TYPE (symbol)))
544 {
545 LA_PRINT_TYPE (SYMBOL_TYPE (symbol), "", outfile, 1, depth,
546 &type_print_raw_options);
547 }
548 else
549 {
550 fprintf_filtered (outfile, "%s %s = ",
551 (TYPE_CODE (SYMBOL_TYPE (symbol)) == TYPE_CODE_ENUM
552 ? "enum"
553 : (TYPE_CODE (SYMBOL_TYPE (symbol)) == TYPE_CODE_STRUCT
554 ? "struct" : "union")),
555 SYMBOL_LINKAGE_NAME (symbol));
556 LA_PRINT_TYPE (SYMBOL_TYPE (symbol), "", outfile, 1, depth,
557 &type_print_raw_options);
558 }
559 fprintf_filtered (outfile, ";\n");
560 }
561 else
562 {
563 if (SYMBOL_CLASS (symbol) == LOC_TYPEDEF)
564 fprintf_filtered (outfile, "typedef ");
565 if (SYMBOL_TYPE (symbol))
566 {
567 /* Print details of types, except for enums where it's clutter. */
568 LA_PRINT_TYPE (SYMBOL_TYPE (symbol), SYMBOL_PRINT_NAME (symbol),
569 outfile,
570 TYPE_CODE (SYMBOL_TYPE (symbol)) != TYPE_CODE_ENUM,
571 depth,
572 &type_print_raw_options);
573 fprintf_filtered (outfile, "; ");
574 }
575 else
576 fprintf_filtered (outfile, "%s ", SYMBOL_PRINT_NAME (symbol));
577
578 switch (SYMBOL_CLASS (symbol))
579 {
580 case LOC_CONST:
581 fprintf_filtered (outfile, "const %s (%s)",
582 plongest (SYMBOL_VALUE (symbol)),
583 hex_string (SYMBOL_VALUE (symbol)));
584 break;
585
586 case LOC_CONST_BYTES:
587 {
588 unsigned i;
589 struct type *type = check_typedef (SYMBOL_TYPE (symbol));
590
591 fprintf_filtered (outfile, "const %u hex bytes:",
592 TYPE_LENGTH (type));
593 for (i = 0; i < TYPE_LENGTH (type); i++)
594 fprintf_filtered (outfile, " %02x",
595 (unsigned) SYMBOL_VALUE_BYTES (symbol)[i]);
596 }
597 break;
598
599 case LOC_STATIC:
600 fprintf_filtered (outfile, "static at ");
601 fputs_filtered (paddress (gdbarch, SYMBOL_VALUE_ADDRESS (symbol)),
602 outfile);
603 if (section)
604 fprintf_filtered (outfile, " section %s",
605 bfd_section_name (section->the_bfd_section->owner,
606 section->the_bfd_section));
607 break;
608
609 case LOC_REGISTER:
610 if (SYMBOL_IS_ARGUMENT (symbol))
611 fprintf_filtered (outfile, "parameter register %s",
612 plongest (SYMBOL_VALUE (symbol)));
613 else
614 fprintf_filtered (outfile, "register %s",
615 plongest (SYMBOL_VALUE (symbol)));
616 break;
617
618 case LOC_ARG:
619 fprintf_filtered (outfile, "arg at offset %s",
620 hex_string (SYMBOL_VALUE (symbol)));
621 break;
622
623 case LOC_REF_ARG:
624 fprintf_filtered (outfile, "reference arg at %s",
625 hex_string (SYMBOL_VALUE (symbol)));
626 break;
627
628 case LOC_REGPARM_ADDR:
629 fprintf_filtered (outfile, "address parameter register %s",
630 plongest (SYMBOL_VALUE (symbol)));
631 break;
632
633 case LOC_LOCAL:
634 fprintf_filtered (outfile, "local at offset %s",
635 hex_string (SYMBOL_VALUE (symbol)));
636 break;
637
638 case LOC_TYPEDEF:
639 break;
640
641 case LOC_LABEL:
642 fprintf_filtered (outfile, "label at ");
643 fputs_filtered (paddress (gdbarch, SYMBOL_VALUE_ADDRESS (symbol)),
644 outfile);
645 if (section)
646 fprintf_filtered (outfile, " section %s",
647 bfd_section_name (section->the_bfd_section->owner,
648 section->the_bfd_section));
649 break;
650
651 case LOC_BLOCK:
652 fprintf_filtered (outfile, "block object ");
653 gdb_print_host_address (SYMBOL_BLOCK_VALUE (symbol), outfile);
654 fprintf_filtered (outfile, ", ");
655 fputs_filtered (paddress (gdbarch,
656 BLOCK_START (SYMBOL_BLOCK_VALUE (symbol))),
657 outfile);
658 fprintf_filtered (outfile, "..");
659 fputs_filtered (paddress (gdbarch,
660 BLOCK_END (SYMBOL_BLOCK_VALUE (symbol))),
661 outfile);
662 if (section)
663 fprintf_filtered (outfile, " section %s",
664 bfd_section_name (section->the_bfd_section->owner,
665 section->the_bfd_section));
666 break;
667
668 case LOC_COMPUTED:
669 fprintf_filtered (outfile, "computed at runtime");
670 break;
671
672 case LOC_UNRESOLVED:
673 fprintf_filtered (outfile, "unresolved");
674 break;
675
676 case LOC_OPTIMIZED_OUT:
677 fprintf_filtered (outfile, "optimized out");
678 break;
679
680 default:
681 fprintf_filtered (outfile, "botched symbol class %x",
682 SYMBOL_CLASS (symbol));
683 break;
684 }
685 }
686 fprintf_filtered (outfile, "\n");
687 }
688
689 static void
690 maintenance_print_msymbols (const char *args, int from_tty)
691 {
692 struct ui_file *outfile = gdb_stdout;
693 char *objfile_arg = NULL;
694 struct objfile *objfile;
695 int i, outfile_idx;
696
697 dont_repeat ();
698
699 gdb_argv argv (args);
700
701 for (i = 0; argv != NULL && argv[i] != NULL; ++i)
702 {
703 if (strcmp (argv[i], "-objfile") == 0)
704 {
705 if (argv[i + 1] == NULL)
706 error (_("Missing objfile name"));
707 objfile_arg = argv[++i];
708 }
709 else if (strcmp (argv[i], "--") == 0)
710 {
711 /* End of options. */
712 ++i;
713 break;
714 }
715 else if (argv[i][0] == '-')
716 {
717 /* Future proofing: Don't allow OUTFILE to begin with "-". */
718 error (_("Unknown option: %s"), argv[i]);
719 }
720 else
721 break;
722 }
723 outfile_idx = i;
724
725 stdio_file arg_outfile;
726
727 if (argv != NULL && argv[outfile_idx] != NULL)
728 {
729 if (argv[outfile_idx + 1] != NULL)
730 error (_("Junk at end of command"));
731 gdb::unique_xmalloc_ptr<char> outfile_name
732 (tilde_expand (argv[outfile_idx]));
733 if (!arg_outfile.open (outfile_name.get (), FOPEN_WT))
734 perror_with_name (outfile_name.get ());
735 outfile = &arg_outfile;
736 }
737
738 ALL_OBJFILES (objfile)
739 {
740 QUIT;
741 if (objfile_arg == NULL
742 || compare_filenames_for_search (objfile_name (objfile), objfile_arg))
743 dump_msymbols (objfile, outfile);
744 }
745 }
746
747 static void
748 maintenance_print_objfiles (const char *regexp, int from_tty)
749 {
750 struct program_space *pspace;
751 struct objfile *objfile;
752
753 dont_repeat ();
754
755 if (regexp)
756 re_comp (regexp);
757
758 ALL_PSPACES (pspace)
759 ALL_PSPACE_OBJFILES (pspace, objfile)
760 {
761 QUIT;
762 if (! regexp
763 || re_exec (objfile_name (objfile)))
764 dump_objfile (objfile);
765 }
766 }
767
768 /* List all the symbol tables whose names match REGEXP (optional). */
769
770 static void
771 maintenance_info_symtabs (const char *regexp, int from_tty)
772 {
773 struct program_space *pspace;
774 struct objfile *objfile;
775
776 dont_repeat ();
777
778 if (regexp)
779 re_comp (regexp);
780
781 ALL_PSPACES (pspace)
782 ALL_PSPACE_OBJFILES (pspace, objfile)
783 {
784 struct compunit_symtab *cust;
785 struct symtab *symtab;
786
787 /* We don't want to print anything for this objfile until we
788 actually find a symtab whose name matches. */
789 int printed_objfile_start = 0;
790
791 ALL_OBJFILE_COMPUNITS (objfile, cust)
792 {
793 int printed_compunit_symtab_start = 0;
794
795 ALL_COMPUNIT_FILETABS (cust, symtab)
796 {
797 QUIT;
798
799 if (! regexp
800 || re_exec (symtab_to_filename_for_display (symtab)))
801 {
802 if (! printed_objfile_start)
803 {
804 printf_filtered ("{ objfile %s ", objfile_name (objfile));
805 wrap_here (" ");
806 printf_filtered ("((struct objfile *) %s)\n",
807 host_address_to_string (objfile));
808 printed_objfile_start = 1;
809 }
810 if (! printed_compunit_symtab_start)
811 {
812 printf_filtered (" { ((struct compunit_symtab *) %s)\n",
813 host_address_to_string (cust));
814 printf_filtered (" debugformat %s\n",
815 COMPUNIT_DEBUGFORMAT (cust));
816 printf_filtered (" producer %s\n",
817 COMPUNIT_PRODUCER (cust) != NULL
818 ? COMPUNIT_PRODUCER (cust)
819 : "(null)");
820 printf_filtered (" dirname %s\n",
821 COMPUNIT_DIRNAME (cust) != NULL
822 ? COMPUNIT_DIRNAME (cust)
823 : "(null)");
824 printf_filtered (" blockvector"
825 " ((struct blockvector *) %s)\n",
826 host_address_to_string
827 (COMPUNIT_BLOCKVECTOR (cust)));
828 printed_compunit_symtab_start = 1;
829 }
830
831 printf_filtered ("\t{ symtab %s ",
832 symtab_to_filename_for_display (symtab));
833 wrap_here (" ");
834 printf_filtered ("((struct symtab *) %s)\n",
835 host_address_to_string (symtab));
836 printf_filtered ("\t fullname %s\n",
837 symtab->fullname != NULL
838 ? symtab->fullname
839 : "(null)");
840 printf_filtered ("\t "
841 "linetable ((struct linetable *) %s)\n",
842 host_address_to_string (symtab->linetable));
843 printf_filtered ("\t}\n");
844 }
845 }
846
847 if (printed_compunit_symtab_start)
848 printf_filtered (" }\n");
849 }
850
851 if (printed_objfile_start)
852 printf_filtered ("}\n");
853 }
854 }
855
856 /* Check consistency of symtabs.
857 An example of what this checks for is NULL blockvectors.
858 They can happen if there's a bug during debug info reading.
859 GDB assumes they are always non-NULL.
860
861 Note: This does not check for psymtab vs symtab consistency.
862 Use "maint check-psymtabs" for that. */
863
864 static void
865 maintenance_check_symtabs (const char *ignore, int from_tty)
866 {
867 struct program_space *pspace;
868 struct objfile *objfile;
869
870 ALL_PSPACES (pspace)
871 ALL_PSPACE_OBJFILES (pspace, objfile)
872 {
873 struct compunit_symtab *cust;
874
875 /* We don't want to print anything for this objfile until we
876 actually find something worth printing. */
877 int printed_objfile_start = 0;
878
879 ALL_OBJFILE_COMPUNITS (objfile, cust)
880 {
881 int found_something = 0;
882 struct symtab *symtab = compunit_primary_filetab (cust);
883
884 QUIT;
885
886 if (COMPUNIT_BLOCKVECTOR (cust) == NULL)
887 found_something = 1;
888 /* Add more checks here. */
889
890 if (found_something)
891 {
892 if (! printed_objfile_start)
893 {
894 printf_filtered ("{ objfile %s ", objfile_name (objfile));
895 wrap_here (" ");
896 printf_filtered ("((struct objfile *) %s)\n",
897 host_address_to_string (objfile));
898 printed_objfile_start = 1;
899 }
900 printf_filtered (" { symtab %s\n",
901 symtab_to_filename_for_display (symtab));
902 if (COMPUNIT_BLOCKVECTOR (cust) == NULL)
903 printf_filtered (" NULL blockvector\n");
904 printf_filtered (" }\n");
905 }
906 }
907
908 if (printed_objfile_start)
909 printf_filtered ("}\n");
910 }
911 }
912
913 /* Expand all symbol tables whose name matches an optional regexp. */
914
915 static void
916 maintenance_expand_symtabs (const char *args, int from_tty)
917 {
918 struct program_space *pspace;
919 struct objfile *objfile;
920 char *regexp = NULL;
921
922 /* We use buildargv here so that we handle spaces in the regexp
923 in a way that allows adding more arguments later. */
924 gdb_argv argv (args);
925
926 if (argv != NULL)
927 {
928 if (argv[0] != NULL)
929 {
930 regexp = argv[0];
931 if (argv[1] != NULL)
932 error (_("Extra arguments after regexp."));
933 }
934 }
935
936 if (regexp)
937 re_comp (regexp);
938
939 ALL_PSPACES (pspace)
940 ALL_PSPACE_OBJFILES (pspace, objfile)
941 {
942 if (objfile->sf)
943 {
944 objfile->sf->qf->expand_symtabs_matching
945 (objfile,
946 [&] (const char *filename, bool basenames)
947 {
948 /* KISS: Only apply the regexp to the complete file name. */
949 return (!basenames
950 && (regexp == NULL || re_exec (filename)));
951 },
952 [] (const char *symname)
953 {
954 /* Since we're not searching on symbols, just return true. */
955 return true;
956 },
957 NULL,
958 ALL_DOMAIN);
959 }
960 }
961 }
962 \f
963
964 /* Return the nexting depth of a block within other blocks in its symtab. */
965
966 static int
967 block_depth (struct block *block)
968 {
969 int i = 0;
970
971 while ((block = BLOCK_SUPERBLOCK (block)) != NULL)
972 {
973 i++;
974 }
975 return i;
976 }
977 \f
978
979 /* Used by MAINTENANCE_INFO_LINE_TABLES to print the information about a
980 single line table. */
981
982 static int
983 maintenance_print_one_line_table (struct symtab *symtab, void *data)
984 {
985 struct linetable *linetable;
986 struct objfile *objfile;
987
988 objfile = symtab->compunit_symtab->objfile;
989 printf_filtered (_("objfile: %s ((struct objfile *) %s)\n"),
990 objfile_name (objfile),
991 host_address_to_string (objfile));
992 printf_filtered (_("compunit_symtab: ((struct compunit_symtab *) %s)\n"),
993 host_address_to_string (symtab->compunit_symtab));
994 printf_filtered (_("symtab: %s ((struct symtab *) %s)\n"),
995 symtab_to_fullname (symtab),
996 host_address_to_string (symtab));
997 linetable = SYMTAB_LINETABLE (symtab);
998 printf_filtered (_("linetable: ((struct linetable *) %s):\n"),
999 host_address_to_string (linetable));
1000
1001 if (linetable == NULL)
1002 printf_filtered (_("No line table.\n"));
1003 else if (linetable->nitems <= 0)
1004 printf_filtered (_("Line table has no lines.\n"));
1005 else
1006 {
1007 int i;
1008
1009 /* Leave space for 6 digits of index and line number. After that the
1010 tables will just not format as well. */
1011 printf_filtered (_("%-6s %6s %s\n"),
1012 _("INDEX"), _("LINE"), _("ADDRESS"));
1013
1014 for (i = 0; i < linetable->nitems; ++i)
1015 {
1016 struct linetable_entry *item;
1017
1018 item = &linetable->item [i];
1019 printf_filtered (_("%-6d %6d %s\n"), i, item->line,
1020 core_addr_to_string (item->pc));
1021 }
1022 }
1023
1024 return 0;
1025 }
1026
1027 /* Implement the 'maint info line-table' command. */
1028
1029 static void
1030 maintenance_info_line_tables (const char *regexp, int from_tty)
1031 {
1032 struct program_space *pspace;
1033 struct objfile *objfile;
1034
1035 dont_repeat ();
1036
1037 if (regexp != NULL)
1038 re_comp (regexp);
1039
1040 ALL_PSPACES (pspace)
1041 ALL_PSPACE_OBJFILES (pspace, objfile)
1042 {
1043 struct compunit_symtab *cust;
1044 struct symtab *symtab;
1045
1046 ALL_OBJFILE_COMPUNITS (objfile, cust)
1047 {
1048 ALL_COMPUNIT_FILETABS (cust, symtab)
1049 {
1050 QUIT;
1051
1052 if (regexp == NULL
1053 || re_exec (symtab_to_filename_for_display (symtab)))
1054 maintenance_print_one_line_table (symtab, NULL);
1055 }
1056 }
1057 }
1058 }
1059
1060 \f
1061
1062 /* Do early runtime initializations. */
1063
1064 void
1065 _initialize_symmisc (void)
1066 {
1067 std_in = stdin;
1068 std_out = stdout;
1069 std_err = stderr;
1070
1071 add_cmd ("symbols", class_maintenance, maintenance_print_symbols, _("\
1072 Print dump of current symbol definitions.\n\
1073 Usage: mt print symbols [-pc address] [--] [outfile]\n\
1074 mt print symbols [-objfile objfile] [-source source] [--] [outfile]\n\
1075 Entries in the full symbol table are dumped to file OUTFILE,\n\
1076 or the terminal if OUTFILE is unspecified.\n\
1077 If ADDRESS is provided, dump only the file for that address.\n\
1078 If SOURCE is provided, dump only that file's symbols.\n\
1079 If OBJFILE is provided, dump only that file's minimal symbols."),
1080 &maintenanceprintlist);
1081
1082 add_cmd ("msymbols", class_maintenance, maintenance_print_msymbols, _("\
1083 Print dump of current minimal symbol definitions.\n\
1084 Usage: mt print msymbols [-objfile objfile] [--] [outfile]\n\
1085 Entries in the minimal symbol table are dumped to file OUTFILE,\n\
1086 or the terminal if OUTFILE is unspecified.\n\
1087 If OBJFILE is provided, dump only that file's minimal symbols."),
1088 &maintenanceprintlist);
1089
1090 add_cmd ("objfiles", class_maintenance, maintenance_print_objfiles,
1091 _("Print dump of current object file definitions.\n\
1092 With an argument REGEXP, list the object files with matching names."),
1093 &maintenanceprintlist);
1094
1095 add_cmd ("symtabs", class_maintenance, maintenance_info_symtabs, _("\
1096 List the full symbol tables for all object files.\n\
1097 This does not include information about individual symbols, blocks, or\n\
1098 linetables --- just the symbol table structures themselves.\n\
1099 With an argument REGEXP, list the symbol tables with matching names."),
1100 &maintenanceinfolist);
1101
1102 add_cmd ("line-table", class_maintenance, maintenance_info_line_tables, _("\
1103 List the contents of all line tables, from all symbol tables.\n\
1104 With an argument REGEXP, list just the line tables for the symbol\n\
1105 tables with matching names."),
1106 &maintenanceinfolist);
1107
1108 add_cmd ("check-symtabs", class_maintenance, maintenance_check_symtabs,
1109 _("\
1110 Check consistency of currently expanded symtabs."),
1111 &maintenancelist);
1112
1113 add_cmd ("expand-symtabs", class_maintenance, maintenance_expand_symtabs,
1114 _("Expand symbol tables.\n\
1115 With an argument REGEXP, only expand the symbol tables with matching names."),
1116 &maintenancelist);
1117 }