2002-10-23 Elena Zannoni <ezannoni@redhat.com>
[deliverable/binutils-gdb.git] / gdb / symtab.h
index 69a83a89f01a8bc7846884118b797ccd897b9a86..38637475c04aa1bf8b11a297cbce87ca332c5272 100644 (file)
@@ -1,35 +1,49 @@
 /* Symbol table definitions for GDB.
-   Copyright (C) 1986, 1989, 1991, 1992 Free Software Foundation, Inc.
+   Copyright 1986, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996,
+   1997, 1998, 1999, 2000, 2001, 2002
+   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
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
+   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
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
 
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
 
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
 
 #if !defined (SYMTAB_H)
 #define SYMTAB_H 1
 
-/* Some definitions and declarations to go with use of obstacks.  */
-
-#include "obstack.h"
-#define obstack_chunk_alloc xmalloc
-#define obstack_chunk_free free
+/* Opaque declarations.  */
+struct obstack;
+
+/* Don't do this; it means that if some .o's are compiled with GNU C
+   and some are not (easy to do accidentally the way we configure
+   things; also it is a pain to have to "make clean" every time you
+   want to switch compilers), then GDB dies a horrible death.  */
+/* GNU C supports enums that are bitfields.  Some compilers don't. */
+#if 0 && defined(__GNUC__) && !defined(BYTE_BITFIELD)
+#define        BYTE_BITFIELD   :8;
+#else
+#define        BYTE_BITFIELD           /*nothing */
+#endif
 
 /* Define a structure for the information that is common to all symbol types,
    including minimal symbols, partial symbols, and full symbols.  In a
    multilanguage environment, some language specific information may need to
-   be recorded along with each symbol. */
+   be recorded along with each symbol.
+
+   These fields are ordered to encourage good packing, since we frequently
+   have tens or hundreds of thousands of these.  */
 
 struct general_symbol_info
 {
@@ -46,41 +60,55 @@ struct general_symbol_info
      target byte order, e.g. LOC_CONST_BYTES).  */
 
   union
-    {
-      long value;
+  {
+    /* The fact that this is a long not a LONGEST mainly limits the
+       range of a LOC_CONST.  Since LOC_CONST_BYTES exists, I'm not
+       sure that is a big deal.  */
+    long ivalue;
 
-      struct block *block;
+    struct block *block;
 
-      char *bytes;
+    char *bytes;
 
-      CORE_ADDR address;
+    CORE_ADDR address;
 
-      /* for opaque typedef struct chain */
+    /* for opaque typedef struct chain */
 
-      struct symbol *chain;
-    }
+    struct symbol *chain;
+  }
   value;
 
-  /* Record the source code language that applies to this symbol.
-     This is used to select one of the fields from the language specific
-     union below. */
-
-  enum language language;
-
   /* Since one and only one language can apply, wrap the language specific
      information inside a union. */
 
   union
+  {
+    struct cplus_specific      /* For C++ */
+      /*  and Java */
     {
-      struct cplus_specific      /* For C++ */
-       {
-         char *demangled_name;
-       } cplus_specific;
-      struct chill_specific      /* For Chill */
-       {
-         char *demangled_name;
-       } chill_specific;
-    } language_specific;
+      char *demangled_name;
+    }
+    cplus_specific;
+    struct objc_specific
+    {
+      char *demangled_name;
+    }
+    objc_specific;
+#if 0
+/* OBSOLETE struct chill_specific        *//* For Chill */
+    /* OBSOLETE   { */
+    /* OBSOLETE     char *demangled_name; */
+    /* OBSOLETE   } */
+    /* OBSOLETE chill_specific; */
+#endif
+  }
+  language_specific;
+
+  /* Record the source code language that applies to this symbol.
+     This is used to select one of the fields from the language specific
+     union above. */
+
+  enum language language BYTE_BITFIELD;
 
   /* Which section is this symbol in?  This is an index into
      section_offsets for this objfile.  Negative means that the symbol
@@ -89,110 +117,59 @@ struct general_symbol_info
      expect all symbol-reading code to set it correctly (the ELF code
      also tries to set it correctly).  */
 
-  int section;
+  short section;
+
+  /* The bfd section associated with this symbol. */
+
+  asection *bfd_section;
 };
 
+extern CORE_ADDR symbol_overlayed_address (CORE_ADDR, asection *);
+
 #define SYMBOL_NAME(symbol)            (symbol)->ginfo.name
-#define SYMBOL_VALUE(symbol)           (symbol)->ginfo.value.value
+#define SYMBOL_VALUE(symbol)           (symbol)->ginfo.value.ivalue
 #define SYMBOL_VALUE_ADDRESS(symbol)   (symbol)->ginfo.value.address
 #define SYMBOL_VALUE_BYTES(symbol)     (symbol)->ginfo.value.bytes
 #define SYMBOL_BLOCK_VALUE(symbol)     (symbol)->ginfo.value.block
 #define SYMBOL_VALUE_CHAIN(symbol)     (symbol)->ginfo.value.chain
 #define SYMBOL_LANGUAGE(symbol)                (symbol)->ginfo.language
 #define SYMBOL_SECTION(symbol)         (symbol)->ginfo.section
+#define SYMBOL_BFD_SECTION(symbol)     (symbol)->ginfo.bfd_section
 
 #define SYMBOL_CPLUS_DEMANGLED_NAME(symbol)    \
   (symbol)->ginfo.language_specific.cplus_specific.demangled_name
 
-
-extern int demangle;   /* We reference it, so go ahead and declare it. */
-
-/* Macro that initializes the language dependent portion of a symbol
+/* Initializes the language dependent portion of a symbol
    depending upon the language for the symbol. */
+#define SYMBOL_INIT_LANGUAGE_SPECIFIC(symbol,language) \
+  (symbol_init_language_specific (&(symbol)->ginfo, (language)))
+extern void symbol_init_language_specific (struct general_symbol_info *symbol,
+                                          enum language language);
+
+#define SYMBOL_INIT_DEMANGLED_NAME(symbol,obstack) \
+  (symbol_init_demangled_name (&symbol->ginfo, (obstack)))
+extern void symbol_init_demangled_name (struct general_symbol_info *symbol,
+                                       struct obstack *obstack);
 
