gdb
[external/binutils.git] / gdb / symmisc.c
1 /* Do various things to symbol tables (other than lookup), for GDB.
2
3    Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995,
4    1996, 1997, 1998, 1999, 2000, 2002, 2003, 2004, 2007, 2008, 2009, 2010
5    Free Software Foundation, Inc.
6
7    This file is part of GDB.
8
9    This program is free software; you can redistribute it and/or modify
10    it under the terms of the GNU General Public License as published by
11    the Free Software Foundation; either version 3 of the License, or
12    (at your option) any later version.
13
14    This program is distributed in the hope that it will be useful,
15    but WITHOUT ANY WARRANTY; without even the implied warranty of
16    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17    GNU General Public License for more details.
18
19    You should have received a copy of the GNU General Public License
20    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
21
22 #include "defs.h"
23 #include "symtab.h"
24 #include "gdbtypes.h"
25 #include "bfd.h"
26 #include "symfile.h"
27 #include "objfiles.h"
28 #include "breakpoint.h"
29 #include "command.h"
30 #include "gdb_obstack.h"
31 #include "exceptions.h"
32 #include "language.h"
33 #include "bcache.h"
34 #include "block.h"
35 #include "gdb_regex.h"
36 #include "gdb_stat.h"
37 #include "dictionary.h"
38
39 #include "gdb_string.h"
40 #include "readline/readline.h"
41
42 #include "psymtab.h"
43
44 #ifndef DEV_TTY
45 #define DEV_TTY "/dev/tty"
46 #endif
47
48 /* Unfortunately for debugging, stderr is usually a macro.  This is painful
49    when calling functions that take FILE *'s from the debugger.
50    So we make a variable which has the same value and which is accessible when
51    debugging GDB with itself.  Because stdin et al need not be constants,
52    we initialize them in the _initialize_symmisc function at the bottom
53    of the file.  */
54 FILE *std_in;
55 FILE *std_out;
56 FILE *std_err;
57
58 /* Prototypes for local functions */
59
60 static void dump_symtab (struct objfile *, struct symtab *,
61                          struct ui_file *);
62
63 static void dump_msymbols (struct objfile *, struct ui_file *);
64
65 static void dump_objfile (struct objfile *);
66
67 static int block_depth (struct block *);
68
69 void _initialize_symmisc (void);
70
71 struct print_symbol_args
72   {
73     struct gdbarch *gdbarch;
74     struct symbol *symbol;
75     int depth;
76     struct ui_file *outfile;
77   };
78
79 static int print_symbol (void *);
80 \f
81 /* Free all the storage associated with the struct symtab <- S.
82    Note that some symtabs have contents that all live inside one big block of
83    memory, and some share the contents of another symbol table and so you
84    should not free the contents on their behalf (except sometimes the
85    linetable, which maybe per symtab even when the rest is not).
86    It is s->free_code that says which alternative to use.  */
87
88 void
89 free_symtab (struct symtab *s)
90 {
91   int i, n;
92   struct blockvector *bv;
93
94   switch (s->free_code)
95     {
96     case free_nothing:
97       /* All the contents are part of a big block of memory (an obstack),
98          and some other symtab is in charge of freeing that block.
99          Therefore, do nothing.  */
100       break;
101
102     case free_linetable:
103       /* Everything will be freed either by our `free_func'
104          or by some other symtab, except for our linetable.
105          Free that now.  */
106       if (LINETABLE (s))
107         xfree (LINETABLE (s));
108       break;
109     }
110
111   /* If there is a single block of memory to free, free it.  */
112   if (s->free_func != NULL)
113     s->free_func (s);
114
115   /* Free source-related stuff */
116   if (s->line_charpos != NULL)
117     xfree (s->line_charpos);
118   if (s->fullname != NULL)
119     xfree (s->fullname);
120   if (s->debugformat != NULL)
121     xfree (s->debugformat);
122   xfree (s);
123 }
124
125 void
126 print_symbol_bcache_statistics (void)
127 {
128   struct program_space *pspace;
129   struct objfile *objfile;
130
131   immediate_quit++;
132   ALL_PSPACES (pspace)
133     ALL_PSPACE_OBJFILES (pspace, objfile)
134   {
135     printf_filtered (_("Byte cache statistics for '%s':\n"), objfile->name);
136     print_bcache_statistics (objfile->psymbol_cache, "partial symbol cache");
137     print_bcache_statistics (objfile->macro_cache, "preprocessor macro cache");
138     print_bcache_statistics (objfile->filename_cache, "file name cache");
139   }
140   immediate_quit--;
141 }
142
143 void
144 print_objfile_statistics (void)
145 {
146   struct program_space *pspace;
147   struct objfile *objfile;
148   struct symtab *s;
149   int i, linetables, blockvectors;
150
151   immediate_quit++;
152   ALL_PSPACES (pspace)
153     ALL_PSPACE_OBJFILES (pspace, objfile)
154   {
155     printf_filtered (_("Statistics for '%s':\n"), objfile->name);
156     if (OBJSTAT (objfile, n_stabs) > 0)
157       printf_filtered (_("  Number of \"stab\" symbols read: %d\n"),
158                        OBJSTAT (objfile, n_stabs));
159     if (OBJSTAT (objfile, n_minsyms) > 0)
160       printf_filtered (_("  Number of \"minimal\" symbols read: %d\n"),
161                        OBJSTAT (objfile, n_minsyms));
162     if (OBJSTAT (objfile, n_psyms) > 0)
163       printf_filtered (_("  Number of \"partial\" symbols read: %d\n"),
164                        OBJSTAT (objfile, n_psyms));
165     if (OBJSTAT (objfile, n_syms) > 0)
166       printf_filtered (_("  Number of \"full\" symbols read: %d\n"),
167                        OBJSTAT (objfile, n_syms));
168     if (OBJSTAT (objfile, n_types) > 0)
169       printf_filtered (_("  Number of \"types\" defined: %d\n"),
170                        OBJSTAT (objfile, n_types));
171     if (objfile->sf)
172       objfile->sf->qf->print_stats (objfile);
173     i = linetables = blockvectors = 0;
174     ALL_OBJFILE_SYMTABS (objfile, s)
175       {
176         i++;
177         if (s->linetable != NULL)
178           linetables++;
179         if (s->primary == 1)
180           blockvectors++;
181       }
182     printf_filtered (_("  Number of symbol tables: %d\n"), i);
183     printf_filtered (_("  Number of symbol tables with line tables: %d\n"), 
184                      linetables);
185     printf_filtered (_("  Number of symbol tables with blockvectors: %d\n"), 
186                      blockvectors);
187     
188     if (OBJSTAT (objfile, sz_strtab) > 0)
189       printf_filtered (_("  Space used by a.out string tables: %d\n"),
190                        OBJSTAT (objfile, sz_strtab));
191     printf_filtered (_("  Total memory used for objfile obstack: %d\n"),
192                      obstack_memory_used (&objfile->objfile_obstack));
193     printf_filtered (_("  Total memory used for psymbol cache: %d\n"),
194                      bcache_memory_used (objfile->psymbol_cache));
195     printf_filtered (_("  Total memory used for macro cache: %d\n"),
196                      bcache_memory_used (objfile->macro_cache));
197     printf_filtered (_("  Total memory used for file name cache: %d\n"),
198                      bcache_memory_used (objfile->filename_cache));
199   }
200   immediate_quit--;
201 }
202
203 static void
204 dump_objfile (struct objfile *objfile)
205 {
206   struct symtab *symtab;
207
208   printf_filtered ("\nObject file %s:  ", objfile->name);
209   printf_filtered ("Objfile at ");
210   gdb_print_host_address (objfile, gdb_stdout);
211   printf_filtered (", bfd at ");
212   gdb_print_host_address (objfile->obfd, gdb_stdout);
213   printf_filtered (", %d minsyms\n\n",
214                    objfile->minimal_symbol_count);
215
216   if (objfile->sf)
217     objfile->sf->qf->dump (objfile);
218
219   if (objfile->symtabs)
220     {
221       printf_filtered ("Symtabs:\n");
222       for (symtab = objfile->symtabs;
223            symtab != NULL;
224            symtab = symtab->next)
225         {
226           printf_filtered ("%s at ", symtab->filename);
227           gdb_print_host_address (symtab, gdb_stdout);
228           printf_filtered (", ");
229           if (symtab->objfile != objfile)
230             {
231               printf_filtered ("NOT ON CHAIN!  ");
232             }
233           wrap_here ("  ");
234         }
235       printf_filtered ("\n\n");
236     }
237 }
238
239 /* Print minimal symbols from this objfile.  */
240
241 static void
242 dump_msymbols (struct objfile *objfile, struct ui_file *outfile)
243 {
244   struct gdbarch *gdbarch = get_objfile_arch (objfile);
245   struct minimal_symbol *msymbol;
246   int index;
247   char ms_type;
248
249   fprintf_filtered (outfile, "\nObject file %s:\n\n", objfile->name);
250   if (objfile->minimal_symbol_count == 0)
251     {
252       fprintf_filtered (outfile, "No minimal symbols found.\n");
253       return;
254     }
255   index = 0;
256   ALL_OBJFILE_MSYMBOLS (objfile, msymbol)
257     {
258       struct obj_section *section = SYMBOL_OBJ_SECTION (msymbol);
259
260       switch (MSYMBOL_TYPE (msymbol))
261         {
262         case mst_unknown:
263           ms_type = 'u';
264           break;
265         case mst_text:
266           ms_type = 'T';
267           break;
268         case mst_solib_trampoline:
269           ms_type = 'S';
270           break;
271         case mst_data:
272           ms_type = 'D';
273           break;
274         case mst_bss:
275           ms_type = 'B';
276           break;
277         case mst_abs:
278           ms_type = 'A';
279           break;
280         case mst_file_text:
281           ms_type = 't';
282           break;
283         case mst_file_data:
284           ms_type = 'd';
285           break;
286         case mst_file_bss:
287           ms_type = 'b';
288           break;
289         default:
290           ms_type = '?';
291           break;
292         }
293       fprintf_filtered (outfile, "[%2d] %c ", index, ms_type);
294       fputs_filtered (paddress (gdbarch, SYMBOL_VALUE_ADDRESS (msymbol)),
295                       outfile);
296       fprintf_filtered (outfile, " %s", SYMBOL_LINKAGE_NAME (msymbol));
297       if (section)
298         fprintf_filtered (outfile, " section %s",
299                           bfd_section_name (objfile->obfd,
300                                             section->the_bfd_section));
301       if (SYMBOL_DEMANGLED_NAME (msymbol) != NULL)
302         {
303           fprintf_filtered (outfile, "  %s", SYMBOL_DEMANGLED_NAME (msymbol));
304         }
305       if (msymbol->filename)
306         fprintf_filtered (outfile, "  %s", msymbol->filename);
307       fputs_filtered ("\n", outfile);
308       index++;
309     }
310   if (objfile->minimal_symbol_count != index)
311     {
312       warning (_("internal error:  minimal symbol count %d != %d"),
313                objfile->minimal_symbol_count, index);
314     }
315   fprintf_filtered (outfile, "\n");
316 }
317
318 static void
319 dump_symtab_1 (struct objfile *objfile, struct symtab *symtab,
320                struct ui_file *outfile)
321 {
322   struct gdbarch *gdbarch = get_objfile_arch (objfile);
323   int i;
324   struct dict_iterator iter;
325   int len, blen;
326   struct linetable *l;
327   struct blockvector *bv;
328   struct symbol *sym;
329   struct block *b;
330   int depth;
331
332   fprintf_filtered (outfile, "\nSymtab for file %s\n", symtab->filename);
333   if (symtab->dirname)
334     fprintf_filtered (outfile, "Compilation directory is %s\n",
335                       symtab->dirname);
336   fprintf_filtered (outfile, "Read from object file %s (", objfile->name);
337   gdb_print_host_address (objfile, outfile);
338   fprintf_filtered (outfile, ")\n");
339   fprintf_filtered (outfile, "Language: %s\n", language_str (symtab->language));
340
341   /* First print the line table.  */
342   l = LINETABLE (symtab);
343   if (l)
344     {
345       fprintf_filtered (outfile, "\nLine table:\n\n");
346       len = l->nitems;
347       for (i = 0; i < len; i++)
348         {
349           fprintf_filtered (outfile, " line %d at ", l->item[i].line);
350           fputs_filtered (paddress (gdbarch, l->item[i].pc), outfile);
351           fprintf_filtered (outfile, "\n");
352         }
353     }
354   /* Now print the block info, but only for primary symtabs since we will
355      print lots of duplicate info otherwise. */
356   if (symtab->primary)
357     {
358       fprintf_filtered (outfile, "\nBlockvector:\n\n");
359       bv = BLOCKVECTOR (symtab);
360       len = BLOCKVECTOR_NBLOCKS (bv);
361       for (i = 0; i < len; i++)
362         {
363           b = BLOCKVECTOR_BLOCK (bv, i);
364           depth = block_depth (b) * 2;
365           print_spaces (depth, outfile);
366           fprintf_filtered (outfile, "block #%03d, object at ", i);
367           gdb_print_host_address (b, outfile);
368           if (BLOCK_SUPERBLOCK (b))
369             {
370               fprintf_filtered (outfile, " under ");
371               gdb_print_host_address (BLOCK_SUPERBLOCK (b), outfile);
372             }
373           /* drow/2002-07-10: We could save the total symbols count
374              even if we're using a hashtable, but nothing else but this message
375              wants it.  */
376           fprintf_filtered (outfile, ", %d syms/buckets in ",
377                             dict_size (BLOCK_DICT (b)));
378           fputs_filtered (paddress (gdbarch, BLOCK_START (b)), outfile);
379           fprintf_filtered (outfile, "..");
380           fputs_filtered (paddress (gdbarch, BLOCK_END (b)), outfile);
381           if (BLOCK_FUNCTION (b))
382             {
383               fprintf_filtered (outfile, ", function %s",
384                                 SYMBOL_LINKAGE_NAME (BLOCK_FUNCTION (b)));
385               if (SYMBOL_DEMANGLED_NAME (BLOCK_FUNCTION (b)) != NULL)
386                 {
387                   fprintf_filtered (outfile, ", %s",
388                                 SYMBOL_DEMANGLED_NAME (BLOCK_FUNCTION (b)));
389                 }
390             }
391           fprintf_filtered (outfile, "\n");
392           /* Now print each symbol in this block (in no particular order, if
393              we're using a hashtable).  */
394           ALL_BLOCK_SYMBOLS (b, iter, sym)
395             {
396               struct print_symbol_args s;
397               s.gdbarch = gdbarch;
398               s.symbol = sym;
399               s.depth = depth + 1;
400               s.outfile = outfile;
401               catch_errors (print_symbol, &s, "Error printing symbol:\n",
402                             RETURN_MASK_ERROR);
403             }
404         }
405       fprintf_filtered (outfile, "\n");
406     }
407   else
408     {
409       fprintf_filtered (outfile, "\nBlockvector same as previous symtab\n\n");
410     }
411 }
412
413 static void
414 dump_symtab (struct objfile *objfile, struct symtab *symtab,
415              struct ui_file *outfile)
416 {
417   /* Set the current language to the language of the symtab we're dumping
418      because certain routines used during dump_symtab() use the current
419      language to print an image of the symbol.  We'll restore it later.
420      But use only real languages, not placeholders.  */
421   if (symtab->language != language_unknown
422       && symtab->language != language_auto)
423     {
424       enum language saved_lang;
425
426       saved_lang = set_language (symtab->language);
427
428       dump_symtab_1 (objfile, symtab, outfile);
429
430       set_language (saved_lang);
431     }
432   else
433     dump_symtab_1 (objfile, symtab, outfile);
434 }
435
436 void
437 maintenance_print_symbols (char *args, int from_tty)
438 {
439   char **argv;
440   struct ui_file *outfile;
441   struct cleanup *cleanups;
442   char *symname = NULL;
443   char *filename = DEV_TTY;
444   struct objfile *objfile;
445   struct symtab *s;
446
447   dont_repeat ();
448
449   if (args == NULL)
450     {
451       error (_("\
452 Arguments missing: an output file name and an optional symbol file name"));
453     }
454   argv = gdb_buildargv (args);
455   cleanups = make_cleanup_freeargv (argv);
456
457   if (argv[0] != NULL)
458     {
459       filename = argv[0];
460       /* If a second arg is supplied, it is a source file name to match on */
461       if (argv[1] != NULL)
462         {
463           symname = argv[1];
464         }
465     }
466
467   filename = tilde_expand (filename);
468   make_cleanup (xfree, filename);
469
470   outfile = gdb_fopen (filename, FOPEN_WT);
471   if (outfile == 0)
472     perror_with_name (filename);
473   make_cleanup_ui_file_delete (outfile);
474
475   immediate_quit++;
476   ALL_SYMTABS (objfile, s)
477     if (symname == NULL || strcmp (symname, s->filename) == 0)
478     dump_symtab (objfile, s, outfile);
479   immediate_quit--;
480   do_cleanups (cleanups);
481 }
482
483 /* Print symbol ARGS->SYMBOL on ARGS->OUTFILE.  ARGS->DEPTH says how
484    far to indent.  ARGS is really a struct print_symbol_args *, but is
485    declared as char * to get it past catch_errors.  Returns 0 for error,
486    1 for success.  */
487
488 static int
489 print_symbol (void *args)
490 {
491   struct gdbarch *gdbarch = ((struct print_symbol_args *) args)->gdbarch;
492   struct symbol *symbol = ((struct print_symbol_args *) args)->symbol;
493   int depth = ((struct print_symbol_args *) args)->depth;
494   struct ui_file *outfile = ((struct print_symbol_args *) args)->outfile;
495   struct obj_section *section = SYMBOL_OBJ_SECTION (symbol);
496
497   print_spaces (depth, outfile);
498   if (SYMBOL_DOMAIN (symbol) == LABEL_DOMAIN)
499     {
500       fprintf_filtered (outfile, "label %s at ", SYMBOL_PRINT_NAME (symbol));
501       fputs_filtered (paddress (gdbarch, SYMBOL_VALUE_ADDRESS (symbol)),
502                       outfile);
503       if (section)
504         fprintf_filtered (outfile, " section %s\n",
505                           bfd_section_name (section->the_bfd_section->owner,
506                                             section->the_bfd_section));
507       else
508         fprintf_filtered (outfile, "\n");
509       return 1;
510     }
511   if (SYMBOL_DOMAIN (symbol) == STRUCT_DOMAIN)
512     {
513       if (TYPE_TAG_NAME (SYMBOL_TYPE (symbol)))
514         {
515           LA_PRINT_TYPE (SYMBOL_TYPE (symbol), "", outfile, 1, depth);
516         }
517       else
518         {
519           fprintf_filtered (outfile, "%s %s = ",
520                          (TYPE_CODE (SYMBOL_TYPE (symbol)) == TYPE_CODE_ENUM
521                           ? "enum"
522                      : (TYPE_CODE (SYMBOL_TYPE (symbol)) == TYPE_CODE_STRUCT
523                         ? "struct" : "union")),
524                             SYMBOL_LINKAGE_NAME (symbol));
525           LA_PRINT_TYPE (SYMBOL_TYPE (symbol), "", outfile, 1, depth);
526         }
527       fprintf_filtered (outfile, ";\n");
528     }
529   else
530     {
531       if (SYMBOL_CLASS (symbol) == LOC_TYPEDEF)
532         fprintf_filtered (outfile, "typedef ");
533       if (SYMBOL_TYPE (symbol))
534         {
535           /* Print details of types, except for enums where it's clutter.  */
536           LA_PRINT_TYPE (SYMBOL_TYPE (symbol), SYMBOL_PRINT_NAME (symbol),
537                          outfile,
538                          TYPE_CODE (SYMBOL_TYPE (symbol)) != TYPE_CODE_ENUM,
539                          depth);
540           fprintf_filtered (outfile, "; ");
541         }
542       else
543         fprintf_filtered (outfile, "%s ", SYMBOL_PRINT_NAME (symbol));
544
545       switch (SYMBOL_CLASS (symbol))
546         {
547         case LOC_CONST:
548           fprintf_filtered (outfile, "const %ld (0x%lx)",
549                             SYMBOL_VALUE (symbol),
550                             SYMBOL_VALUE (symbol));
551           break;
552
553         case LOC_CONST_BYTES:
554           {
555             unsigned i;
556             struct type *type = check_typedef (SYMBOL_TYPE (symbol));
557             fprintf_filtered (outfile, "const %u hex bytes:",
558                               TYPE_LENGTH (type));
559             for (i = 0; i < TYPE_LENGTH (type); i++)
560               fprintf_filtered (outfile, " %02x",
561                                 (unsigned) SYMBOL_VALUE_BYTES (symbol)[i]);
562           }
563           break;
564
565         case LOC_STATIC:
566           fprintf_filtered (outfile, "static at ");
567           fputs_filtered (paddress (gdbarch, SYMBOL_VALUE_ADDRESS (symbol)),
568                           outfile);
569           if (section)
570             fprintf_filtered (outfile, " section %s",
571                               bfd_section_name (section->the_bfd_section->owner,
572                                                 section->the_bfd_section));
573           break;
574
575         case LOC_REGISTER:
576           if (SYMBOL_IS_ARGUMENT (symbol))
577             fprintf_filtered (outfile, "parameter register %ld",
578                               SYMBOL_VALUE (symbol));
579           else
580             fprintf_filtered (outfile, "register %ld", SYMBOL_VALUE (symbol));
581           break;
582
583         case LOC_ARG:
584           fprintf_filtered (outfile, "arg at offset 0x%lx",
585                             SYMBOL_VALUE (symbol));
586           break;
587
588         case LOC_REF_ARG:
589           fprintf_filtered (outfile, "reference arg at 0x%lx", SYMBOL_VALUE (symbol));
590           break;
591
592         case LOC_REGPARM_ADDR:
593           fprintf_filtered (outfile, "address parameter register %ld", SYMBOL_VALUE (symbol));
594           break;
595
596         case LOC_LOCAL:
597           fprintf_filtered (outfile, "local at offset 0x%lx",
598                             SYMBOL_VALUE (symbol));
599           break;
600
601         case LOC_TYPEDEF:
602           break;
603
604         case LOC_LABEL:
605           fprintf_filtered (outfile, "label at ");
606           fputs_filtered (paddress (gdbarch, SYMBOL_VALUE_ADDRESS (symbol)),
607                           outfile);
608           if (section)
609             fprintf_filtered (outfile, " section %s",
610                               bfd_section_name (section->the_bfd_section->owner,
611                                                 section->the_bfd_section));
612           break;
613
614         case LOC_BLOCK:
615           fprintf_filtered (outfile, "block object ");
616           gdb_print_host_address (SYMBOL_BLOCK_VALUE (symbol), outfile);
617           fprintf_filtered (outfile, ", ");
618           fputs_filtered (paddress (gdbarch,
619                                     BLOCK_START (SYMBOL_BLOCK_VALUE (symbol))),
620                           outfile);
621           fprintf_filtered (outfile, "..");
622           fputs_filtered (paddress (gdbarch,
623                                     BLOCK_END (SYMBOL_BLOCK_VALUE (symbol))),
624                           outfile);
625           if (section)
626             fprintf_filtered (outfile, " section %s",
627                               bfd_section_name (section->the_bfd_section->owner,
628                                                 section->the_bfd_section));
629           break;
630
631         case LOC_COMPUTED:
632           fprintf_filtered (outfile, "computed at runtime");
633           break;
634
635         case LOC_UNRESOLVED:
636           fprintf_filtered (outfile, "unresolved");
637           break;
638
639         case LOC_OPTIMIZED_OUT:
640           fprintf_filtered (outfile, "optimized out");
641           break;
642
643         default:
644           fprintf_filtered (outfile, "botched symbol class %x",
645                             SYMBOL_CLASS (symbol));
646           break;
647         }
648     }
649   fprintf_filtered (outfile, "\n");
650   return 1;
651 }
652
653 void
654 maintenance_print_msymbols (char *args, int from_tty)
655 {
656   char **argv;
657   struct ui_file *outfile;
658   struct cleanup *cleanups;
659   char *filename = DEV_TTY;
660   char *symname = NULL;
661   struct program_space *pspace;
662   struct objfile *objfile;
663
664   struct stat sym_st, obj_st;
665
666   dont_repeat ();
667
668   if (args == NULL)
669     {
670       error (_("print-msymbols takes an output file name and optional symbol file name"));
671     }
672   argv = gdb_buildargv (args);
673   cleanups = make_cleanup_freeargv (argv);
674
675   if (argv[0] != NULL)
676     {
677       filename = argv[0];
678       /* If a second arg is supplied, it is a source file name to match on */
679       if (argv[1] != NULL)
680         {
681           symname = xfullpath (argv[1]);
682           make_cleanup (xfree, symname);
683           if (symname && stat (symname, &sym_st))
684             perror_with_name (symname);
685         }
686     }
687
688   filename = tilde_expand (filename);
689   make_cleanup (xfree, filename);
690
691   outfile = gdb_fopen (filename, FOPEN_WT);
692   if (outfile == 0)
693     perror_with_name (filename);
694   make_cleanup_ui_file_delete (outfile);
695
696   immediate_quit++;
697   ALL_PSPACES (pspace)
698     ALL_PSPACE_OBJFILES (pspace, objfile)
699       if (symname == NULL
700           || (!stat (objfile->name, &obj_st) && sym_st.st_ino == obj_st.st_ino))
701         dump_msymbols (objfile, outfile);
702   immediate_quit--;
703   fprintf_filtered (outfile, "\n\n");
704   do_cleanups (cleanups);
705 }
706
707 void
708 maintenance_print_objfiles (char *ignore, int from_tty)
709 {
710   struct program_space *pspace;
711   struct objfile *objfile;
712
713   dont_repeat ();
714
715   immediate_quit++;
716   ALL_PSPACES (pspace)
717     ALL_PSPACE_OBJFILES (pspace, objfile)
718       dump_objfile (objfile);
719   immediate_quit--;
720 }
721
722
723 /* List all the symbol tables whose names match REGEXP (optional).  */
724 void
725 maintenance_info_symtabs (char *regexp, int from_tty)
726 {
727   struct program_space *pspace;
728   struct objfile *objfile;
729
730   if (regexp)
731     re_comp (regexp);
732
733   ALL_PSPACES (pspace)
734     ALL_PSPACE_OBJFILES (pspace, objfile)
735     {
736       struct symtab *symtab;
737       
738       /* We don't want to print anything for this objfile until we
739          actually find a symtab whose name matches.  */
740       int printed_objfile_start = 0;
741
742       ALL_OBJFILE_SYMTABS (objfile, symtab)
743         {
744           QUIT;
745
746           if (! regexp
747               || re_exec (symtab->filename))
748             {
749               if (! printed_objfile_start)
750                 {
751                   printf_filtered ("{ objfile %s ", objfile->name);
752                   wrap_here ("  ");
753                   printf_filtered ("((struct objfile *) %s)\n", 
754                                    host_address_to_string (objfile));
755                   printed_objfile_start = 1;
756                 }
757
758               printf_filtered ("        { symtab %s ", symtab->filename);
759               wrap_here ("    ");
760               printf_filtered ("((struct symtab *) %s)\n", 
761                                host_address_to_string (symtab));
762               printf_filtered ("          dirname %s\n",
763                                symtab->dirname ? symtab->dirname : "(null)");
764               printf_filtered ("          fullname %s\n",
765                                symtab->fullname ? symtab->fullname : "(null)");
766               printf_filtered ("          blockvector ((struct blockvector *) %s)%s\n",
767                                host_address_to_string (symtab->blockvector),
768                                symtab->primary ? " (primary)" : "");
769               printf_filtered ("          linetable ((struct linetable *) %s)\n",
770                                host_address_to_string (symtab->linetable));
771               printf_filtered ("          debugformat %s\n", symtab->debugformat);
772               printf_filtered ("        }\n");
773             }
774         }
775
776       if (printed_objfile_start)
777         printf_filtered ("}\n");
778     }
779 }
780 \f
781
782 /* Return the nexting depth of a block within other blocks in its symtab.  */
783
784 static int
785 block_depth (struct block *block)
786 {
787   int i = 0;
788   while ((block = BLOCK_SUPERBLOCK (block)) != NULL)
789     {
790       i++;
791     }
792   return i;
793 }
794 \f
795
796 /* Do early runtime initializations. */
797 void
798 _initialize_symmisc (void)
799 {
800   std_in = stdin;
801   std_out = stdout;
802   std_err = stderr;
803 }