Various fixes to improve g++ debugging. See ChangeLog.
[binutils-gdb.git] / gdb / symtab.h
index 9e36c65c7888b278cd34be9b28f4d9fe0492d401..d220a8398ba7fd48f93eb2933e48784142c660dc 100644 (file)
@@ -1,21 +1,21 @@
 /* Symbol table definitions for GDB.
-   Copyright (C) 1986, 1989 Free Software Foundation, Inc.
+   Copyright (C) 1986, 1989, 1991 Free Software Foundation, Inc.
 
 This file is part of GDB.
 
-GDB is free software; you can redistribute it and/or modify
+This program is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 1, or (at your option)
-any later version.
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
 
-GDB is distributed in the hope that it will be useful,
+This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 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 GDB; see the file COPYING.  If not, write to
-the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
+along with this program; if not, write to the Free Software
+Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 
 #if !defined (SYMTAB_H)
 #define SYMTAB_H 1
@@ -59,7 +59,7 @@ extern void free ();
 /* Actually, the misc function list is used to store *all* of the
    global symbols (text, data, bss, and abs).  It is sometimes used
    to figure out what symtabs to read in.  The "type" field is used
-   occasionally.
+   occasionally.  Calling it the misc "function" vector is now a misnomer.
 
    The misc_info field is available for machine-specific information
    that can be cached along with a misc function vector entry.  The
@@ -83,19 +83,6 @@ struct misc_function
 struct misc_function *misc_function_vector;
 int misc_function_count;
 \f
-enum language {language_unknown, language_c};
-
-/* All data types of symbols in the compiled program
-   are represented by `struct type' objects.
-   All of these objects are pointed to by the typevector.
-   The type vector may have empty slots that contain zero.  */
-
-struct typevector
-{
-  int length;                  /* Number of types described */
-  struct type *type[1];
-};
-
 /* Different kinds of data types are distinguished by the `code' field.  */
 
 enum type_code
@@ -119,6 +106,10 @@ enum type_code
   TYPE_CODE_MEMBER,            /* Member type */
   TYPE_CODE_METHOD,            /* Method type */
   TYPE_CODE_REF,               /* C++ Reference types */
+
+  /* Modula-2 */
+  TYPE_CODE_CHAR,              /* *real* character type */
+  TYPE_CODE_BOOL,              /* Builtin Modula-2 BOOLEAN */
 };
 
 /* This appears in a type's flags word for an unsigned integer type.  */
@@ -256,10 +247,12 @@ struct type
          /* For virtual functions.   */
          /* First baseclass that defines this virtual function.   */
          struct type *fcontext;
+         unsigned int is_const : 1;
+         unsigned int is_volatile : 1;
          /* Index into that baseclass's virtual function table,
-            minus 1; else if static: VOFFSET_STATIC; else: 0.  */
-         int voffset;
-#        define VOFFSET_STATIC (-1)
+            minus 2; else if static: VOFFSET_STATIC; else: 0.  */
+         unsigned long voffset : 30;
+#        define VOFFSET_STATIC 1
        } *fn_fields;
 
       B_TYPE *private_fn_field_bits;
@@ -403,11 +396,6 @@ enum address_class
   LOC_LABEL,           /* Value is address SYMBOL_VALUE_ADDRESS in the code */
   LOC_BLOCK,           /* Value is address SYMBOL_VALUE_BLOCK of a
                           `struct block'.  Function names have this class. */
-  LOC_EXTERNAL,                /* Value is at address SYMBOL_VALUE_ADDRESS not in
-                          this compilation.
-                          This is used only in psymtabs; in symtabs
-                          LOC_STATIC is used instead (since in that case
-                          we take the time to find the address).  */
   LOC_CONST_BYTES,     /* Value is a constant byte-sequence pointed to by
                           SYMBOL_VALUE_ADDRESS, in target byte order.  */
   LOC_LOCAL_ARG,       /* Value is arg at spec'd offset in stack frame.
@@ -442,7 +430,7 @@ struct symbol
                                   LOC_REF_ARG, LOC_REGPARM, LOC_LOCAL */
       struct block *block;      /* for LOC_BLOCK */
       char *bytes;             /* for LOC_CONST_BYTES */
-      CORE_ADDR address;       /* for LOC_STATIC, LOC_LABEL, LOC_EXTERNAL */
+      CORE_ADDR address;       /* for LOC_STATIC, LOC_LABEL */
       struct symbol *chain;    /* for opaque typedef struct chain */
     }
   value;
@@ -528,8 +516,6 @@ struct symtab
     struct blockvector *blockvector;
     /* Table mapping core addresses to line numbers for this file.  */
     struct linetable *linetable;
