import gdb-1999-06-14 snapshot
[deliverable/binutils-gdb.git] / gdb / symtab.h
index ffc2f9b206e34551a0f993beff1bbade3f13740e..4c06d83f61cfb2c96f3d2bfeee8389c6a382b4d0 100644 (file)
@@ -1,5 +1,6 @@
 /* Symbol table definitions for GDB.
-   Copyright 1986, 1989, 1991, 1992, 1993, 1994 Free Software Foundation, Inc.
+   Copyright 1986, 89, 91, 92, 93, 94, 95, 96, 1998
+             Free Software Foundation, Inc.
 
 This file is part of GDB.
 
@@ -15,7 +16,7 @@ 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.  */
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 
 #if !defined (SYMTAB_H)
 #define SYMTAB_H 1
@@ -25,9 +26,14 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #include "obstack.h"
 #define obstack_chunk_alloc xmalloc
 #define obstack_chunk_free free
-
-/* GNU C supports enums that are bitfields.  Some old compilers don't. */
-#if defined(__GNUC__) && !defined(BYTE_BITFIELD)
+#include "bcache.h"
+
+/* 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*/
@@ -57,7 +63,10 @@ struct general_symbol_info
 
   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;
 
@@ -77,6 +86,7 @@ struct general_symbol_info
   union
     {
       struct cplus_specific      /* For C++ */
+                               /*  and Java */
        {
          char *demangled_name;
        } cplus_specific;
@@ -100,30 +110,36 @@ struct general_symbol_info
      also tries to set it correctly).  */
 
   short section;
+
+  /* The bfd section associated with this symbol. */
+
+  asection *bfd_section;
 };
 
+extern CORE_ADDR symbol_overlayed_address PARAMS((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
    depending upon the language for the symbol. */
 
 #define SYMBOL_INIT_LANGUAGE_SPECIFIC(symbol,language)                 \
   do {                                                                 \
     SYMBOL_LANGUAGE (symbol) = language;                               \
-    if (SYMBOL_LANGUAGE (symbol) == language_cplus)                    \
+    if (SYMBOL_LANGUAGE (symbol) == language_cplus                     \
+       || SYMBOL_LANGUAGE (symbol) == language_java                    \
+       )                                                               \
       {                                                                        \
        SYMBOL_CPLUS_DEMANGLED_NAME (symbol) = NULL;                    \
       }                                                                        \
@@ -167,6 +183,23 @@ extern int demangle;       /* We reference it, so go ahead and declare it. */
            SYMBOL_CPLUS_DEMANGLED_NAME (symbol) = NULL;                \
          }                                                             \
       }                                                                        \
+    if (SYMBOL_LANGUAGE (symbol) == language_java)                     \
+      {                                                                        \
+       demangled =                                                     \
+         cplus_demangle (SYMBOL_NAME (symbol),                         \
+                         DMGL_PARAMS | DMGL_ANSI | DMGL_JAVA);         \
+       if (demangled != NULL)                                          \
+         {                                                             \
+           SYMBOL_LANGUAGE (symbol) = language_java;                   \
+           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))              \
@@ -196,6 +229,7 @@ extern int demangle;        /* We reference it, so go ahead and declare it. */
 
 #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)                           \
@@ -225,10 +259,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
@@ -273,17 +303,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
@@ -299,13 +337,21 @@ struct minimal_symbol
       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;
-
 };
 
 #define MSYMBOL_INFO(msymbol)          (msymbol)->info
@@ -418,8 +464,8 @@ struct block
 
 /* 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
@@ -441,8 +487,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.  */
 
@@ -545,12 +608,56 @@ 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. */
+     
+  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
 {
 
@@ -564,11 +671,16 @@ struct symbol
 
   /* Name space code.  */
 
-  enum namespace namespace BYTE_BITFIELD;
+#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;
 
   /* Address class */
 
-  enum address_class class BYTE_BITFIELD;
+  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
@@ -585,13 +697,25 @@ struct symbol
       short basereg;
     }
   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;
 };
 
+
 #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_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
@@ -609,16 +733,16 @@ struct partial_symbol
 
   /* Name space code.  */
 