-#define SYMBOL_INIT_LANGUAGE_SPECIFIC(symbol,language)                 \
-  do {                                                                 \
-    SYMBOL_LANGUAGE (symbol) = language;                               \
-    if (SYMBOL_LANGUAGE (symbol) == language_cplus)                    \
-      {                                                                        \
-       SYMBOL_CPLUS_DEMANGLED_NAME (symbol) = NULL;                    \
-      }                                                                        \
-    else if (SYMBOL_LANGUAGE (symbol) == language_chill)               \
-      {                                                                        \
-       SYMBOL_CHILL_DEMANGLED_NAME (symbol) = NULL;                    \
-      }                                                                        \
-    else                                                               \
-      {                                                                        \
-       memset (&(symbol)->ginfo.language_specific, 0,                  \
-               sizeof ((symbol)->ginfo.language_specific));            \
-      }                                                                        \
-  } while (0)
-
-/* Macro that attempts to initialize the demangled name for a symbol,
-   based on the language of that symbol.  If the language is set to
-   language_auto, it will attempt to find any demangling algorithm
-   that works and then set the language appropriately.  If no demangling
-   of any kind is found, the language is set back to language_unknown,
-   so we can avoid doing this work again the next time we encounter
-   the symbol.  Any required space to store the name is obtained from the
-   specified obstack. */
-
-#define SYMBOL_INIT_DEMANGLED_NAME(symbol,obstack)                     \
-  do {                                                                 \
-    char *demangled = NULL;                                            \
-    if (SYMBOL_LANGUAGE (symbol) == language_cplus                     \
-       || SYMBOL_LANGUAGE (symbol) == language_auto)                   \
-      {                                                                        \
-       demangled =                                                     \
-         cplus_demangle (SYMBOL_NAME (symbol), DMGL_PARAMS | DMGL_ANSI);\
-       if (demangled != NULL)                                          \
-         {                                                             \
-           SYMBOL_LANGUAGE (symbol) = language_cplus;                  \
-           SYMBOL_CPLUS_DEMANGLED_NAME (symbol) =                      \
-             obsavestring (demangled, strlen (demangled), (obstack));  \
-           free (demangled);                                           \
-         }                                                             \
-       else                                                            \
-         {                                                             \
-           SYMBOL_CPLUS_DEMANGLED_NAME (symbol) = NULL;                \
-         }                                                             \
-      }                                                                        \
-    if (demangled == NULL                                              \
-       && (SYMBOL_LANGUAGE (symbol) == language_chill                  \
-           || SYMBOL_LANGUAGE (symbol) == language_auto))              \
-      {                                                                        \
-       demangled =                                                     \
-         chill_demangle (SYMBOL_NAME (symbol));                        \
-       if (demangled != NULL)                                          \
-         {                                                             \
-           SYMBOL_LANGUAGE (symbol) = language_chill;                  \
-           SYMBOL_CHILL_DEMANGLED_NAME (symbol) =                      \
-             obsavestring (demangled, strlen (demangled), (obstack));  \
-           free (demangled);                                           \
-         }                                                             \
-       else                                                            \
-         {                                                             \
-           SYMBOL_CHILL_DEMANGLED_NAME (symbol) = NULL;                \
-         }                                                             \
-      }                                                                        \
-    if (SYMBOL_LANGUAGE (symbol) == language_auto)                     \
-      {                                                                        \
-       SYMBOL_LANGUAGE (symbol) = language_unknown;                    \
-      }                                                                        \
-  } while (0)
 
 /* Macro that returns the demangled name for a symbol based on the language
    for that symbol.  If no demangled name exists, returns NULL. */
 
 #define SYMBOL_DEMANGLED_NAME(symbol)                                  \
   (SYMBOL_LANGUAGE (symbol) == language_cplus                          \
+   || SYMBOL_LANGUAGE (symbol) == language_java                                \
    ? SYMBOL_CPLUS_DEMANGLED_NAME (symbol)                              \
-   : (SYMBOL_LANGUAGE (symbol) == language_chill                       \
-      ? SYMBOL_CHILL_DEMANGLED_NAME (symbol)                           \
-      : NULL))
+      : (SYMBOL_LANGUAGE (symbol) == language_objc                     \
+         ? SYMBOL_OBJC_DEMANGLED_NAME (symbol)                         \
+   : /* OBSOLETE (SYMBOL_LANGUAGE (symbol) == language_chill */                \
+     /* OBSOLETE ? SYMBOL_CHILL_DEMANGLED_NAME (symbol) */             \
+        NULL))
+
+/* OBSOLETE #define SYMBOL_CHILL_DEMANGLED_NAME(symbol) */
+/* OBSOLETE (symbol)->ginfo.language_specific.chill_specific.demangled_name */
 
-#define SYMBOL_CHILL_DEMANGLED_NAME(symbol)                            \
-  (symbol)->ginfo.language_specific.chill_specific.demangled_name
+#define SYMBOL_OBJC_DEMANGLED_NAME(symbol)                             \
+   (symbol)->ginfo.language_specific.objc_specific.demangled_name
 
 /* Macro that returns the "natural source name" of a symbol.  In C++ this is
    the "demangled" form of the name if demangle is on and the "mangled" form
@@ -215,10 +192,6 @@ extern int demangle;       /* We reference it, so go ahead and declare it. */
    ? SYMBOL_DEMANGLED_NAME (symbol)                                    \
    : SYMBOL_NAME (symbol))
 
-/* From utils.c.  */
-extern int demangle;
-extern int asm_demangle;
-
 /* Macro that tests a symbol for a match against a specified name string.
    First test the unencoded name, then looks for and test a C++ encoded
    name if it exists.  Note that whitespace is ignored while attempting to
@@ -230,7 +203,7 @@ extern int asm_demangle;
   (STREQ (SYMBOL_NAME (symbol), (name))                                        \
    || (SYMBOL_DEMANGLED_NAME (symbol) != NULL                          \
        && strcmp_iw (SYMBOL_DEMANGLED_NAME (symbol), (name)) == 0))
-   
+
 /* Macro that tests a symbol for an re-match against the last compiled regular
    expression.  First test the unencoded name, then look for and test a C++
    encoded name if it exists.
@@ -240,7 +213,7 @@ extern int asm_demangle;
   (re_exec (SYMBOL_NAME (symbol)) != 0                                 \
    || (SYMBOL_DEMANGLED_NAME (symbol) != NULL                          \
        && re_exec (SYMBOL_DEMANGLED_NAME (symbol)) != 0))
-   
+
 /* Define a simple structure used to hold some very basic information about
    all defined global symbols (text, data, bss, abs, etc).  The only required
    information is the general_symbol_info.
@@ -263,17 +236,25 @@ struct minimal_symbol
 
   struct general_symbol_info ginfo;
 
-  /* The info field is available for caching machine-specific information that
-     The AMD 29000 tdep.c uses it to remember things it has decoded from the
-     instructions in the function header, so it doesn't have to rederive the
-     info constantly (over a serial line).  It is initialized to zero and
-     stays that way until target-dependent code sets it.  Storage for any data
-     pointed to by this field should be allocated on the symbol_obstack for
-     the associated objfile.  The type would be "void *" except for reasons
-     of compatibility with older compilers.  This field is optional. */
+  /* The info field is available for caching machine-specific information
+     so it doesn't have to rederive the info constantly (over a serial line).
+     It is initialized to zero and stays that way until target-dependent code
+     sets it.  Storage for any data pointed to by this field should be allo-
+     cated on the symbol_obstack for the associated objfile.  
+     The type would be "void *" except for reasons of compatibility with older
+     compilers.  This field is optional.
+
+     Currently, the AMD 29000 tdep.c uses it to remember things it has decoded
+     from the instructions in the function header, and the MIPS-16 code uses
+     it to identify 16-bit procedures.  */
 
   char *info;
 
