]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - gdb/symmisc.c
gdb: New maint info line-table command.
[thirdparty/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 a.out 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 objfile *objfile, struct symtab *symtab,
286 struct ui_file *outfile)
287 {
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 fprintf_filtered (outfile, "\nBlockvector same as previous symtab\n\n");
381 }
382 }
383
384 static void
385 dump_symtab (struct objfile *objfile, struct symtab *symtab,
386 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 (objfile, symtab, outfile);
400
401 set_language (saved_lang);
402 }
403 else
404 dump_symtab_1 (objfile, 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;
412 struct cleanup *cleanups;
413 char *symname = NULL;
414 char *filename = DEV_TTY;
415 struct objfile *objfile;
416 struct compunit_symtab *cu;
417 struct symtab *s;
418
419 dont_repeat ();
420
421 if (args == NULL)
422 {
423 error (_("Arguments missing: an output file name "
424 "and an optional symbol file name"));
425 }
426 argv = gdb_buildargv (args);
427 cleanups = make_cleanup_freeargv (argv);
428
429 if (argv[0] != NULL)
430 {
431 filename = argv[0];
432 /* If a second arg is supplied, it is a source file name to match on. */
433 if (argv[1] != NULL)
434 {
435 symname = argv[1];
436 }
437 }
438
439 filename = tilde_expand (filename);
440 make_cleanup (xfree, filename);
441
442 outfile = gdb_fopen (filename, FOPEN_WT);
443 if (outfile == 0)
444 perror_with_name (filename);
445 make_cleanup_ui_file_delete (outfile);
446
447 ALL_FILETABS (objfile, cu, s)
448 {
449 QUIT;
450 if (symname == NULL
451 || filename_cmp (symname, symtab_to_filename_for_display (s)) == 0)
452 dump_symtab (objfile, s, outfile);
453 }
454 do_cleanups (cleanups);
455 }
456
457 /* Print symbol ARGS->SYMBOL on ARGS->OUTFILE. ARGS->DEPTH says how
458 far to indent. ARGS is really a struct print_symbol_args *, but is
459 declared as char * to get it past catch_errors. Returns 0 for error,
460 1 for success. */
461
462 static int
463 print_symbol (void *args)
464 {
465 struct gdbarch *gdbarch = ((struct print_symbol_args *) args)->gdbarch;
466 struct symbol *symbol = ((struct print_symbol_args *) args)->symbol;
467 int depth = ((struct print_symbol_args *) args)->depth;
468 struct ui_file *outfile = ((struct print_symbol_args *) args)->outfile;
469 struct obj_section *section;
470
471 if (SYMBOL_OBJFILE_OWNED (symbol))
472 section = SYMBOL_OBJ_SECTION (symbol_objfile (symbol), symbol);
473 else
474 section = NULL;
475
476 print_spaces (depth, outfile);
477 if (SYMBOL_DOMAIN (symbol) == LABEL_DOMAIN)
478 {
479 fprintf_filtered (outfile, "label %s at ", SYMBOL_PRINT_NAME (symbol));
480 fputs_filtered (paddress (gdbarch, SYMBOL_VALUE_ADDRESS (symbol)),
481 outfile);
482 if (section)
483 fprintf_filtered (outfile, " section %s\n",
484 bfd_section_name (section->the_bfd_section->owner,
485 section->the_bfd_section));
486 else
487 fprintf_filtered (outfile, "\n");
488 return 1;
489 }
490 if (SYMBOL_DOMAIN (symbol) == STRUCT_DOMAIN)
491 {
492 if (TYPE_TAG_NAME (SYMBOL_TYPE (symbol)))
493 {
494 LA_PRINT_TYPE (SYMBOL_TYPE (symbol), "", outfile, 1, depth,
495 &type_print_raw_options);
496 }
497 else
498 {
499 fprintf_filtered (outfile, "%s %s = ",
500 (TYPE_CODE (SYMBOL_TYPE (symbol)) == TYPE_CODE_ENUM
501 ? "enum"
502 : (TYPE_CODE (SYMBOL_TYPE (symbol)) == TYPE_CODE_STRUCT
503 ? "struct" : "union")),
504 SYMBOL_LINKAGE_NAME (symbol));
505 LA_PRINT_TYPE (SYMBOL_TYPE (symbol), "", outfile, 1, depth,
506 &type_print_raw_options);
507 }
508 fprintf_filtered (outfile, ";\n");
509 }
510 else
511 {
512 if (SYMBOL_CLASS (symbol) == LOC_TYPEDEF)
513 fprintf_filtered (outfile, "typedef ");
514 if (SYMBOL_TYPE (symbol))
515 {
516 /* Print details of types, except for enums where it's clutter. */
517 LA_PRINT_TYPE (SYMBOL_TYPE (symbol), SYMBOL_PRINT_NAME (symbol),
518 outfile,
519 TYPE_CODE (SYMBOL_TYPE (symbol)) != TYPE_CODE_ENUM,
520 depth,
521 &type_print_raw_options);
522 fprintf_filtered (outfile, "; ");
523 }
524 else
525 fprintf_filtered (outfile, "%s ", SYMBOL_PRINT_NAME (symbol));
526
527 switch (SYMBOL_CLASS (symbol))
528 {
529 case LOC_CONST:
530 fprintf_filtered (outfile, "const %s (%s)",
531 plongest (SYMBOL_VALUE (symbol)),
532 hex_string (SYMBOL_VALUE (symbol)));
533 break;
534
535 case LOC_CONST_BYTES:
536 {
537 unsigned i;
538 struct type *type = check_typedef (SYMBOL_TYPE (symbol));
539
540 fprintf_filtered (outfile, "const %u hex bytes:",
541 TYPE_LENGTH (type));
542 for (i = 0; i < TYPE_LENGTH (type); i++)
543 fprintf_filtered (outfile, " %02x",
544 (unsigned) SYMBOL_VALUE_BYTES (symbol)[i]);
545 }
546 break;
547
548 case LOC_STATIC:
549 fprintf_filtered (outfile, "static at ");
550 fputs_filtered (paddress (gdbarch, SYMBOL_VALUE_ADDRESS (symbol)),
551 outfile);
552 if (section)
553 fprintf_filtered (outfile, " section %s",
554 bfd_section_name (section->the_bfd_section->owner,
555 section->the_bfd_section));
556 break;
557
558 case LOC_REGISTER:
559 if (SYMBOL_IS_ARGUMENT (symbol))
560 fprintf_filtered (outfile, "parameter register %s",
561 plongest (SYMBOL_VALUE (symbol)));
562 else
563 fprintf_filtered (outfile, "register %s",
564 plongest (SYMBOL_VALUE (symbol)));
565 break;
566
567 case LOC_ARG:
568 fprintf_filtered (outfile, "arg at offset %s",
569 hex_string (SYMBOL_VALUE (symbol)));
570 break;
571
572 case LOC_REF_ARG:
573 fprintf_filtered (outfile, "reference arg at %s",
574 hex_string (SYMBOL_VALUE (symbol)));
575 break;
576
577 case LOC_REGPARM_ADDR:
578 fprintf_filtered (outfile, "address parameter register %s",
579 plongest (SYMBOL_VALUE (symbol)));
580 break;
581
582 case LOC_LOCAL:
583 fprintf_filtered (outfile, "local at offset %s",
584 hex_string (SYMBOL_VALUE (symbol)));
585 break;
586
587 case LOC_TYPEDEF:
588 break;
589
590 case LOC_LABEL:
591 fprintf_filtered (outfile, "label at ");
592 fputs_filtered (paddress (gdbarch, SYMBOL_VALUE_ADDRESS (symbol)),
593 outfile);
594 if (section)
595 fprintf_filtered (outfile, " section %s",
596 bfd_section_name (section->the_bfd_section->owner,
597 section->the_bfd_section));
598 break;
599
600 case LOC_BLOCK:
601 fprintf_filtered (outfile, "block object ");
602 gdb_print_host_address (SYMBOL_BLOCK_VALUE (symbol), outfile);
603 fprintf_filtered (outfile, ", ");
604 fputs_filtered (paddress (gdbarch,
605 BLOCK_START (SYMBOL_BLOCK_VALUE (symbol))),
606 outfile);
607 fprintf_filtered (outfile, "..");
608 fputs_filtered (paddress (gdbarch,
609 BLOCK_END (SYMBOL_BLOCK_VALUE (symbol))),
610 outfile);
611 if (section)
612 fprintf_filtered (outfile, " section %s",
613 bfd_section_name (section->the_bfd_section->owner,
614 section->the_bfd_section));
615 break;
616
617 case LOC_COMPUTED:
618 fprintf_filtered (outfile, "computed at runtime");
619 break;
620
621 case LOC_UNRESOLVED:
622 fprintf_filtered (outfile, "unresolved");
623 break;
624
625 case LOC_OPTIMIZED_OUT:
626 fprintf_filtered (outfile, "optimized out");
627 break;
628
629 default:
630 fprintf_filtered (outfile, "botched symbol class %x",
631 SYMBOL_CLASS (symbol));
632 break;
633 }
634 }
635 fprintf_filtered (outfile, "\n");
636 return 1;
637 }
638
639 static void
640 maintenance_print_msymbols (char *args, int from_tty)
641 {
642 char **argv;
643 struct ui_file *outfile;
644 struct cleanup *cleanups;
645 char *filename = DEV_TTY;
646 char *symname = NULL;
647 struct program_space *pspace;
648 struct objfile *objfile;
649
650 struct stat sym_st, obj_st;
651
652 dont_repeat ();
653
654 if (args == NULL)
655 {
656 error (_("print-msymbols takes an output file "
657 "name and optional symbol file name"));
658 }
659 argv = gdb_buildargv (args);
660 cleanups = make_cleanup_freeargv (argv);
661
662 if (argv[0] != NULL)
663 {
664 filename = argv[0];
665 /* If a second arg is supplied, it is a source file name to match on. */
666 if (argv[1] != NULL)
667 {
668 symname = gdb_realpath (argv[1]);
669 make_cleanup (xfree, symname);
670 if (symname && stat (symname, &sym_st))
671 perror_with_name (symname);
672 }
673 }
674
675 filename = tilde_expand (filename);
676 make_cleanup (xfree, filename);
677
678 outfile = gdb_fopen (filename, FOPEN_WT);
679 if (outfile == 0)
680 perror_with_name (filename);
681 make_cleanup_ui_file_delete (outfile);
682
683 ALL_PSPACES (pspace)
684 ALL_PSPACE_OBJFILES (pspace, objfile)
685 {
686 QUIT;
687 if (symname == NULL || (!stat (objfile_name (objfile), &obj_st)
688 && sym_st.st_dev == obj_st.st_dev
689 && sym_st.st_ino == obj_st.st_ino))
690 dump_msymbols (objfile, outfile);
691 }
692 fprintf_filtered (outfile, "\n\n");
693 do_cleanups (cleanups);
694 }
695
696 static void
697 maintenance_print_objfiles (char *regexp, int from_tty)
698 {
699 struct program_space *pspace;
700 struct objfile *objfile;
701
702 dont_repeat ();
703
704 if (regexp)
705 re_comp (regexp);
706
707 ALL_PSPACES (pspace)
708 ALL_PSPACE_OBJFILES (pspace, objfile)
709 {
710 QUIT;
711 if (! regexp
712 || re_exec (objfile_name (objfile)))
713 dump_objfile (objfile);
714 }
715 }
716
717 /* List all the symbol tables whose names match REGEXP (optional). */
718
719 static void
720 maintenance_info_symtabs (char *regexp, int from_tty)
721 {
722 struct program_space *pspace;
723 struct objfile *objfile;
724
725 dont_repeat ();
726
727 if (regexp)
728 re_comp (regexp);
729
730 ALL_PSPACES (pspace)
731 ALL_PSPACE_OBJFILES (pspace, objfile)
732 {
733 struct compunit_symtab *cust;
734 struct symtab *symtab;
735
736 /* We don't want to print anything for this objfile until we
737 actually find a symtab whose name matches. */
738 int printed_objfile_start = 0;
739
740 ALL_OBJFILE_COMPUNITS (objfile, cust)
741 {
742 int printed_compunit_symtab_start = 0;
743
744 ALL_COMPUNIT_FILETABS (cust, symtab)
745 {
746 QUIT;
747
748 if (! regexp
749 || re_exec (symtab_to_filename_for_display (symtab)))
750 {
751 if (! printed_objfile_start)
752 {
753 printf_filtered ("{ objfile %s ", objfile_name (objfile));
754 wrap_here (" ");
755 printf_filtered ("((struct objfile *) %s)\n",
756 host_address_to_string (objfile));
757 printed_objfile_start = 1;
758 }
759 if (! printed_compunit_symtab_start)
760 {
761 printf_filtered (" { ((struct compunit_symtab *) %s)\n",
762 host_address_to_string (cust));
763 printf_filtered (" debugformat %s\n",
764 COMPUNIT_DEBUGFORMAT (cust));
765 printf_filtered (" producer %s\n",
766 COMPUNIT_PRODUCER (cust) != NULL
767 ? COMPUNIT_PRODUCER (cust)
768 : "(null)");
769 printf_filtered (" dirname %s\n",
770 COMPUNIT_DIRNAME (cust) != NULL
771 ? COMPUNIT_DIRNAME (cust)
772 : "(null)");
773 printf_filtered (" blockvector"
774 " ((struct blockvector *) %s)\n",
775 host_address_to_string
776 (COMPUNIT_BLOCKVECTOR (cust)));
777 printed_compunit_symtab_start = 1;
778 }
779
780 printf_filtered ("\t{ symtab %s ",
781 symtab_to_filename_for_display (symtab));
782 wrap_here (" ");
783 printf_filtered ("((struct symtab *) %s)\n",
784 host_address_to_string (symtab));
785 printf_filtered ("\t fullname %s\n",
786 symtab->fullname != NULL
787 ? symtab->fullname
788 : "(null)");
789 printf_filtered ("\t "
790 "linetable ((struct linetable *) %s)\n",
791 host_address_to_string (symtab->linetable));
792 printf_filtered ("\t}\n");
793 }
794 }
795
796 if (printed_compunit_symtab_start)
797 printf_filtered (" }\n");
798 }
799
800 if (printed_objfile_start)
801 printf_filtered ("}\n");
802 }
803 }
804
805 /* Check consistency of symtabs.
806 An example of what this checks for is NULL blockvectors.
807 They can happen if there's a bug during debug info reading.
808 GDB assumes they are always non-NULL.
809
810 Note: This does not check for psymtab vs symtab consistency.
811 Use "maint check-psymtabs" for that. */
812
813 static void
814 maintenance_check_symtabs (char *ignore, int from_tty)
815 {
816 struct program_space *pspace;
817 struct objfile *objfile;
818
819 ALL_PSPACES (pspace)
820 ALL_PSPACE_OBJFILES (pspace, objfile)
821 {
822 struct compunit_symtab *cust;
823
824 /* We don't want to print anything for this objfile until we
825 actually find something worth printing. */
826 int printed_objfile_start = 0;
827
828 ALL_OBJFILE_COMPUNITS (objfile, cust)
829 {
830 int found_something = 0;
831 struct symtab *symtab = compunit_primary_filetab (cust);
832
833 QUIT;
834
835 if (COMPUNIT_BLOCKVECTOR (cust) == NULL)
836 found_something = 1;
837 /* Add more checks here. */
838
839 if (found_something)
840 {
841 if (! printed_objfile_start)
842 {
843 printf_filtered ("{ objfile %s ", objfile_name (objfile));
844 wrap_here (" ");
845 printf_filtered ("((struct objfile *) %s)\n",
846 host_address_to_string (objfile));
847 printed_objfile_start = 1;
848 }
849 printf_filtered (" { symtab %s\n",
850 symtab_to_filename_for_display (symtab));
851 if (COMPUNIT_BLOCKVECTOR (cust) == NULL)
852 printf_filtered (" NULL blockvector\n");
853 printf_filtered (" }\n");
854 }
855 }
856
857 if (printed_objfile_start)
858 printf_filtered ("}\n");
859 }
860 }
861
862 /* Helper function for maintenance_expand_symtabs.
863 This is the name_matcher function for expand_symtabs_matching. */
864
865 static int
866 maintenance_expand_name_matcher (const char *symname, void *data)
867 {
868 /* Since we're not searching on symbols, just return TRUE. */
869 return 1;
870 }
871
872 /* Helper function for maintenance_expand_symtabs.
873 This is the file_matcher function for expand_symtabs_matching. */
874
875 static int
876 maintenance_expand_file_matcher (const char *filename, void *data,
877 int basenames)
878 {
879 const char *regexp = (const char *) data;
880
881 QUIT;
882
883 /* KISS: Only apply the regexp to the complete file name. */
884 if (basenames)
885 return 0;
886
887 if (regexp == NULL || re_exec (filename))
888 return 1;
889
890 return 0;
891 }
892
893 /* Expand all symbol tables whose name matches an optional regexp. */
894
895 static void
896 maintenance_expand_symtabs (char *args, int from_tty)
897 {
898 struct program_space *pspace;
899 struct objfile *objfile;
900 struct cleanup *cleanups;
901 char **argv;
902 char *regexp = NULL;
903
904 /* We use buildargv here so that we handle spaces in the regexp
905 in a way that allows adding more arguments later. */
906 argv = gdb_buildargv (args);
907 cleanups = make_cleanup_freeargv (argv);
908
909 if (argv != NULL)
910 {
911 if (argv[0] != NULL)
912 {
913 regexp = argv[0];
914 if (argv[1] != NULL)
915 error (_("Extra arguments after regexp."));
916 }
917 }
918
919 if (regexp)
920 re_comp (regexp);
921
922 ALL_PSPACES (pspace)
923 ALL_PSPACE_OBJFILES (pspace, objfile)
924 {
925 if (objfile->sf)
926 {
927 objfile->sf->qf->expand_symtabs_matching
928 (objfile, maintenance_expand_file_matcher,
929 maintenance_expand_name_matcher, NULL, ALL_DOMAIN, regexp);
930 }
931 }
932
933 do_cleanups (cleanups);
934 }
935 \f
936
937 /* Return the nexting depth of a block within other blocks in its symtab. */
938
939 static int
940 block_depth (struct block *block)
941 {
942 int i = 0;
943
944 while ((block = BLOCK_SUPERBLOCK (block)) != NULL)
945 {
946 i++;
947 }
948 return i;
949 }
950 \f
951
952 /* Used by MAINTENANCE_INFO_LINE_TABLES to print the information about a
953 single line table. */
954
955 static int
956 maintenance_print_one_line_table (struct symtab *symtab, void *data)
957 {
958 struct linetable *linetable;
959 struct objfile *objfile;
960
961 objfile = symtab->compunit_symtab->objfile;
962 printf_filtered (_("objfile: %s ((struct objfile *) %s)\n"),
963 objfile_name (objfile),
964 host_address_to_string (objfile));
965 printf_filtered (_("compunit_symtab: ((struct compunit_symtab *) %s)\n"),
966 host_address_to_string (symtab->compunit_symtab));
967 printf_filtered (_("symtab: %s ((struct symtab *) %s)\n"),
968 symtab_to_fullname (symtab),
969 host_address_to_string (symtab));
970 linetable = SYMTAB_LINETABLE (symtab);
971 printf_filtered (_("linetable: ((struct linetable *) %s):\n"),
972 host_address_to_string (linetable));
973
974 if (linetable == NULL)
975 printf_filtered (_("No line table.\n"));
976 else if (linetable->nitems <= 0)
977 printf_filtered (_("Line table has no lines.\n"));
978 else
979 {
980 int i;
981
982 /* Leave space for 6 digits of index and line number. After that the
983 tables will just not format as well. */
984 printf_filtered (_("%-6s %6s %s\n"),
985 _("INDEX"), _("LINE"), _("ADDRESS"));
986
987 for (i = 0; i < linetable->nitems; ++i)
988 {
989 struct linetable_entry *item;
990 struct cleanup *row_cleanup;
991
992 item = &linetable->item [i];
993 printf_filtered (_("%-6d %6d %s\n"), i, item->line,
994 core_addr_to_string (item->pc));
995 }
996 }
997
998 return 0;
999 }
1000
1001 /* Implement the 'maint info line-table' command. */
1002
1003 static void
1004 maintenance_info_line_tables (char *regexp, int from_tty)
1005 {
1006 struct program_space *pspace;
1007 struct objfile *objfile;
1008
1009 dont_repeat ();
1010
1011 if (regexp != NULL)
1012 re_comp (regexp);
1013
1014 ALL_PSPACES (pspace)
1015 ALL_PSPACE_OBJFILES (pspace, objfile)
1016 {
1017 struct compunit_symtab *cust;
1018 struct symtab *symtab;
1019
1020 ALL_OBJFILE_COMPUNITS (objfile, cust)
1021 {
1022 ALL_COMPUNIT_FILETABS (cust, symtab)
1023 {
1024 QUIT;
1025
1026 if (regexp == NULL
1027 || re_exec (symtab_to_filename_for_display (symtab)))
1028 maintenance_print_one_line_table (symtab, NULL);
1029 }
1030 }
1031 }
1032 }
1033
1034 \f
1035
1036 /* Do early runtime initializations. */
1037
1038 void
1039 _initialize_symmisc (void)
1040 {
1041 std_in = stdin;
1042 std_out = stdout;
1043 std_err = stderr;
1044
1045 add_cmd ("symbols", class_maintenance, maintenance_print_symbols, _("\
1046 Print dump of current symbol definitions.\n\
1047 Entries in the full symbol table are dumped to file OUTFILE.\n\
1048 If a SOURCE file is specified, dump only that file's symbols."),
1049 &maintenanceprintlist);
1050
1051 add_cmd ("msymbols", class_maintenance, maintenance_print_msymbols, _("\
1052 Print dump of current minimal symbol definitions.\n\
1053 Entries in the minimal symbol table are dumped to file OUTFILE.\n\
1054 If a SOURCE file is specified, dump only that file's minimal symbols."),
1055 &maintenanceprintlist);
1056
1057 add_cmd ("objfiles", class_maintenance, maintenance_print_objfiles,
1058 _("Print dump of current object file definitions.\n\
1059 With an argument REGEXP, list the object files with matching names."),
1060 &maintenanceprintlist);
1061
1062 add_cmd ("symtabs", class_maintenance, maintenance_info_symtabs, _("\
1063 List the full symbol tables for all object files.\n\
1064 This does not include information about individual symbols, blocks, or\n\
1065 linetables --- just the symbol table structures themselves.\n\
1066 With an argument REGEXP, list the symbol tables with matching names."),
1067 &maintenanceinfolist);
1068
1069 add_cmd ("line-table", class_maintenance, maintenance_info_line_tables, _("\
1070 List the contents of all line tables, from all symbol tables.\n\
1071 With an argument REGEXP, list just the line tables for the symbol\n\
1072 tables with matching names."),
1073 &maintenanceinfolist);
1074
1075 add_cmd ("check-symtabs", class_maintenance, maintenance_check_symtabs,
1076 _("\
1077 Check consistency of currently expanded symtabs."),
1078 &maintenancelist);
1079
1080 add_cmd ("expand-symtabs", class_maintenance, maintenance_expand_symtabs,
1081 _("Expand symbol tables.\n\
1082 With an argument REGEXP, only expand the symbol tables with matching names."),
1083 &maintenancelist);
1084 }