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