-    /* Vector containing all types defined for this symtab.  */
-    struct typevector *typevector;
     /* Name of this source file.  */
     char *filename;
     /* Directory in which it was compiled, or NULL if we don't know.  */
@@ -555,6 +541,13 @@ struct symtab
     /* Full name of file as found by searching the source path.
        0 if not yet known.  */
     char *fullname;
+
+    /* 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
   };
 
 /* Each source file that has not been fully read in is represented by
@@ -580,15 +573,6 @@ struct partial_symtab
      relocate by this amount when reading in symbols from the symbol
      file.  */
   CORE_ADDR addr;
-
-  /* Offset within loader symbol table of first local symbol for this
-     file and length (in bytes) of the section of the symbol table
-     devoted to this file's symbols (actually, the section bracketed
-     may contain more than just this files symbols
-     If ldsymlen is 0, the only reason for this things existence is
-     the dependency list below.  Nothing else will happen when it is
-     read in.  */
-  int ldsymoff, ldsymlen;
   /* Range of text addresses covered by this file; texthigh is the
      beginning of the next section. */
   CORE_ADDR textlow, texthigh;
@@ -601,14 +585,15 @@ struct partial_symtab
   /* Global symbol list.  This list will be sorted after readin to
      improve access.  Binary search will be the usual method of
      finding a symbol within it. globals_offset is an integer offset
-     within ps_globals */
+     within global_psymbols[].  */
   int globals_offset, n_global_syms;
   /* Static symbol list.  This list will *not* be sorted after readin;
      to find a symbol in it, exhaustive search must be used.  This is
      reasonable because searches through this list will eventually
      lead to either the read in of a files symbols for real (assumed
      to take a *lot* of time; check) or an error (and we don't care
-     how long errors take). */
+     how long errors take).  This is an offset and size within
+     static_psymbols[].  */
   int statics_offset, n_static_syms;
   /* Pointer to symtab eventually allocated for this source file, 0 if
      !readin or if we haven't looked for the symtab after it was readin.  */
@@ -616,6 +601,12 @@ struct partial_symtab
   /* Pointer to function which will read in the symtab corresponding to
      this psymtab.  */
   void (*read_symtab) ();
+  /* Information that lets read_symtab() locate the part of the symbol table
+     that this psymtab corresponds to.  This information is private to the
+     format-dependent symbol reading routines.  For further detail examine
+     the various symbol reading modules.  Should really be (void *) but is
+     (char *) as with other such gdb variables.  (FIXME) */
+  char *read_symtab_private;
   /* Non-zero if the symtab corresponding to this psymtab has been
      readin */
   unsigned char readin;
@@ -645,8 +636,6 @@ int current_source_line;
 #define BLOCKLIST(symtab) (symtab)->blockvector
 #define BLOCKVECTOR(symtab) (symtab)->blockvector
 
-#define TYPEVECTOR(symtab) (symtab)->typevector
-
 #define LINELIST(symtab) (symtab)->linetable
 #define LINETABLE(symtab) (symtab)->linetable
 \f
@@ -657,9 +646,6 @@ int current_source_line;
 #define BLOCKVECTOR_NBLOCKS(blocklist) (blocklist)->nblocks
 #define BLOCKVECTOR_BLOCK(blocklist,n) (blocklist)->block[n]
 
-#define TYPEVECTOR_NTYPES(typelist) (typelist)->length
-#define TYPEVECTOR_TYPE(typelist,n) (typelist)->type[n]
-
 #define BLOCK_START(bl) (bl)->startaddr
 #define BLOCK_END(bl) (bl)->endaddr
 #define BLOCK_NSYMS(bl) (bl)->nsyms
@@ -745,9 +731,9 @@ int current_source_line;
 #define TYPE_FN_FIELD_TYPE(thistype, n) (thistype)[n].type
 #define TYPE_FN_FIELD_ARGS(thistype, n) TYPE_ARG_TYPES ((thistype)[n].type)
 #define TYPE_FN_FIELD_PHYSNAME(thistype, n) (thistype)[n].physname
-#define TYPE_FN_FIELD_VIRTUAL_P(thistype, n) ((thistype)[n].voffset > 0)
+#define TYPE_FN_FIELD_VIRTUAL_P(thistype, n) ((thistype)[n].voffset > 1)
 #define TYPE_FN_FIELD_STATIC_P(thistype, n) ((thistype)[n].voffset == VOFFSET_STATIC)
