OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-old/] [gdb-6.8/] [gdb/] [symmisc.c] - Diff between revs 827 and 840

Go to most recent revision | Only display areas with differences | Details | Blame | View Log

Rev 827 Rev 840
/* Do various things to symbol tables (other than lookup), for GDB.
/* Do various things to symbol tables (other than lookup), for GDB.
 
 
   Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995,
   Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995,
   1996, 1997, 1998, 1999, 2000, 2002, 2003, 2004, 2007, 2008
   1996, 1997, 1998, 1999, 2000, 2002, 2003, 2004, 2007, 2008
   Free Software Foundation, Inc.
   Free Software Foundation, Inc.
 
 
   This file is part of GDB.
   This file is part of GDB.
 
 
   This program is free software; you can redistribute it and/or modify
   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.
   (at your option) any later version.
 
 
   This program is distributed in the hope that it will be useful,
   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.
   GNU General Public License for more details.
 
 
   You should have received a copy of the GNU General Public License
   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 
#include "defs.h"
#include "defs.h"
#include "symtab.h"
#include "symtab.h"
#include "gdbtypes.h"
#include "gdbtypes.h"
#include "bfd.h"
#include "bfd.h"
#include "symfile.h"
#include "symfile.h"
#include "objfiles.h"
#include "objfiles.h"
#include "breakpoint.h"
#include "breakpoint.h"
#include "command.h"
#include "command.h"
#include "gdb_obstack.h"
#include "gdb_obstack.h"
#include "exceptions.h"
#include "exceptions.h"
#include "language.h"
#include "language.h"
#include "bcache.h"
#include "bcache.h"
#include "block.h"
#include "block.h"
#include "gdb_regex.h"
#include "gdb_regex.h"
#include "gdb_stat.h"
#include "gdb_stat.h"
#include "dictionary.h"
#include "dictionary.h"
 
 
#include "gdb_string.h"
#include "gdb_string.h"
#include "readline/readline.h"
#include "readline/readline.h"
 
 
#ifndef DEV_TTY
#ifndef DEV_TTY
#define DEV_TTY "/dev/tty"
#define DEV_TTY "/dev/tty"
#endif
#endif
 
 
/* Unfortunately for debugging, stderr is usually a macro.  This is painful
/* Unfortunately for debugging, stderr is usually a macro.  This is painful
   when calling functions that take FILE *'s from the debugger.
   when calling functions that take FILE *'s from the debugger.
   So we make a variable which has the same value and which is accessible when
   So we make a variable which has the same value and which is accessible when
   debugging GDB with itself.  Because stdin et al need not be constants,
   debugging GDB with itself.  Because stdin et al need not be constants,
   we initialize them in the _initialize_symmisc function at the bottom
   we initialize them in the _initialize_symmisc function at the bottom
   of the file.  */
   of the file.  */
FILE *std_in;
FILE *std_in;
FILE *std_out;
FILE *std_out;
FILE *std_err;
FILE *std_err;
 
 
/* Prototypes for local functions */
/* Prototypes for local functions */
 
 
static void dump_symtab (struct objfile *, struct symtab *,
static void dump_symtab (struct objfile *, struct symtab *,
                         struct ui_file *);
                         struct ui_file *);
 
 
static void dump_psymtab (struct objfile *, struct partial_symtab *,
static void dump_psymtab (struct objfile *, struct partial_symtab *,
                          struct ui_file *);
                          struct ui_file *);
 
 
static void dump_msymbols (struct objfile *, struct ui_file *);
static void dump_msymbols (struct objfile *, struct ui_file *);
 
 
static void dump_objfile (struct objfile *);
static void dump_objfile (struct objfile *);
 
 
static int block_depth (struct block *);
static int block_depth (struct block *);
 
 
static void print_partial_symbols (struct partial_symbol **, int,
static void print_partial_symbols (struct partial_symbol **, int,
                                   char *, struct ui_file *);
                                   char *, struct ui_file *);
 
 
static void free_symtab_block (struct objfile *, struct block *);
static void free_symtab_block (struct objfile *, struct block *);
 
 
void _initialize_symmisc (void);
void _initialize_symmisc (void);
 
 
struct print_symbol_args
struct print_symbol_args
  {
  {
    struct symbol *symbol;
    struct symbol *symbol;
    int depth;
    int depth;
    struct ui_file *outfile;
    struct ui_file *outfile;
  };
  };
 
 
static int print_symbol (void *);
static int print_symbol (void *);
 
 
static void free_symtab_block (struct objfile *, struct block *);
static void free_symtab_block (struct objfile *, struct block *);


 
 
/* Free a struct block <- B and all the symbols defined in that block.  */
/* Free a struct block <- B and all the symbols defined in that block.  */
 
 
/* FIXME: carlton/2003-04-28: I don't believe this is currently ever
/* FIXME: carlton/2003-04-28: I don't believe this is currently ever
   used.  */
   used.  */
 
 
static void
static void
free_symtab_block (struct objfile *objfile, struct block *b)
free_symtab_block (struct objfile *objfile, struct block *b)
{
{
  struct dict_iterator iter;
  struct dict_iterator iter;
  struct symbol *sym;
  struct symbol *sym;
 
 
  ALL_BLOCK_SYMBOLS (b, iter, sym)
  ALL_BLOCK_SYMBOLS (b, iter, sym)
    {
    {
      xfree (DEPRECATED_SYMBOL_NAME (sym));
      xfree (DEPRECATED_SYMBOL_NAME (sym));
      xfree (sym);
      xfree (sym);
    }
    }
 
 
  dict_free (BLOCK_DICT (b));
  dict_free (BLOCK_DICT (b));
  xfree (b);
  xfree (b);
}
}
 
 
/* Free all the storage associated with the struct symtab <- S.
/* Free all the storage associated with the struct symtab <- S.
   Note that some symtabs have contents malloc'ed structure by structure,
   Note that some symtabs have contents malloc'ed structure by structure,
   while some have contents that all live inside one big block of memory,
   while some have contents that all live inside one big block of memory,
   and some share the contents of another symbol table and so you should
   and some share the contents of another symbol table and so you should
   not free the contents on their behalf (except sometimes the linetable,
   not free the contents on their behalf (except sometimes the linetable,
   which maybe per symtab even when the rest is not).
   which maybe per symtab even when the rest is not).
   It is s->free_code that says which alternative to use.  */
   It is s->free_code that says which alternative to use.  */
 
 
