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