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