+#ifdef SOFUN_ADDRESS_MAYBE_MISSING
+  /* Which source file is this symbol in?  Only relevant for mst_file_*.  */
+  char *filename;
+#endif
+
   /* Classification types for this symbol.  These should be taken as "advisory
      only", since if gdb can't easily figure out a classification it simply
      selects mst_unknown.  It may also have to guess when it can't figure out
@@ -283,25 +264,45 @@ struct minimal_symbol
      supplies. */
 
   enum minimal_symbol_type
-    {
-      mst_unknown = 0,         /* Unknown type, the default */
-      mst_text,                        /* Generally executable instructions */
-      mst_data,                        /* Generally initialized data */
-      mst_bss,                 /* Generally uninitialized data */
-      mst_abs,                 /* Generally absolute (nonrelocatable) */
-      /* For the mst_file* types, the names are only guaranteed to be unique
-        within a given .o file.  */
-      mst_file_text,           /* Static version of mst_text */
-      mst_file_data,           /* Static version of mst_data */
-      mst_file_bss             /* Static version of mst_bss */
-    } type;
-
+  {
+    mst_unknown = 0,           /* Unknown type, the default */
+    mst_text,                  /* Generally executable instructions */
+    mst_data,                  /* Generally initialized data */
+    mst_bss,                   /* Generally uninitialized data */
+    mst_abs,                   /* Generally absolute (nonrelocatable) */
+    /* GDB uses mst_solib_trampoline for the start address of a shared
+       library trampoline entry.  Breakpoints for shared library functions
+       are put there if the shared library is not yet loaded.
+       After the shared library is loaded, lookup_minimal_symbol will
+       prefer the minimal symbol from the shared library (usually
+       a mst_text symbol) over the mst_solib_trampoline symbol, and the
+       breakpoints will be moved to their true address in the shared
+       library via breakpoint_re_set.  */
+    mst_solib_trampoline,      /* Shared library trampoline code */
+    /* For the mst_file* types, the names are only guaranteed to be unique
+       within a given .o file.  */
+    mst_file_text,             /* Static version of mst_text */
+    mst_file_data,             /* Static version of mst_data */
+    mst_file_bss               /* Static version of mst_bss */
+  }
+  type BYTE_BITFIELD;
+
+  /* Minimal symbols with the same hash key are kept on a linked
+     list.  This is the link.  */
+
+  struct minimal_symbol *hash_next;
+
+  /* Minimal symbols are stored in two different hash tables.  This is
+     the `next' pointer for the demangled hash table.  */
+
+  struct minimal_symbol *demangled_hash_next;
 };
 
 #define MSYMBOL_INFO(msymbol)          (msymbol)->info
 #define MSYMBOL_TYPE(msymbol)          (msymbol)->type
-
 \f
+
+
 /* All of the name-scope contours of the program
    are represented by `struct block' objects.
    All of these objects are pointed to by the blockvector.
@@ -378,6 +379,25 @@ struct block
 
   unsigned char gcc_compile_flag;
 
+  /* The symbols for this block are either in a simple linear list or
+     in a simple hashtable.  Blocks which correspond to a function
+     (which have a list of symbols corresponding to arguments) use
+     a linear list, as do some older symbol readers (currently only
+     mdebugread and dstread).  Other blocks are hashed.
+
+     The hashtable uses the same hash function as the minsym hashtables,
+     found in minsyms.c:minsym_hash_iw.  Symbols are hashed based on
+     their demangled name if appropriate, and on their name otherwise.
+     The hash function ignores space, and stops at the beginning of the
+     argument list if any.
+
+     The table is laid out in NSYMS/5 buckets and symbols are chained via
+     their hash_next field.  */
+
+  /* If this is really a hashtable of the symbols, this flag is 1.  */
+
+  unsigned char hashtable;
+
   /* Number of local symbols.  */
 
   int nsyms;
@@ -390,26 +410,46 @@ struct block
 
 #define BLOCK_START(bl)                (bl)->startaddr
 #define BLOCK_END(bl)          (bl)->endaddr
-#define BLOCK_NSYMS(bl)                (bl)->nsyms
-#define BLOCK_SYM(bl, n)       (bl)->sym[n]
 #define BLOCK_FUNCTION(bl)     (bl)->function
 #define BLOCK_SUPERBLOCK(bl)   (bl)->superblock
 #define BLOCK_GCC_COMPILED(bl) (bl)->gcc_compile_flag
+#define BLOCK_HASHTABLE(bl)    (bl)->hashtable
+
+/* For blocks without a hashtable (BLOCK_HASHTABLE (bl) == 0) only.  */
+#define BLOCK_NSYMS(bl)                (bl)->nsyms
+#define BLOCK_SYM(bl, n)       (bl)->sym[n]
+
+/* For blocks with a hashtable, but these are valid for non-hashed blocks as
+   well - each symbol will appear to be one bucket by itself.  */
+#define BLOCK_BUCKETS(bl)      (bl)->nsyms
+#define BLOCK_BUCKET(bl, n)    (bl)->sym[n]
+
+/* Macro used to set the size of a hashtable for N symbols.  */
+#define BLOCK_HASHTABLE_SIZE(n)        ((n)/5 + 1)
+
+/* Macro to loop through all symbols in a block BL, in no particular order.
+   i counts which bucket we are in, and sym points to the current symbol.  */
+
+#define ALL_BLOCK_SYMBOLS(bl, i, sym)                          \
+       for ((i) = 0; (i) < BLOCK_BUCKETS ((bl)); (i)++)        \
+         for ((sym) = BLOCK_BUCKET ((bl), (i)); (sym);         \
+              (sym) = (sym)->hash_next)
 
 /* Nonzero if symbols of block BL should be sorted alphabetically.
    Don't sort a block which corresponds to a function.  If we did the
    sorting would have to preserve the order of the symbols for the
-   arguments.  */
-
-#define BLOCK_SHOULD_SORT(bl) ((bl)->nsyms >= 40 && BLOCK_FUNCTION (bl) == NULL)
+   arguments.  Also don't sort any block that we chose to hash.  */
 
+#define BLOCK_SHOULD_SORT(bl) (! BLOCK_HASHTABLE (bl) \
+                              && BLOCK_FUNCTION (bl) == NULL)
 \f
+
 /* Represent one symbol name; a variable, constant, function or typedef.  */
 
 /* Different name spaces for symbols.  Looking up a symbol specifies a
    namespace and ignores symbol definitions in other name spaces. */
 
