2007-10-25 Wu Zhou <woodzltc@cn.ibm.com>
[binutils-gdb.git] / gdb / gdbtypes.h
index ce30b1971e6cc9e01533f45545dd5d13a9c8b2ef..b1e8558451de6f1b25d98c6ccc773bf50fbfff92 100644 (file)
@@ -9,7 +9,7 @@
 
    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 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
@@ -18,9 +18,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., 51 Franklin Street, Fifth Floor,
-   Boston, MA 02110-1301, USA.  */
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 #if !defined (GDBTYPES_H)
 #define GDBTYPES_H 1
@@ -67,7 +65,12 @@ struct block;
 #define FT_UNSIGNED_BYTE       27
 #define FT_TEMPLATE_ARG                28
 
-#define FT_NUM_MEMBERS         29      /* Highest FT_* above, plus one. */
+/* The following three fundamental types are for decimal floating point.  */
+#define FT_DECFLOAT            29
+#define FT_DBL_PREC_DECFLOAT   30
+#define FT_EXT_PREC_DECFLOAT   31
+
+#define FT_NUM_MEMBERS         32      /* Highest FT_* above, plus one. */
 
 /* Some macros for char-based bitfields.  */
 
@@ -171,7 +174,9 @@ enum type_code
     TYPE_CODE_TEMPLATE,                /* C++ template */
     TYPE_CODE_TEMPLATE_ARG,    /* C++ template arg */
 
-    TYPE_CODE_NAMESPACE                /* C++ namespace.  */
+    TYPE_CODE_NAMESPACE,       /* C++ namespace.  */
+
+    TYPE_CODE_DECFLOAT         /* Decimal floating point.  */
   };
 
 /* For now allow source to use TYPE_CODE_CLASS for C++ classes, as an
@@ -319,6 +324,20 @@ enum type_code
 
 #define TYPE_FLAG_FIXED_INSTANCE (1 << 15)
 
+/* This debug target supports TYPE_STUB(t).  In the unsupported case we have to
+   rely on NFIELDS to be zero etc., see TYPE_IS_OPAQUE ().
+   TYPE_STUB(t) with !TYPE_STUB_SUPPORTED(t) may exist if we only guessed
+   the TYPE_STUB(t) value (see dwarfread.c).  */
+
+#define TYPE_FLAG_STUB_SUPPORTED (1 << 16)
+#define TYPE_STUB_SUPPORTED(t)   (TYPE_FLAGS (t) & TYPE_FLAG_STUB_SUPPORTED)
+
+/* Not textual.  By default, GDB treats all single byte integers as
+   characters (or elements of strings) unless this flag is set.  */
+
+#define TYPE_FLAG_NOTTEXT      (1 << 17)
+#define TYPE_NOTTEXT(t)                (TYPE_FLAGS (t) & TYPE_FLAG_NOTTEXT)
+
 /*  Array bound type.  */
 enum array_bound_type
 {
@@ -497,11 +516,12 @@ struct main_type
 
     struct cplus_struct_type *cplus_stuff;
 
-    /* FLOATFORMAT is for TYPE_CODE_FLT.  It is a pointer to the
-       floatformat object that describes the floating-point value
-       that resides within the type.  */
+    /* FLOATFORMAT is for TYPE_CODE_FLT.  It is a pointer to two
+       floatformat objects that describe the floating-point value
+       that resides within the type.  The first is for big endian
+       targets and the second is for little endian targets.  */
 
-    const struct floatformat *floatformat;
+    const struct floatformat **floatformat;
   } type_specific;
 };
 
@@ -968,7 +988,8 @@ extern void allocate_cplus_struct_type (struct type *);
 #define TYPE_IS_OPAQUE(thistype) (((TYPE_CODE (thistype) == TYPE_CODE_STRUCT) ||        \
                                    (TYPE_CODE (thistype) == TYPE_CODE_UNION))        && \
                                   (TYPE_NFIELDS (thistype) == 0)                     && \