void
void
free_symtab (struct symtab *s)
free_symtab (struct symtab *s)
{
{
  int i, n;
  int i, n;
  struct blockvector *bv;
  struct blockvector *bv;
 
 
  switch (s->free_code)
  switch (s->free_code)
    {
    {
    case free_nothing:
    case free_nothing:
      /* All the contents are part of a big block of memory (an obstack),
      /* All the contents are part of a big block of memory (an obstack),
         and some other symtab is in charge of freeing that block.
         and some other symtab is in charge of freeing that block.
         Therefore, do nothing.  */
         Therefore, do nothing.  */
      break;
      break;
 
 
    case free_contents:
    case free_contents:
      /* Here all the contents were malloc'ed structure by structure
      /* Here all the contents were malloc'ed structure by structure
         and must be freed that way.  */
         and must be freed that way.  */
      /* First free the blocks (and their symbols.  */
      /* First free the blocks (and their symbols.  */
      bv = BLOCKVECTOR (s);
      bv = BLOCKVECTOR (s);
      n = BLOCKVECTOR_NBLOCKS (bv);
      n = BLOCKVECTOR_NBLOCKS (bv);
      for (i = 0; i < n; i++)
      for (i = 0; i < n; i++)
        free_symtab_block (s->objfile, BLOCKVECTOR_BLOCK (bv, i));
        free_symtab_block (s->objfile, BLOCKVECTOR_BLOCK (bv, i));
      /* Free the blockvector itself.  */
      /* Free the blockvector itself.  */
      xfree (bv);
      xfree (bv);
      /* Also free the linetable.  */
      /* Also free the linetable.  */
 
 
    case free_linetable:
    case free_linetable:
      /* Everything will be freed either by our `free_func'
      /* Everything will be freed either by our `free_func'
         or by some other symtab, except for our linetable.
         or by some other symtab, except for our linetable.
         Free that now.  */
         Free that now.  */
      if (LINETABLE (s))
      if (LINETABLE (s))
        xfree (LINETABLE (s));
        xfree (LINETABLE (s));
      break;
      break;
    }
    }
 
 
  /* If there is a single block of memory to free, free it.  */
  /* If there is a single block of memory to free, free it.  */
  if (s->free_func != NULL)
  if (s->free_func != NULL)
    s->free_func (s);
    s->free_func (s);
 
 
  /* Free source-related stuff */
  /* Free source-related stuff */
  if (s->line_charpos != NULL)
  if (s->line_charpos != NULL)
    xfree (s->line_charpos);
    xfree (s->line_charpos);
  if (s->fullname != NULL)
  if (s->fullname != NULL)
    xfree (s->fullname);
    xfree (s->fullname);
  if (s->debugformat != NULL)
  if (s->debugformat != NULL)
    xfree (s->debugformat);
    xfree (s->debugformat);
  xfree (s);
  xfree (s);
}
}
 
 
void
void
print_symbol_bcache_statistics (void)
print_symbol_bcache_statistics (void)
{
{
  struct objfile *objfile;
  struct objfile *objfile;
 
 
  immediate_quit++;
  immediate_quit++;
  ALL_OBJFILES (objfile)
  ALL_OBJFILES (objfile)
  {
  {
    printf_filtered (_("Byte cache statistics for '%s':\n"), objfile->name);
    printf_filtered (_("Byte cache statistics for '%s':\n"), objfile->name);
    print_bcache_statistics (objfile->psymbol_cache, "partial symbol cache");
    print_bcache_statistics (objfile->psymbol_cache, "partial symbol cache");
  }
  }
  immediate_quit--;
  immediate_quit--;
}
}
 
 
void
void
print_objfile_statistics (void)
print_objfile_statistics (void)
{
{
  struct objfile *objfile;
  struct objfile *objfile;
  struct symtab *s;
  struct symtab *s;
  struct partial_symtab *ps;
  struct partial_symtab *ps;
  int i, linetables, blockvectors;
  int i, linetables, blockvectors;
 
 
  immediate_quit++;
  immediate_quit++;
  ALL_OBJFILES (objfile)
  ALL_OBJFILES (objfile)
  {
  {
    printf_filtered (_("Statistics for '%s':\n"), objfile->name);
    printf_filtered (_("Statistics for '%s':\n"), objfile->name);
    if (OBJSTAT (objfile, n_stabs) > 0)
    if (OBJSTAT (objfile, n_stabs) > 0)
      printf_filtered (_("  Number of \"stab\" symbols read: %d\n"),
      printf_filtered (_("  Number of \"stab\" symbols read: %d\n"),
                       OBJSTAT (objfile, n_stabs));
                       OBJSTAT (objfile, n_stabs));
    if (OBJSTAT (objfile, n_minsyms) > 0)
    if (OBJSTAT (objfile, n_minsyms) > 0)
      printf_filtered (_("  Number of \"minimal\" symbols read: %d\n"),
      printf_filtered (_("  Number of \"minimal\" symbols read: %d\n"),
                       OBJSTAT (objfile, n_minsyms));
                       OBJSTAT (objfile, n_minsyms));
    if (OBJSTAT (objfile, n_psyms) > 0)
    if (OBJSTAT (objfile, n_psyms) > 0)
      printf_filtered (_("  Number of \"partial\" symbols read: %d\n"),
      printf_filtered (_("  Number of \"partial\" symbols read: %d\n"),
                       OBJSTAT (objfile, n_psyms));
                       OBJSTAT (objfile, n_psyms));
    if (OBJSTAT (objfile, n_syms) > 0)
    if (OBJSTAT (objfile, n_syms) > 0)
      printf_filtered (_("  Number of \"full\" symbols read: %d\n"),
      printf_filtered (_("  Number of \"full\" symbols read: %d\n"),
                       OBJSTAT (objfile, n_syms));
                       OBJSTAT (objfile, n_syms));
    if (OBJSTAT (objfile, n_types) > 0)
    if (OBJSTAT (objfile, n_types) > 0)
      printf_filtered (_("  Number of \"types\" defined: %d\n"),
      printf_filtered (_("  Number of \"types\" defined: %d\n"),
                       OBJSTAT (objfile, n_types));
                       OBJSTAT (objfile, n_types));
    i = 0;
    i = 0;
    ALL_OBJFILE_PSYMTABS (objfile, ps)
    ALL_OBJFILE_PSYMTABS (objfile, ps)
      {
      {
        if (ps->readin == 0)
        if (ps->readin == 0)
          i++;
          i++;
      }
      }
    printf_filtered (_("  Number of psym tables (not yet expanded): %d\n"), i);
    printf_filtered (_("  Number of psym tables (not yet expanded): %d\n"), i);
    i = linetables = blockvectors = 0;
    i = linetables = blockvectors = 0;
    ALL_OBJFILE_SYMTABS (objfile, s)
    ALL_OBJFILE_SYMTABS (objfile, s)
      {
      {
        i++;
        i++;
        if (s->linetable != NULL)
        if (s->linetable != NULL)
          linetables++;
          linetables++;
        if (s->primary == 1)
        if (s->primary == 1)
          blockvectors++;
          blockvectors++;
      }
      }
    printf_filtered (_("  Number of symbol tables: %d\n"), i);
    printf_filtered (_("  Number of symbol tables: %d\n"), i);
    printf_filtered (_("  Number of symbol tables with line tables: %d\n"),
    printf_filtered (_("  Number of symbol tables with line tables: %d\n"),
                     linetables);
                     linetables);
    printf_filtered (_("  Number of symbol tables with blockvectors: %d\n"),
    printf_filtered (_("  Number of symbol tables with blockvectors: %d\n"),
                     blockvectors);
                     blockvectors);
 
 
    if (OBJSTAT (objfile, sz_strtab) > 0)
    if (OBJSTAT (objfile, sz_strtab) > 0)
      printf_filtered (_("  Space used by a.out string tables: %d\n"),
      printf_filtered (_("  Space used by a.out string tables: %d\n"),
                       OBJSTAT (objfile, sz_strtab));
                       OBJSTAT (objfile, sz_strtab));
    printf_filtered (_("  Total memory used for objfile obstack: %d\n"),
    printf_filtered (_("  Total memory used for objfile obstack: %d\n"),
                     obstack_memory_used (&objfile->objfile_obstack));
                     obstack_memory_used (&objfile->objfile_obstack));
    printf_filtered (_("  Total memory used for psymbol cache: %d\n"),
    printf_filtered (_("  Total memory used for psymbol cache: %d\n"),
                     bcache_memory_used (objfile->psymbol_cache));
                     bcache_memory_used (objfile->psymbol_cache));
    printf_filtered (_("  Total memory used for macro cache: %d\n"),
    printf_filtered (_("  Total memory used for macro cache: %d\n"),
                     bcache_memory_used (objfile->macro_cache));
                     bcache_memory_used (objfile->macro_cache));
  }
  }
  immediate_quit--;
  immediate_quit--;
}
}
 
 
static void
static void
dump_objfile (struct objfile *objfile)
dump_objfile (struct objfile *objfile)
{
{
  struct symtab *symtab;
  struct symtab *symtab;
  struct partial_symtab *psymtab;
  struct partial_symtab *psymtab;
 
 
  printf_filtered ("\nObject file %s:  ", objfile->name);
  printf_filtered ("\nObject file %s:  ", objfile->name);
  printf_filtered ("Objfile at ");
  printf_filtered ("Objfile at ");
  gdb_print_host_address (objfile, gdb_stdout);
  gdb_print_host_address (objfile, gdb_stdout);
  printf_filtered (", bfd at ");
  printf_filtered (", bfd at ");
  gdb_print_host_address (objfile->obfd, gdb_stdout);
  gdb_print_host_address (objfile->obfd, gdb_stdout);
  printf_filtered (", %d minsyms\n\n",
  printf_filtered (", %d minsyms\n\n",
                   objfile->minimal_symbol_count);
                   objfile->minimal_symbol_count);
 
 
  if (objfile->psymtabs)
  if (objfile->psymtabs)
    {
    {
      printf_filtered ("Psymtabs:\n");
      printf_filtered ("Psymtabs:\n");
      for (psymtab = objfile->psymtabs;
      for (psymtab = objfile->psymtabs;
           psymtab != NULL;
           psymtab != NULL;
           psymtab = psymtab->next)
           psymtab = psymtab->next)
        {
        {
          printf_filtered ("%s at ",
          printf_filtered ("%s at ",
                           psymtab->filename);
                           psymtab->filename);
          gdb_print_host_address (psymtab, gdb_stdout);
          gdb_print_host_address (psymtab, gdb_stdout);
          printf_filtered (", ");
          printf_filtered (", ");
          if (psymtab->objfile != objfile)
          if (psymtab->objfile != objfile)
            {
            {
              printf_filtered ("NOT ON CHAIN!  ");
              printf_filtered ("NOT ON CHAIN!  ");
            }
            }
          wrap_here ("  ");
          wrap_here ("  ");
        }
        }
      printf_filtered ("\n\n");
      printf_filtered ("\n\n");
    }
    }
 
 
  if (objfile->symtabs)
  if (objfile->symtabs)
    {
    {
      printf_filtered ("Symtabs:\n");
      printf_filtered ("Symtabs:\n");
      for (symtab = objfile->symtabs;
      for (symtab = objfile->symtabs;
           symtab != NULL;
           symtab != NULL;
           symtab = symtab->next)
           symtab = symtab->next)
        {
        {
          printf_filtered ("%s at ", symtab->filename);
          printf_filtered ("%s at ", symtab->filename);
          gdb_print_host_address (symtab, gdb_stdout);
          gdb_print_host_address (symtab, gdb_stdout);
          printf_filtered (", ");
          printf_filtered (", ");
          if (symtab->objfile != objfile)
          if (symtab->objfile != objfile)
            {
            {
              printf_filtered ("NOT ON CHAIN!  ");
              printf_filtered ("NOT ON CHAIN!  ");
            }
            }
          wrap_here ("  ");
          wrap_here ("  ");
        }
        }
      printf_filtered ("\n\n");
      printf_filtered ("\n\n");
    }
    }
}
}
 
 
/* Print minimal symbols from this objfile.  */
/* Print minimal symbols from this objfile.  */
 
 
static void
static void
dump_msymbols (struct objfile *objfile, struct ui_file *outfile)
dump_msymbols (struct objfile *objfile, struct ui_file *outfile)
{
{
  struct minimal_symbol *msymbol;
  struct minimal_symbol *msymbol;
  int index;
  int index;
  char ms_type;
  char ms_type;
 
 
  fprintf_filtered (outfile, "\nObject file %s:\n\n", objfile->name);
  fprintf_filtered (outfile, "\nObject file %s:\n\n", objfile->name);
  if (objfile->minimal_symbol_count == 0)
  if (objfile->minimal_symbol_count == 0)
    {
    {
      fprintf_filtered (outfile, "No minimal symbols found.\n");
      fprintf_filtered (outfile, "No minimal symbols found.\n");
      return;
      return;
    }
    }
  for (index = 0, msymbol = objfile->msymbols;
  for (index = 0, msymbol = objfile->msymbols;
       DEPRECATED_SYMBOL_NAME (msymbol) != NULL; msymbol++, index++)
       DEPRECATED_SYMBOL_NAME (msymbol) != NULL; msymbol++, index++)
    {
    {
      switch (msymbol->type)
      switch (msymbol->type)
        {
        {
        case mst_unknown:
        case mst_unknown:
          ms_type = 'u';
          ms_type = 'u';
          break;
          break;
        case mst_text:
        case mst_text:
          ms_type = 'T';
          ms_type = 'T';
          break;
          break;
        case mst_solib_trampoline:
        case mst_solib_trampoline:
          ms_type = 'S';
          ms_type = 'S';
          break;
          break;
        case mst_data:
        case mst_data:
          ms_type = 'D';
          ms_type = 'D';
          break;
          break;
        case mst_bss:
        case mst_bss:
          ms_type = 'B';
          ms_type = 'B';
          break;
          break;
        case mst_abs:
        case mst_abs:
          ms_type = 'A';
          ms_type = 'A';
          break;
          break;
        case mst_file_text:
        case mst_file_text:
          ms_type = 't';
          ms_type = 't';
          break;
          break;
        case mst_file_data:
        case mst_file_data:
          ms_type = 'd';
          ms_type = 'd';
          break;
          break;
        case mst_file_bss:
        case mst_file_bss:
          ms_type = 'b';
          ms_type = 'b';
          break;
          break;
        default:
        default:
          ms_type = '?';
          ms_type = '?';
          break;
          break;
        }
        }
      fprintf_filtered (outfile, "[%2d] %c ", index, ms_type);
      fprintf_filtered (outfile, "[%2d] %c ", index, ms_type);
      fputs_filtered (paddress (SYMBOL_VALUE_ADDRESS (msymbol)), outfile);
      fputs_filtered (paddress (SYMBOL_VALUE_ADDRESS (msymbol)), outfile);
      fprintf_filtered (outfile, " %s", DEPRECATED_SYMBOL_NAME (msymbol));
      fprintf_filtered (outfile, " %s", DEPRECATED_SYMBOL_NAME (msymbol));
      if (SYMBOL_BFD_SECTION (msymbol))
      if (SYMBOL_BFD_SECTION (msymbol))
        fprintf_filtered (outfile, " section %s",
        fprintf_filtered (outfile, " section %s",
                          bfd_section_name (objfile->obfd,
                          bfd_section_name (objfile->obfd,
                                            SYMBOL_BFD_SECTION (msymbol)));
                                            SYMBOL_BFD_SECTION (msymbol)));
      if (SYMBOL_DEMANGLED_NAME (msymbol) != NULL)
      if (SYMBOL_DEMANGLED_NAME (msymbol) != NULL)
        {
        {
          fprintf_filtered (outfile, "  %s", SYMBOL_DEMANGLED_NAME (msymbol));
          fprintf_filtered (outfile, "  %s", SYMBOL_DEMANGLED_NAME (msymbol));
        }
        }
      if (msymbol->filename)
      if (msymbol->filename)
        fprintf_filtered (outfile, "  %s", msymbol->filename);
        fprintf_filtered (outfile, "  %s", msymbol->filename);
      fputs_filtered ("\n", outfile);
      fputs_filtered ("\n", outfile);
    }
    }
  if (objfile->minimal_symbol_count != index)
  if (objfile->minimal_symbol_count != index)
    {
    {
      warning (_("internal error:  minimal symbol count %d != %d"),
      warning (_("internal error:  minimal symbol count %d != %d"),
               objfile->minimal_symbol_count, index);
               objfile->minimal_symbol_count, index);
    }
    }
  fprintf_filtered (outfile, "\n");
  fprintf_filtered (outfile, "\n");
}
}
 
 
static void
static void
dump_psymtab (struct objfile *objfile, struct partial_symtab *psymtab,
dump_psymtab (struct objfile *objfile, struct partial_symtab *psymtab,
              struct ui_file *outfile)
              struct ui_file *outfile)
{
{
  int i;
  int i;
 
 
  fprintf_filtered (outfile, "\nPartial symtab for source file %s ",
  fprintf_filtered (outfile, "\nPartial symtab for source file %s ",
                    psymtab->filename);
                    psymtab->filename);
  fprintf_filtered (outfile, "(object ");
  fprintf_filtered (outfile, "(object ");
  gdb_print_host_address (psymtab, outfile);
  gdb_print_host_address (psymtab, outfile);
  fprintf_filtered (outfile, ")\n\n");
  fprintf_filtered (outfile, ")\n\n");
  fprintf_unfiltered (outfile, "  Read from object file %s (",
  fprintf_unfiltered (outfile, "  Read from object file %s (",
                      objfile->name);
                      objfile->name);
  gdb_print_host_address (objfile, outfile);
  gdb_print_host_address (objfile, outfile);
  fprintf_unfiltered (outfile, ")\n");
  fprintf_unfiltered (outfile, ")\n");
 
 
  if (psymtab->readin)
  if (psymtab->readin)
    {
    {
      fprintf_filtered (outfile,
      fprintf_filtered (outfile,
                        "  Full symtab was read (at ");
                        "  Full symtab was read (at ");
      gdb_print_host_address (psymtab->symtab, outfile);
      gdb_print_host_address (psymtab->symtab, outfile);
      fprintf_filtered (outfile, " by function at ");
      fprintf_filtered (outfile, " by function at ");
      gdb_print_host_address (psymtab->read_symtab, outfile);
      gdb_print_host_address (psymtab->read_symtab, outfile);
      fprintf_filtered (outfile, ")\n");
      fprintf_filtered (outfile, ")\n");
    }
    }
 
 
  fprintf_filtered (outfile, "  Relocate symbols by ");
  fprintf_filtered (outfile, "  Relocate symbols by ");
  for (i = 0; i < psymtab->objfile->num_sections; ++i)
  for (i = 0; i < psymtab->objfile->num_sections; ++i)
    {
    {
      if (i != 0)
      if (i != 0)
        fprintf_filtered (outfile, ", ");
        fprintf_filtered (outfile, ", ");
      wrap_here ("    ");
      wrap_here ("    ");
      fputs_filtered (paddress (ANOFFSET (psymtab->section_offsets, i)),
      fputs_filtered (paddress (ANOFFSET (psymtab->section_offsets, i)),
                      outfile);
                      outfile);
    }
    }
  fprintf_filtered (outfile, "\n");
  fprintf_filtered (outfile, "\n");
 
 
  fprintf_filtered (outfile, "  Symbols cover text addresses ");
  fprintf_filtered (outfile, "  Symbols cover text addresses ");
  fputs_filtered (paddress (psymtab->textlow), outfile);
  fputs_filtered (paddress (psymtab->textlow), outfile);
  fprintf_filtered (outfile, "-");
  fprintf_filtered (outfile, "-");
  fputs_filtered (paddress (psymtab->texthigh), outfile);
  fputs_filtered (paddress (psymtab->texthigh), outfile);
  fprintf_filtered (outfile, "\n");
  fprintf_filtered (outfile, "\n");
  fprintf_filtered (outfile, "  Depends on %d other partial symtabs.\n",
  fprintf_filtered (outfile, "  Depends on %d other partial symtabs.\n",
                    psymtab->number_of_dependencies);
                    psymtab->number_of_dependencies);
  for (i = 0; i < psymtab->number_of_dependencies; i++)
  for (i = 0; i < psymtab->number_of_dependencies; i++)
    {
    {
      fprintf_filtered (outfile, "    %d ", i);
      fprintf_filtered (outfile, "    %d ", i);
      gdb_print_host_address (psymtab->dependencies[i], outfile);
      gdb_print_host_address (psymtab->dependencies[i], outfile);
      fprintf_filtered (outfile, " %s\n",
      fprintf_filtered (outfile, " %s\n",
                        psymtab->dependencies[i]->filename);
                        psymtab->dependencies[i]->filename);
    }
    }
  if (psymtab->n_global_syms > 0)
  if (psymtab->n_global_syms > 0)
    {
    {
      print_partial_symbols (objfile->global_psymbols.list
      print_partial_symbols (objfile->global_psymbols.list
                             + psymtab->globals_offset,
                             + psymtab->globals_offset,
                             psymtab->n_global_syms, "Global", outfile);
                             psymtab->n_global_syms, "Global", outfile);
    }
    }
  if (psymtab->n_static_syms > 0)
  if (psymtab->n_static_syms > 0)
    {
    {
      print_partial_symbols (objfile->static_psymbols.list
      print_partial_symbols (objfile->static_psymbols.list
                             + psymtab->statics_offset,
                             + psymtab->statics_offset,
                             psymtab->n_static_syms, "Static", outfile);
                             psymtab->n_static_syms, "Static", outfile);
    }
    }
  fprintf_filtered (outfile, "\n");
  fprintf_filtered (outfile, "\n");
}
}
 
 
static void
static void
dump_symtab_1 (struct objfile *objfile, struct symtab *symtab,
dump_symtab_1 (struct objfile *objfile, struct symtab *symtab,
               struct ui_file *outfile)
               struct ui_file *outfile)
{
{
  int i;
  int i;
  struct dict_iterator iter;
  struct dict_iterator iter;
  int len, blen;
  int len, blen;
  struct linetable *l;
  struct linetable *l;
  struct blockvector *bv;
  struct blockvector *bv;
  struct symbol *sym;
  struct symbol *sym;
  struct block *b;
  struct block *b;
  int depth;
  int depth;
 
 
  fprintf_filtered (outfile, "\nSymtab for file %s\n", symtab->filename);
  fprintf_filtered (outfile, "\nSymtab for file %s\n", symtab->filename);
  if (symtab->dirname)
  if (symtab->dirname)
    fprintf_filtered (outfile, "Compilation directory is %s\n",
    fprintf_filtered (outfile, "Compilation directory is %s\n",
                      symtab->dirname);
                      symtab->dirname);
  fprintf_filtered (outfile, "Read from object file %s (", objfile->name);
  fprintf_filtered (outfile, "Read from object file %s (", objfile->name);
  gdb_print_host_address (objfile, outfile);
  gdb_print_host_address (objfile, outfile);
  fprintf_filtered (outfile, ")\n");
  fprintf_filtered (outfile, ")\n");
  fprintf_filtered (outfile, "Language: %s\n", language_str (symtab->language));
  fprintf_filtered (outfile, "Language: %s\n", language_str (symtab->language));
 
 
  /* First print the line table.  */
  /* First print the line table.  */
  l = LINETABLE (symtab);
  l = LINETABLE (symtab);
  if (l)
  if (l)
    {
    {
      fprintf_filtered (outfile, "\nLine table:\n\n");
      fprintf_filtered (outfile, "\nLine table:\n\n");
      len = l->nitems;
      len = l->nitems;
      for (i = 0; i < len; i++)
      for (i = 0; i < len; i++)
        {
        {
          fprintf_filtered (outfile, " line %d at ", l->item[i].line);
          fprintf_filtered (outfile, " line %d at ", l->item[i].line);
          fputs_filtered (paddress (l->item[i].pc), outfile);
          fputs_filtered (paddress (l->item[i].pc), outfile);
          fprintf_filtered (outfile, "\n");
          fprintf_filtered (outfile, "\n");
        }
        }
    }
    }
  /* Now print the block info, but only for primary symtabs since we will
  /* Now print the block info, but only for primary symtabs since we will
     print lots of duplicate info otherwise. */
     print lots of duplicate info otherwise. */
  if (symtab->primary)
  if (symtab->primary)
    {
    {
      fprintf_filtered (outfile, "\nBlockvector:\n\n");
      fprintf_filtered (outfile, "\nBlockvector:\n\n");
      bv = BLOCKVECTOR (symtab);
      bv = BLOCKVECTOR (symtab);
      len = BLOCKVECTOR_NBLOCKS (bv);
      len = BLOCKVECTOR_NBLOCKS (bv);
      for (i = 0; i < len; i++)
      for (i = 0; i < len; i++)
        {
        {
          b = BLOCKVECTOR_BLOCK (bv, i);
          b = BLOCKVECTOR_BLOCK (bv, i);
          depth = block_depth (b) * 2;
          depth = block_depth (b) * 2;
          print_spaces (depth, outfile);
          print_spaces (depth, outfile);
          fprintf_filtered (outfile, "block #%03d, object at ", i);
          fprintf_filtered (outfile, "block #%03d, object at ", i);
          gdb_print_host_address (b, outfile);
          gdb_print_host_address (b, outfile);
          if (BLOCK_SUPERBLOCK (b))
          if (BLOCK_SUPERBLOCK (b))
            {
            {
              fprintf_filtered (outfile, " under ");
              fprintf_filtered (outfile, " under ");
              gdb_print_host_address (BLOCK_SUPERBLOCK (b), outfile);
              gdb_print_host_address (BLOCK_SUPERBLOCK (b), outfile);
            }
            }
          /* drow/2002-07-10: We could save the total symbols count
          /* drow/2002-07-10: We could save the total symbols count
             even if we're using a hashtable, but nothing else but this message
             even if we're using a hashtable, but nothing else but this message
             wants it.  */
             wants it.  */
          fprintf_filtered (outfile, ", %d syms/buckets in ",
          fprintf_filtered (outfile, ", %d syms/buckets in ",
                            dict_size (BLOCK_DICT (b)));
                            dict_size (BLOCK_DICT (b)));
          fputs_filtered (paddress (BLOCK_START (b)), outfile);
          fputs_filtered (paddress (BLOCK_START (b)), outfile);
          fprintf_filtered (outfile, "..");
          fprintf_filtered (outfile, "..");
          fputs_filtered (paddress (BLOCK_END (b)), outfile);
          fputs_filtered (paddress (BLOCK_END (b)), outfile);
          if (BLOCK_FUNCTION (b))
          if (BLOCK_FUNCTION (b))
            {
            {
              fprintf_filtered (outfile, ", function %s", DEPRECATED_SYMBOL_NAME (BLOCK_FUNCTION (b)));
              fprintf_filtered (outfile, ", function %s", DEPRECATED_SYMBOL_NAME (BLOCK_FUNCTION (b)));
              if (SYMBOL_DEMANGLED_NAME (BLOCK_FUNCTION (b)) != NULL)
              if (SYMBOL_DEMANGLED_NAME (BLOCK_FUNCTION (b)) != NULL)
                {
                {
                  fprintf_filtered (outfile, ", %s",
                  fprintf_filtered (outfile, ", %s",
                                SYMBOL_DEMANGLED_NAME (BLOCK_FUNCTION (b)));
                                SYMBOL_DEMANGLED_NAME (BLOCK_FUNCTION (b)));
                }
                }
            }
            }
          fprintf_filtered (outfile, "\n");
          fprintf_filtered (outfile, "\n");
          /* Now print each symbol in this block (in no particular order, if
          /* Now print each symbol in this block (in no particular order, if
             we're using a hashtable).  */
             we're using a hashtable).  */
          ALL_BLOCK_SYMBOLS (b, iter, sym)
          ALL_BLOCK_SYMBOLS (b, iter, sym)
            {
            {
              struct print_symbol_args s;
              struct print_symbol_args s;
              s.symbol = sym;
              s.symbol = sym;
              s.depth = depth + 1;
              s.depth = depth + 1;
              s.outfile = outfile;
              s.outfile = outfile;
              catch_errors (print_symbol, &s, "Error printing symbol:\n",
              catch_errors (print_symbol, &s, "Error printing symbol:\n",
                            RETURN_MASK_ERROR);
                            RETURN_MASK_ERROR);
            }
            }
        }
        }
      fprintf_filtered (outfile, "\n");
      fprintf_filtered (outfile, "\n");
    }
    }
  else
  else
    {
    {
      fprintf_filtered (outfile, "\nBlockvector same as previous symtab\n\n");
      fprintf_filtered (outfile, "\nBlockvector same as previous symtab\n\n");
    }
    }
}
}
 
 
static void
static void
dump_symtab (struct objfile *objfile, struct symtab *symtab,
dump_symtab (struct objfile *objfile, struct symtab *symtab,
             struct ui_file *outfile)
             struct ui_file *outfile)
{
{
  enum language saved_lang;
  enum language saved_lang;
 
 
  /* Set the current language to the language of the symtab we're dumping
  /* Set the current language to the language of the symtab we're dumping
     because certain routines used during dump_symtab() use the current
     because certain routines used during dump_symtab() use the current
     language to print an image of the symbol.  We'll restore it later.  */
     language to print an image of the symbol.  We'll restore it later.  */
  saved_lang = set_language (symtab->language);
  saved_lang = set_language (symtab->language);
 
 
  dump_symtab_1 (objfile, symtab, outfile);
  dump_symtab_1 (objfile, symtab, outfile);
 
 
  set_language (saved_lang);
  set_language (saved_lang);
}
}
 
 
void
void
maintenance_print_symbols (char *args, int from_tty)
maintenance_print_symbols (char *args, int from_tty)
{
{
  char **argv;
  char **argv;
  struct ui_file *outfile;
  struct ui_file *outfile;
  struct cleanup *cleanups;
  struct cleanup *cleanups;
  char *symname = NULL;
  char *symname = NULL;
  char *filename = DEV_TTY;
  char *filename = DEV_TTY;
  struct objfile *objfile;
  struct objfile *objfile;
  struct symtab *s;
  struct symtab *s;
 
 
  dont_repeat ();
  dont_repeat ();
 
 
  if (args == NULL)
  if (args == NULL)
    {
    {
      error (_("\
      error (_("\
Arguments missing: an output file name and an optional symbol file name"));
Arguments missing: an output file name and an optional symbol file name"));
    }
    }
  else if ((argv = buildargv (args)) == NULL)
  else if ((argv = buildargv (args)) == NULL)
    {
    {
      nomem (0);
      nomem (0);
    }
    }
  cleanups = make_cleanup_freeargv (argv);
  cleanups = make_cleanup_freeargv (argv);
 
 
  if (argv[0] != NULL)
  if (argv[0] != NULL)
    {
    {
      filename = argv[0];
      filename = argv[0];
      /* If a second arg is supplied, it is a source file name to match on */
      /* If a second arg is supplied, it is a source file name to match on */
      if (argv[1] != NULL)
      if (argv[1] != NULL)
        {
        {
          symname = argv[1];
          symname = argv[1];
        }
        }
    }
    }
 
 
  filename = tilde_expand (filename);
  filename = tilde_expand (filename);
  make_cleanup (xfree, filename);
  make_cleanup (xfree, filename);
 
 
  outfile = gdb_fopen (filename, FOPEN_WT);
  outfile = gdb_fopen (filename, FOPEN_WT);
  if (outfile == 0)
  if (outfile == 0)
    perror_with_name (filename);
    perror_with_name (filename);
  make_cleanup_ui_file_delete (outfile);
  make_cleanup_ui_file_delete (outfile);
 
 
  immediate_quit++;
  immediate_quit++;
  ALL_SYMTABS (objfile, s)
  ALL_SYMTABS (objfile, s)
    if (symname == NULL || strcmp (symname, s->filename) == 0)
    if (symname == NULL || strcmp (symname, s->filename) == 0)
    dump_symtab (objfile, s, outfile);
    dump_symtab (objfile, s, outfile);
  immediate_quit--;
  immediate_quit--;
  do_cleanups (cleanups);
  do_cleanups (cleanups);
}
}
 
 
/* Print symbol ARGS->SYMBOL on ARGS->OUTFILE.  ARGS->DEPTH says how
/* Print symbol ARGS->SYMBOL on ARGS->OUTFILE.  ARGS->DEPTH says how
   far to indent.  ARGS is really a struct print_symbol_args *, but is
   far to indent.  ARGS is really a struct print_symbol_args *, but is
   declared as char * to get it past catch_errors.  Returns 0 for error,
   declared as char * to get it past catch_errors.  Returns 0 for error,
   1 for success.  */
   1 for success.  */
 
 
static int
static int
print_symbol (void *args)
print_symbol (void *args)
{
{
  struct symbol *symbol = ((struct print_symbol_args *) args)->symbol;
  struct symbol *symbol = ((struct print_symbol_args *) args)->symbol;
  int depth = ((struct print_symbol_args *) args)->depth;
  int depth = ((struct print_symbol_args *) args)->depth;
  struct ui_file *outfile = ((struct print_symbol_args *) args)->outfile;
  struct ui_file *outfile = ((struct print_symbol_args *) args)->outfile;
 
 
  print_spaces (depth, outfile);
  print_spaces (depth, outfile);
  if (SYMBOL_DOMAIN (symbol) == LABEL_DOMAIN)
  if (SYMBOL_DOMAIN (symbol) == LABEL_DOMAIN)
    {
    {
      fprintf_filtered (outfile, "label %s at ", SYMBOL_PRINT_NAME (symbol));
      fprintf_filtered (outfile, "label %s at ", SYMBOL_PRINT_NAME (symbol));
      fputs_filtered (paddress (SYMBOL_VALUE_ADDRESS (symbol)), outfile);
      fputs_filtered (paddress (SYMBOL_VALUE_ADDRESS (symbol)), outfile);
      if (SYMBOL_BFD_SECTION (symbol))
      if (SYMBOL_BFD_SECTION (symbol))
        fprintf_filtered (outfile, " section %s\n",
        fprintf_filtered (outfile, " section %s\n",
                       bfd_section_name (SYMBOL_BFD_SECTION (symbol)->owner,
                       bfd_section_name (SYMBOL_BFD_SECTION (symbol)->owner,
                                         SYMBOL_BFD_SECTION (symbol)));
                                         SYMBOL_BFD_SECTION (symbol)));
      else
      else
        fprintf_filtered (outfile, "\n");
        fprintf_filtered (outfile, "\n");
      return 1;
      return 1;
    }
    }
  if (SYMBOL_DOMAIN (symbol) == STRUCT_DOMAIN)
  if (SYMBOL_DOMAIN (symbol) == STRUCT_DOMAIN)
    {
    {
      if (TYPE_TAG_NAME (SYMBOL_TYPE (symbol)))
      if (TYPE_TAG_NAME (SYMBOL_TYPE (symbol)))
        {
        {
          LA_PRINT_TYPE (SYMBOL_TYPE (symbol), "", outfile, 1, depth);
          LA_PRINT_TYPE (SYMBOL_TYPE (symbol), "", outfile, 1, depth);
        }
        }
      else
      else
        {
        {
          fprintf_filtered (outfile, "%s %s = ",
          fprintf_filtered (outfile, "%s %s = ",
                         (TYPE_CODE (SYMBOL_TYPE (symbol)) == TYPE_CODE_ENUM
                         (TYPE_CODE (SYMBOL_TYPE (symbol)) == TYPE_CODE_ENUM
                          ? "enum"
                          ? "enum"
                     : (TYPE_CODE (SYMBOL_TYPE (symbol)) == TYPE_CODE_STRUCT
                     : (TYPE_CODE (SYMBOL_TYPE (symbol)) == TYPE_CODE_STRUCT
                        ? "struct" : "union")),
                        ? "struct" : "union")),
                            DEPRECATED_SYMBOL_NAME (symbol));
                            DEPRECATED_SYMBOL_NAME (symbol));
          LA_PRINT_TYPE (SYMBOL_TYPE (symbol), "", outfile, 1, depth);
          LA_PRINT_TYPE (SYMBOL_TYPE (symbol), "", outfile, 1, depth);
        }
        }
      fprintf_filtered (outfile, ";\n");
      fprintf_filtered (outfile, ";\n");
    }
    }
  else
  else
    {
    {
      if (SYMBOL_CLASS (symbol) == LOC_TYPEDEF)
      if (SYMBOL_CLASS (symbol) == LOC_TYPEDEF)
        fprintf_filtered (outfile, "typedef ");
        fprintf_filtered (outfile, "typedef ");
      if (SYMBOL_TYPE (symbol))
      if (SYMBOL_TYPE (symbol))
        {
        {
          /* Print details of types, except for enums where it's clutter.  */
          /* Print details of types, except for enums where it's clutter.  */
          LA_PRINT_TYPE (SYMBOL_TYPE (symbol), SYMBOL_PRINT_NAME (symbol),
          LA_PRINT_TYPE (SYMBOL_TYPE (symbol), SYMBOL_PRINT_NAME (symbol),
                         outfile,
                         outfile,
                         TYPE_CODE (SYMBOL_TYPE (symbol)) != TYPE_CODE_ENUM,
                         TYPE_CODE (SYMBOL_TYPE (symbol)) != TYPE_CODE_ENUM,
                         depth);
                         depth);
          fprintf_filtered (outfile, "; ");
          fprintf_filtered (outfile, "; ");
        }
        }
      else
      else
        fprintf_filtered (outfile, "%s ", SYMBOL_PRINT_NAME (symbol));
        fprintf_filtered (outfile, "%s ", SYMBOL_PRINT_NAME (symbol));
 
 
      switch (SYMBOL_CLASS (symbol))
      switch (SYMBOL_CLASS (symbol))
        {
        {
        case LOC_CONST:
        case LOC_CONST:
          fprintf_filtered (outfile, "const %ld (0x%lx)",
          fprintf_filtered (outfile, "const %ld (0x%lx)",
                            SYMBOL_VALUE (symbol),
                            SYMBOL_VALUE (symbol),
                            SYMBOL_VALUE (symbol));
                            SYMBOL_VALUE (symbol));
          break;
          break;
 
 
        case LOC_CONST_BYTES:
        case LOC_CONST_BYTES:
          {
          {
            unsigned i;
            unsigned i;
            struct type *type = check_typedef (SYMBOL_TYPE (symbol));
            struct type *type = check_typedef (SYMBOL_TYPE (symbol));
            fprintf_filtered (outfile, "const %u hex bytes:",
            fprintf_filtered (outfile, "const %u hex bytes:",
                              TYPE_LENGTH (type));
                              TYPE_LENGTH (type));
            for (i = 0; i < TYPE_LENGTH (type); i++)
            for (i = 0; i < TYPE_LENGTH (type); i++)
              fprintf_filtered (outfile, " %02x",
              fprintf_filtered (outfile, " %02x",
                                (unsigned) SYMBOL_VALUE_BYTES (symbol)[i]);
                                (unsigned) SYMBOL_VALUE_BYTES (symbol)[i]);
          }
          }
          break;
          break;
 
 
        case LOC_STATIC:
        case LOC_STATIC:
          fprintf_filtered (outfile, "static at ");
          fprintf_filtered (outfile, "static at ");
          fputs_filtered (paddress (SYMBOL_VALUE_ADDRESS (symbol)), outfile);
          fputs_filtered (paddress (SYMBOL_VALUE_ADDRESS (symbol)), outfile);
          if (SYMBOL_BFD_SECTION (symbol))
          if (SYMBOL_BFD_SECTION (symbol))
            fprintf_filtered (outfile, " section %s",
            fprintf_filtered (outfile, " section %s",
                              bfd_section_name
                              bfd_section_name
                              (SYMBOL_BFD_SECTION (symbol)->owner,
                              (SYMBOL_BFD_SECTION (symbol)->owner,
                               SYMBOL_BFD_SECTION (symbol)));
                               SYMBOL_BFD_SECTION (symbol)));
          break;
          break;
 
 
        case LOC_INDIRECT:
        case LOC_INDIRECT:
          fprintf_filtered (outfile, "extern global at *(");
          fprintf_filtered (outfile, "extern global at *(");
          fputs_filtered (paddress (SYMBOL_VALUE_ADDRESS (symbol)), outfile);
          fputs_filtered (paddress (SYMBOL_VALUE_ADDRESS (symbol)), outfile);
          fprintf_filtered (outfile, "),");
          fprintf_filtered (outfile, "),");
          break;
          break;
 
 
        case LOC_REGISTER:
        case LOC_REGISTER:
          fprintf_filtered (outfile, "register %ld", SYMBOL_VALUE (symbol));
          fprintf_filtered (outfile, "register %ld", SYMBOL_VALUE (symbol));
          break;
          break;
 
 
        case LOC_ARG:
        case LOC_ARG:
          fprintf_filtered (outfile, "arg at offset 0x%lx",
          fprintf_filtered (outfile, "arg at offset 0x%lx",
                            SYMBOL_VALUE (symbol));
                            SYMBOL_VALUE (symbol));
          break;
          break;
 
 
        case LOC_LOCAL_ARG:
        case LOC_LOCAL_ARG:
          fprintf_filtered (outfile, "arg at offset 0x%lx from fp",
          fprintf_filtered (outfile, "arg at offset 0x%lx from fp",
                            SYMBOL_VALUE (symbol));
                            SYMBOL_VALUE (symbol));
          break;
          break;
 
 
        case LOC_REF_ARG:
        case LOC_REF_ARG:
          fprintf_filtered (outfile, "reference arg at 0x%lx", SYMBOL_VALUE (symbol));
          fprintf_filtered (outfile, "reference arg at 0x%lx", SYMBOL_VALUE (symbol));
          break;
          break;
 
 
        case LOC_REGPARM:
        case LOC_REGPARM:
          fprintf_filtered (outfile, "parameter register %ld", SYMBOL_VALUE (symbol));
          fprintf_filtered (outfile, "parameter register %ld", SYMBOL_VALUE (symbol));
          break;
          break;
 
 
        case LOC_REGPARM_ADDR:
        case LOC_REGPARM_ADDR:
          fprintf_filtered (outfile, "address parameter register %ld", SYMBOL_VALUE (symbol));
          fprintf_filtered (outfile, "address parameter register %ld", SYMBOL_VALUE (symbol));
          break;
          break;
 
 
        case LOC_LOCAL:
        case LOC_LOCAL:
          fprintf_filtered (outfile, "local at offset 0x%lx",
          fprintf_filtered (outfile, "local at offset 0x%lx",
                            SYMBOL_VALUE (symbol));
                            SYMBOL_VALUE (symbol));
          break;
          break;
 
 
        case LOC_BASEREG:
        case LOC_BASEREG:
          fprintf_filtered (outfile, "local at 0x%lx from register %d",
          fprintf_filtered (outfile, "local at 0x%lx from register %d",
                            SYMBOL_VALUE (symbol), SYMBOL_BASEREG (symbol));
                            SYMBOL_VALUE (symbol), SYMBOL_BASEREG (symbol));
          break;
          break;
 
 
        case LOC_BASEREG_ARG:
        case LOC_BASEREG_ARG:
          fprintf_filtered (outfile, "arg at 0x%lx from register %d",
          fprintf_filtered (outfile, "arg at 0x%lx from register %d",
                            SYMBOL_VALUE (symbol), SYMBOL_BASEREG (symbol));
                            SYMBOL_VALUE (symbol), SYMBOL_BASEREG (symbol));
          break;
          break;
 
 
        case LOC_TYPEDEF:
        case LOC_TYPEDEF:
          break;
          break;
 
 
        case LOC_LABEL:
        case LOC_LABEL:
          fprintf_filtered (outfile, "label at ");
          fprintf_filtered (outfile, "label at ");
          fputs_filtered (paddress (SYMBOL_VALUE_ADDRESS (symbol)), outfile);
          fputs_filtered (paddress (SYMBOL_VALUE_ADDRESS (symbol)), outfile);
          if (SYMBOL_BFD_SECTION (symbol))
          if (SYMBOL_BFD_SECTION (symbol))
            fprintf_filtered (outfile, " section %s",
            fprintf_filtered (outfile, " section %s",
                              bfd_section_name
                              bfd_section_name
                              (SYMBOL_BFD_SECTION (symbol)->owner,
                              (SYMBOL_BFD_SECTION (symbol)->owner,
                               SYMBOL_BFD_SECTION (symbol)));
                               SYMBOL_BFD_SECTION (symbol)));
          break;
          break;
 
 
        case LOC_BLOCK:
        case LOC_BLOCK:
          fprintf_filtered (outfile, "block object ");
          fprintf_filtered (outfile, "block object ");
          gdb_print_host_address (SYMBOL_BLOCK_VALUE (symbol), outfile);
          gdb_print_host_address (SYMBOL_BLOCK_VALUE (symbol), outfile);
          fprintf_filtered (outfile, ", ");
          fprintf_filtered (outfile, ", ");
          fputs_filtered (paddress (BLOCK_START (SYMBOL_BLOCK_VALUE (symbol))),
          fputs_filtered (paddress (BLOCK_START (SYMBOL_BLOCK_VALUE (symbol))),
                          outfile);
                          outfile);
          fprintf_filtered (outfile, "..");
          fprintf_filtered (outfile, "..");
          fputs_filtered (paddress (BLOCK_END (SYMBOL_BLOCK_VALUE (symbol))),
          fputs_filtered (paddress (BLOCK_END (SYMBOL_BLOCK_VALUE (symbol))),
                          outfile);
                          outfile);
          if (SYMBOL_BFD_SECTION (symbol))
          if (SYMBOL_BFD_SECTION (symbol))
            fprintf_filtered (outfile, " section %s",
            fprintf_filtered (outfile, " section %s",
                              bfd_section_name
                              bfd_section_name
                              (SYMBOL_BFD_SECTION (symbol)->owner,
                              (SYMBOL_BFD_SECTION (symbol)->owner,
                               SYMBOL_BFD_SECTION (symbol)));
                               SYMBOL_BFD_SECTION (symbol)));
          break;
          break;
 
 
        case LOC_COMPUTED:
        case LOC_COMPUTED:
        case LOC_COMPUTED_ARG:
        case LOC_COMPUTED_ARG:
          fprintf_filtered (outfile, "computed at runtime");
          fprintf_filtered (outfile, "computed at runtime");
          break;
          break;
 
 
        case LOC_UNRESOLVED:
        case LOC_UNRESOLVED:
          fprintf_filtered (outfile, "unresolved");
          fprintf_filtered (outfile, "unresolved");
          break;
          break;
 
 
        case LOC_OPTIMIZED_OUT:
        case LOC_OPTIMIZED_OUT:
          fprintf_filtered (outfile, "optimized out");
          fprintf_filtered (outfile, "optimized out");
          break;
          break;
 
 
        default:
        default:
          fprintf_filtered (outfile, "botched symbol class %x",
          fprintf_filtered (outfile, "botched symbol class %x",
                            SYMBOL_CLASS (symbol));
                            SYMBOL_CLASS (symbol));
          break;
          break;
        }
        }
    }
    }
  fprintf_filtered (outfile, "\n");
  fprintf_filtered (outfile, "\n");
  return 1;
  return 1;
}
}
 
 
void
void
maintenance_print_psymbols (char *args, int from_tty)
maintenance_print_psymbols (char *args, int from_tty)
{
{
  char **argv;
  char **argv;
  struct ui_file *outfile;
  struct ui_file *outfile;
  struct cleanup *cleanups;
  struct cleanup *cleanups;
  char *symname = NULL;
  char *symname = NULL;
  char *filename = DEV_TTY;
  char *filename = DEV_TTY;
  struct objfile *objfile;
  struct objfile *objfile;
  struct partial_symtab *ps;
  struct partial_symtab *ps;
 
 
  dont_repeat ();
  dont_repeat ();
 
 
  if (args == NULL)
  if (args == NULL)
    {
    {
      error (_("print-psymbols takes an output file name and optional symbol file name"));
      error (_("print-psymbols takes an output file name and optional symbol file name"));
    }
    }
  else if ((argv = buildargv (args)) == NULL)
  else if ((argv = buildargv (args)) == NULL)
    {
    {
      nomem (0);
      nomem (0);
    }
    }
  cleanups = make_cleanup_freeargv (argv);
  cleanups = make_cleanup_freeargv (argv);
 
 
  if (argv[0] != NULL)
  if (argv[0] != NULL)
    {
    {
      filename = argv[0];
      filename = argv[0];
      /* If a second arg is supplied, it is a source file name to match on */
      /* If a second arg is supplied, it is a source file name to match on */
      if (argv[1] != NULL)
      if (argv[1] != NULL)
        {
        {
          symname = argv[1];
          symname = argv[1];
        }
        }
    }
    }
 
 
  filename = tilde_expand (filename);
  filename = tilde_expand (filename);
  make_cleanup (xfree, filename);
  make_cleanup (xfree, filename);
 
 
  outfile = gdb_fopen (filename, FOPEN_WT);
  outfile = gdb_fopen (filename, FOPEN_WT);
  if (outfile == 0)
  if (outfile == 0)
    perror_with_name (filename);
    perror_with_name (filename);
  make_cleanup_ui_file_delete (outfile);
  make_cleanup_ui_file_delete (outfile);
 
 
  immediate_quit++;
  immediate_quit++;
  ALL_PSYMTABS (objfile, ps)
  ALL_PSYMTABS (objfile, ps)
    if (symname == NULL || strcmp (symname, ps->filename) == 0)
    if (symname == NULL || strcmp (symname, ps->filename) == 0)
    dump_psymtab (objfile, ps, outfile);
    dump_psymtab (objfile, ps, outfile);
  immediate_quit--;
  immediate_quit--;
  do_cleanups (cleanups);
  do_cleanups (cleanups);
}
}
 
 
static void
static void
print_partial_symbols (struct partial_symbol **p, int count, char *what,
print_partial_symbols (struct partial_symbol **p, int count, char *what,
                       struct ui_file *outfile)
                       struct ui_file *outfile)
{
{
  fprintf_filtered (outfile, "  %s partial symbols:\n", what);
  fprintf_filtered (outfile, "  %s partial symbols:\n", what);
  while (count-- > 0)
  while (count-- > 0)
    {
    {
      fprintf_filtered (outfile, "    `%s'", DEPRECATED_SYMBOL_NAME (*p));
      fprintf_filtered (outfile, "    `%s'", DEPRECATED_SYMBOL_NAME (*p));
      if (SYMBOL_DEMANGLED_NAME (*p) != NULL)
      if (SYMBOL_DEMANGLED_NAME (*p) != NULL)
        {
        {
          fprintf_filtered (outfile, "  `%s'", SYMBOL_DEMANGLED_NAME (*p));
          fprintf_filtered (outfile, "  `%s'", SYMBOL_DEMANGLED_NAME (*p));
        }
        }
      fputs_filtered (", ", outfile);
      fputs_filtered (", ", outfile);
      switch (SYMBOL_DOMAIN (*p))
      switch (SYMBOL_DOMAIN (*p))
        {
        {
        case UNDEF_DOMAIN:
        case UNDEF_DOMAIN:
          fputs_filtered ("undefined domain, ", outfile);
          fputs_filtered ("undefined domain, ", outfile);
          break;
          break;
        case VAR_DOMAIN:
        case VAR_DOMAIN:
          /* This is the usual thing -- don't print it */
          /* This is the usual thing -- don't print it */
          break;
          break;
        case STRUCT_DOMAIN:
        case STRUCT_DOMAIN:
          fputs_filtered ("struct domain, ", outfile);
          fputs_filtered ("struct domain, ", outfile);
          break;
          break;
        case LABEL_DOMAIN:
        case LABEL_DOMAIN:
          fputs_filtered ("label domain, ", outfile);
          fputs_filtered ("label domain, ", outfile);
          break;
          break;
        default:
        default:
          fputs_filtered ("<invalid domain>, ", outfile);
          fputs_filtered ("<invalid domain>, ", outfile);
          break;
          break;
        }
        }
      switch (SYMBOL_CLASS (*p))
      switch (SYMBOL_CLASS (*p))
        {
        {
        case LOC_UNDEF:
        case LOC_UNDEF:
          fputs_filtered ("undefined", outfile);
          fputs_filtered ("undefined", outfile);
          break;
          break;
        case LOC_CONST:
        case LOC_CONST:
          fputs_filtered ("constant int", outfile);
          fputs_filtered ("constant int", outfile);
          break;
          break;
        case LOC_STATIC:
        case LOC_STATIC:
          fputs_filtered ("static", outfile);
          fputs_filtered ("static", outfile);
          break;
          break;
        case LOC_INDIRECT:
        case LOC_INDIRECT:
          fputs_filtered ("extern global", outfile);
          fputs_filtered ("extern global", outfile);
          break;
          break;
        case LOC_REGISTER:
        case LOC_REGISTER:
          fputs_filtered ("register", outfile);
          fputs_filtered ("register", outfile);
          break;
          break;
        case LOC_ARG:
        case LOC_ARG:
          fputs_filtered ("pass by value", outfile);
          fputs_filtered ("pass by value", outfile);
          break;
          break;
        case LOC_REF_ARG:
        case LOC_REF_ARG:
          fputs_filtered ("pass by reference", outfile);
          fputs_filtered ("pass by reference", outfile);
          break;
          break;
        case LOC_REGPARM:
        case LOC_REGPARM:
          fputs_filtered ("register parameter", outfile);
          fputs_filtered ("register parameter", outfile);
          break;
          break;
        case LOC_REGPARM_ADDR:
        case LOC_REGPARM_ADDR:
          fputs_filtered ("register address parameter", outfile);
          fputs_filtered ("register address parameter", outfile);
          break;
          break;
        case LOC_LOCAL:
        case LOC_LOCAL:
          fputs_filtered ("stack parameter", outfile);
          fputs_filtered ("stack parameter", outfile);
          break;
          break;
        case LOC_TYPEDEF:
        case LOC_TYPEDEF:
          fputs_filtered ("type", outfile);
          fputs_filtered ("type", outfile);
          break;
          break;
        case LOC_LABEL:
        case LOC_LABEL:
          fputs_filtered ("label", outfile);
          fputs_filtered ("label", outfile);
          break;
          break;
        case LOC_BLOCK:
        case LOC_BLOCK:
          fputs_filtered ("function", outfile);
          fputs_filtered ("function", outfile);
          break;
          break;
        case LOC_CONST_BYTES:
        case LOC_CONST_BYTES:
          fputs_filtered ("constant bytes", outfile);
          fputs_filtered ("constant bytes", outfile);
          break;
          break;
        case LOC_LOCAL_ARG:
        case LOC_LOCAL_ARG:
          fputs_filtered ("shuffled arg", outfile);
          fputs_filtered ("shuffled arg", outfile);
          break;
          break;
        case LOC_UNRESOLVED:
        case LOC_UNRESOLVED:
          fputs_filtered ("unresolved", outfile);
          fputs_filtered ("unresolved", outfile);
          break;
          break;
        case LOC_OPTIMIZED_OUT:
        case LOC_OPTIMIZED_OUT:
          fputs_filtered ("optimized out", outfile);
          fputs_filtered ("optimized out", outfile);
          break;
          break;
        case LOC_COMPUTED:
        case LOC_COMPUTED:
        case LOC_COMPUTED_ARG:
        case LOC_COMPUTED_ARG:
          fputs_filtered ("computed at runtime", outfile);
          fputs_filtered ("computed at runtime", outfile);
          break;
          break;
        default:
        default:
          fputs_filtered ("<invalid location>", outfile);
          fputs_filtered ("<invalid location>", outfile);
          break;
          break;
        }
        }
      fputs_filtered (", ", outfile);
      fputs_filtered (", ", outfile);
      fputs_filtered (paddress (SYMBOL_VALUE_ADDRESS (*p)), outfile);
      fputs_filtered (paddress (SYMBOL_VALUE_ADDRESS (*p)), outfile);
      fprintf_filtered (outfile, "\n");
      fprintf_filtered (outfile, "\n");
      p++;
      p++;
    }
    }
}
}
 
 
void
void
maintenance_print_msymbols (char *args, int from_tty)
maintenance_print_msymbols (char *args, int from_tty)
{
{
  char **argv;
  char **argv;
  struct ui_file *outfile;
  struct ui_file *outfile;
  struct cleanup *cleanups;
  struct cleanup *cleanups;
  char *filename = DEV_TTY;
  char *filename = DEV_TTY;
  char *symname = NULL;
  char *symname = NULL;
  struct objfile *objfile;
  struct objfile *objfile;
 
 
  struct stat sym_st, obj_st;
  struct stat sym_st, obj_st;
 
 
  dont_repeat ();
  dont_repeat ();
 
 
  if (args == NULL)
  if (args == NULL)
    {
    {
      error (_("print-msymbols takes an output file name and optional symbol file name"));
      error (_("print-msymbols takes an output file name and optional symbol file name"));
    }
    }
  else if ((argv = buildargv (args)) == NULL)
  else if ((argv = buildargv (args)) == NULL)
    {
    {
      nomem (0);
      nomem (0);
    }
    }
  cleanups = make_cleanup_freeargv (argv);
  cleanups = make_cleanup_freeargv (argv);
 
 
  if (argv[0] != NULL)
  if (argv[0] != NULL)
    {
    {
      filename = argv[0];
      filename = argv[0];
      /* If a second arg is supplied, it is a source file name to match on */
      /* If a second arg is supplied, it is a source file name to match on */
      if (argv[1] != NULL)
      if (argv[1] != NULL)
        {
        {
          symname = xfullpath (argv[1]);
          symname = xfullpath (argv[1]);
          make_cleanup (xfree, symname);
          make_cleanup (xfree, symname);
          if (symname && stat (symname, &sym_st))
          if (symname && stat (symname, &sym_st))
            perror_with_name (symname);
            perror_with_name (symname);
        }
        }
    }
    }
 
 
  filename = tilde_expand (filename);
  filename = tilde_expand (filename);
  make_cleanup (xfree, filename);
  make_cleanup (xfree, filename);
 
 
  outfile = gdb_fopen (filename, FOPEN_WT);
  outfile = gdb_fopen (filename, FOPEN_WT);
  if (outfile == 0)
  if (outfile == 0)
    perror_with_name (filename);
    perror_with_name (filename);
  make_cleanup_ui_file_delete (outfile);
  make_cleanup_ui_file_delete (outfile);
 
 
  immediate_quit++;
  immediate_quit++;
  ALL_OBJFILES (objfile)
  ALL_OBJFILES (objfile)
    if (symname == NULL
    if (symname == NULL
        || (!stat (objfile->name, &obj_st) && sym_st.st_ino == obj_st.st_ino))
        || (!stat (objfile->name, &obj_st) && sym_st.st_ino == obj_st.st_ino))
      dump_msymbols (objfile, outfile);
      dump_msymbols (objfile, outfile);
  immediate_quit--;
  immediate_quit--;
  fprintf_filtered (outfile, "\n\n");
  fprintf_filtered (outfile, "\n\n");
  do_cleanups (cleanups);
  do_cleanups (cleanups);
}
}
 
 
void
void
maintenance_print_objfiles (char *ignore, int from_tty)
maintenance_print_objfiles (char *ignore, int from_tty)
{
{
  struct objfile *objfile;
  struct objfile *objfile;
 
 
  dont_repeat ();
  dont_repeat ();
 
 
  immediate_quit++;
  immediate_quit++;
  ALL_OBJFILES (objfile)
  ALL_OBJFILES (objfile)
    dump_objfile (objfile);
    dump_objfile (objfile);
  immediate_quit--;
  immediate_quit--;
}
}
 
 
 
 
/* List all the symbol tables whose names match REGEXP (optional).  */
/* List all the symbol tables whose names match REGEXP (optional).  */
void
void
maintenance_info_symtabs (char *regexp, int from_tty)
maintenance_info_symtabs (char *regexp, int from_tty)
{
{
  struct objfile *objfile;
  struct objfile *objfile;
 
 
  if (regexp)
  if (regexp)
    re_comp (regexp);
    re_comp (regexp);
 
 
  ALL_OBJFILES (objfile)
  ALL_OBJFILES (objfile)
    {
    {
      struct symtab *symtab;
      struct symtab *symtab;
 
 
      /* We don't want to print anything for this objfile until we
      /* We don't want to print anything for this objfile until we
         actually find a symtab whose name matches.  */
         actually find a symtab whose name matches.  */
      int printed_objfile_start = 0;
      int printed_objfile_start = 0;
 
 
      ALL_OBJFILE_SYMTABS (objfile, symtab)
      ALL_OBJFILE_SYMTABS (objfile, symtab)
        if (! regexp
        if (! regexp
            || re_exec (symtab->filename))
            || re_exec (symtab->filename))
          {
          {
            if (! printed_objfile_start)
            if (! printed_objfile_start)
              {
              {
                printf_filtered ("{ objfile %s ", objfile->name);
                printf_filtered ("{ objfile %s ", objfile->name);
                wrap_here ("  ");
                wrap_here ("  ");
                printf_filtered ("((struct objfile *) %p)\n", objfile);
                printf_filtered ("((struct objfile *) %p)\n", objfile);
                printed_objfile_start = 1;
                printed_objfile_start = 1;
              }
              }
 
 
            printf_filtered ("  { symtab %s ", symtab->filename);
            printf_filtered ("  { symtab %s ", symtab->filename);
            wrap_here ("    ");
            wrap_here ("    ");
            printf_filtered ("((struct symtab *) %p)\n", symtab);
            printf_filtered ("((struct symtab *) %p)\n", symtab);
            printf_filtered ("    dirname %s\n",
            printf_filtered ("    dirname %s\n",
                             symtab->dirname ? symtab->dirname : "(null)");
                             symtab->dirname ? symtab->dirname : "(null)");
            printf_filtered ("    fullname %s\n",
            printf_filtered ("    fullname %s\n",
                             symtab->fullname ? symtab->fullname : "(null)");
                             symtab->fullname ? symtab->fullname : "(null)");
            printf_filtered ("    blockvector ((struct blockvector *) %p)%s\n",
            printf_filtered ("    blockvector ((struct blockvector *) %p)%s\n",
                             symtab->blockvector,
                             symtab->blockvector,
                             symtab->primary ? " (primary)" : "");
                             symtab->primary ? " (primary)" : "");
            printf_filtered ("    linetable ((struct linetable *) %p)\n",
            printf_filtered ("    linetable ((struct linetable *) %p)\n",
                             symtab->linetable);
                             symtab->linetable);
            printf_filtered ("    debugformat %s\n", symtab->debugformat);
            printf_filtered ("    debugformat %s\n", symtab->debugformat);
            printf_filtered ("  }\n");
            printf_filtered ("  }\n");
          }
          }
 
 
      if (printed_objfile_start)
      if (printed_objfile_start)
        printf_filtered ("}\n");
        printf_filtered ("}\n");
    }
    }
}
}
 
 
 
 
/* List all the partial symbol tables whose names match REGEXP (optional).  */
/* List all the partial symbol tables whose names match REGEXP (optional).  */
void
void
maintenance_info_psymtabs (char *regexp, int from_tty)
maintenance_info_psymtabs (char *regexp, int from_tty)
{
{
  struct objfile *objfile;
  struct objfile *objfile;
 
 
  if (regexp)
  if (regexp)
    re_comp (regexp);
    re_comp (regexp);
 
 
  ALL_OBJFILES (objfile)
  ALL_OBJFILES (objfile)
    {
    {
      struct partial_symtab *psymtab;
      struct partial_symtab *psymtab;
 
 
      /* We don't want to print anything for this objfile until we
      /* We don't want to print anything for this objfile until we
         actually find a symtab whose name matches.  */
         actually find a symtab whose name matches.  */
      int printed_objfile_start = 0;
      int printed_objfile_start = 0;
 
 
      ALL_OBJFILE_PSYMTABS (objfile, psymtab)
      ALL_OBJFILE_PSYMTABS (objfile, psymtab)
        if (! regexp
        if (! regexp
            || re_exec (psymtab->filename))
            || re_exec (psymtab->filename))
          {
          {
            if (! printed_objfile_start)
            if (! printed_objfile_start)
              {
              {
                printf_filtered ("{ objfile %s ", objfile->name);
                printf_filtered ("{ objfile %s ", objfile->name);
                wrap_here ("  ");
                wrap_here ("  ");
                printf_filtered ("((struct objfile *) %p)\n", objfile);
                printf_filtered ("((struct objfile *) %p)\n", objfile);
                printed_objfile_start = 1;
                printed_objfile_start = 1;
              }
              }
 
 
            printf_filtered ("  { psymtab %s ", psymtab->filename);
            printf_filtered ("  { psymtab %s ", psymtab->filename);
            wrap_here ("    ");
            wrap_here ("    ");
            printf_filtered ("((struct partial_symtab *) %p)\n", psymtab);
            printf_filtered ("((struct partial_symtab *) %p)\n", psymtab);
            printf_filtered ("    readin %s\n",
            printf_filtered ("    readin %s\n",
                             psymtab->readin ? "yes" : "no");
                             psymtab->readin ? "yes" : "no");
            printf_filtered ("    fullname %s\n",
            printf_filtered ("    fullname %s\n",
                             psymtab->fullname ? psymtab->fullname : "(null)");
                             psymtab->fullname ? psymtab->fullname : "(null)");
            printf_filtered ("    text addresses ");
            printf_filtered ("    text addresses ");
            fputs_filtered (paddress (psymtab->textlow), gdb_stdout);
            fputs_filtered (paddress (psymtab->textlow), gdb_stdout);
            printf_filtered (" -- ");
            printf_filtered (" -- ");
            fputs_filtered (paddress (psymtab->texthigh), gdb_stdout);
            fputs_filtered (paddress (psymtab->texthigh), gdb_stdout);
            printf_filtered ("\n");
            printf_filtered ("\n");
            printf_filtered ("    globals ");
            printf_filtered ("    globals ");
            if (psymtab->n_global_syms)
            if (psymtab->n_global_syms)
              {
              {
                printf_filtered ("(* (struct partial_symbol **) %p @ %d)\n",
                printf_filtered ("(* (struct partial_symbol **) %p @ %d)\n",
                                 (psymtab->objfile->global_psymbols.list
                                 (psymtab->objfile->global_psymbols.list
                                  + psymtab->globals_offset),
                                  + psymtab->globals_offset),
                                 psymtab->n_global_syms);
                                 psymtab->n_global_syms);
              }
              }
            else
            else
              printf_filtered ("(none)\n");
              printf_filtered ("(none)\n");
            printf_filtered ("    statics ");
            printf_filtered ("    statics ");
            if (psymtab->n_static_syms)
            if (psymtab->n_static_syms)
              {
              {
                printf_filtered ("(* (struct partial_symbol **) %p @ %d)\n",
                printf_filtered ("(* (struct partial_symbol **) %p @ %d)\n",
                                 (psymtab->objfile->static_psymbols.list
                                 (psymtab->objfile->static_psymbols.list
                                  + psymtab->statics_offset),
                                  + psymtab->statics_offset),
                                 psymtab->n_static_syms);
                                 psymtab->n_static_syms);
              }
              }
            else
            else
              printf_filtered ("(none)\n");
              printf_filtered ("(none)\n");
            printf_filtered ("    dependencies ");
            printf_filtered ("    dependencies ");
            if (psymtab->number_of_dependencies)
            if (psymtab->number_of_dependencies)
              {
              {
                int i;
                int i;
 
 
                printf_filtered ("{\n");
                printf_filtered ("{\n");
                for (i = 0; i < psymtab->number_of_dependencies; i++)
                for (i = 0; i < psymtab->number_of_dependencies; i++)
                  {
                  {
                    struct partial_symtab *dep = psymtab->dependencies[i];
                    struct partial_symtab *dep = psymtab->dependencies[i];
 
 
                    /* Note the string concatenation there --- no comma.  */
                    /* Note the string concatenation there --- no comma.  */
                    printf_filtered ("      psymtab %s "
                    printf_filtered ("      psymtab %s "
                                     "((struct partial_symtab *) %p)\n",
                                     "((struct partial_symtab *) %p)\n",
                                     dep->filename, dep);
                                     dep->filename, dep);
                  }
                  }
                printf_filtered ("    }\n");
                printf_filtered ("    }\n");
              }
              }
            else
            else
              printf_filtered ("(none)\n");
              printf_filtered ("(none)\n");
            printf_filtered ("  }\n");
            printf_filtered ("  }\n");
          }
          }
 
 
      if (printed_objfile_start)
      if (printed_objfile_start)
        printf_filtered ("}\n");
        printf_filtered ("}\n");
    }
    }
}
}
 
 
 
 
/* Check consistency of psymtabs and symtabs.  */
/* Check consistency of psymtabs and symtabs.  */
 
 
void
void
maintenance_check_symtabs (char *ignore, int from_tty)
maintenance_check_symtabs (char *ignore, int from_tty)
{
{
  struct symbol *sym;
  struct symbol *sym;
  struct partial_symbol **psym;
  struct partial_symbol **psym;
  struct symtab *s = NULL;
  struct symtab *s = NULL;
  struct partial_symtab *ps;
  struct partial_symtab *ps;
  struct blockvector *bv;
  struct blockvector *bv;
  struct objfile *objfile;
  struct objfile *objfile;
  struct block *b;
  struct block *b;
  int length;
  int length;
 
 
  ALL_PSYMTABS (objfile, ps)
  ALL_PSYMTABS (objfile, ps)
  {
  {
    s = PSYMTAB_TO_SYMTAB (ps);
    s = PSYMTAB_TO_SYMTAB (ps);
    if (s == NULL)
    if (s == NULL)
      continue;
      continue;
    bv = BLOCKVECTOR (s);
    bv = BLOCKVECTOR (s);
    b = BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK);
    b = BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK);
    psym = ps->objfile->static_psymbols.list + ps->statics_offset;
    psym = ps->objfile->static_psymbols.list + ps->statics_offset;
    length = ps->n_static_syms;
    length = ps->n_static_syms;
    while (length--)
    while (length--)
      {
      {
        sym = lookup_block_symbol (b, DEPRECATED_SYMBOL_NAME (*psym),
        sym = lookup_block_symbol (b, DEPRECATED_SYMBOL_NAME (*psym),
                                   NULL, SYMBOL_DOMAIN (*psym));
                                   NULL, SYMBOL_DOMAIN (*psym));
        if (!sym)
        if (!sym)
          {
          {
            printf_filtered ("Static symbol `");
            printf_filtered ("Static symbol `");
            puts_filtered (DEPRECATED_SYMBOL_NAME (*psym));
            puts_filtered (DEPRECATED_SYMBOL_NAME (*psym));
            printf_filtered ("' only found in ");
            printf_filtered ("' only found in ");
            puts_filtered (ps->filename);
            puts_filtered (ps->filename);
            printf_filtered (" psymtab\n");
            printf_filtered (" psymtab\n");
          }
          }
        psym++;
        psym++;
      }
      }
    b = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
    b = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
    psym = ps->objfile->global_psymbols.list + ps->globals_offset;
    psym = ps->objfile->global_psymbols.list + ps->globals_offset;
    length = ps->n_global_syms;
    length = ps->n_global_syms;
    while (length--)
    while (length--)
      {
      {
        sym = lookup_block_symbol (b, DEPRECATED_SYMBOL_NAME (*psym),
        sym = lookup_block_symbol (b, DEPRECATED_SYMBOL_NAME (*psym),
                                   NULL, SYMBOL_DOMAIN (*psym));
                                   NULL, SYMBOL_DOMAIN (*psym));
        if (!sym)
        if (!sym)
          {
          {
            printf_filtered ("Global symbol `");
            printf_filtered ("Global symbol `");
            puts_filtered (DEPRECATED_SYMBOL_NAME (*psym));
            puts_filtered (DEPRECATED_SYMBOL_NAME (*psym));
            printf_filtered ("' only found in ");
            printf_filtered ("' only found in ");
            puts_filtered (ps->filename);
            puts_filtered (ps->filename);
            printf_filtered (" psymtab\n");
            printf_filtered (" psymtab\n");
          }
          }
        psym++;
        psym++;
      }
      }
    if (ps->texthigh < ps->textlow)
    if (ps->texthigh < ps->textlow)
      {
      {
        printf_filtered ("Psymtab ");
        printf_filtered ("Psymtab ");
        puts_filtered (ps->filename);
        puts_filtered (ps->filename);
        printf_filtered (" covers bad range ");
        printf_filtered (" covers bad range ");
        fputs_filtered (paddress (ps->textlow), gdb_stdout);
        fputs_filtered (paddress (ps->textlow), gdb_stdout);
        printf_filtered (" - ");
        printf_filtered (" - ");
        fputs_filtered (paddress (ps->texthigh), gdb_stdout);
        fputs_filtered (paddress (ps->texthigh), gdb_stdout);
        printf_filtered ("\n");
        printf_filtered ("\n");
        continue;
        continue;
      }
      }
    if (ps->texthigh == 0)
    if (ps->texthigh == 0)
      continue;
      continue;
    if (ps->textlow < BLOCK_START (b) || ps->texthigh > BLOCK_END (b))
    if (ps->textlow < BLOCK_START (b) || ps->texthigh > BLOCK_END (b))
      {
      {
        printf_filtered ("Psymtab ");
        printf_filtered ("Psymtab ");
        puts_filtered (ps->filename);
        puts_filtered (ps->filename);
        printf_filtered (" covers ");
        printf_filtered (" covers ");
        fputs_filtered (paddress (ps->textlow), gdb_stdout);
        fputs_filtered (paddress (ps->textlow), gdb_stdout);
        printf_filtered (" - ");
        printf_filtered (" - ");
        fputs_filtered (paddress (ps->texthigh), gdb_stdout);
        fputs_filtered (paddress (ps->texthigh), gdb_stdout);
        printf_filtered (" but symtab covers only ");
        printf_filtered (" but symtab covers only ");
        fputs_filtered (paddress (BLOCK_START (b)), gdb_stdout);
        fputs_filtered (paddress (BLOCK_START (b)), gdb_stdout);
        printf_filtered (" - ");
        printf_filtered (" - ");
        fputs_filtered (paddress (BLOCK_END (b)), gdb_stdout);
        fputs_filtered (paddress (BLOCK_END (b)), gdb_stdout);
        printf_filtered ("\n");
        printf_filtered ("\n");
      }
      }
  }
  }
}
}


 
 