-enum namespace
+typedef enum
 {
   /* UNDEF_NAMESPACE is used when a namespace has not been discovered or
      none of the following apply.  This usually indicates an error either
@@ -431,8 +471,25 @@ enum namespace
   /* LABEL_NAMESPACE may be used for names of labels (for gotos);
      currently it is not used and labels are not recorded at all.  */
 
-  LABEL_NAMESPACE
-};
+  LABEL_NAMESPACE,
+
+  /* Searching namespaces. These overlap with VAR_NAMESPACE, providing
+     some granularity with the search_symbols function. */
+
+  /* Everything in VAR_NAMESPACE minus FUNCTIONS_-, TYPES_-, and
+     METHODS_NAMESPACE */
+  VARIABLES_NAMESPACE,
+
+  /* All functions -- for some reason not methods, though. */
+  FUNCTIONS_NAMESPACE,
+
+  /* All defined types */
+  TYPES_NAMESPACE,
+
+  /* All class methods -- why is this separated out? */
+  METHODS_NAMESPACE
+}
+namespace_enum;
 
 /* An address-class says where to find the value of a symbol.  */
 
@@ -535,10 +592,61 @@ enum address_class
 
   LOC_BASEREG_ARG,
 
+  /* Value is at fixed address, but the address of the variable has
+     to be determined from the minimal symbol table whenever the
+     variable is referenced.
+     This happens if debugging information for a global symbol is
+     emitted and the corresponding minimal symbol is defined
+     in another object file or runtime common storage.
+     The linker might even remove the minimal symbol if the global
+     symbol is never referenced, in which case the symbol remains
+     unresolved.  */
+
+  LOC_UNRESOLVED,
+
+  /* Value is at a thread-specific location calculated by a
+     target-specific method. This is used only by hppa.  */
+
+  LOC_HP_THREAD_LOCAL_STATIC,
+
+  /* Value is at a thread-specific location calculated by a
+     target-specific method.  SYMBOL_OBJFILE gives the object file
+     in which the symbol is defined; the symbol's value is the
+     offset into that objfile's thread-local storage for the current
+     thread.  */
+      
+  LOC_THREAD_LOCAL_STATIC,
+
   /* The variable does not actually exist in the program.
      The value is ignored.  */
 
-  LOC_OPTIMIZED_OUT
+  LOC_OPTIMIZED_OUT,
+
+  /* The variable is static, but actually lives at * (address).
+   * I.e. do an extra indirection to get to it.
+   * This is used on HP-UX to get at globals that are allocated
+   * in shared libraries, where references from images other
+   * than the one where the global was allocated are done
+   * with a level of indirection.
+   */
+
+  LOC_INDIRECT
+};
+
+/* Linked list of symbol's live ranges. */
+
+struct range_list
+{
+  CORE_ADDR start;
+  CORE_ADDR end;
+  struct range_list *next;
+};
+
+/* Linked list of aliases for a particular main/primary symbol.  */
+struct alias_list
+{
+  struct symbol *sym;
+  struct alias_list *next;
 };
 
 struct symbol
@@ -548,41 +656,66 @@ struct symbol
 
   struct general_symbol_info ginfo;
 
-  /* Name space code.  */
+  /* Data type of value */
 
-  enum namespace namespace;
+  struct type *type;
 
-  /* Address class */
+  /* Name space code.  */
 
-  enum address_class class;
+#ifdef __MFC4__
+  /* FIXME: don't conflict with C++'s namespace */
+  /* would be safer to do a global change for all namespace identifiers. */
+#define namespace _namespace
+#endif
+  namespace_enum namespace BYTE_BITFIELD;
 
-  /* Data type of value */
+  /* Address class */
 
-  struct type *type;
+  enum address_class aclass BYTE_BITFIELD;
 
   /* Line number of definition.  FIXME:  Should we really make the assumption
      that nobody will try to debug files longer than 64K lines?  What about
      machine generated programs? */
 
   unsigned short line;
-  
+
   /* Some symbols require an additional value to be recorded on a per-
      symbol basis.  Stash those values here. */
 
   union
-    {
-      /* Used by LOC_BASEREG and LOC_BASEREG_ARG.  */
-      short basereg;
-    }
+  {
+    /* Used by LOC_BASEREG and LOC_BASEREG_ARG.  */
+    short basereg;
+
+    /* Used by LOC_THREAD_LOCAL_STATIC.  The objfile in which this
+       symbol is defined.  To find a thread-local variable (e.g., a
+       variable declared with the `__thread' storage class), we may
+       need to know which object file it's in.  */
+    struct objfile *objfile;
+  }
   aux_value;
 
+
+  /* Link to a list of aliases for this symbol.
+     Only a "primary/main symbol may have aliases.  */
+  struct alias_list *aliases;
+
+  /* List of ranges where this symbol is active.  This is only
+     used by alias symbols at the current time.  */
+  struct range_list *ranges;
+
+  struct symbol *hash_next;
 };
 
+
 #define SYMBOL_NAMESPACE(symbol)       (symbol)->namespace
-#define SYMBOL_CLASS(symbol)           (symbol)->class
+#define SYMBOL_CLASS(symbol)           (symbol)->aclass
 #define SYMBOL_TYPE(symbol)            (symbol)->type
 #define SYMBOL_LINE(symbol)            (symbol)->line
 #define SYMBOL_BASEREG(symbol)         (symbol)->aux_value.basereg
+#define SYMBOL_OBJFILE(symbol)          (symbol)->aux_value.objfile
+#define SYMBOL_ALIASES(symbol)         (symbol)->aliases
+#define SYMBOL_RANGES(symbol)          (symbol)->ranges
 \f
 /* A partial_symbol records the name, namespace, and address class of
    symbols whose types we have not parsed yet.  For functions, it also
@@ -600,26 +733,17 @@ struct partial_symbol
 
   /* Name space code.  */
 
-  enum namespace namespace;
+  namespace_enum namespace BYTE_BITFIELD;
 
   /* Address class (for info_symbols) */
 
-  enum address_class class;
+  enum address_class aclass BYTE_BITFIELD;
 
 };
 
 #define PSYMBOL_NAMESPACE(psymbol)     (psymbol)->namespace
-#define PSYMBOL_CLASS(psymbol)         (psymbol)->class
-
+#define PSYMBOL_CLASS(psymbol)         (psymbol)->aclass
 \f
-/* Source-file information.  This describes the relation between source files,
-   ine numbers and addresses in the program text.  */
-
-struct sourcevector
-{
-  int length;                  /* Number of source files described */
-  struct source *source[1];    /* Descriptions of the files */
-};
 
 /* Each item represents a line-->pc (or the reverse) mapping.  This is
    somewhat more wasteful of space than one might wish, but since only
@@ -639,12 +763,15 @@ struct linetable_entry
 
    Example: a C for statement generally looks like this
 
-       10      0x100   - for the init/test part of a for stmt.
-       20      0x200
-       30      0x300
-       10      0x400   - for the increment part of a for stmt.
+   10   0x100   - for the init/test part of a for stmt.
+   20   0x200
+   30   0x300
+   10   0x400   - for the increment part of a for stmt.
 
-   */
+   If an entry has a line number of zero, it marks the start of a PC
+   range for which no line number information is available.  It is
+   acceptable, though wasteful of table space, for such a range to be
+   zero length.  */
 
 struct linetable
 {
@@ -656,14 +783,6 @@ struct linetable
   struct linetable_entry item[1];
 };
 