-                                  (TYPE_CPLUS_SPECIFIC (thistype) && (TYPE_NFN_FIELDS (thistype) == 0)))
+                                  (TYPE_CPLUS_SPECIFIC (thistype) && (TYPE_NFN_FIELDS (thistype) == 0)) && \
+                                  (TYPE_STUB (thistype) || !TYPE_STUB_SUPPORTED (thistype)))
 
 struct builtin_type
 {
@@ -991,12 +1012,21 @@ struct builtin_type
   /* The target CPU's address type.  This is the ISA address size.  */
   struct type *builtin_core_addr;
 
+
+  /* Types used for symbols with no debug information.  */
+  struct type *nodebug_text_symbol;
+  struct type *nodebug_data_symbol;
+  struct type *nodebug_unknown_symbol;
+  struct type *nodebug_tls_symbol;
+
+
   /* Integral types.  */
 
-  /* We use this for the '/c' print format, because c_char is just a
+  /* We use these for the '/c' print format, because c_char is just a
      one-byte integral type, which languages less laid back than C
      will print as ... well, a one-byte integral type.  */
   struct type *builtin_true_char;
+  struct type *builtin_true_unsigned_char;
 
   /* Implicit size/sign (based on the the architecture's ABI).  */
   struct type *builtin_void;
@@ -1018,52 +1048,63 @@ struct builtin_type
   struct type *builtin_bool;
   struct type *builtin_long_long;
   struct type *builtin_unsigned_long_long;
+  struct type *builtin_decfloat;
+  struct type *builtin_decdouble;
+  struct type *builtin_declong;
 };
 
 /* Return the type table for the specified architecture.  */
 extern const struct builtin_type *builtin_type (struct gdbarch *gdbarch);
 
-/* Implicit sizes */
-extern struct type *builtin_type_void;
-extern struct type *builtin_type_char;
-extern struct type *builtin_type_short;
-extern struct type *builtin_type_int;
-extern struct type *builtin_type_long;
-extern struct type *builtin_type_signed_char;
-extern struct type *builtin_type_unsigned_char;
-extern struct type *builtin_type_unsigned_short;
-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;
-extern struct type *builtin_type_string;
-extern struct type *builtin_type_bool;
-
-/* Address/pointer types: */
-/* (C) Language `pointer to data' type.  Some target platforms use an
-   implicitly {sign,zero} -extended 32 bit C language pointer on a 64
-   bit ISA.  */
-extern struct type *builtin_type_void_data_ptr;
-
-/* (C) Language `pointer to function returning void' type.  Since
-   ANSI, C standards have explicitly said that pointers to functions
-   and pointers to data are not interconvertible --- that is, you
-   can't cast a function pointer to void * and back, and expect to get
-   the same value.  However, all function pointer types are
-   interconvertible, so void (*) () can server as a generic function
-   pointer.  */
-extern struct type *builtin_type_void_func_ptr;
-
-/* The target CPU's address type.  This is the ISA address size. */
-extern struct type *builtin_type_CORE_ADDR;
-/* The symbol table address type.  Some object file formats have a 32
-   bit address type even though the TARGET has a 64 bit pointer type
-   (cf MIPS). */
-extern struct type *builtin_type_bfd_vma;
-
+/* Compatibility macros to access types for the current architecture.  */
+#define builtin_type_void_data_ptr \
+       (builtin_type (current_gdbarch)->builtin_data_ptr)
+#define builtin_type_void_func_ptr \
+       (builtin_type (current_gdbarch)->builtin_func_ptr)
+#define builtin_type_CORE_ADDR \
+       (builtin_type (current_gdbarch)->builtin_core_addr)
+#define builtin_type_true_char \
+       (builtin_type (current_gdbarch)->builtin_true_char)
+#define builtin_type_void \
+       (builtin_type (current_gdbarch)->builtin_void)
+#define builtin_type_char \
+       (builtin_type (current_gdbarch)->builtin_char)
+#define builtin_type_short \
+       (builtin_type (current_gdbarch)->builtin_short)
+#define builtin_type_int \
+       (builtin_type (current_gdbarch)->builtin_int)
+#define builtin_type_long \
+       (builtin_type (current_gdbarch)->builtin_long)
+#define builtin_type_signed_char \
+       (builtin_type (current_gdbarch)->builtin_signed_char)
+#define builtin_type_unsigned_char \
+       (builtin_type (current_gdbarch)->builtin_unsigned_char)
+#define builtin_type_unsigned_short \
+       (builtin_type (current_gdbarch)->builtin_unsigned_short)
+#define builtin_type_unsigned_int \
+       (builtin_type (current_gdbarch)->builtin_unsigned_int)
+#define builtin_type_unsigned_long \
+       (builtin_type (current_gdbarch)->builtin_unsigned_long)
+#define builtin_type_float \
+       (builtin_type (current_gdbarch)->builtin_float)
+#define builtin_type_double \
+       (builtin_type (current_gdbarch)->builtin_double)
+#define builtin_type_long_double \
+       (builtin_type (current_gdbarch)->builtin_long_double)
+#define builtin_type_complex \
+       (builtin_type (current_gdbarch)->builtin_complex)
+#define builtin_type_double_complex \
+       (builtin_type (current_gdbarch)->builtin_double_complex)
+#define builtin_type_string \
+       (builtin_type (current_gdbarch)->builtin_string)
+#define builtin_type_bool \
+       (builtin_type (current_gdbarch)->builtin_bool)
+#define builtin_type_long_long \
+       (builtin_type (current_gdbarch)->builtin_long_long)
+#define builtin_type_unsigned_long_long \
+       (builtin_type (current_gdbarch)->builtin_unsigned_long_long)
+
 /* Explicit sizes - see C9X <intypes.h> for naming scheme.  The "int0"
    is for when an architecture needs to describe a register that has
    no size.  */
