Fix gcc -Wall warnings. See ChangeLog for details.
[deliverable/binutils-gdb.git] / gdb / symtab.h
index cd1ad34ee2e686976fb77f4c2d644b40963f5d97..4bf17d73411c81358094a8ff8a014cf6329bf8df 100644 (file)
@@ -1,5 +1,5 @@
 /* Symbol table definitions for GDB.
-   Copyright 1986, 1989, 1991, 1992, 1993, 1994 Free Software Foundation, Inc.
+   Copyright 1986, 1989, 1991, 1992, 1993, 1994, 1995, 1996 Free Software Foundation, Inc.
 
 This file is part of GDB.
 
@@ -15,7 +15,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,6 +25,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #include "obstack.h"
 #define obstack_chunk_alloc xmalloc
 #define obstack_chunk_free free
+#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
@@ -83,7 +84,7 @@ struct general_symbol_info
 
   union
     {
-      struct cplus_specific      /* For C++ */
+      struct cplus_specific      /* For C++ and Java */
        {
          char *demangled_name;
        } cplus_specific;
@@ -107,8 +108,14 @@ 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.ivalue
 #define SYMBOL_VALUE_ADDRESS(symbol)   (symbol)->ginfo.value.address
@@ -117,20 +124,19 @@ struct general_symbol_info
 #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;                    \
       }                                                                        \
@@ -174,6 +180,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))              \
@@ -203,6 +226,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)                           \
@@ -232,10 +256,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
@@ -291,6 +311,11 @@ struct minimal_symbol
 
   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
@@ -321,7 +346,6 @@ struct minimal_symbol
       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
@@ -434,8 +458,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
@@ -458,7 +482,7 @@ enum namespace
      currently it is not used and labels are not recorded at all.  */
 
   LABEL_NAMESPACE
-};
+} namespace_enum;
 
 /* An address-class says where to find the value of a symbol.  */
 
@@ -561,12 +585,33 @@ 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,
+
   /* The variable does not actually exist in the program.
      The value is ignored.  */
 
   LOC_OPTIMIZED_OUT
 };
 
+/* Linked list of symbol's live ranges. */
+
+struct live_range              
+{
+  CORE_ADDR start;
+  CORE_ADDR end;
+  struct live_range *next;     
+};
+
 struct symbol
 {
 
@@ -580,11 +625,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
@@ -601,13 +651,35 @@ struct symbol
       short basereg;
     }
   aux_value;
+
+  /* Live range information (if present) for debugging of optimized code.  
+     Gcc extensions were added to stabs to encode live range information.
+     The syntax for referencing (defining) symbol aliases is "#n" ("#n=")
+     where n is a number.  The syntax for specifying a range is "l(#<m>,#<n>)",
+     where m and n are numbers. 
+     aliases - list of other symbols which are lexically the same symbol, 
+         but were optimized into different storage classes (eg. for the
+         local symbol "x", one symbol contains range information where x 
+         is on the stack, while an alias contains the live ranges where x 
+         is in a register).
+     range - list of instruction ranges where the symbol is live. */
+  struct live_range_info               
+    {
+      struct symbol *aliases;  /* Link to other aliases for this symbol. */
+      struct live_range        *range; /* Linked list of live ranges. */
+    } live;
 };
 
 #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)->live.aliases
+#define SYMBOL_RANGE(symbol)           (symbol)->live.range 
+#define SYMBOL_RANGE_START(symbol)     (symbol)->live.range->start
+#define SYMBOL_RANGE_END(symbol)       (symbol)->live.range->end
+#define SYMBOL_RANGE_NEXT(symbol)      (symbol)->live.range->next
 \f
 /* A partial_symbol records the name, namespace, and address class of
    symbols whose types we have not parsed yet.  For functions, it also
@@ -625,16 +697,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,
@@ -706,6 +778,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.  */
 
@@ -728,7 +807,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;
 
@@ -778,6 +857,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;
@@ -921,19 +1007,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. */
@@ -950,16 +1041,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 *));
@@ -970,30 +1079,68 @@ 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));
 
+/* 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 *));
 
@@ -1020,18 +1167,36 @@ 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 *, struct objfile *));
+lookup_minimal_symbol PARAMS ((const char *, const char *, struct objfile *));
+
+extern struct minimal_symbol *
+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));
 
@@ -1047,10 +1212,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.  */
@@ -1060,6 +1229,14 @@ 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;
@@ -1072,6 +1249,11 @@ struct symtabs_and_lines
 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.  */
@@ -1103,10 +1285,10 @@ decode_line_spec_1 PARAMS ((char *, int));
 extern struct symtabs_and_lines
 decode_line_1 PARAMS ((char **, int, struct symtab *, int, char ***));
 
-/* Symmisc.c */
-
 #if MAINTENANCE_CMDS
 
+/* Symmisc.c */
+
 void
 maintenance_print_symbols PARAMS ((char *, int));
 
@@ -1122,6 +1304,11 @@ maintenance_print_objfiles PARAMS ((char *, int));
 void
 maintenance_check_symtabs PARAMS ((char *, int));
 
+/* maint.c */
+
+void
+maintenance_print_statistics PARAMS ((char *, int));
+
 #endif
 
 extern void
@@ -1140,8 +1327,6 @@ symbol_file_add PARAMS ((char *, int, CORE_ADDR, 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));
 
@@ -1166,6 +1351,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
@@ -1174,4 +1363,12 @@ 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 *));
+
 #endif /* !defined(SYMTAB_H) */
This page took 0.029993 seconds and 4 git commands to generate.