-/* All the information on one source file.  */
-
-struct source
-{
-  char *name;                  /* Name of file */
-  struct linetable contents;
-};
-
 /* How to relocate the symbols from each section in a symbol file.
    Each struct contains an array of offsets.
    The ordering and meaning of the offsets is file-type-dependent;
@@ -675,111 +794,124 @@ struct source
    extract offset values in the struct.  */
 
 struct section_offsets
-  {
-    CORE_ADDR offsets[1];              /* As many as needed. */
-  };
+{
+  CORE_ADDR offsets[1];                /* As many as needed. */
+};
+
+#define        ANOFFSET(secoff, whichone) \
+   ((whichone == -1) \
+    ? (internal_error (__FILE__, __LINE__, "Section index is uninitialized"), -1) \
+    : secoff->offsets[whichone])
+
+/* The maximum possible size of a section_offsets table.  */
 
-#define        ANOFFSET(secoff, whichone)      (secoff->offsets[whichone])
+#define SIZEOF_SECTION_OFFSETS \
+  (sizeof (struct section_offsets) \
+   + sizeof (((struct section_offsets *) 0)->offsets) * (SECT_OFF_MAX-1))
 
 /* Each source file or header is represented by a struct symtab. 
    These objects are chained through the `next' field.  */
 
 struct symtab
-  {
+{
+
+  /* Chain of all existing symtabs.  */
 
-    /* Chain of all existing symtabs.  */
+  struct symtab *next;
 
-    struct symtab *next;
+  /* List of all symbol scope blocks for this symtab.  May be shared
+     between different symtabs (and normally is for all the symtabs
+     in a given compilation unit).  */
 
-    /* List of all symbol scope blocks for this symtab.  May be shared
-       between different symtabs (and normally is for all the symtabs
-       in a given compilation unit).  */
+  struct blockvector *blockvector;
 
-    struct blockvector *blockvector;
+  /* Table mapping core addresses to line numbers for this file.
+     Can be NULL if none.  Never shared between different symtabs.  */
 
-    /* Table mapping core addresses to line numbers for this file.
-       Can be NULL if none.  Never shared between different symtabs.  */
+  struct linetable *linetable;
 
-    struct linetable *linetable;
+  /* Section in objfile->section_offsets for the blockvector and
+     the linetable.  Probably always SECT_OFF_TEXT.  */
 
-    /* Section in objfile->section_offsets for the blockvector and
-       the linetable.  */
+  int block_line_section;
 
-    int block_line_section;
+  /* If several symtabs share a blockvector, exactly one of them
+     should be designated the primary, so that the blockvector
+     is relocated exactly once by objfile_relocate.  */
 
-    /* If several symtabs share a blockvector, exactly one of them
-       should be designed the primary, so that the blockvector
-       is relocated exactly once by objfile_relocate.  */
+  int primary;
 
-    int primary;
+  /* The macro table for this symtab.  Like the blockvector, this
+     may be shared between different symtabs --- and normally is for
+     all the symtabs in a given compilation unit.  */
+  struct macro_table *macro_table;
 
-    /* Name of this source file.  */
+  /* Name of this source file.  */
 
-    char *filename;
+  char *filename;
 
-    /* Directory in which it was compiled, or NULL if we don't know.  */
+  /* Directory in which it was compiled, or NULL if we don't know.  */
 
-    char *dirname;
+  char *dirname;
 
-    /* This component says how to free the data we point to:
-       free_contents => do a tree walk and free each object.
-       free_nothing => do nothing; some other symtab will free
-         the data this one uses.
-      free_linetable => free just the linetable.  FIXME: Is this redundant
-      with the primary field?  */
+  /* This component says how to free the data we point to:
+     free_contents => do a tree walk and free each object.
+     free_nothing => do nothing; some other symtab will free
+     the data this one uses.
+     free_linetable => free just the linetable.  FIXME: Is this redundant
+     with the primary field?  */
 
-    enum free_code
-      {
-       free_nothing, free_contents, free_linetable
-       }
-    free_code;
+  enum free_code
+  {
+    free_nothing, free_contents, free_linetable
+  }
+  free_code;
 
-    /* Pointer to one block of storage to be freed, if nonzero.  */
-    /* This is IN ADDITION to the action indicated by free_code.  */
-    
-    char *free_ptr;
+  /* Pointer to one block of storage to be freed, if nonzero.  */
+  /* This is IN ADDITION to the action indicated by free_code.  */
 
-    /* Total number of lines found in source file.  */
+  char *free_ptr;
 
-    int nlines;
+  /* Total number of lines found in source file.  */
 
-    /* line_charpos[N] is the position of the (N-1)th line of the
-       source file.  "position" means something we can lseek() to; it
-       is not guaranteed to be useful any other way.  */
+  int nlines;
 
-    int *line_charpos;
+  /* line_charpos[N] is the position of the (N-1)th line of the
+     source file.  "position" means something we can lseek() to; it
+     is not guaranteed to be useful any other way.  */
 
-    /* Language of this source file.  */
+  int *line_charpos;
 
-    enum language language;
+  /* Language of this source file.  */
 
-    /* String of version information.  May be zero.  */
+  enum language language;
 
-    char *version;
+  /* String that identifies the format of the debugging information, such
+     as "stabs", "dwarf 1", "dwarf 2", "coff", etc.  This is mostly useful
+     for automated testing of gdb but may also be information that is
+     useful to the user. */
 
-    /* Full name of file as found by searching the source path.
-       NULL if not yet known.  */
+  char *debugformat;
 
-    char *fullname;
+  /* String of version information.  May be zero.  */
 
-    /* Object file from which this symbol information was read.  */
+  char *version;
 
-    struct objfile *objfile;
+  /* Full name of file as found by searching the source path.
+     NULL if not yet known.  */
 
-    /* Anything extra for this symtab.  This is for target machines
-       with special debugging info of some sort (which cannot just
-       be represented in a normal symtab).  */
+  char *fullname;
 
-#if defined (EXTRA_SYMTAB_INFO)
-    EXTRA_SYMTAB_INFO
-#endif
+  /* Object file from which this symbol information was read.  */
+
+  struct objfile *objfile;
 
-  };
+};
 
 #define BLOCKVECTOR(symtab)    (symtab)->blockvector
 #define LINETABLE(symtab)      (symtab)->linetable
-
 \f