@@ -1079,90 +1120,109 @@ extern struct type *builtin_type_uint64;
 extern struct type *builtin_type_int128;
 extern struct type *builtin_type_uint128;
 
-/* SIMD types.  We inherit these names from GCC.  */
-extern struct type *builtin_type_v4sf;
-extern struct type *builtin_type_v4si;
-extern struct type *builtin_type_v16qi;
-extern struct type *builtin_type_v8qi;
-extern struct type *builtin_type_v8hi;
-extern struct type *builtin_type_v4hi;
-extern struct type *builtin_type_v2si;
-
-/* Types for 64 bit vectors. */
-extern struct type *builtin_type_v2_float;
-extern struct type *builtin_type_v2_int32;
-extern struct type *builtin_type_v4_int16;
-extern struct type *builtin_type_v8_int8;
-extern struct type *builtin_type_vec64;
-
-/* Types for 128 bit vectors. */
-extern struct type *builtin_type_v2_double;
-extern struct type *builtin_type_v4_float;
-extern struct type *builtin_type_v2_int64;
-extern struct type *builtin_type_v4_int32;
-extern struct type *builtin_type_v8_int16;
-extern struct type *builtin_type_v16_int8;
-extern struct type *builtin_type_vec128;
-
 /* Explicit floating-point formats.  See "floatformat.h".  */
-extern struct type *builtin_type_ieee_single[BFD_ENDIAN_UNKNOWN];
-extern struct type *builtin_type_ieee_single_big;
-extern struct type *builtin_type_ieee_single_little;
-extern struct type *builtin_type_ieee_double[BFD_ENDIAN_UNKNOWN];
-extern struct type *builtin_type_ieee_double_big;
-extern struct type *builtin_type_ieee_double_little;
-extern struct type *builtin_type_ieee_double_littlebyte_bigword;
+extern const struct floatformat *floatformats_ieee_single[BFD_ENDIAN_UNKNOWN];
+extern const struct floatformat *floatformats_ieee_double[BFD_ENDIAN_UNKNOWN];
+extern const struct floatformat *floatformats_ieee_double_littlebyte_bigword[BFD_ENDIAN_UNKNOWN];
+extern const struct floatformat *floatformats_i387_ext[BFD_ENDIAN_UNKNOWN];
+extern const struct floatformat *floatformats_m68881_ext[BFD_ENDIAN_UNKNOWN];
+extern const struct floatformat *floatformats_arm_ext[BFD_ENDIAN_UNKNOWN];
+extern const struct floatformat *floatformats_ia64_spill[BFD_ENDIAN_UNKNOWN];
+extern const struct floatformat *floatformats_ia64_quad[BFD_ENDIAN_UNKNOWN];
+extern const struct floatformat *floatformats_vax_f[BFD_ENDIAN_UNKNOWN];
+extern const struct floatformat *floatformats_vax_d[BFD_ENDIAN_UNKNOWN];
+
+extern struct type *builtin_type_ieee_single;
+extern struct type *builtin_type_ieee_double;
 extern struct type *builtin_type_i387_ext;
 extern struct type *builtin_type_m68881_ext;
-extern struct type *builtin_type_i960_ext;
-extern struct type *builtin_type_m88110_ext;
-extern struct type *builtin_type_m88110_harris_ext;
-extern struct type *builtin_type_arm_ext[BFD_ENDIAN_UNKNOWN];
-extern struct type *builtin_type_arm_ext_big;
-extern struct type *builtin_type_arm_ext_littlebyte_bigword;
-extern struct type *builtin_type_ia64_spill[BFD_ENDIAN_UNKNOWN];
-extern struct type *builtin_type_ia64_spill_big;
-extern struct type *builtin_type_ia64_spill_little;
-extern struct type *builtin_type_ia64_quad[BFD_ENDIAN_UNKNOWN];
-extern struct type *builtin_type_ia64_quad_big;
-extern struct type *builtin_type_ia64_quad_little;
-
-/* We use this for the '/c' print format, because builtin_type_char is
-   just a one-byte integral type, which languages less laid back than
-   C will print as ... well, a one-byte integral type.  */
-extern struct type *builtin_type_true_char;
+extern struct type *builtin_type_arm_ext;
+extern struct type *builtin_type_ia64_spill;
+extern struct type *builtin_type_ia64_quad;
 
 /* This type represents a type that was unrecognized in symbol
    read-in.  */
 
 extern struct type *builtin_type_error;
 