-  enum namespace namespace BYTE_BITFIELD;
+  namespace_enum namespace BYTE_BITFIELD;
 
   /* Address class (for info_symbols) */
 
-  enum address_class class BYTE_BITFIELD;
+  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,
@@ -690,6 +814,13 @@ struct section_offsets
 
 #define        ANOFFSET(secoff, whichone)      (secoff->offsets[whichone])
 
+/* The maximum possible size of a section_offsets table.  */
+#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.  */
 
@@ -712,7 +843,7 @@ struct symtab
     struct linetable *linetable;
 
     /* Section in objfile->section_offsets for the blockvector and
-       the linetable.  */
+       the linetable.  Probably always SECT_OFF_TEXT.  */
 
     int block_line_section;
 
@@ -762,6 +893,13 @@ struct symtab
 
     enum language language;
 
+    /* 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. */
+
+    char *debugformat;
+
     /* String of version information.  May be zero.  */
 
     char *version;
@@ -775,14 +913,6 @@ struct symtab
 
     struct objfile *objfile;
 
-    /* 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).  */
-
-#if defined (EXTRA_SYMTAB_INFO)
-    EXTRA_SYMTAB_INFO
-#endif
-
   };
 
 #define BLOCKVECTOR(symtab)    (symtab)->blockvector
@@ -905,19 +1035,24 @@ struct partial_symtab
    Note that this macro is g++ specific (FIXME). */
 
 #define OPNAME_PREFIX_P(NAME) \
-  ((NAME)[0] == 'o' && (NAME)[1] == 'p' && (NAME)[2] == CPLUS_MARKER)
+  ((NAME)[0] == 'o' && (NAME)[1] == 'p' && is_cplus_marker ((NAME)[2]))
 
 /* Macro that yields non-zero value iff NAME is the prefix for C++ vtbl
-   names.  Note that this macro is g++ specific (FIXME).  */
+   names.  Note that this macro is g++ specific (FIXME).
+   '_vt$' is the old cfront-style vtables; '_VT$' is the new
+   style, using thunks (where '$' is really CPLUS_MARKER). */
 
 #define VTBL_PREFIX_P(NAME) \
-  ((NAME)[3] == CPLUS_MARKER && !strncmp ((NAME), "_vt", 3))
+  ((NAME)[0] == '_' \
+   && (((NAME)[1] == 'V' && (NAME)[2] == 'T') \
+       || ((NAME)[1] == 'v' && (NAME)[2] == 't')) \
+   && is_cplus_marker ((NAME)[3]))
 
 /* Macro that yields non-zero value iff NAME is the prefix for C++ destructor
    names.  Note that this macro is g++ specific (FIXME).  */
 
 #define DESTRUCTOR_PREFIX_P(NAME) \
-  ((NAME)[0] == '_' && (NAME)[1] == CPLUS_MARKER && (NAME)[2] == '_')
+  ((NAME)[0] == '_' && is_cplus_marker ((NAME)[1]) && (NAME)[2] == '_')
 
 \f
 /* External variables and functions for the objects described above. */
@@ -934,16 +1069,34 @@ extern int current_source_line;
 
 extern struct objfile *current_objfile;
 
+/* True if we are nested inside psymtab_to_symtab. */
+
+extern int currently_reading_symtab;
+
+/* From utils.c.  */
+extern int demangle;
+extern int asm_demangle;
+
+/* symtab.c lookup functions */
+
+/* lookup a symbol table by source file name */
+
 extern struct symtab *
 lookup_symtab PARAMS ((char *));
 
+/* lookup a symbol by name (optional block, optional symtab) */
+
 extern struct symbol *
 lookup_symbol PARAMS ((const char *, const struct block *,
-                      const enum namespace, int *, struct symtab **));
+                      const namespace_enum, int *, struct symtab **));
 
+/* lookup a symbol by name, within a specified block */
+  
 extern struct symbol *
 lookup_block_symbol PARAMS ((const struct block *, const char *,
-                            const enum namespace));
+                            const namespace_enum));
+
+/* lookup a [struct, union, enum] by name, within a specified block */
 
 extern struct type *
 lookup_struct PARAMS ((char *, struct block *));