+
 /* Each source file that has not been fully read in is represented by
    a partial_symtab.  This contains the information on where in the
    executable the debugging symbols for a specific file are, and a
@@ -802,11 +934,15 @@ struct partial_symtab
 
   char *filename;
 
+  /* Full path of the source file.  NULL if not known.  */
+
+  char *fullname;
+
   /* Information about the object file from which symbols should be read.  */
 
   struct objfile *objfile;
 
-  /* Set of relocation offsets to apply to each section.  */ 
+  /* Set of relocation offsets to apply to each section.  */
 
   struct section_offsets *section_offsets;
 
@@ -856,7 +992,7 @@ struct partial_symtab
   /* Pointer to function which will read in the symtab corresponding to
      this psymtab.  */
 
-  void (*read_symtab) PARAMS ((struct partial_symtab *));
+  void (*read_symtab) (struct partial_symtab *);
 
   /* Information that lets read_symtab() locate the part of the symbol table
      that this psymtab corresponds to.  This information is private to the
@@ -874,8 +1010,8 @@ struct partial_symtab
 /* A fast way to get from a psymtab to its symtab (after the first time).  */
 #define        PSYMTAB_TO_SYMTAB(pst)  \
     ((pst) -> symtab != NULL ? (pst) -> symtab : psymtab_to_symtab (pst))
-
 \f
+
 /* The virtual function table is now an array of structures which have the
    form { int16 offset, delta; void *pfn; }. 
 
@@ -886,129 +1022,182 @@ struct partial_symtab
    PFN is a pointer to the virtual function.
 
    Note that this macro is g++ specific (FIXME). */
-  
+
 #define VTBL_FNADDR_OFFSET 2
 
-/* Macro that yields non-zero value iff NAME is the prefix for C++ operator
-   names.  If you leave out the parenthesis here you will lose!
-   Currently 'o' 'p' CPLUS_MARKER is used for both the symbol in the
-   symbol-file and the names in gdb's symbol table.
-   Note that this macro is g++ specific (FIXME). */
+/* External variables and functions for the objects described above. */
 
-#define OPNAME_PREFIX_P(NAME) \
-  ((NAME)[0] == 'o' && (NAME)[1] == 'p' && (NAME)[2] == CPLUS_MARKER)
+/* See the comment in symfile.c about how current_objfile is used. */
 
-/* Macro that yields non-zero value iff NAME is the prefix for C++ vtbl
-   names.  Note that this macro is g++ specific (FIXME).  */
+extern struct objfile *current_objfile;
 
-#define VTBL_PREFIX_P(NAME) \
-  ((NAME)[3] == CPLUS_MARKER && !strncmp ((NAME), "_vt", 3))
+/* True if we are nested inside psymtab_to_symtab. */
 
-/* Macro that yields non-zero value iff NAME is the prefix for C++ destructor
-   names.  Note that this macro is g++ specific (FIXME).  */
+extern int currently_reading_symtab;
 
-#define DESTRUCTOR_PREFIX_P(NAME) \
-  ((NAME)[0] == '_' && (NAME)[1] == CPLUS_MARKER && (NAME)[2] == '_')
+/* From utils.c.  */
+extern int demangle;
+extern int asm_demangle;
 
-\f
-/* External variables and functions for the objects described above. */
+/* symtab.c lookup functions */
 
-/* This symtab variable specifies the current file for printing source lines */
+/* lookup a symbol table by source file name */
 
-extern struct symtab *current_source_symtab;
+extern struct symtab *lookup_symtab (const char *);
 
-/* This is the next line to print for listing source lines.  */
+/* lookup a symbol by name (optional block, optional symtab) */
 
-extern int current_source_line;
+extern struct symbol *lookup_symbol (const char *, const struct block *,
+                                    const namespace_enum, int *,
+                                    struct symtab **);
 
-/* See the comment in symfile.c about how current_objfile is used. */
+/* lookup a symbol by name, within a specified block */
 
-extern struct objfile *current_objfile;
+extern struct symbol *lookup_block_symbol (const struct block *, const char *,
+                                          const char *,
+                                          const namespace_enum);
 
-extern struct symtab *
-lookup_symtab PARAMS ((char *));
+/* lookup a [struct, union, enum] by name, within a specified block */
 
-extern struct symbol *
-lookup_symbol PARAMS ((const char *, const struct block *,
-                      const enum namespace, int *, struct symtab **));
+extern struct type *lookup_struct (char *, struct block *);
 
-extern struct symbol *
-lookup_block_symbol PARAMS ((const struct block *, const char *,
-                            const enum namespace));
+extern struct type *lookup_union (char *, struct block *);
 
-extern struct type *
-lookup_struct PARAMS ((char *, struct block *));
+extern struct type *lookup_enum (char *, struct block *);
 
-extern struct type *
-lookup_union PARAMS ((char *, struct block *));
+/* lookup the function corresponding to the block */
 
-extern struct type *
-lookup_enum PARAMS ((char *, struct block *));
+extern struct symbol *block_function (struct block *);
 
-extern struct symbol *
-block_function PARAMS ((struct block *));
+/* from blockframe.c: */
 
-extern struct symbol *
-find_pc_function PARAMS ((CORE_ADDR));
+/* lookup the function symbol corresponding to the address */
 
-extern int find_pc_partial_function
-  PARAMS ((CORE_ADDR, char **, CORE_ADDR *, CORE_ADDR *));
+extern struct symbol *find_pc_function (CORE_ADDR);
 
-extern void
-clear_pc_function_cache PARAMS ((void));
+/* lookup the function corresponding to the address and section */
 
-extern struct partial_symtab *
-lookup_partial_symtab PARAMS ((char *));
+extern struct symbol *find_pc_sect_function (CORE_ADDR, asection *);
 
-extern struct partial_symtab *
-find_pc_psymtab PARAMS ((CORE_ADDR));
+/* lookup function from address, return name, start addr and end addr */
 
-extern struct symtab *
-find_pc_symtab PARAMS ((CORE_ADDR));
+extern int
+find_pc_partial_function (CORE_ADDR, char **, CORE_ADDR *, CORE_ADDR *);
 
-extern struct partial_symbol *
-find_pc_psymbol PARAMS ((struct partial_symtab *, CORE_ADDR));
+extern void clear_pc_function_cache (void);
 
-extern int
-find_pc_line_pc_range PARAMS ((CORE_ADDR, CORE_ADDR *, CORE_ADDR *));
+extern int find_pc_sect_partial_function (CORE_ADDR, asection *,
+                                         char **, CORE_ADDR *, CORE_ADDR *);
 
-extern int
-contained_in PARAMS ((struct block *, struct block *));
+/* from symtab.c: */
 
