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