-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;
+struct builtin_m2_type
+{
+  struct type *builtin_char;
+  struct type *builtin_int;
+  struct type *builtin_card;
+  struct type *builtin_real;
+  struct type *builtin_bool;
+};
+
+/* Return the Modula-2 type table for the specified architecture.  */
+extern const struct builtin_m2_type *builtin_m2_type (struct gdbarch *gdbarch);
+
+/* Compatibility macros to access types for the current architecture.  */
+#define builtin_type_m2_char \
+       (builtin_m2_type (current_gdbarch)->builtin_char)
+#define builtin_type_m2_int \
+       (builtin_m2_type (current_gdbarch)->builtin_int)
+#define builtin_type_m2_card \
+       (builtin_m2_type (current_gdbarch)->builtin_card)
+#define builtin_type_m2_real \
+       (builtin_m2_type (current_gdbarch)->builtin_real)
+#define builtin_type_m2_bool \
+       (builtin_m2_type (current_gdbarch)->builtin_bool)
+
 
 /* Fortran (F77) types */
 
-extern struct type *builtin_type_f_character;
-extern struct type *builtin_type_f_integer;
-extern struct type *builtin_type_f_integer_s2;
-extern struct type *builtin_type_f_logical;
-extern struct type *builtin_type_f_logical_s1;
-extern struct type *builtin_type_f_logical_s2;
-extern struct type *builtin_type_f_real;
-extern struct type *builtin_type_f_real_s8;
-extern struct type *builtin_type_f_real_s16;
-extern struct type *builtin_type_f_complex_s8;
-extern struct type *builtin_type_f_complex_s16;
-extern struct type *builtin_type_f_complex_s32;
-extern struct type *builtin_type_f_void;
+struct builtin_f_type
+{
+  struct type *builtin_character;
+  struct type *builtin_integer;
+  struct type *builtin_integer_s2;
+  struct type *builtin_logical;
+  struct type *builtin_logical_s1;
+  struct type *builtin_logical_s2;
+  struct type *builtin_real;
+  struct type *builtin_real_s8;
+  struct type *builtin_real_s16;
+  struct type *builtin_complex_s8;
+  struct type *builtin_complex_s16;
+  struct type *builtin_complex_s32;
+  struct type *builtin_void;
+};
+
+/* Return the Fortran type table for the specified architecture.  */
+extern const struct builtin_f_type *builtin_f_type (struct gdbarch *gdbarch);
+
+/* Compatibility macros to access types for the current architecture.  */
+#define builtin_type_f_character \
+       (builtin_f_type (current_gdbarch)->builtin_character)
+#define builtin_type_f_integer \
+       (builtin_f_type (current_gdbarch)->builtin_integer)
+#define builtin_type_f_integer_s2 \
+       (builtin_f_type (current_gdbarch)->builtin_integer_s2)
+#define builtin_type_f_logical \
+       (builtin_f_type (current_gdbarch)->builtin_logical)
+#define builtin_type_f_logical_s1 \
+       (builtin_f_type (current_gdbarch)->builtin_logical_s1)
+#define builtin_type_f_logical_s2 \
+       (builtin_f_type (current_gdbarch)->builtin_logical_s2)
+#define builtin_type_f_real \
+       (builtin_f_type (current_gdbarch)->builtin_real)
+#define builtin_type_f_real_s8 \
+       (builtin_f_type (current_gdbarch)->builtin_real_s8)
+#define builtin_type_f_real_s16 \
+       (builtin_f_type (current_gdbarch)->builtin_real_s16)
+#define builtin_type_f_complex_s8 \
+       (builtin_f_type (current_gdbarch)->builtin_complex_s8)
+#define builtin_type_f_complex_s16 \
+       (builtin_f_type (current_gdbarch)->builtin_complex_s16)
+#define builtin_type_f_complex_s32 \
+       (builtin_f_type (current_gdbarch)->builtin_complex_s32)
+#define builtin_type_f_void \
+       (builtin_f_type (current_gdbarch)->builtin_void)
+
 
 /* RTTI for C++ */
 /* extern struct type *builtin_type_cxx_typeinfo; */
@@ -1218,6 +1278,9 @@ extern void append_composite_type_field (struct type *t, char *name,
 extern struct type *init_flags_type (char *name, int length);
 extern void append_flags_type_flag (struct type *type, int bitpos, char *name);
 
+extern void make_vector_type (struct type *array_type);
+extern struct type *init_vector_type (struct type *elt_type, int n);
+
 extern struct type *lookup_reference_type (struct type *);
 
 extern struct type *make_reference_type (struct type *, struct type **);
@@ -1299,8 +1362,6 @@ extern int has_vtable (struct type *);
 
 extern struct type *primary_base_class (struct type *);
 
-extern struct type **virtual_base_list (struct type *);
-
 extern int virtual_base_list_length (struct type *);
 extern int virtual_base_list_length_skip_primaries (struct type *);