* config/m88k/{tm-delta88.h,tm-delta88v4.h}, m88k-tdep.c:
[deliverable/binutils-gdb.git] / gdb / gdbtypes.h
index 95f40359e44d5213522524f16c905daa023f35e6..bf21d9035a36aef91b320229a89f1de17cb6c786 100644 (file)
@@ -21,9 +21,11 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #if !defined (GDBTYPES_H)
 #define GDBTYPES_H 1
 
-/* When gdb creates fundamental types, it uses one of the following
-   type identifiers.  The identifiers are used to index a vector of
-   pointers to any types that are created. */
+/* Codes for `fundamental types'.  This is a monstrosity based on the
+   bogus notion that there are certain compiler-independent
+   `fundamental types'.  None of these is well-defined (how big is
+   FT_SHORT?  Does it depend on the language?  How does the
+   language-specific code know which type to correlate to FT_SHORT?)  */
 
 #define FT_VOID                        0
 #define FT_BOOLEAN             1
@@ -51,8 +53,19 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #define FT_STRING              23
 #define FT_FIXED_DECIMAL       24
 #define FT_FLOAT_DECIMAL       25
+#define FT_BYTE                        26
+#define FT_UNSIGNED_BYTE       27
 
-#define FT_NUM_MEMBERS         26
+#define FT_NUM_MEMBERS         28      /* Highest FT_* above, plus one. */
+
+/* Some macros for char-based bitfields.  */
+
+#define B_SET(a,x)     ((a)[(x)>>3] |= (1 << ((x)&7)))
+#define B_CLR(a,x)     ((a)[(x)>>3] &= ~(1 << ((x)&7)))
+#define B_TST(a,x)     ((a)[(x)>>3] & (1 << ((x)&7)))
+#define B_TYPE         unsigned char
+#define        B_BYTES(x)      ( 1 + ((x)>>3) )
+#define        B_CLRALL(a,x)   memset ((a), 0, B_BYTES(x))
 
 /* Different kinds of data types are distinguished by the `code' field.  */
 
@@ -60,18 +73,38 @@ enum type_code
 {
   TYPE_CODE_UNDEF,             /* Not used; catches errors */
   TYPE_CODE_PTR,               /* Pointer type */
-  TYPE_CODE_ARRAY,             /* Array type, lower bound zero */
+  TYPE_CODE_ARRAY,             /* Array type with lower & upper bounds. */
   TYPE_CODE_STRUCT,            /* C struct or Pascal record */
   TYPE_CODE_UNION,             /* C union or Pascal variant part */
   TYPE_CODE_ENUM,              /* Enumeration type */
   TYPE_CODE_FUNC,              /* Function type */
   TYPE_CODE_INT,               /* Integer type */
-  TYPE_CODE_FLT,               /* Floating type */
-  TYPE_CODE_VOID,              /* Void type (values zero length) */
+
+  /* Floating type.  This is *NOT* a complex type.  Complex types, when
+     we have them, will have their own type code (or TYPE_CODE_ERROR if
+     we can parse a complex type but not manipulate it).  There are parts
+     of GDB which bogusly assume that TYPE_CODE_FLT can mean complex.  */
+  TYPE_CODE_FLT,
+
+  /* Void type (values zero length; the length field is ignored).  */
+  TYPE_CODE_VOID,
+
   TYPE_CODE_SET,               /* Pascal sets */
   TYPE_CODE_RANGE,             /* Range (integers within spec'd bounds) */
-  TYPE_CODE_PASCAL_ARRAY,      /* Array with explicit type of index */
-  TYPE_CODE_ERROR,              /* Unknown type */
+
+  /* A string type which is like an array of character but prints
+     differently (at least for CHILL).  It does not contain a length
+     field as Pascal strings (for many Pascals, anyway) do; if we want
+     to deal with such strings, we should use a new type code.  */
+  TYPE_CODE_STRING,
+
+  /* String of bits; like TYPE_CODE_SET but prints differently (at least
+     for CHILL).  */
+  TYPE_CODE_BITSTRING,
+
+  /* Unknown type.  The length field is valid if we were able to
+     deduce that much about the type, or 0 if we don't even know that.  */
+  TYPE_CODE_ERROR,
 
   /* C++ */
   TYPE_CODE_MEMBER,            /* Member type */
@@ -80,7 +113,7 @@ enum type_code
 
   /* Modula-2 */
   TYPE_CODE_CHAR,              /* *real* character type */
-  TYPE_CODE_BOOL               /* Builtin Modula-2 BOOLEAN */
+  TYPE_CODE_BOOL               /* BOOLEAN type */
 };
 
 /* For now allow source to use TYPE_CODE_CLASS for C++ classes, as an
@@ -91,20 +124,23 @@ enum type_code
 
 /* Some bits for the type's flags word. */
 