@@ -954,30 +1107,73 @@ lookup_union PARAMS ((char *, struct block *));
 extern struct type *
 lookup_enum PARAMS ((char *, struct block *));
 
+/* lookup the function corresponding to the block */
+
 extern struct symbol *
 block_function PARAMS ((struct block *));
 
+/* from blockframe.c: */
+
+/* lookup the function symbol corresponding to the address */
+
 extern struct symbol *
 find_pc_function PARAMS ((CORE_ADDR));
 
-extern int find_pc_partial_function
-  PARAMS ((CORE_ADDR, char **, CORE_ADDR *, CORE_ADDR *));
+/* lookup the function corresponding to the address and section */
+
+extern struct symbol *
+find_pc_sect_function PARAMS ((CORE_ADDR, asection *));
+  
+/* lookup function from address, return name, start addr and end addr */
+
+extern int 
+find_pc_partial_function PARAMS ((CORE_ADDR, char **,
+                                            CORE_ADDR *, CORE_ADDR *));
 
 extern void
 clear_pc_function_cache PARAMS ((void));
 
+extern int 
+find_pc_sect_partial_function PARAMS ((CORE_ADDR, asection *, 
+                                       char **, CORE_ADDR *, CORE_ADDR *));
+
+/* from symtab.c: */
+
+/* lookup partial symbol table by filename */
+
 extern struct partial_symtab *
 lookup_partial_symtab PARAMS ((char *));
 
+/* lookup partial symbol table by address */
+
 extern struct partial_symtab *
 find_pc_psymtab PARAMS ((CORE_ADDR));
 
+/* lookup partial symbol table by address and section */
+
+extern struct partial_symtab *
+find_pc_sect_psymtab PARAMS ((CORE_ADDR, asection *));
+
+/* lookup full symbol table by address */
+
 extern struct symtab *
 find_pc_symtab PARAMS ((CORE_ADDR));
 
+/* lookup full symbol table by address and section */
+
+extern struct symtab *
+find_pc_sect_symtab PARAMS ((CORE_ADDR, asection *));
+
+/* lookup partial symbol by address */
+
 extern struct partial_symbol *
 find_pc_psymbol PARAMS ((struct partial_symtab *, CORE_ADDR));
 
+/* lookup partial symbol by address and section */
+
+extern struct partial_symbol *
+find_pc_sect_psymbol PARAMS ((struct partial_symtab *, CORE_ADDR, asection *));
+
 extern int
 find_pc_line_pc_range PARAMS ((CORE_ADDR, CORE_ADDR *, CORE_ADDR *));
 
@@ -987,6 +1183,10 @@ contained_in PARAMS ((struct block *, struct block *));
 extern void
 reread_symbols PARAMS ((void));
 
