Oodles of changes. The most important is adding support for stabs
[deliverable/binutils-gdb.git] / gdb / symtab.h
index 0421357ec7cd3e9e9f1ce3197741485c07b2f60c..bd7e050ac456eeb07ea1f52f6bf4447d02b44254 100644 (file)
@@ -1,25 +1,25 @@
 /* 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
-#include <obstack.h>
+#include "obstack.h"
 
 /* An obstack to hold objects that should be freed
    when we load a new symbol table.
@@ -32,12 +32,6 @@ extern struct obstack *psymbol_obstack;
 /* Some definitions and declarations to go with use of obstacks.  */
 #define obstack_chunk_alloc xmalloc
 #define obstack_chunk_free free
-#ifdef __STDC__
-extern void *xmalloc ();
-#else
-extern char *xmalloc ();
-#endif
-extern void free ();
 
 /* Some macros for char-based bitfields.  */
 #define B_SET(a,x) (a[x>>3] |= (1 << (x&7)))
@@ -59,7 +53,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 +77,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 +100,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.  */
@@ -131,10 +116,6 @@ enum type_code
    someone referenced a type that wasn't definined in a source file
    via (struct sir_not_appearing_in_this_film *)).  */
 #define TYPE_FLAG_STUB 8
-/* Set when a class has a constructor defined */
-#define        TYPE_FLAG_HAS_CONSTRUCTOR       256
-/* Set when a class has a destructor defined */
-#define        TYPE_FLAG_HAS_DESTRUCTOR        512
 
 struct type
 {
@@ -152,6 +133,7 @@ struct type
      For a range type, describes the type of the full range.
      Unused otherwise.  */
   struct type *target_type;
+
   /* Type that is a pointer to this type.
      Zero if no such pointer-to type is known yet.
      The debugger may add the address of such a type
@@ -159,27 +141,12 @@ struct type
   struct type *pointer_type;
   /* C++: also need a reference type.  */
   struct type *reference_type;
-  struct type **arg_types;
-  
   /* Type that is a function returning this type.
      Zero if no such function type is known here.
      The debugger may add the address of such a type
      if it has to construct one later.  */
   struct type *function_type;
 
-/* Handling of pointers to members:
-   TYPE_MAIN_VARIANT is used for pointer and pointer
-   to member types.  Normally it the value of the address of its
-   containing type.  However, for pointers to members, we must be
-   able to allocate pointer to member types and look them up
-   from some place of reference.
-   NEXT_VARIANT is the next element in the chain.
-
-   A long time ago (Jul 88; GDB 2.5) Tiemann said that main_variant
-   may no longer be necessary and that he might eliminate it.  I don't
-   know whether this is still true (or ever was).  */
-  struct type *main_variant, *next_variant;
-
   /* Flags about this type.  */
   short flags;
   /* Number of fields described for this type */
@@ -215,7 +182,32 @@ struct type
       char *name;
     } *fields;
 