-/* Explicitly unsigned integer type */
+/* Unsigned integer type.  If this is not set for a TYPE_CODE_INT, the
+   type is signed.  */
 
 #define TYPE_FLAG_UNSIGNED     (1 << 0)
 
-/* Explicitly signed integer type */
-
-#define TYPE_FLAG_SIGNED       (1 << 1)
-
-/* This appears in a type's flags word if it is a stub type (eg. if
+/* This appears in a type's flags word if it is a stub type (e.g., if
    someone referenced a type that wasn't defined in a source file
    via (struct sir_not_appearing_in_this_film *)).  */
 
 #define TYPE_FLAG_STUB         (1 << 2)
 
+/* The target type of this type is a stub type, and this type needs to
+   be updated if it gets un-stubbed in check_stub_type.  Currently only
+   used for arrays, in which TYPE_LENGTH of the array gets set based
+   on the TYPE_LENGTH of the target type.  */
+
+#define TYPE_FLAG_TARGET_STUB (1 << 3)
 
 struct type
 {
@@ -114,12 +150,27 @@ struct type
   enum type_code code;
 
   /* Name of this type, or NULL if none.
+
      This is used for printing only, except by poorly designed C++ code.
-     Type names specified as input are defined by symbols.  */
+     For looking up a name, look for a symbol in the VAR_NAMESPACE.  */
 
   char *name;
 
-  /* Length in bytes of storage for a value of this type */
+  /* Tag name for this type, or NULL if none.  This means that the
+     name of the type consists of a keyword followed by the tag name.
+     Which keyword is determined by the type code ("struct" for
+     TYPE_CODE_STRUCT, etc.).  As far as I know C/C++ are the only languages
+     with this feature.
+
+     This is used for printing only, except by poorly designed C++ code.
+     For looking up a name, look for a symbol in the STRUCT_NAMESPACE.
+     One more legitimate use is that if TYPE_FLAG_STUB is set, this is
+     the name to use to look for definitions in other files.  */
+
+  char *tag_name;
+
+  /* Length, in units of TARGET_CHAR_BIT bits,
+     of storage for a value of this type */
 
   unsigned length;
 
@@ -193,6 +244,7 @@ struct type
         containing structure.  For a function type, this is the
         position in the argument list of this argument.
         For a range bound or enum value, this is the value itself.
+        (FIXME:  What about ranges larger than host int size?)
         For BITS_BIG_ENDIAN=1 targets, it is the bit offset to the MSB.
         For BITS_BIG_ENDIAN=0 targets, it is the bit offset to the LSB. */
 
@@ -201,8 +253,10 @@ struct type
       /* Size of this field, in bits, or zero if not packed.
         For an unpacked field, the field's type's length
         says how many bytes the field occupies.  */
+      /* FIXME: This is abused by TYPE_FIELD_STATIC_PHYSNAME to contain 
+        a pointer, so it has to be long.  */
 
-      int bitsize;
+      long bitsize;
 
       /* In a struct or enum type, type of this field.
         In a function type, type of this argument.
@@ -218,8 +272,7 @@ struct type
     } *fields;
 
   /* 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.
+     defined the virtual function table pointer.  
 
      For types that are pointer to member types, VPTR_BASETYPE
      is the type that this pointer is a member of.
@@ -228,6 +281,13 @@ struct type
 
   struct type *vptr_basetype;
 
+  /* Field number of the virtual function table pointer in
+     VPTR_BASETYPE.  If -1, we were unable to find the virtual
+     function table pointer in initial symbol reading, and
+     fill_in_vptr_fieldno should be called to find it if possible.
+
+     Unused if this type does not have virtual functions.  */
+
   int vptr_fieldno;
 
   /* Slot to point to additional language-specific fields of this type.  */
@@ -255,7 +315,10 @@ struct type
 
 struct cplus_struct_type
 {
-  /* Number of base classes this type derives from. */
+  /* Number of base classes this type derives from.  The baseclasses are
+     stored in the first N_BASECLASSES fields (i.e. the `fields' field of
+     the struct type).  I think only the `type' field of such a field has
+     any meaning.  */
 
   short n_baseclasses;
 
@@ -297,6 +360,11 @@ struct cplus_struct_type
 
   B_TYPE *protected_field_bits;
 
+  /* for classes with fields to be ignored, either this is optimized out
+     or this field has length 0 */
+
+  B_TYPE *ignore_field_bits;
+
   /* For classes, structures, and unions, a description of each field,
      which consists of an overloaded name, followed by the types of
      arguments that the method expects, and then the name after it
@@ -320,7 +388,16 @@ struct cplus_struct_type
       struct fn_field
        {
 
-         /* The name after it has been processed */
+         /* If is_stub is clear, this is the mangled name which we can
+            look up to find the address of the method (FIXME: it would
+            be cleaner to have a pointer to the struct symbol here
+            instead).  */
+
+         /* If is_stub is set, this is the portion of the mangled
+            name which specifies the arguments.  For example, "ii",
+            if there are two int arguments, or "" if there are no
+            arguments.  See gdb_mangle_name for the conversion from this
+            format to the one used if is_stub is clear.  */
 
          char *physname;
 
@@ -328,7 +405,9 @@ struct cplus_struct_type
 
          struct type *type;
 
-         /* The argument list */
+         /* The argument list.  Only valid if is_stub is clear.  Contains
+            the type of each argument, including `this', and ending with
+            a NULL pointer after the last argument.  */
 
          struct type **args;
 
@@ -343,7 +422,12 @@ struct cplus_struct_type
          unsigned int is_volatile : 1;
          unsigned int is_private : 1;
          unsigned int is_protected : 1;
+
+         /* A stub method only has some fields valid (but they are enough
+            to reconstruct the rest of the fields).  */
          unsigned int is_stub : 1;
+
+         /* Unused.  */
          unsigned int dummy : 3;
 
          /* Index into that baseclass's virtual function table,
@@ -374,6 +458,7 @@ allocate_cplus_struct_type PARAMS ((struct type *));
   (TYPE_CPLUS_SPECIFIC(type) != &cplus_struct_default)
 
 #define TYPE_NAME(thistype) (thistype)->name
+#define TYPE_TAG_NAME(type) ((type)->tag_name)
 #define TYPE_TARGET_TYPE(thistype) (thistype)->target_type
 #define TYPE_POINTER_TYPE(thistype) (thistype)->pointer_type
 #define TYPE_REFERENCE_TYPE(thistype) (thistype)->reference_type
@@ -386,6 +471,12 @@ allocate_cplus_struct_type PARAMS ((struct type *));
 #define TYPE_NFIELDS(thistype) (thistype)->nfields
 #define TYPE_FIELDS(thistype) (thistype)->fields
 
+#define TYPE_LOW_BOUND(range_type) TYPE_FIELD_BITPOS (range_type, 0)
+#define TYPE_HIGH_BOUND(range_type) TYPE_FIELD_BITPOS (range_type, 1)
+/* If TYPE_DUMMY_RANGE is true for a range type, it was allocated
+   by force_to_range_type. */
+#define TYPE_DUMMY_RANGE(type) ((type)->vptr_fieldno)
+
 /* C++ */
 
 #define TYPE_VPTR_BASETYPE(thistype) (thistype)->vptr_basetype
@@ -417,12 +508,16 @@ allocate_cplus_struct_type PARAMS ((struct type *));
   TYPE_CPLUS_SPECIFIC(thistype)->private_field_bits
 #define TYPE_FIELD_PROTECTED_BITS(thistype) \
   TYPE_CPLUS_SPECIFIC(thistype)->protected_field_bits
+#define TYPE_FIELD_IGNORE_BITS(thistype) \
+  TYPE_CPLUS_SPECIFIC(thistype)->ignore_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_IGNORE(thistype, n) \
+  B_SET (TYPE_CPLUS_SPECIFIC(thistype)->ignore_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) \
@@ -431,6 +526,9 @@ allocate_cplus_struct_type PARAMS ((struct type *));
 #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_IGNORE(thistype, n) \
+  (TYPE_CPLUS_SPECIFIC(thistype)->ignore_field_bits == NULL ? 0 \
+    : B_TST(TYPE_CPLUS_SPECIFIC(thistype)->ignore_field_bits, (n)))
 #define TYPE_FIELD_VIRTUAL(thistype, n) \
        B_TST(TYPE_CPLUS_SPECIFIC(thistype)->virtual_field_bits, (n))
 
@@ -472,6 +570,7 @@ 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;
+extern struct type *builtin_type_string;
 
 /* This type represents a type that was unrecognized in symbol
    read-in.  */
@@ -489,19 +588,27 @@ 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".  */
+/* Chill types */
+
+extern struct type *builtin_type_chill_bool;
+extern struct type *builtin_type_chill_char;
+extern struct type *builtin_type_chill_long;
+extern struct type *builtin_type_chill_ulong;
+extern struct type *builtin_type_chill_real;
+
+/* CC_HAS_LONG_LONG is defined if the host has "long long".  */
 
-#ifdef LONG_LONG
+#ifdef CC_HAS_LONG_LONG
 
 #define BUILTIN_TYPE_LONGEST builtin_type_long_long
 #define BUILTIN_TYPE_UNSIGNED_LONGEST builtin_type_unsigned_long_long
 
-#else /* not LONG_LONG.  */
+#else /* not CC_HAS_LONG_LONG.  */
 
 #define BUILTIN_TYPE_LONGEST builtin_type_long
 #define BUILTIN_TYPE_UNSIGNED_LONGEST builtin_type_unsigned_long
 
-#endif /* not LONG_LONG.  */
+#endif /* not CC_HAS_LONG_LONG.  */
 
 /* Maximum and minimum values of built-in types */
 
@@ -571,7 +678,16 @@ extern struct type *
 lookup_function_type PARAMS ((struct type *));
 
 extern struct type *
-create_array_type PARAMS ((struct type *, int));
+create_range_type PARAMS ((struct type *, struct type *, int, int));
+
+extern struct type *
+create_array_type PARAMS ((struct type *, struct type *, struct type *));
+
+extern struct type *
+create_string_type PARAMS ((struct type *, struct type *));
+
+extern struct type *
+create_set_type PARAMS ((struct type *, struct type *));
 
 extern struct type *
 lookup_unsigned_typename PARAMS ((char *));
@@ -594,9 +710,6 @@ gdb_mangle_name PARAMS ((struct type *, int, int));
 extern struct type *
 builtin_type PARAMS ((char **));
 
-extern struct type *
-error_type PARAMS ((char **));
-
 extern struct type *
 lookup_typename PARAMS ((char *, struct block *, int));
 
@@ -616,7 +729,7 @@ extern void recursive_dump_type PARAMS ((struct type *, int));
 /* printcmd.c */
 
 extern void
-print_scalar_formatted PARAMS ((char *, struct type *, int, int, FILE *));
+print_scalar_formatted PARAMS ((char *, struct type *, int, int, GDB_FILE *));
 
 #if MAINTENANCE_CMDS
 extern void maintenance_print_type PARAMS ((char *, int));
This page took 0.030293 seconds and 4 git commands to generate.