+extern struct type *
+lookup_transparent_type PARAMS ((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."
@@ -1004,18 +1204,42 @@ extern void prim_record_minimal_symbol PARAMS ((const char *, CORE_ADDR,
                                                enum minimal_symbol_type,
                                                struct objfile *));
 
-extern void prim_record_minimal_symbol_and_info
+extern struct minimal_symbol *prim_record_minimal_symbol_and_info
   PARAMS ((const char *, CORE_ADDR,
           enum minimal_symbol_type,
           char *info, int section,
+          asection *bfd_section,
           struct objfile *));
 
+#ifdef SOFUN_ADDRESS_MAYBE_MISSING
+extern CORE_ADDR find_stab_function_addr PARAMS ((char *,
+                                                 struct partial_symtab *,
+                                                 struct objfile *));
+#endif
+
+extern struct minimal_symbol *
+lookup_minimal_symbol PARAMS ((const char *, const char *, struct objfile *));
+
 extern struct minimal_symbol *
-lookup_minimal_symbol PARAMS ((const char *, struct objfile *));
+lookup_minimal_symbol_text PARAMS ((const char *, const char *, struct objfile *));
+
+struct minimal_symbol *
+lookup_minimal_symbol_solib_trampoline PARAMS ((const char *,
+                                               const char *,
+                                               struct objfile *));
 
 extern struct minimal_symbol *
 lookup_minimal_symbol_by_pc PARAMS ((CORE_ADDR));
 
+extern struct minimal_symbol *
+lookup_minimal_symbol_by_pc_section PARAMS ((CORE_ADDR, asection *));
+
+extern struct minimal_symbol *
+lookup_solib_trampoline_symbol_by_pc PARAMS ((CORE_ADDR));
+
+extern CORE_ADDR
+find_solib_trampoline_target PARAMS ((CORE_ADDR));
+
 extern void
 init_minimal_symbol_collection PARAMS ((void));
 
@@ -1025,10 +1249,14 @@ discard_minimal_symbols PARAMS ((int));
 extern void
 install_minimal_symbols PARAMS ((struct objfile *));
 
+/* Sort all the minimal symbols in OBJFILE.  */
+
+extern void msymbols_sort PARAMS ((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.  */
@@ -1038,18 +1266,66 @@ 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));
 
+/* Same function, but specify a section as well as an address */
+
+extern struct symtab_and_line
+find_pc_sect_line PARAMS ((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.  */
@@ -1059,8 +1335,8 @@ find_addr_symbol PARAMS ((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 PARAMS ((struct symtab *, int, CORE_ADDR *));
 
 extern int 
 find_line_pc_range PARAMS ((struct symtab_and_line,
@@ -1083,8 +1359,6 @@ decode_line_1 PARAMS ((char **, int, struct symtab *, int, char ***));
 
 /* Symmisc.c */
 
-#if MAINTENANCE_CMDS
-
 void
 maintenance_print_symbols PARAMS ((char *, int));
 
@@ -1097,7 +1371,13 @@ maintenance_print_msymbols PARAMS ((char *, int));
 void
 maintenance_print_objfiles PARAMS ((char *, int));
 
-#endif
+void
+maintenance_check_symtabs PARAMS ((char *, int));
+
+/* maint.c */
+
+void
+maintenance_print_statistics PARAMS ((char *, int));
 
 extern void
 free_symtab PARAMS ((struct symtab *));
@@ -1111,12 +1391,10 @@ extern void
 clear_solib PARAMS ((void));
 
 extern struct objfile *
-symbol_file_add PARAMS ((char *, int, CORE_ADDR, int, int, int));
+symbol_file_add PARAMS ((char *, int, CORE_ADDR, int, int, int, int, int));
 
 /* source.c */
 
-extern int frame_file_full_name; /* in stack.c */
-
 extern int
 identify_source_line PARAMS ((struct symtab *, int, int, CORE_ADDR));
 
@@ -1131,6 +1409,9 @@ select_source_symtab PARAMS ((struct symtab *));
 
 extern char **make_symbol_completion_list PARAMS ((char *, char *));
 
+extern struct symbol **
+make_symbol_overload_list PARAMS ((struct symbol *));
+
 /* symtab.c */
 
 extern struct partial_symtab *
@@ -1141,6 +1422,10 @@ find_main_psymtab PARAMS ((void));
 extern struct blockvector *
 blockvector_for_pc PARAMS ((CORE_ADDR, int *));
 
+extern struct blockvector *
+blockvector_for_pc_sect PARAMS ((CORE_ADDR, asection *, int *, 
+                                struct symtab *));
+
 /* symfile.c */
 
 extern void
@@ -1149,4 +1434,40 @@ clear_symtab_users PARAMS ((void));
 extern enum language
 deduce_language_from_filename PARAMS ((char *));
 
+/* symtab.c */
+
+extern int
+in_prologue PARAMS ((CORE_ADDR pc, CORE_ADDR func_start));
+
+extern struct symbol *
+fixup_symbol_section PARAMS ((struct symbol  *, struct objfile *));
+
+/* Symbol searching */
+
+/* When using search_symbols, a list of the following structs is returned.
+   Callers must free the search list using free_symbol_search! */
+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 void search_symbols PARAMS ((char *, namespace_enum, int, char **, struct symbol_search **));
+extern void free_search_symbols PARAMS ((struct symbol_search *));
+
 #endif /* !defined(SYMTAB_H) */
This page took 0.031088 seconds and 4 git commands to generate.