-#define TYPE_FN_FIELD_VOFFSET(thistype, n) ((thistype)[n].voffset-1)
+#define TYPE_FN_FIELD_VOFFSET(thistype, n) ((thistype)[n].voffset-2)
 #define TYPE_FN_FIELD_FCONTEXT(thistype, n) ((thistype)[n].fcontext)
 
 #define TYPE_FN_PRIVATE_BITS(thistype) (thistype).private_fn_field_bits
@@ -759,10 +745,26 @@ int current_source_line;
 
 /* The virtual function table is now an array of structures
    which have the form { int16 offset, delta; void *pfn; }. 
-   Gee, can we have more documentation than that?   FIXME.  -- gnu */
+
+   In normal virtual function tables, OFFSET is unused.
+   DELTA is the amount which is added to the apparent object's base
+   address in order to point to the actual object to which the
+   virtual function should be applied.
+   PFN is a pointer to the virtual function.  */
   
 #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.  */
+#define OPNAME_PREFIX_P(NAME) ((NAME)[0] == 'o' && (NAME)[1] == 'p' \
+                              && (NAME)[2] == CPLUS_MARKER)
+
+#define VTBL_PREFIX_P(NAME) ((NAME)[3] == CPLUS_MARKER \
+                            && !strncmp ((NAME), "_vt", 3))
 \f
 /* Functions that work on the objects described above */
 
@@ -786,7 +788,7 @@ extern struct type *create_array_type ();
 extern struct symbol *block_function ();
 extern struct symbol *find_pc_function ();
 extern int find_pc_partial_function ();
-extern void clearpc_function_cache ();
+extern void clear_pc_function_cache ();
 extern struct partial_symtab *lookup_partial_symtab ();
 extern struct partial_symtab *find_pc_psymtab ();
 extern struct symtab *find_pc_symtab ();
@@ -799,8 +801,15 @@ extern int contained_in();
 /* C++ stuff.  */
 extern struct type *lookup_reference_type ();
 extern struct type *lookup_member_type ();
+extern struct type *lookup_method_type ();
 extern struct type *lookup_class ();
 extern void smash_to_method_type ();
+void smash_to_member_type (
+#ifdef __STDC__
+                          struct type *, struct type *, struct type *
+#endif
+                          );
+extern struct type *allocate_stub_method ();
 /* end of C++ stuff.  */
 
 extern void free_all_symtabs ();
@@ -819,14 +828,25 @@ extern struct type *builtin_type_unsigned_int;
 extern struct type *builtin_type_unsigned_long;
 extern struct type *builtin_type_float;
 extern struct type *builtin_type_double;
+extern struct type *builtin_type_long_double;
+extern struct type *builtin_type_complex;
+extern struct type *builtin_type_double_complex;
 /* This type represents a type that was unrecognized in symbol
    read-in.  */
 extern struct type *builtin_type_error;
 
-#ifdef LONG_LONG
 extern struct type *builtin_type_long_long;
 extern struct type *builtin_type_unsigned_long_long;
 
+/* Modula-2 types */
+extern struct type *builtin_type_m2_char;
+extern struct type *builtin_type_m2_int;
+extern struct type *builtin_type_m2_card;
+extern struct type *builtin_type_m2_real;
+extern struct type *builtin_type_m2_bool;
+
+/* LONG_LONG is defined if the host has "long long".  */
+#ifdef LONG_LONG
 #define BUILTIN_TYPE_LONGEST builtin_type_long_long
 #define BUILTIN_TYPE_UNSIGNED_LONGEST builtin_type_unsigned_long_long
 /* This should not be a typedef, because "unsigned LONGEST" needs
@@ -883,10 +903,27 @@ void symbol_file_add ();
 /* source.c */
 int identify_source_line ();
 void print_source_lines ();
+void forget_cached_source_info (
+#ifdef __STDC__
+                               void
+#endif
+                               );
+void select_source_symtab (
+#ifdef __STDC__
+                          struct symtab *
+#endif
+                          );
 
 char **make_symbol_completion_list ();
 
 /* The entry point of a file we are reading.  */
 extern CORE_ADDR entry_point;
 
+/* Maximum and minimum values of built-in types */
+#define        MAX_OF_TYPE(t)  \
+   TYPE_UNSIGNED(t) ? UMAX_OF_SIZE(TYPE_LENGTH(t)) : MAX_OF_SIZE(TYPE_LENGTH(t))
+
+#define MIN_OF_TYPE(t) \
+   TYPE_UNSIGNED(t) ? UMIN_OF_SIZE(TYPE_LENGTH(t)) : MIN_OF_SIZE(TYPE_LENGTH(t))
+
 #endif /* symtab.h not already included.  */