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
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#ifndef DEV_TTY
43#define DEV_TTY "/dev/tty"
44#endif
45
46/* Unfortunately for debugging, stderr is usually a macro.  This is painful
47   when calling functions that take FILE *'s from the debugger.
48   So we make a variable which has the same value and which is accessible when
49   debugging GDB with itself.  Because stdin et al need not be constants,
50   we initialize them in the _initialize_symmisc function at the bottom
51   of the file.  */
52FILE *std_in;
53FILE *std_out;
54FILE *std_err;
55
56/* Prototypes for local functions */
57
58static void dump_symtab (struct objfile *, struct symtab *,
59			 struct ui_file *);
60
61static void dump_psymtab (struct objfile *, struct partial_symtab *,
62			  struct ui_file *);
63
64static void dump_msymbols (struct objfile *, struct ui_file *);
65
66static void dump_objfile (struct objfile *);
67
68static int block_depth (struct block *);
69
70static void print_partial_symbols (struct partial_symbol **, int,
71				   char *, struct ui_file *);
72
73static void free_symtab_block (struct objfile *, struct block *);
74
75void _initialize_symmisc (void);
76
77struct print_symbol_args
78  {
79    struct symbol *symbol;
80    int depth;
81    struct ui_file *outfile;
82  };
83
84static int print_symbol (void *);
85
86static void free_symtab_block (struct objfile *, struct block *);
87
88
89/* Free a struct block <- B and all the symbols defined in that block.  */
90
91/* FIXME: carlton/2003-04-28: I don't believe this is currently ever
92   used.  */
93
94static void
95free_symtab_block (struct objfile *objfile, struct block *b)
96{
97  struct dict_iterator iter;
98  struct symbol *sym;
99
100  ALL_BLOCK_SYMBOLS (b, iter, sym)
101    {
102      xfree (DEPRECATED_SYMBOL_NAME (sym));
103      xfree (sym);
104    }
105
106  dict_free (BLOCK_DICT (b));
107  xfree (b);
108}
109
110/* Free all the storage associated with the struct symtab <- S.
111   Note that some symtabs have contents malloc'ed structure by structure,
112   while some have contents that all live inside one big block of memory,
113   and some share the contents of another symbol table and so you should
114   not free the contents on their behalf (except sometimes the linetable,
115   which maybe per symtab even when the rest is not).
116   It is s->free_code that says which alternative to use.  */
117
118void
119free_symtab (struct symtab *s)
120{
121  int i, n;
122  struct blockvector *bv;
123
124  switch (s->free_code)
125    {
126    case free_nothing:
127      /* All the contents are part of a big block of memory (an obstack),
128         and some other symtab is in charge of freeing that block.
129         Therefore, do nothing.  */
130      break;
131
132    case free_contents:
133      /* Here all the contents were malloc'ed structure by structure
134         and must be freed that way.  */
135      /* First free the blocks (and their symbols.  */
136      bv = BLOCKVECTOR (s);
137      n = BLOCKVECTOR_NBLOCKS (bv);
138      for (i = 0; i < n; i++)
139	free_symtab_block (s->objfile, BLOCKVECTOR_BLOCK (bv, i));
140      /* Free the blockvector itself.  */
141      xfree (bv);
142      /* Also free the linetable.  */
143
144    case free_linetable:
145      /* Everything will be freed either by our `free_func'
146         or by some other symtab, except for our linetable.
147         Free that now.  */
148      if (LINETABLE (s))
149	xfree (LINETABLE (s));
150      break;
151    }
152
153  /* If there is a single block of memory to free, free it.  */
154  if (s->free_func != NULL)
155    s->free_func (s);
156
157  /* Free source-related stuff */
158  if (s->line_charpos != NULL)
159    xfree (s->line_charpos);
160  if (s->fullname != NULL)
161    xfree (s->fullname);
162  if (s->debugformat != NULL)
163    xfree (s->debugformat);
164  xfree (s);
165}
166
167void
168print_symbol_bcache_statistics (void)
169{
170  struct objfile *objfile;
171
172  immediate_quit++;
173  ALL_OBJFILES (objfile)
174  {
175    printf_filtered (_("Byte cache statistics for '%s':\n"), objfile->name);
176    print_bcache_statistics (objfile->psymbol_cache, "partial symbol cache");
177  }
178  immediate_quit--;
179}
180
181void
182print_objfile_statistics (void)
183{
184  struct objfile *objfile;
185  struct symtab *s;
186  struct partial_symtab *ps;
187  int i, linetables, blockvectors;
188
189  immediate_quit++;
190  ALL_OBJFILES (objfile)
191  {
192    printf_filtered (_("Statistics for '%s':\n"), objfile->name);
193    if (OBJSTAT (objfile, n_stabs) > 0)
194      printf_filtered (_("  Number of \"stab\" symbols read: %d\n"),
195		       OBJSTAT (objfile, n_stabs));
196    if (OBJSTAT (objfile, n_minsyms) > 0)
197      printf_filtered (_("  Number of \"minimal\" symbols read: %d\n"),
198		       OBJSTAT (objfile, n_minsyms));
199    if (OBJSTAT (objfile, n_psyms) > 0)
200      printf_filtered (_("  Number of \"partial\" symbols read: %d\n"),
201		       OBJSTAT (objfile, n_psyms));
202    if (OBJSTAT (objfile, n_syms) > 0)
203      printf_filtered (_("  Number of \"full\" symbols read: %d\n"),
204		       OBJSTAT (objfile, n_syms));
205    if (OBJSTAT (objfile, n_types) > 0)
206      printf_filtered (_("  Number of \"types\" defined: %d\n"),
207		       OBJSTAT (objfile, n_types));
208    i = 0;
209    ALL_OBJFILE_PSYMTABS (objfile, ps)
210      {
211        if (ps->readin == 0)
212          i++;
213      }
214    printf_filtered (_("  Number of psym tables (not yet expanded): %d\n"), i);
215    i = linetables = blockvectors = 0;
216    ALL_OBJFILE_SYMTABS (objfile, s)
217      {
218        i++;
219        if (s->linetable != NULL)
220          linetables++;
221        if (s->primary == 1)
222          blockvectors++;
223      }
224    printf_filtered (_("  Number of symbol tables: %d\n"), i);
225    printf_filtered (_("  Number of symbol tables with line tables: %d\n"),
226                     linetables);
227    printf_filtered (_("  Number of symbol tables with blockvectors: %d\n"),
228                     blockvectors);
229
230    if (OBJSTAT (objfile, sz_strtab) > 0)
231      printf_filtered (_("  Space used by a.out string tables: %d\n"),
232		       OBJSTAT (objfile, sz_strtab));
233    printf_filtered (_("  Total memory used for objfile obstack: %d\n"),
234		     obstack_memory_used (&objfile->objfile_obstack));
235    printf_filtered (_("  Total memory used for psymbol cache: %d\n"),
236		     bcache_memory_used (objfile->psymbol_cache));
237    printf_filtered (_("  Total memory used for macro cache: %d\n"),
238		     bcache_memory_used (objfile->macro_cache));
239  }
240  immediate_quit--;
241}
242
243static void
244dump_objfile (struct objfile *objfile)
245{
246  struct symtab *symtab;
247  struct partial_symtab *psymtab;
248
249  printf_filtered ("\nObject file %s:  ", objfile->name);
250  printf_filtered ("Objfile at ");
251  gdb_print_host_address (objfile, gdb_stdout);
252  printf_filtered (", bfd at ");
253  gdb_print_host_address (objfile->obfd, gdb_stdout);
254  printf_filtered (", %d minsyms\n\n",
255		   objfile->minimal_symbol_count);
256
257  if (objfile->psymtabs)
258    {
259      printf_filtered ("Psymtabs:\n");
260      for (psymtab = objfile->psymtabs;
261	   psymtab != NULL;
262	   psymtab = psymtab->next)
263	{
264	  printf_filtered ("%s at ",
265			   psymtab->filename);
266	  gdb_print_host_address (psymtab, gdb_stdout);
267	  printf_filtered (", ");
268	  if (psymtab->objfile != objfile)
269	    {
270	      printf_filtered ("NOT ON CHAIN!  ");
271	    }
272	  wrap_here ("  ");
273	}
274      printf_filtered ("\n\n");
275    }
276
277  if (objfile->symtabs)
278    {
279      printf_filtered ("Symtabs:\n");
280      for (symtab = objfile->symtabs;
281	   symtab != NULL;
282	   symtab = symtab->next)
283	{
284	  printf_filtered ("%s at ", symtab->filename);
285	  gdb_print_host_address (symtab, gdb_stdout);
286	  printf_filtered (", ");
287	  if (symtab->objfile != objfile)
288	    {
289	      printf_filtered ("NOT ON CHAIN!  ");
290	    }
291	  wrap_here ("  ");
292	}
293      printf_filtered ("\n\n");
294    }
295}
296
297/* Print minimal symbols from this objfile.  */
298
299static void
300dump_msymbols (struct objfile *objfile, struct ui_file *outfile)
301{
302  struct minimal_symbol *msymbol;
303  int index;
304  char ms_type;
305
306  fprintf_filtered (outfile, "\nObject file %s:\n\n", objfile->name);
307  if (objfile->minimal_symbol_count == 0)
308    {
309      fprintf_filtered (outfile, "No minimal symbols found.\n");
310      return;
311    }
312  for (index = 0, msymbol = objfile->msymbols;
313       DEPRECATED_SYMBOL_NAME (msymbol) != NULL; msymbol++, index++)
314    {
315      switch (msymbol->type)
316	{
317	case mst_unknown:
318	  ms_type = 'u';
319	  break;
320	case mst_text:
321	  ms_type = 'T';
322	  break;
323	case mst_solib_trampoline:
324	  ms_type = 'S';
325	  break;
326	case mst_data:
327	  ms_type = 'D';
328	  break;
329	case mst_bss:
330	  ms_type = 'B';
331	  break;
332	case mst_abs:
333	  ms_type = 'A';
334	  break;
335	case mst_file_text:
336	  ms_type = 't';
337	  break;
338	case mst_file_data:
339	  ms_type = 'd';
340	  break;
341	case mst_file_bss:
342	  ms_type = 'b';
343	  break;
344	default:
345	  ms_type = '?';
346	  break;
347	}
348      fprintf_filtered (outfile, "[%2d] %c ", index, ms_type);
349      deprecated_print_address_numeric (SYMBOL_VALUE_ADDRESS (msymbol), 1, outfile);
350      fprintf_filtered (outfile, " %s", DEPRECATED_SYMBOL_NAME (msymbol));
351      if (SYMBOL_BFD_SECTION (msymbol))
352	fprintf_filtered (outfile, " section %s",
353			  bfd_section_name (objfile->obfd,
354					    SYMBOL_BFD_SECTION (msymbol)));
355      if (SYMBOL_DEMANGLED_NAME (msymbol) != NULL)
356	{
357	  fprintf_filtered (outfile, "  %s", SYMBOL_DEMANGLED_NAME (msymbol));
358	}
359#ifdef SOFUN_ADDRESS_MAYBE_MISSING
360      if (msymbol->filename)
361	fprintf_filtered (outfile, "  %s", msymbol->filename);
362#endif
363      fputs_filtered ("\n", outfile);
364    }
365  if (objfile->minimal_symbol_count != index)
366    {
367      warning (_("internal error:  minimal symbol count %d != %d"),
368	       objfile->minimal_symbol_count, index);
369    }
370  fprintf_filtered (outfile, "\n");
371}
372
373static void
374dump_psymtab (struct objfile *objfile, struct partial_symtab *psymtab,
375	      struct ui_file *outfile)
376{
377  int i;
378
379  fprintf_filtered (outfile, "\nPartial symtab for source file %s ",
380		    psymtab->filename);
381  fprintf_filtered (outfile, "(object ");
382  gdb_print_host_address (psymtab, outfile);
383  fprintf_filtered (outfile, ")\n\n");
384  fprintf_unfiltered (outfile, "  Read from object file %s (",
385		      objfile->name);
386  gdb_print_host_address (objfile, outfile);
387  fprintf_unfiltered (outfile, ")\n");
388
389  if (psymtab->readin)
390    {
391      fprintf_filtered (outfile,
392			"  Full symtab was read (at ");
393      gdb_print_host_address (psymtab->symtab, outfile);
394      fprintf_filtered (outfile, " by function at ");
395      gdb_print_host_address (psymtab->read_symtab, outfile);
396      fprintf_filtered (outfile, ")\n");
397    }
398
399  fprintf_filtered (outfile, "  Relocate symbols by ");
400  for (i = 0; i < psymtab->objfile->num_sections; ++i)
401    {
402      if (i != 0)
403	fprintf_filtered (outfile, ", ");
404      wrap_here ("    ");
405      deprecated_print_address_numeric (ANOFFSET (psymtab->section_offsets, i),
406			     1,
407			     outfile);
408    }
409  fprintf_filtered (outfile, "\n");
410
411  fprintf_filtered (outfile, "  Symbols cover text addresses ");
412  deprecated_print_address_numeric (psymtab->textlow, 1, outfile);
413  fprintf_filtered (outfile, "-");
414  deprecated_print_address_numeric (psymtab->texthigh, 1, outfile);
415  fprintf_filtered (outfile, "\n");
416  fprintf_filtered (outfile, "  Depends on %d other partial symtabs.\n",
417		    psymtab->number_of_dependencies);
418  for (i = 0; i < psymtab->number_of_dependencies; i++)
419    {
420      fprintf_filtered (outfile, "    %d ", i);
421      gdb_print_host_address (psymtab->dependencies[i], outfile);
422      fprintf_filtered (outfile, " %s\n",
423			psymtab->dependencies[i]->filename);
424    }
425  if (psymtab->n_global_syms > 0)
426    {
427      print_partial_symbols (objfile->global_psymbols.list
428			     + psymtab->globals_offset,
429			     psymtab->n_global_syms, "Global", outfile);
430    }
431  if (psymtab->n_static_syms > 0)
432    {
433      print_partial_symbols (objfile->static_psymbols.list
434			     + psymtab->statics_offset,
435			     psymtab->n_static_syms, "Static", outfile);
436    }
437  fprintf_filtered (outfile, "\n");
438}
439
440static void
441dump_symtab_1 (struct objfile *objfile, struct symtab *symtab,
442	       struct ui_file *outfile)
443{
444  int i;
445  struct dict_iterator iter;
446  int len, blen;
447  struct linetable *l;
448  struct blockvector *bv;
449  struct symbol *sym;
450  struct block *b;
451  int depth;
452
453  fprintf_filtered (outfile, "\nSymtab for file %s\n", symtab->filename);
454  if (symtab->dirname)
455    fprintf_filtered (outfile, "Compilation directory is %s\n",
456		      symtab->dirname);
457  fprintf_filtered (outfile, "Read from object file %s (", objfile->name);
458  gdb_print_host_address (objfile, outfile);
459  fprintf_filtered (outfile, ")\n");
460  fprintf_filtered (outfile, "Language: %s\n", language_str (symtab->language));
461
462  /* First print the line table.  */
463  l = LINETABLE (symtab);
464  if (l)
465    {
466      fprintf_filtered (outfile, "\nLine table:\n\n");
467      len = l->nitems;
468      for (i = 0; i < len; i++)
469	{
470	  fprintf_filtered (outfile, " line %d at ", l->item[i].line);
471	  deprecated_print_address_numeric (l->item[i].pc, 1, outfile);
472	  fprintf_filtered (outfile, "\n");
473	}
474    }
475  /* Now print the block info, but only for primary symtabs since we will
476     print lots of duplicate info otherwise. */
477  if (symtab->primary)
478    {
479      fprintf_filtered (outfile, "\nBlockvector:\n\n");
480      bv = BLOCKVECTOR (symtab);
481      len = BLOCKVECTOR_NBLOCKS (bv);
482      for (i = 0; i < len; i++)
483	{
484	  b = BLOCKVECTOR_BLOCK (bv, i);
485	  depth = block_depth (b) * 2;
486	  print_spaces (depth, outfile);
487	  fprintf_filtered (outfile, "block #%03d, object at ", i);
488	  gdb_print_host_address (b, outfile);
489	  if (BLOCK_SUPERBLOCK (b))
490	    {
491	      fprintf_filtered (outfile, " under ");
492	      gdb_print_host_address (BLOCK_SUPERBLOCK (b), outfile);
493	    }
494	  /* drow/2002-07-10: We could save the total symbols count
495	     even if we're using a hashtable, but nothing else but this message
496	     wants it.  */
497	  fprintf_filtered (outfile, ", %d syms/buckets in ",
498			    dict_size (BLOCK_DICT (b)));
499	  deprecated_print_address_numeric (BLOCK_START (b), 1, outfile);
500	  fprintf_filtered (outfile, "..");
501	  deprecated_print_address_numeric (BLOCK_END (b), 1, outfile);
502	  if (BLOCK_FUNCTION (b))
503	    {
504	      fprintf_filtered (outfile, ", function %s", DEPRECATED_SYMBOL_NAME (BLOCK_FUNCTION (b)));
505	      if (SYMBOL_DEMANGLED_NAME (BLOCK_FUNCTION (b)) != NULL)
506		{
507		  fprintf_filtered (outfile, ", %s",
508				SYMBOL_DEMANGLED_NAME (BLOCK_FUNCTION (b)));
509		}
510	    }
511	  if (BLOCK_GCC_COMPILED (b))
512	    fprintf_filtered (outfile, ", compiled with gcc%d", BLOCK_GCC_COMPILED (b));
513	  fprintf_filtered (outfile, "\n");
514	  /* Now print each symbol in this block (in no particular order, if
515	     we're using a hashtable).  */
516	  ALL_BLOCK_SYMBOLS (b, iter, sym)
517	    {
518	      struct print_symbol_args s;
519	      s.symbol = sym;
520	      s.depth = depth + 1;
521	      s.outfile = outfile;
522	      catch_errors (print_symbol, &s, "Error printing symbol:\n",
523			    RETURN_MASK_ALL);
524	    }
525	}
526      fprintf_filtered (outfile, "\n");
527    }
528  else
529    {
530      fprintf_filtered (outfile, "\nBlockvector same as previous symtab\n\n");
531    }
532}
533
534static void
535dump_symtab (struct objfile *objfile, struct symtab *symtab,
536	     struct ui_file *outfile)
537{
538  enum language saved_lang;
539
540  /* Set the current language to the language of the symtab we're dumping
541     because certain routines used during dump_symtab() use the current
542     language to print an image of the symbol.  We'll restore it later.  */
543  saved_lang = set_language (symtab->language);
544
545  dump_symtab_1 (objfile, symtab, outfile);
546
547  set_language (saved_lang);
548}
549
550void
551maintenance_print_symbols (char *args, int from_tty)
552{
553  char **argv;
554  struct ui_file *outfile;
555  struct cleanup *cleanups;
556  char *symname = NULL;
557  char *filename = DEV_TTY;
558  struct objfile *objfile;
559  struct symtab *s;
560
561  dont_repeat ();
562
563  if (args == NULL)
564    {
565      error (_("\
566Arguments missing: an output file name and an optional symbol file name"));
567    }
568  else if ((argv = buildargv (args)) == NULL)
569    {
570      nomem (0);
571    }
572  cleanups = make_cleanup_freeargv (argv);
573
574  if (argv[0] != NULL)
575    {
576      filename = argv[0];
577      /* If a second arg is supplied, it is a source file name to match on */
578      if (argv[1] != NULL)
579	{
580	  symname = argv[1];
581	}
582    }
583
584  filename = tilde_expand (filename);
585  make_cleanup (xfree, filename);
586
587  outfile = gdb_fopen (filename, FOPEN_WT);
588  if (outfile == 0)
589    perror_with_name (filename);
590  make_cleanup_ui_file_delete (outfile);
591
592  immediate_quit++;
593  ALL_SYMTABS (objfile, s)
594    if (symname == NULL || strcmp (symname, s->filename) == 0)
595    dump_symtab (objfile, s, outfile);
596  immediate_quit--;
597  do_cleanups (cleanups);
598}
599
600/* Print symbol ARGS->SYMBOL on ARGS->OUTFILE.  ARGS->DEPTH says how
601   far to indent.  ARGS is really a struct print_symbol_args *, but is
602   declared as char * to get it past catch_errors.  Returns 0 for error,
603   1 for success.  */
604
605static int
606print_symbol (void *args)
607{
608  struct symbol *symbol = ((struct print_symbol_args *) args)->symbol;
609  int depth = ((struct print_symbol_args *) args)->depth;
610  struct ui_file *outfile = ((struct print_symbol_args *) args)->outfile;
611
612  print_spaces (depth, outfile);
613  if (SYMBOL_DOMAIN (symbol) == LABEL_DOMAIN)
614    {
615      fprintf_filtered (outfile, "label %s at ", SYMBOL_PRINT_NAME (symbol));
616      deprecated_print_address_numeric (SYMBOL_VALUE_ADDRESS (symbol), 1, outfile);
617      if (SYMBOL_BFD_SECTION (symbol))
618	fprintf_filtered (outfile, " section %s\n",
619		       bfd_section_name (SYMBOL_BFD_SECTION (symbol)->owner,
620					 SYMBOL_BFD_SECTION (symbol)));
621      else
622	fprintf_filtered (outfile, "\n");
623      return 1;
624    }
625  if (SYMBOL_DOMAIN (symbol) == STRUCT_DOMAIN)
626    {
627      if (TYPE_TAG_NAME (SYMBOL_TYPE (symbol)))
628	{
629	  LA_PRINT_TYPE (SYMBOL_TYPE (symbol), "", outfile, 1, depth);
630	}
631      else
632	{
633	  fprintf_filtered (outfile, "%s %s = ",
634			 (TYPE_CODE (SYMBOL_TYPE (symbol)) == TYPE_CODE_ENUM
635			  ? "enum"
636		     : (TYPE_CODE (SYMBOL_TYPE (symbol)) == TYPE_CODE_STRUCT
637			? "struct" : "union")),
638			    DEPRECATED_SYMBOL_NAME (symbol));
639	  LA_PRINT_TYPE (SYMBOL_TYPE (symbol), "", outfile, 1, depth);
640	}
641      fprintf_filtered (outfile, ";\n");
642    }
643  else
644    {
645      if (SYMBOL_CLASS (symbol) == LOC_TYPEDEF)
646	fprintf_filtered (outfile, "typedef ");
647      if (SYMBOL_TYPE (symbol))
648	{
649	  /* Print details of types, except for enums where it's clutter.  */
650	  LA_PRINT_TYPE (SYMBOL_TYPE (symbol), SYMBOL_PRINT_NAME (symbol),
651			 outfile,
652			 TYPE_CODE (SYMBOL_TYPE (symbol)) != TYPE_CODE_ENUM,
653			 depth);
654	  fprintf_filtered (outfile, "; ");
655	}
656      else
657	fprintf_filtered (outfile, "%s ", SYMBOL_PRINT_NAME (symbol));
658
659      switch (SYMBOL_CLASS (symbol))
660	{
661	case LOC_CONST:
662	  fprintf_filtered (outfile, "const %ld (0x%lx)",
663			    SYMBOL_VALUE (symbol),
664			    SYMBOL_VALUE (symbol));
665	  break;
666
667	case LOC_CONST_BYTES:
668	  {
669	    unsigned i;
670	    struct type *type = check_typedef (SYMBOL_TYPE (symbol));
671	    fprintf_filtered (outfile, "const %u hex bytes:",
672			      TYPE_LENGTH (type));
673	    for (i = 0; i < TYPE_LENGTH (type); i++)
674	      fprintf_filtered (outfile, " %02x",
675				(unsigned) SYMBOL_VALUE_BYTES (symbol)[i]);
676	  }
677	  break;
678
679	case LOC_STATIC:
680	  fprintf_filtered (outfile, "static at ");
681	  deprecated_print_address_numeric (SYMBOL_VALUE_ADDRESS (symbol), 1, outfile);
682	  if (SYMBOL_BFD_SECTION (symbol))
683	    fprintf_filtered (outfile, " section %s",
684			      bfd_section_name
685			      (SYMBOL_BFD_SECTION (symbol)->owner,
686			       SYMBOL_BFD_SECTION (symbol)));
687	  break;
688
689	case LOC_INDIRECT:
690	  fprintf_filtered (outfile, "extern global at *(");
691	  deprecated_print_address_numeric (SYMBOL_VALUE_ADDRESS (symbol), 1, outfile);
692	  fprintf_filtered (outfile, "),");
693	  break;
694
695	case LOC_REGISTER:
696	  fprintf_filtered (outfile, "register %ld", SYMBOL_VALUE (symbol));
697	  break;
698
699	case LOC_ARG:
700	  fprintf_filtered (outfile, "arg at offset 0x%lx",
701			    SYMBOL_VALUE (symbol));
702	  break;
703
704	case LOC_LOCAL_ARG:
705	  fprintf_filtered (outfile, "arg at offset 0x%lx from fp",
706			    SYMBOL_VALUE (symbol));
707	  break;
708
709	case LOC_REF_ARG:
710	  fprintf_filtered (outfile, "reference arg at 0x%lx", SYMBOL_VALUE (symbol));
711	  break;
712
713	case LOC_REGPARM:
714	  fprintf_filtered (outfile, "parameter register %ld", SYMBOL_VALUE (symbol));
715	  break;
716
717	case LOC_REGPARM_ADDR:
718	  fprintf_filtered (outfile, "address parameter register %ld", SYMBOL_VALUE (symbol));
719	  break;
720
721	case LOC_LOCAL:
722	  fprintf_filtered (outfile, "local at offset 0x%lx",
723			    SYMBOL_VALUE (symbol));
724	  break;
725
726	case LOC_BASEREG:
727	  fprintf_filtered (outfile, "local at 0x%lx from register %d",
728			    SYMBOL_VALUE (symbol), SYMBOL_BASEREG (symbol));
729	  break;
730
731	case LOC_BASEREG_ARG:
732	  fprintf_filtered (outfile, "arg at 0x%lx from register %d",
733			    SYMBOL_VALUE (symbol), SYMBOL_BASEREG (symbol));
734	  break;
735
736	case LOC_TYPEDEF:
737	  break;
738
739	case LOC_LABEL:
740	  fprintf_filtered (outfile, "label at ");
741	  deprecated_print_address_numeric (SYMBOL_VALUE_ADDRESS (symbol), 1, outfile);
742	  if (SYMBOL_BFD_SECTION (symbol))
743	    fprintf_filtered (outfile, " section %s",
744			      bfd_section_name
745			      (SYMBOL_BFD_SECTION (symbol)->owner,
746			       SYMBOL_BFD_SECTION (symbol)));
747	  break;
748
749	case LOC_BLOCK:
750	  fprintf_filtered (outfile, "block object ");
751	  gdb_print_host_address (SYMBOL_BLOCK_VALUE (symbol), outfile);
752	  fprintf_filtered (outfile, ", ");
753	  deprecated_print_address_numeric (BLOCK_START (SYMBOL_BLOCK_VALUE (symbol)),
754				 1,
755				 outfile);
756	  fprintf_filtered (outfile, "..");
757	  deprecated_print_address_numeric (BLOCK_END (SYMBOL_BLOCK_VALUE (symbol)),
758				 1,
759				 outfile);
760	  if (SYMBOL_BFD_SECTION (symbol))
761	    fprintf_filtered (outfile, " section %s",
762			      bfd_section_name
763			      (SYMBOL_BFD_SECTION (symbol)->owner,
764			       SYMBOL_BFD_SECTION (symbol)));
765	  break;
766
767	case LOC_COMPUTED:
768	case LOC_COMPUTED_ARG:
769	  fprintf_filtered (outfile, "computed at runtime");
770	  break;
771
772	case LOC_UNRESOLVED:
773	  fprintf_filtered (outfile, "unresolved");
774	  break;
775
776	case LOC_OPTIMIZED_OUT:
777	  fprintf_filtered (outfile, "optimized out");
778	  break;
779
780	default:
781	  fprintf_filtered (outfile, "botched symbol class %x",
782			    SYMBOL_CLASS (symbol));
783	  break;
784	}
785    }
786  fprintf_filtered (outfile, "\n");
787  return 1;
788}
789
790void
791maintenance_print_psymbols (char *args, int from_tty)
792{
793  char **argv;
794  struct ui_file *outfile;
795  struct cleanup *cleanups;
796  char *symname = NULL;
797  char *filename = DEV_TTY;
798  struct objfile *objfile;
799  struct partial_symtab *ps;
800
801  dont_repeat ();
802
803  if (args == NULL)
804    {
805      error (_("print-psymbols takes an output file name and optional symbol file name"));
806    }
807  else if ((argv = buildargv (args)) == NULL)
808    {
809      nomem (0);
810    }
811  cleanups = make_cleanup_freeargv (argv);
812
813  if (argv[0] != NULL)
814    {
815      filename = argv[0];
816      /* If a second arg is supplied, it is a source file name to match on */
817      if (argv[1] != NULL)
818	{
819	  symname = argv[1];
820	}
821    }
822
823  filename = tilde_expand (filename);
824  make_cleanup (xfree, filename);
825
826  outfile = gdb_fopen (filename, FOPEN_WT);
827  if (outfile == 0)
828    perror_with_name (filename);
829  make_cleanup_ui_file_delete (outfile);
830
831  immediate_quit++;
832  ALL_PSYMTABS (objfile, ps)
833    if (symname == NULL || strcmp (symname, ps->filename) == 0)
834    dump_psymtab (objfile, ps, outfile);
835  immediate_quit--;
836  do_cleanups (cleanups);
837}
838
839static void
840print_partial_symbols (struct partial_symbol **p, int count, char *what,
841		       struct ui_file *outfile)
842{
843  fprintf_filtered (outfile, "  %s partial symbols:\n", what);
844  while (count-- > 0)
845    {
846      fprintf_filtered (outfile, "    `%s'", DEPRECATED_SYMBOL_NAME (*p));
847      if (SYMBOL_DEMANGLED_NAME (*p) != NULL)
848	{
849	  fprintf_filtered (outfile, "  `%s'", SYMBOL_DEMANGLED_NAME (*p));
850	}
851      fputs_filtered (", ", outfile);
852      switch (SYMBOL_DOMAIN (*p))
853	{
854	case UNDEF_DOMAIN:
855	  fputs_filtered ("undefined domain, ", outfile);
856	  break;
857	case VAR_DOMAIN:
858	  /* This is the usual thing -- don't print it */
859	  break;
860	case STRUCT_DOMAIN:
861	  fputs_filtered ("struct domain, ", outfile);
862	  break;
863	case LABEL_DOMAIN:
864	  fputs_filtered ("label domain, ", outfile);
865	  break;
866	default:
867	  fputs_filtered ("<invalid domain>, ", outfile);
868	  break;
869	}
870      switch (SYMBOL_CLASS (*p))
871	{
872	case LOC_UNDEF:
873	  fputs_filtered ("undefined", outfile);
874	  break;
875	case LOC_CONST:
876	  fputs_filtered ("constant int", outfile);
877	  break;
878	case LOC_STATIC:
879	  fputs_filtered ("static", outfile);
880	  break;
881	case LOC_INDIRECT:
882	  fputs_filtered ("extern global", outfile);
883	  break;
884	case LOC_REGISTER:
885	  fputs_filtered ("register", outfile);
886	  break;
887	case LOC_ARG:
888	  fputs_filtered ("pass by value", outfile);
889	  break;
890	case LOC_REF_ARG:
891	  fputs_filtered ("pass by reference", outfile);
892	  break;
893	case LOC_REGPARM:
894	  fputs_filtered ("register parameter", outfile);
895	  break;
896	case LOC_REGPARM_ADDR:
897	  fputs_filtered ("register address parameter", outfile);
898	  break;
899	case LOC_LOCAL:
900	  fputs_filtered ("stack parameter", outfile);
901	  break;
902	case LOC_TYPEDEF:
903	  fputs_filtered ("type", outfile);
904	  break;
905	case LOC_LABEL:
906	  fputs_filtered ("label", outfile);
907	  break;
908	case LOC_BLOCK:
909	  fputs_filtered ("function", outfile);
910	  break;
911	case LOC_CONST_BYTES:
912	  fputs_filtered ("constant bytes", outfile);
913	  break;
914	case LOC_LOCAL_ARG:
915	  fputs_filtered ("shuffled arg", outfile);
916	  break;
917	case LOC_UNRESOLVED:
918	  fputs_filtered ("unresolved", outfile);
919	  break;
920	case LOC_OPTIMIZED_OUT:
921	  fputs_filtered ("optimized out", outfile);
922	  break;
923	case LOC_COMPUTED:
924	case LOC_COMPUTED_ARG:
925	  fputs_filtered ("computed at runtime", outfile);
926	  break;
927	default:
928	  fputs_filtered ("<invalid location>", outfile);
929	  break;
930	}
931      fputs_filtered (", ", outfile);
932      deprecated_print_address_numeric (SYMBOL_VALUE_ADDRESS (*p), 1, outfile);
933      fprintf_filtered (outfile, "\n");
934      p++;
935    }
936}
937
938void
939maintenance_print_msymbols (char *args, int from_tty)
940{
941  char **argv;
942  struct ui_file *outfile;
943  struct cleanup *cleanups;
944  char *filename = DEV_TTY;
945  char *symname = NULL;
946  struct objfile *objfile;
947
948  struct stat sym_st, obj_st;
949
950  dont_repeat ();
951
952  if (args == NULL)
953    {
954      error (_("print-msymbols takes an output file name and optional symbol file name"));
955    }
956  else if ((argv = buildargv (args)) == NULL)
957    {
958      nomem (0);
959    }
960  cleanups = make_cleanup_freeargv (argv);
961
962  if (argv[0] != NULL)
963    {
964      filename = argv[0];
965      /* If a second arg is supplied, it is a source file name to match on */
966      if (argv[1] != NULL)
967	{
968	  symname = xfullpath (argv[1]);
969	  make_cleanup (xfree, symname);
970	  if (symname && stat (symname, &sym_st))
971	    perror_with_name (symname);
972	}
973    }
974
975  filename = tilde_expand (filename);
976  make_cleanup (xfree, filename);
977
978  outfile = gdb_fopen (filename, FOPEN_WT);
979  if (outfile == 0)
980    perror_with_name (filename);
981  make_cleanup_ui_file_delete (outfile);
982
983  immediate_quit++;
984  ALL_OBJFILES (objfile)
985    if (symname == NULL
986	|| (!stat (objfile->name, &obj_st) && sym_st.st_ino == obj_st.st_ino))
987      dump_msymbols (objfile, outfile);
988  immediate_quit--;
989  fprintf_filtered (outfile, "\n\n");
990  do_cleanups (cleanups);
991}
992
993void
994maintenance_print_objfiles (char *ignore, int from_tty)
995{
996  struct objfile *objfile;
997
998  dont_repeat ();
999
1000  immediate_quit++;
1001  ALL_OBJFILES (objfile)
1002    dump_objfile (objfile);
1003  immediate_quit--;
1004}
1005
1006
1007/* List all the symbol tables whose names match REGEXP (optional).  */
1008void
1009maintenance_info_symtabs (char *regexp, int from_tty)
1010{
1011  struct objfile *objfile;
1012
1013  if (regexp)
1014    re_comp (regexp);
1015
1016  ALL_OBJFILES (objfile)
1017    {
1018      struct symtab *symtab;
1019
1020      /* We don't want to print anything for this objfile until we
1021         actually find a symtab whose name matches.  */
1022      int printed_objfile_start = 0;
1023
1024      ALL_OBJFILE_SYMTABS (objfile, symtab)
1025        if (! regexp
1026            || re_exec (symtab->filename))
1027          {
1028            if (! printed_objfile_start)
1029              {
1030                printf_filtered ("{ objfile %s ", objfile->name);
1031                wrap_here ("  ");
1032                printf_filtered ("((struct objfile *) %p)\n", objfile);
1033                printed_objfile_start = 1;
1034              }
1035
1036            printf_filtered ("  { symtab %s ", symtab->filename);
1037            wrap_here ("    ");
1038            printf_filtered ("((struct symtab *) %p)\n", symtab);
1039            printf_filtered ("    dirname %s\n",
1040                             symtab->dirname ? symtab->dirname : "(null)");
1041            printf_filtered ("    fullname %s\n",
1042                             symtab->fullname ? symtab->fullname : "(null)");
1043            printf_filtered ("    blockvector ((struct blockvector *) %p)%s\n",
1044                             symtab->blockvector,
1045                             symtab->primary ? " (primary)" : "");
1046            printf_filtered ("    debugformat %s\n", symtab->debugformat);
1047            printf_filtered ("  }\n");
1048          }
1049
1050      if (printed_objfile_start)
1051        printf_filtered ("}\n");
1052    }
1053}
1054
1055
1056/* List all the partial symbol tables whose names match REGEXP (optional).  */
1057void
1058maintenance_info_psymtabs (char *regexp, int from_tty)
1059{
1060  struct objfile *objfile;
1061
1062  if (regexp)
1063    re_comp (regexp);
1064
1065  ALL_OBJFILES (objfile)
1066    {
1067      struct partial_symtab *psymtab;
1068
1069      /* We don't want to print anything for this objfile until we
1070         actually find a symtab whose name matches.  */
1071      int printed_objfile_start = 0;
1072
1073      ALL_OBJFILE_PSYMTABS (objfile, psymtab)
1074        if (! regexp
1075            || re_exec (psymtab->filename))
1076          {
1077            if (! printed_objfile_start)
1078              {
1079                printf_filtered ("{ objfile %s ", objfile->name);
1080                wrap_here ("  ");
1081                printf_filtered ("((struct objfile *) %p)\n", objfile);
1082                printed_objfile_start = 1;
1083              }
1084
1085            printf_filtered ("  { psymtab %s ", psymtab->filename);
1086            wrap_here ("    ");
1087            printf_filtered ("((struct partial_symtab *) %p)\n", psymtab);
1088            printf_filtered ("    readin %s\n",
1089                             psymtab->readin ? "yes" : "no");
1090            printf_filtered ("    fullname %s\n",
1091                             psymtab->fullname ? psymtab->fullname : "(null)");
1092            printf_filtered ("    text addresses ");
1093            deprecated_print_address_numeric (psymtab->textlow, 1, gdb_stdout);
1094            printf_filtered (" -- ");
1095            deprecated_print_address_numeric (psymtab->texthigh, 1, gdb_stdout);
1096            printf_filtered ("\n");
1097            printf_filtered ("    globals ");
1098            if (psymtab->n_global_syms)
1099              {
1100                printf_filtered ("(* (struct partial_symbol **) %p @ %d)\n",
1101                                 (psymtab->objfile->global_psymbols.list
1102                                  + psymtab->globals_offset),
1103                                 psymtab->n_global_syms);
1104              }
1105            else
1106              printf_filtered ("(none)\n");
1107            printf_filtered ("    statics ");
1108            if (psymtab->n_static_syms)
1109              {
1110                printf_filtered ("(* (struct partial_symbol **) %p @ %d)\n",
1111                                 (psymtab->objfile->static_psymbols.list
1112                                  + psymtab->statics_offset),
1113                                 psymtab->n_static_syms);
1114              }
1115            else
1116              printf_filtered ("(none)\n");
1117            printf_filtered ("    dependencies ");
1118            if (psymtab->number_of_dependencies)
1119              {
1120                int i;
1121
1122                printf_filtered ("{\n");
1123                for (i = 0; i < psymtab->number_of_dependencies; i++)
1124                  {
1125                    struct partial_symtab *dep = psymtab->dependencies[i];
1126
1127                    /* Note the string concatenation there --- no comma.  */
1128                    printf_filtered ("      psymtab %s "
1129                                     "((struct partial_symtab *) %p)\n",
1130                                     dep->filename, dep);
1131                  }
1132                printf_filtered ("    }\n");
1133              }
1134            else
1135              printf_filtered ("(none)\n");
1136            printf_filtered ("  }\n");
1137          }
1138
1139      if (printed_objfile_start)
1140        printf_filtered ("}\n");
1141    }
1142}
1143
1144
1145/* Check consistency of psymtabs and symtabs.  */
1146
1147void
1148maintenance_check_symtabs (char *ignore, int from_tty)
1149{
1150  struct symbol *sym;
1151  struct partial_symbol **psym;
1152  struct symtab *s = NULL;
1153  struct partial_symtab *ps;
1154  struct blockvector *bv;
1155  struct objfile *objfile;
1156  struct block *b;
1157  int length;
1158
1159  ALL_PSYMTABS (objfile, ps)
1160  {
1161    s = PSYMTAB_TO_SYMTAB (ps);
1162    if (s == NULL)
1163      continue;
1164    bv = BLOCKVECTOR (s);
1165    b = BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK);
1166    psym = ps->objfile->static_psymbols.list + ps->statics_offset;
1167    length = ps->n_static_syms;
1168    while (length--)
1169      {
1170	sym = lookup_block_symbol (b, DEPRECATED_SYMBOL_NAME (*psym),
1171				   NULL, SYMBOL_DOMAIN (*psym));
1172	if (!sym)
1173	  {
1174	    printf_filtered ("Static symbol `");
1175	    puts_filtered (DEPRECATED_SYMBOL_NAME (*psym));
1176	    printf_filtered ("' only found in ");
1177	    puts_filtered (ps->filename);
1178	    printf_filtered (" psymtab\n");
1179	  }
1180	psym++;
1181      }
1182    b = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
1183    psym = ps->objfile->global_psymbols.list + ps->globals_offset;
1184    length = ps->n_global_syms;
1185    while (length--)
1186      {
1187	sym = lookup_block_symbol (b, DEPRECATED_SYMBOL_NAME (*psym),
1188				   NULL, SYMBOL_DOMAIN (*psym));
1189	if (!sym)
1190	  {
1191	    printf_filtered ("Global symbol `");
1192	    puts_filtered (DEPRECATED_SYMBOL_NAME (*psym));
1193	    printf_filtered ("' only found in ");
1194	    puts_filtered (ps->filename);
1195	    printf_filtered (" psymtab\n");
1196	  }
1197	psym++;
1198      }
1199    if (ps->texthigh < ps->textlow)
1200      {
1201	printf_filtered ("Psymtab ");
1202	puts_filtered (ps->filename);
1203	printf_filtered (" covers bad range ");
1204	deprecated_print_address_numeric (ps->textlow, 1, gdb_stdout);
1205	printf_filtered (" - ");
1206	deprecated_print_address_numeric (ps->texthigh, 1, gdb_stdout);
1207	printf_filtered ("\n");
1208	continue;
1209      }
1210    if (ps->texthigh == 0)
1211      continue;
1212    if (ps->textlow < BLOCK_START (b) || ps->texthigh > BLOCK_END (b))
1213      {
1214	printf_filtered ("Psymtab ");
1215	puts_filtered (ps->filename);
1216	printf_filtered (" covers ");
1217	deprecated_print_address_numeric (ps->textlow, 1, gdb_stdout);
1218	printf_filtered (" - ");
1219	deprecated_print_address_numeric (ps->texthigh, 1, gdb_stdout);
1220	printf_filtered (" but symtab covers only ");
1221	deprecated_print_address_numeric (BLOCK_START (b), 1, gdb_stdout);
1222	printf_filtered (" - ");
1223	deprecated_print_address_numeric (BLOCK_END (b), 1, gdb_stdout);
1224	printf_filtered ("\n");
1225      }
1226  }
1227}
1228
1229
1230/* Return the nexting depth of a block within other blocks in its symtab.  */
1231
1232static int
1233block_depth (struct block *block)
1234{
1235  int i = 0;
1236  while ((block = BLOCK_SUPERBLOCK (block)) != NULL)
1237    {
1238      i++;
1239    }
1240  return i;
1241}
1242
1243
1244/* Increase the space allocated for LISTP, which is probably
1245   global_psymbols or static_psymbols. This space will eventually
1246   be freed in free_objfile().  */
1247
1248void
1249extend_psymbol_list (struct psymbol_allocation_list *listp,
1250		     struct objfile *objfile)
1251{
1252  int new_size;
1253  if (listp->size == 0)
1254    {
1255      new_size = 255;
1256      listp->list = (struct partial_symbol **)
1257	xmalloc (new_size * sizeof (struct partial_symbol *));
1258    }
1259  else
1260    {
1261      new_size = listp->size * 2;
1262      listp->list = (struct partial_symbol **)
1263	xrealloc ((char *) listp->list,
1264		  new_size * sizeof (struct partial_symbol *));
1265    }
1266  /* Next assumes we only went one over.  Should be good if
1267     program works correctly */
1268  listp->next = listp->list + listp->size;
1269  listp->size = new_size;
1270}
1271
1272
1273/* Do early runtime initializations. */
1274void
1275_initialize_symmisc (void)
1276{
1277  std_in = stdin;
1278  std_out = stdout;
1279  std_err = stderr;
1280}
1281