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