/* Return the nexting depth of a block within other blocks in its symtab.  */
/* Return the nexting depth of a block within other blocks in its symtab.  */
 
 
static int
static int
block_depth (struct block *block)
block_depth (struct block *block)
{
{
  int i = 0;
  int i = 0;
  while ((block = BLOCK_SUPERBLOCK (block)) != NULL)
  while ((block = BLOCK_SUPERBLOCK (block)) != NULL)
    {
    {
      i++;
      i++;
    }
    }
  return i;
  return i;
}
}


 
 
/* Increase the space allocated for LISTP, which is probably
/* Increase the space allocated for LISTP, which is probably
   global_psymbols or static_psymbols. This space will eventually
   global_psymbols or static_psymbols. This space will eventually
   be freed in free_objfile().  */
   be freed in free_objfile().  */
 
 
void
void
extend_psymbol_list (struct psymbol_allocation_list *listp,
extend_psymbol_list (struct psymbol_allocation_list *listp,
                     struct objfile *objfile)
                     struct objfile *objfile)
{
{
  int new_size;
  int new_size;
  if (listp->size == 0)
  if (listp->size == 0)
    {
    {
      new_size = 255;
      new_size = 255;
      listp->list = (struct partial_symbol **)
      listp->list = (struct partial_symbol **)
        xmalloc (new_size * sizeof (struct partial_symbol *));
        xmalloc (new_size * sizeof (struct partial_symbol *));
    }
    }
  else
  else
    {
    {
      new_size = listp->size * 2;
      new_size = listp->size * 2;
      listp->list = (struct partial_symbol **)
      listp->list = (struct partial_symbol **)
        xrealloc ((char *) listp->list,
        xrealloc ((char *) listp->list,
                  new_size * sizeof (struct partial_symbol *));
                  new_size * sizeof (struct partial_symbol *));
    }
    }
  /* Next assumes we only went one over.  Should be good if
  /* Next assumes we only went one over.  Should be good if
     program works correctly */
     program works correctly */
  listp->next = listp->list + listp->size;
  listp->next = listp->list + listp->size;
  listp->size = new_size;
  listp->size = new_size;
}
}
 
 
 
 
/* Do early runtime initializations. */
/* Do early runtime initializations. */
void
void
_initialize_symmisc (void)
_initialize_symmisc (void)
{
{
  std_in = stdin;
  std_in = stdin;
  std_out = stdout;
  std_out = stdout;
  std_err = stderr;
  std_err = stderr;
}
}
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.