-extern void
-reread_symbols PARAMS ((void));
+/* lookup partial symbol table by filename */
+
+extern struct partial_symtab *lookup_partial_symtab (const char *);
+
+/* lookup partial symbol table by address */
+
+extern struct partial_symtab *find_pc_psymtab (CORE_ADDR);
+
+/* lookup partial symbol table by address and section */
+
+extern struct partial_symtab *find_pc_sect_psymtab (CORE_ADDR, asection *);
+
+/* lookup full symbol table by address */
+
+extern struct symtab *find_pc_symtab (CORE_ADDR);
+
+/* lookup full symbol table by address and section */
+
+extern struct symtab *find_pc_sect_symtab (CORE_ADDR, asection *);
+
+/* lookup partial symbol by address */
+
+extern struct partial_symbol *find_pc_psymbol (struct partial_symtab *,
+                                              CORE_ADDR);
+
+/* lookup partial symbol by address and section */
+
+extern struct partial_symbol *find_pc_sect_psymbol (struct partial_symtab *,
+                                                   CORE_ADDR, asection *);
+
+extern int find_pc_line_pc_range (CORE_ADDR, CORE_ADDR *, CORE_ADDR *);
+
+extern int contained_in (struct block *, struct block *);
+
+extern void reread_symbols (void);
+
+extern struct type *lookup_transparent_type (const char *);
+
+
+/* Macro for name of symbol to indicate a file compiled with gcc. */
+#ifndef GCC_COMPILED_FLAG_SYMBOL
+#define GCC_COMPILED_FLAG_SYMBOL "gcc_compiled."
+#endif
+
+/* Macro for name of symbol to indicate a file compiled with gcc2. */
+#ifndef GCC2_COMPILED_FLAG_SYMBOL
+#define GCC2_COMPILED_FLAG_SYMBOL "gcc2_compiled."
+#endif
 
 /* Functions for dealing with the minimal symbol table, really a misc
    address<->symbol mapping for things we don't have debug symbols for.  */
 
-extern void
-prim_record_minimal_symbol PARAMS ((const char *, CORE_ADDR,
-                                   enum minimal_symbol_type));
+extern void prim_record_minimal_symbol (const char *, CORE_ADDR,
+                                       enum minimal_symbol_type,
+                                       struct objfile *);
 
-extern void
-prim_record_minimal_symbol_and_info PARAMS ((const char *, CORE_ADDR,
-                                            enum minimal_symbol_type,
-                                            char *info, int section));
+extern struct minimal_symbol *prim_record_minimal_symbol_and_info
+  (const char *, CORE_ADDR,
+   enum minimal_symbol_type,
+   char *info, int section, asection * bfd_section, struct objfile *);
 
-extern struct minimal_symbol *
-lookup_minimal_symbol PARAMS ((const char *, struct objfile *));
+extern unsigned int msymbol_hash_iw (const char *);
 
-extern struct minimal_symbol *
-lookup_minimal_symbol_by_pc PARAMS ((CORE_ADDR));
+extern unsigned int msymbol_hash (const char *);
 
 extern void
-init_minimal_symbol_collection PARAMS ((void));
+add_minsym_to_hash_table (struct minimal_symbol *sym,
+                         struct minimal_symbol **table);
 
-extern void
-discard_minimal_symbols PARAMS ((int));
+extern struct minimal_symbol *lookup_minimal_symbol (const char *,
+                                                    const char *,
+                                                    struct objfile *);
 
-extern void
-install_minimal_symbols PARAMS ((struct objfile *));
+extern struct minimal_symbol *lookup_minimal_symbol_text (const char *,
+                                                         const char *,
+                                                         struct objfile *);
+
+struct minimal_symbol *lookup_minimal_symbol_solib_trampoline (const char *,
+                                                              const char *,
+                                                              struct objfile
+                                                              *);
+
+extern struct minimal_symbol *lookup_minimal_symbol_by_pc (CORE_ADDR);
+
+extern struct minimal_symbol *lookup_minimal_symbol_by_pc_section (CORE_ADDR,
+                                                                  asection
+                                                                  *);
+
+extern struct minimal_symbol
+  *lookup_solib_trampoline_symbol_by_pc (CORE_ADDR);
+
+extern CORE_ADDR find_solib_trampoline_target (CORE_ADDR);
+
+extern void init_minimal_symbol_collection (void);
+
+extern struct cleanup *make_cleanup_discard_minimal_symbols (void);
+
+extern void install_minimal_symbols (struct objfile *);
+
+/* Sort all the minimal symbols in OBJFILE.  */
+
+extern void msymbols_sort (struct objfile *objfile);
 
 struct symtab_and_line
 {
   struct symtab *symtab;
-
+  asection *section;
   /* Line number.  Line numbers start at 1 and proceed through symtab->nlines.
      0 is never a valid line number; it is used to indicate that line number
      information is not available.  */
@@ -1018,108 +1207,200 @@ struct symtab_and_line
   CORE_ADDR end;
 };
 
+#define INIT_SAL(sal) { \
+  (sal)->symtab  = 0;   \
+  (sal)->section = 0;   \
+  (sal)->line    = 0;   \
+  (sal)->pc      = 0;   \
+  (sal)->end     = 0;   \
+}
+
 struct symtabs_and_lines
 {
   struct symtab_and_line *sals;
   int nelts;
 };
+\f
+
+
+/* Some types and macros needed for exception catchpoints.
+   Can't put these in target.h because symtab_and_line isn't
+   known there. This file will be included by breakpoint.c,
+   hppa-tdep.c, etc. */
+
+/* Enums for exception-handling support */
+enum exception_event_kind
+{
+  EX_EVENT_THROW,
+  EX_EVENT_CATCH
+};
+
+/* Type for returning info about an exception */
+struct exception_event_record
+{
+  enum exception_event_kind kind;
+  struct symtab_and_line throw_sal;
+  struct symtab_and_line catch_sal;
+  /* This may need to be extended in the future, if
+     some platforms allow reporting more information,
+     such as point of rethrow, type of exception object,
+     type expected by catch clause, etc. */
+};
+
+#define CURRENT_EXCEPTION_KIND       (current_exception_event->kind)
+#define CURRENT_EXCEPTION_CATCH_SAL  (current_exception_event->catch_sal)
+#define CURRENT_EXCEPTION_CATCH_LINE (current_exception_event->catch_sal.line)
+#define CURRENT_EXCEPTION_CATCH_FILE (current_exception_event->catch_sal.symtab->filename)
+#define CURRENT_EXCEPTION_CATCH_PC   (current_exception_event->catch_sal.pc)
+#define CURRENT_EXCEPTION_THROW_SAL  (current_exception_event->throw_sal)
+#define CURRENT_EXCEPTION_THROW_LINE (current_exception_event->throw_sal.line)
+#define CURRENT_EXCEPTION_THROW_FILE (current_exception_event->throw_sal.symtab->filename)
+#define CURRENT_EXCEPTION_THROW_PC   (current_exception_event->throw_sal.pc)
+\f
 
 /* Given a pc value, return line number it is in.  Second arg nonzero means
    if pc is on the boundary use the previous statement's line number.  */
 