-  /* C++ */
+  /* For types with virtual functions, VPTR_BASETYPE is the base class which
+     defined the virtual function table pointer.  VPTR_FIELDNO is
+     the field number of that pointer in the structure.
+
+     For types that are pointer to member types, VPTR_BASETYPE
+     is the type that this pointer is a member of.
+
+     Unused otherwise.  */
+  struct type *vptr_basetype;
+
+  int vptr_fieldno;
+
+  /* Slot to point to additional language-specific fields of this type.  */
+  union type_specific
+    {
+      /* ARG_TYPES is for TYPE_CODE_METHOD and TYPE_CODE_FUNC.  */
+      struct type **arg_types;
+      /* CPLUS_STUFF is for TYPE_CODE_STRUCT.  */
+      struct cplus_struct_type *cplus_stuff;
+    } type_specific;
+};
+
+/* C++ language-specific information for TYPE_CODE_STRUCT and TYPE_CODE_UNION
+   nodes.  */
+struct cplus_struct_type
+{
   B_TYPE *virtual_field_bits; /* if base class is virtual */
   B_TYPE *private_field_bits;
   B_TYPE *protected_field_bits;
@@ -242,10 +234,6 @@ struct type
       /* The list of methods.  */
       struct fn_field
        {
-#if 0
-         /* The overloaded name */
-         char *name;
-#endif
          /* The return value of the method */
          struct type *type;
          /* The argument list */
@@ -256,32 +244,34 @@ 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;
+         unsigned int is_private : 1;
+         unsigned int is_protected : 1;
+         unsigned int is_stub : 1;
+         unsigned int dummy : 3;
+
          /* 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 voffset : 24;
+#        define VOFFSET_STATIC 1
        } *fn_fields;
 
-      B_TYPE *private_fn_field_bits;
-      B_TYPE *protected_fn_field_bits;
-
     } *fn_fieldlists;
 
   unsigned char via_protected;
   unsigned char via_public;
+};
+/* The default value of TYPE_CPLUS_SPECIFIC(T) points to the
+   this shared static structure. */
 
-  /* For types with virtual functions, VPTR_BASETYPE is the base class which
-     defined the virtual function table pointer.  VPTR_FIELDNO is
-     the field number of that pointer in the structure.
-
-     For types that are pointer to member types, VPTR_BASETYPE
-     ifs the type that this pointer is a member of.
+extern struct cplus_struct_type cplus_struct_default;
 
-     Unused otherwise.  */
-  struct type *vptr_basetype;
+extern void allocate_cplus_struct_type ();
+#define ALLOCATE_CPLUS_STRUCT_TYPE(type) allocate_cplus_struct_type (type)
+#define HAVE_CPLUS_STRUCT(type) \
+  (TYPE_CPLUS_SPECIFIC(type) != &cplus_struct_default)
 
-  int vptr_fieldno;
-};
 \f
 /* All of the name-scope contours of the program
    are represented by `struct block' objects.
@@ -382,7 +372,7 @@ struct block
 
 enum namespace
 {
-  UNDEF_NAMESPACE, VAR_NAMESPACE, STRUCT_NAMESPACE, LABEL_NAMESPACE,
+  UNDEF_NAMESPACE, VAR_NAMESPACE, STRUCT_NAMESPACE, LABEL_NAMESPACE
 };
 
 /* An address-class says where to find the value of a symbol.  */
@@ -403,14 +393,9 @@ 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.
+  LOC_LOCAL_ARG                /* Value is arg at spec'd offset in stack frame.
                           Differs from LOC_LOCAL in that symbol is an
                           argument; differs from LOC_ARG in that we find it
                           in the frame (FRAME_LOCALS_ADDRESS), not in the
@@ -442,7 +427,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;
@@ -526,10 +511,9 @@ struct symtab
     struct symtab *next;
     /* List of all symbol scope blocks for this symtab.  */
     struct blockvector *blockvector;
-    /* Table mapping core addresses to line numbers for this file.  */
+    /* Table mapping core addresses to line numbers for this file.
+       Can be NULL if none.  */
     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 +539,18 @@ struct symtab
     /* Full name of file as found by searching the source path.
        0 if not yet known.  */
     char *fullname;
+
+    /* Object file from which this symbol information was read.  */
+    struct objfile *objfile;
+    /* Chain of all symtabs owned by that objfile.  */
+    struct symtab *objfile_chain;
+
+    /* 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
@@ -574,21 +570,15 @@ struct partial_symtab
   /* Name of the source file which this partial_symtab defines */
   char *filename;
 
-  /* Name of the symbol file from which symbols should be read.  */
-  char *symfile_name;
+  /* Information about the object file from which symbols should be read.  */
+  struct objfile *objfile;
+  /* Chain of psymtabs owned by this objfile */
+  struct partial_symtab *objfile_chain;
+
   /* Address relative to which the symbols in this file are.  Need to
      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 +591,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 +607,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;
@@ -642,24 +639,15 @@ struct symtab *current_source_symtab;
 
 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
 /* Macros normally used to access components of symbol table structures.  */
 
-#define BLOCKLIST_NBLOCKS(blocklist) (blocklist)->nblocks
-#define BLOCKLIST_BLOCK(blocklist,n) (blocklist)->block[n]
 #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
@@ -687,8 +675,6 @@ int current_source_line;
 #define TYPE_POINTER_TYPE(thistype) (thistype)->pointer_type
 #define TYPE_REFERENCE_TYPE(thistype) (thistype)->reference_type
 #define TYPE_FUNCTION_TYPE(thistype) (thistype)->function_type
-#define TYPE_MAIN_VARIANT(thistype) (thistype)->main_variant
-#define TYPE_NEXT_VARIANT(thistype) (thistype)->next_variant
 #define TYPE_LENGTH(thistype) (thistype)->length
 #define TYPE_FLAGS(thistype) (thistype)->flags
 #define TYPE_UNSIGNED(thistype) ((thistype)->flags & TYPE_FLAG_UNSIGNED)
@@ -699,16 +685,19 @@ int current_source_line;
 #define TYPE_VPTR_BASETYPE(thistype) (thistype)->vptr_basetype
 #define TYPE_DOMAIN_TYPE(thistype) (thistype)->vptr_basetype
 #define TYPE_VPTR_FIELDNO(thistype) (thistype)->vptr_fieldno
-#define TYPE_FN_FIELDS(thistype) (thistype)->fn_fields
-#define TYPE_NFN_FIELDS(thistype) (thistype)->nfn_fields
-#define TYPE_NFN_FIELDS_TOTAL(thistype) (thistype)->nfn_fields_total
-#define TYPE_ARG_TYPES(thistype) (thistype)->arg_types
+#define TYPE_FN_FIELDS(thistype) TYPE_CPLUS_SPECIFIC(thistype)->fn_fields
+#define TYPE_NFN_FIELDS(thistype) TYPE_CPLUS_SPECIFIC(thistype)->nfn_fields
+#define TYPE_NFN_FIELDS_TOTAL(thistype) TYPE_CPLUS_SPECIFIC(thistype)->nfn_fields_total
+#define        TYPE_TYPE_SPECIFIC(thistype) (thistype)->type_specific
+#define TYPE_ARG_TYPES(thistype) (thistype)->type_specific.arg_types
+#define TYPE_CPLUS_SPECIFIC(thistype) (thistype)->type_specific.cplus_stuff
 #define TYPE_BASECLASS(thistype,index) (thistype)->fields[index].type
-#define TYPE_N_BASECLASSES(thistype) (thistype)->n_baseclasses
+#define TYPE_N_BASECLASSES(thistype) TYPE_CPLUS_SPECIFIC(thistype)->n_baseclasses
 #define TYPE_BASECLASS_NAME(thistype,index) (thistype)->fields[index].name
 #define TYPE_BASECLASS_BITPOS(thistype,index) (thistype)->fields[index].bitpos
 #define BASETYPE_VIA_PUBLIC(thistype, index) (!TYPE_FIELD_PRIVATE(thistype, index))
-#define BASETYPE_VIA_VIRTUAL(thistype, index) B_TST((thistype)->virtual_field_bits, (index))
+#define BASETYPE_VIA_VIRTUAL(thistype, index) \
+  B_TST(TYPE_CPLUS_SPECIFIC(thistype)->virtual_field_bits, (index))
 
 #define TYPE_FIELD(thistype, n) (thistype)->fields[n]
 #define TYPE_FIELD_TYPE(thistype, n) (thistype)->fields[n].type
@@ -718,51 +707,71 @@ int current_source_line;
 #define TYPE_FIELD_BITSIZE(thistype, n) (thistype)->fields[n].bitsize
 #define TYPE_FIELD_PACKED(thistype, n) (thistype)->fields[n].bitsize
 
-#define TYPE_FIELD_PRIVATE_BITS(thistype) (thistype)->private_field_bits
-#define TYPE_FIELD_PROTECTED_BITS(thistype) (thistype)->protected_field_bits
-#define TYPE_FIELD_VIRTUAL_BITS(thistype) (thistype)->virtual_field_bits
-#define SET_TYPE_FIELD_PRIVATE(thistype, n) B_SET ((thistype)->private_field_bits, (n))
-#define SET_TYPE_FIELD_PROTECTED(thistype, n) B_SET ((thistype)->protected_field_bits, (n))
-#define SET_TYPE_FIELD_VIRTUAL(thistype, n) B_SET ((thistype)->virtual_field_bits, (n))
-#define TYPE_FIELD_PRIVATE(thistype, n) B_TST((thistype)->private_field_bits, (n))
-#define TYPE_FIELD_PROTECTED(thistype, n) B_TST((thistype)->protected_field_bits, (n))
-#define TYPE_FIELD_VIRTUAL(thistype, n) B_TST((thistype)->virtual_field_bits, (n))
-
-#define TYPE_HAS_DESTRUCTOR(thistype) ((thistype)->flags & TYPE_FLAG_HAS_DESTRUCTOR)
-#define TYPE_HAS_CONSTRUCTOR(thistype) ((thistype)->flags & TYPE_FLAG_HAS_CONSTRUCTOR)
+#define TYPE_FIELD_PRIVATE_BITS(thistype) \
+  TYPE_CPLUS_SPECIFIC(thistype)->private_field_bits
+#define TYPE_FIELD_PROTECTED_BITS(thistype) \
+  TYPE_CPLUS_SPECIFIC(thistype)->protected_field_bits
+#define TYPE_FIELD_VIRTUAL_BITS(thistype) \
+  TYPE_CPLUS_SPECIFIC(thistype)->virtual_field_bits
+#define SET_TYPE_FIELD_PRIVATE(thistype, n) \
+  B_SET (TYPE_CPLUS_SPECIFIC(thistype)->private_field_bits, (n))
+#define SET_TYPE_FIELD_PROTECTED(thistype, n) \
+  B_SET (TYPE_CPLUS_SPECIFIC(thistype)->protected_field_bits, (n))
+#define SET_TYPE_FIELD_VIRTUAL(thistype, n) \
+  B_SET (TYPE_CPLUS_SPECIFIC(thistype)->virtual_field_bits, (n))
+#define TYPE_FIELD_PRIVATE(thistype, n) \
+  (TYPE_CPLUS_SPECIFIC(thistype)->private_field_bits == NULL ? 0 \
+    : B_TST(TYPE_CPLUS_SPECIFIC(thistype)->private_field_bits, (n)))
+#define TYPE_FIELD_PROTECTED(thistype, n) \
+  (TYPE_CPLUS_SPECIFIC(thistype)->protected_field_bits == NULL ? 0 \
+    : B_TST(TYPE_CPLUS_SPECIFIC(thistype)->protected_field_bits, (n)))
+#define TYPE_FIELD_VIRTUAL(thistype, n) \
+       B_TST(TYPE_CPLUS_SPECIFIC(thistype)->virtual_field_bits, (n))
 
 #define TYPE_FIELD_STATIC(thistype, n) ((thistype)->fields[n].bitpos == -1)
 #define TYPE_FIELD_STATIC_PHYSNAME(thistype, n) ((char *)(thistype)->fields[n].bitsize)
 
-#define TYPE_FN_FIELDLISTS(thistype) (thistype)->fn_fieldlists
-#define TYPE_FN_FIELDLIST(thistype, n) (thistype)->fn_fieldlists[n]
-#define TYPE_FN_FIELDLIST1(thistype, n) (thistype)->fn_fieldlists[n].fn_fields
-#define TYPE_FN_FIELDLIST_NAME(thistype, n) (thistype)->fn_fieldlists[n].name
-#define TYPE_FN_FIELDLIST_LENGTH(thistype, n) (thistype)->fn_fieldlists[n].length
-
-#define TYPE_FN_FIELD(thistype, n) (thistype)[n]
-#define TYPE_FN_FIELD_NAME(thistype, n) (thistype)[n].name
-#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_STATIC_P(thistype, n) ((thistype)[n].voffset == VOFFSET_STATIC)
-#define TYPE_FN_FIELD_VOFFSET(thistype, n) ((thistype)[n].voffset-1)
-#define TYPE_FN_FIELD_FCONTEXT(thistype, n) ((thistype)[n].fcontext)
-
-#define TYPE_FN_PRIVATE_BITS(thistype) (thistype).private_fn_field_bits
-#define TYPE_FN_PROTECTED_BITS(thistype) (thistype).protected_fn_field_bits
-#define SET_TYPE_FN_PRIVATE(thistype, n) B_SET ((thistype).private_fn_field_bits, n)
-#define SET_TYPE_FN_PROTECTED(thistype, n) B_SET ((thistype).protected_fn_field_bits, n)
-#define TYPE_FN_PRIVATE(thistype, n) B_TST ((thistype).private_fn_field_bits, n)
-#define TYPE_FN_PROTECTED(thistype, n) B_TST ((thistype).protected_fn_field_bits, n)
+#define TYPE_FN_FIELDLISTS(thistype) TYPE_CPLUS_SPECIFIC(thistype)->fn_fieldlists
+#define TYPE_FN_FIELDLIST(thistype, n) TYPE_CPLUS_SPECIFIC(thistype)->fn_fieldlists[n]
+#define TYPE_FN_FIELDLIST1(thistype, n) TYPE_CPLUS_SPECIFIC(thistype)->fn_fieldlists[n].fn_fields
+#define TYPE_FN_FIELDLIST_NAME(thistype, n) TYPE_CPLUS_SPECIFIC(thistype)->fn_fieldlists[n].name
+#define TYPE_FN_FIELDLIST_LENGTH(thistype, n) TYPE_CPLUS_SPECIFIC(thistype)->fn_fieldlists[n].length
+
+#define TYPE_FN_FIELD(thisfn, n) (thisfn)[n]
+#define TYPE_FN_FIELD_NAME(thisfn, n) (thisfn)[n].name
+#define TYPE_FN_FIELD_TYPE(thisfn, n) (thisfn)[n].type
+#define TYPE_FN_FIELD_ARGS(thisfn, n) TYPE_ARG_TYPES ((thisfn)[n].type)
+#define TYPE_FN_FIELD_PHYSNAME(thisfn, n) (thisfn)[n].physname
+#define TYPE_FN_FIELD_VIRTUAL_P(thisfn, n) ((thisfn)[n].voffset > 1)
+#define TYPE_FN_FIELD_STATIC_P(thisfn, n) ((thisfn)[n].voffset == VOFFSET_STATIC)
+#define TYPE_FN_FIELD_VOFFSET(thisfn, n) ((thisfn)[n].voffset-2)
+#define TYPE_FN_FIELD_FCONTEXT(thisfn, n) ((thisfn)[n].fcontext)
+#define TYPE_FN_FIELD_STUB(thisfn, n) ((thisfn)[n].is_stub)
+#define TYPE_FN_FIELD_PRIVATE(thisfn, n) ((thisfn)[n].is_private)
+#define TYPE_FN_FIELD_PROTECTED(thisfn, n) ((thisfn)[n].is_protected)
 
 /* 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 */
 
@@ -781,12 +790,11 @@ extern struct type *lookup_enum ();
 extern struct type *lookup_struct_elt_type ();
 extern struct type *lookup_pointer_type ();
 extern struct type *lookup_function_type ();
-extern struct type *lookup_basetype_type ();
 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 ();
@@ -797,15 +805,18 @@ extern char *type_name_no_tag ();
 extern int contained_in();
 
 /* C++ stuff.  */
+extern struct type *lookup_template_type ();
 extern struct type *lookup_reference_type ();
 extern struct type *lookup_member_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 ();
-extern void free_all_psymtabs ();
-extern void free_inclink_symtabs ();
 extern void reread_symbols ();
 
 extern struct type *builtin_type_void;
@@ -819,14 +830,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
@@ -872,6 +894,9 @@ struct symtabs_and_lines decode_line_spec ();
 struct symtabs_and_lines decode_line_spec_1 ();
 struct symtabs_and_lines decode_line_1 ();
 
+/* Symmisc.c */
+void free_symtab ();
+
 /* Symbol-reading stuff in symfile.c and solib.c.  */
 struct symtab *psymtab_to_symtab ();
 void clear_solib ();
@@ -880,10 +905,24 @@ 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.  */
This page took 0.031134 seconds and 4 git commands to generate.