-extern struct symtab_and_line
-find_pc_line PARAMS ((CORE_ADDR, int));
+extern struct symtab_and_line find_pc_line (CORE_ADDR, int);
+
+/* Same function, but specify a section as well as an address */
+
+extern struct symtab_and_line find_pc_sect_line (CORE_ADDR, asection *, int);
+
+/* Given an address, return the nearest symbol at or below it in memory.
+   Optionally return the symtab it's from through 2nd arg, and the
+   address in inferior memory of the symbol through 3rd arg.  */
+
+extern struct symbol *find_addr_symbol (CORE_ADDR, struct symtab **,
+                                       CORE_ADDR *);
 
 /* Given a symtab and line number, return the pc there.  */
 
-extern CORE_ADDR
-find_line_pc PARAMS ((struct symtab *, int));
+extern int find_line_pc (struct symtab *, int, CORE_ADDR *);
 
-extern int 
-find_line_pc_range PARAMS ((struct symtab_and_line, int,
-                           CORE_ADDR *, CORE_ADDR *));
+extern int
+find_line_pc_range (struct symtab_and_line, CORE_ADDR *, CORE_ADDR *);
 
-extern void
-resolve_sal_pc PARAMS ((struct symtab_and_line *));
+extern void resolve_sal_pc (struct symtab_and_line *);
 
 /* Given a string, return the line specified by it.  For commands like "list"
    and "breakpoint".  */
 
-extern struct symtabs_and_lines
-decode_line_spec PARAMS ((char *, int));
-
-extern struct symtabs_and_lines
-decode_line_spec_1 PARAMS ((char *, int));
+extern struct symtabs_and_lines decode_line_spec (char *, int);
 
-extern struct symtabs_and_lines
-decode_line_1 PARAMS ((char **, int, struct symtab *, int, char ***));
+extern struct symtabs_and_lines decode_line_spec_1 (char *, int);
 
 /* Symmisc.c */
 
-#if MAINTENANCE_CMDS
+void maintenance_print_symbols (char *, int);
 
-void
-maintenance_print_symbols PARAMS ((char *, int));
+void maintenance_print_psymbols (char *, int);
 
-void
-maintenance_print_psymbols PARAMS ((char *, int));
+void maintenance_print_msymbols (char *, int);
 
-void
-maintenance_print_msymbols PARAMS ((char *, int));
+void maintenance_print_objfiles (char *, int);
 
-void
-maintenance_print_objfiles PARAMS ((char *, int));
+void maintenance_check_symtabs (char *, int);
 
-#endif
+/* maint.c */
 
-extern void
-free_symtab PARAMS ((struct symtab *));
+void maintenance_print_statistics (char *, int);
 
-/* Symbol-reading stuff in symfile.c and solib.c.  */
+extern void free_symtab (struct symtab *);
 
-extern struct symtab *
-psymtab_to_symtab PARAMS ((struct partial_symtab *));
+/* Symbol-reading stuff in symfile.c and solib.c.  */
 
-extern void
-clear_solib PARAMS ((void));
+extern struct symtab *psymtab_to_symtab (struct partial_symtab *);
 
-extern struct objfile *
-symbol_file_add PARAMS ((char *, int, CORE_ADDR, int, int, int));
+extern void clear_solib (void);
 
 /* source.c */
 
-extern int frame_file_full_name; /* in stack.c */
+extern int identify_source_line (struct symtab *, int, int, CORE_ADDR);
 
-extern int
-identify_source_line PARAMS ((struct symtab *, int, int, CORE_ADDR));
+extern void print_source_lines (struct symtab *, int, int, int);
 
-extern void
-print_source_lines PARAMS ((struct symtab *, int, int, int));
+extern void forget_cached_source_info (void);
 
-extern void
-forget_cached_source_info PARAMS ((void));
+extern void select_source_symtab (struct symtab *);
 
-extern void
-select_source_symtab PARAMS ((struct symtab *));
+extern char **make_symbol_completion_list (char *, char *);
 
-extern char **make_symbol_completion_list PARAMS ((char *, char *));
+extern char **make_file_symbol_completion_list (char *, char *, char *);
+
+extern struct symbol **make_symbol_overload_list (struct symbol *);
+
+extern char **make_source_files_completion_list (char *, char *);
 
 /* symtab.c */
 
-extern struct partial_symtab *
-find_main_psymtab PARAMS ((void));
+extern struct partial_symtab *find_main_psymtab (void);
+
+extern struct symtab *find_line_symtab (struct symtab *, int, int *, int *);
+
+extern struct symtab_and_line find_function_start_sal (struct symbol *sym,
+                                                      int);
 
 /* blockframe.c */
 
-extern struct blockvector *
-blockvector_for_pc PARAMS ((CORE_ADDR, int *));
+extern struct blockvector *blockvector_for_pc (CORE_ADDR, int *);
+
+extern struct blockvector *blockvector_for_pc_sect (CORE_ADDR, asection *,
+                                                   int *, struct symtab *);
 
 /* symfile.c */
 
-extern void
-clear_symtab_users PARAMS ((void));
+extern void clear_symtab_users (void);
+
+extern enum language deduce_language_from_filename (char *);
+
+/* symtab.c */
+
+extern int in_prologue (CORE_ADDR pc, CORE_ADDR func_start);
+
+extern struct symbol *fixup_symbol_section (struct symbol *,
+                                           struct objfile *);
+
+extern struct partial_symbol *fixup_psymbol_section (struct partial_symbol
+                                                    *psym,
+                                                    struct objfile *objfile);
+
+/* Symbol searching */
+
+/* When using search_symbols, a list of the following structs is returned.
+   Callers must free the search list using free_search_symbols! */
+struct symbol_search
+{
+  /* The block in which the match was found. Could be, for example,
+     STATIC_BLOCK or GLOBAL_BLOCK. */
+  int block;
+
+  /* Information describing what was found.
+
+     If symtab abd symbol are NOT NULL, then information was found
+     for this match. */
+  struct symtab *symtab;
+  struct symbol *symbol;
+
+  /* If msymbol is non-null, then a match was made on something for
+     which only minimal_symbols exist. */
+  struct minimal_symbol *msymbol;
+
+  /* A link to the next match, or NULL for the end. */
+  struct symbol_search *next;
+};
 
-extern enum language
-deduce_language_from_filename PARAMS ((char *));
+extern void search_symbols (char *, namespace_enum, int, char **,
+                           struct symbol_search **);
+extern void free_search_symbols (struct symbol_search *);
+extern struct cleanup *make_cleanup_free_search_symbols (struct symbol_search
+                                                        *);
+
+/* The name of the ``main'' function.
+   FIXME: cagney/2001-03-20: Can't make main_name() const since some
+   of the calling code currently assumes that the string isn't
+   const. */
+extern void set_main_name (const char *name);
+extern /*const */ char *main_name (void);
 
 #endif /* !defined(SYMTAB_H) */
This page took 0.038995 seconds and 4 git commands to generate.