aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog71
-rw-r--r--gdb/ada-lang.c15
-rw-r--r--gdb/alpha-tdep.c4
-rw-r--r--gdb/amd64-tdep.c2
-rw-r--r--gdb/arm-tdep.c16
-rw-r--r--gdb/arm-tdep.h3
-rw-r--r--gdb/f-lang.c49
-rw-r--r--gdb/gdbtypes.c70
-rw-r--r--gdb/gdbtypes.h12
-rw-r--r--gdb/hppa-tdep.c4
-rw-r--r--gdb/i386-tdep.c19
-rw-r--r--gdb/i386-tdep.h2
-rw-r--r--gdb/i387-tdep.c26
-rw-r--r--gdb/ia64-tdep.c81
-rw-r--r--gdb/ia64-tdep.h3
-rw-r--r--gdb/jv-lang.c4
-rw-r--r--gdb/m2-lang.c5
-rw-r--r--gdb/m68k-tdep.c17
-rw-r--r--gdb/m68k-tdep.h3
-rw-r--r--gdb/mips-tdep.c31
-rw-r--r--gdb/target-descriptions.c9
21 files changed, 252 insertions, 194 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index a8138e1..c0755e2 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,76 @@
2009-07-02 Ulrich Weigand <uweigand@de.ibm.com>
+ * gdbtypes.h (builtin_type_ieee_single, builtin_type_ieee_double,
+ builtin_type_i387_ext, builtin_type_m68881_ext, builtin_type_arm_ext,
+ builtin_type_ia64_spill, builtin_type_ia64_quad): Remove.
+ (init_float_type, init_complex_type): Add prototypes.
+ * gdbtypes.c (builtin_type_ieee_single, builtin_type_ieee_double,
+ builtin_type_i387_ext, builtin_type_m68881_ext, builtin_type_arm_ext,
+ builtin_type_ia64_spill, builtin_type_ia64_quad): Remove.
+ (_initialize_gdbtypes): Do not initialize them.
+ (build_flt): Rename to ...
+ (init_float_type): ... this. Make global.
+ (build_complex): Rename to ...
+ (init_complex_type): ... this. Make global. Remove BIT argument.
+ (gdbtypes_post_init): Update calls.
+
+ * ada-lang.c (ada_language_arch_info): Use init_float_type.
+ * jv-lang.c (build_java_types): Likewise.
+ * m2-lang.c (build_m2_types): Likewise.
+ * f-lang.c (build_fortran_types): Use init_float_type and
+ init_complex_type.
+
+ * target-descriptions.c (tdesc_gdb_type): Call init_float_type instead
+ of using builtin_type_ieee_single, builtin_type_ieee_double, or
+ builtin_type_arm_ext.
+
+ * ia64-tdep.h (struct gdbarch_tdep): Add ia64_ext_type member.
+ * ia64-tdep.c (builtin_type_ia64_ext): Remove.
+ (_initialize_ia64_tdep): Do not initialize it.
+ (floatformat_valid, floatformat_ia64_ext, floatformats_ia64_ext):
+ Move up.
+ (ia64_ext_type): New function.
+ (ia64_register_reggroup_p, ia64_convert_register_p,
+ ia64_register_to_value, ia64_value_to_register,
+ ia64_extract_return_value, ia64_store_return_value): Use ia64_ext_type
+ instead of builtin_type_ia64_ext.
+
+ * i386-tdep.h (struct gdbarch_tdep): Add i387_ext_type member.
+ (i387_ext_type): Add prototype.
+ * i386-tdep.c (i387_ext_type): New function.
+ (i386_extract_return_value, i386_store_return_value,
+ i386_register_type): Use it instead of builtin_type_i387_ext.
+ * amd64-tdep.c (amd64_register_type): Likewise.
+ * i387-tdep.c (print_i387_value, i387_register_to_value,
+ i387_value_to_register): Likewise.
+ (print_i387_value, print_i387_ext): Add GDBARCH argument.
+ (print_i387_ext, i387_print_float_info): Pass to subroutines.
+
+ * m68k-tdep.h (struct gdbarch_tdep): Add m68881_ext_type member.
+ * m68k-tdep.c (m68881_ext_type): New function.
+ (m68k_register_type, m68k_convert_register_p): Use it instead
+ of builtin_type_m68881_ext.
+
+ * arm-tdep.h (struct gdbarch_tdep): Add arm_ext_type member.
+ * arm-tdep.c (arm_ext_type): New function.
+ (arm_register_type): Use it instead of builtin_type_arm_ext.
+
+ * alpha-tdep.c (alpha_register_type): Use builtin types
+ instead of builtin_type_ieee_double.
+
+ * mips-tdep.c (mips_float_register_type, mips_double_register_type):
+ Remove.
+ (mips_register_type): Use builtin types instead of
+ builtin_type_ieee_single and builtin_type_ieee_double.
+ (mips_print_fp_register): Use builtin types instead of
+ mips_float_register_type and mips_double_register_type.
+
+ * hppa-tdep.c (hppa32_register_type, hppa64_register_type):
+ Use builtin types instead of builtin_type_ieee_single and
+ builtin_type_ieee_double.
+
+2009-07-02 Ulrich Weigand <uweigand@de.ibm.com>
+
* gdbtypes.h (builtin_type_int0, builtin_type_int8, builtin_type_uint8,
builtin_type_int16, builtin_type_uint16, builtin_type_int32,
builtin_type_uint32, builtin_type_int64, builtin_type_uint64,
diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c
index 7bda72c..d5078ce 100644
--- a/gdb/ada-lang.c
+++ b/gdb/ada-lang.c
@@ -11177,21 +11177,18 @@ ada_language_arch_info (struct gdbarch *gdbarch,
init_type (TYPE_CODE_INT, TARGET_CHAR_BIT / TARGET_CHAR_BIT,
0, "character", (struct objfile *) NULL);
lai->primitive_type_vector [ada_primitive_type_float] =
- init_type (TYPE_CODE_FLT,
- gdbarch_float_bit (gdbarch)/ TARGET_CHAR_BIT,
- 0, "float", (struct objfile *) NULL);
+ init_float_type (gdbarch_float_bit (gdbarch),
+ "float", NULL);
lai->primitive_type_vector [ada_primitive_type_double] =
- init_type (TYPE_CODE_FLT,
- gdbarch_double_bit (gdbarch) / TARGET_CHAR_BIT,
- 0, "long_float", (struct objfile *) NULL);
+ init_float_type (gdbarch_double_bit (gdbarch),
+ "long_float", NULL);
lai->primitive_type_vector [ada_primitive_type_long_long] =
init_type (TYPE_CODE_INT,
gdbarch_long_long_bit (gdbarch) / TARGET_CHAR_BIT,
0, "long_long_integer", (struct objfile *) NULL);
lai->primitive_type_vector [ada_primitive_type_long_double] =
- init_type (TYPE_CODE_FLT,
- gdbarch_double_bit (gdbarch) / TARGET_CHAR_BIT,
- 0, "long_long_float", (struct objfile *) NULL);
+ init_float_type (gdbarch_double_bit (gdbarch),
+ "long_long_float", NULL);
lai->primitive_type_vector [ada_primitive_type_natural] =
init_type (TYPE_CODE_INT,
gdbarch_int_bit (gdbarch) / TARGET_CHAR_BIT,
diff --git a/gdb/alpha-tdep.c b/gdb/alpha-tdep.c
index 79a6ae1..ff24975 100644
--- a/gdb/alpha-tdep.c
+++ b/gdb/alpha-tdep.c
@@ -102,7 +102,7 @@ alpha_register_type (struct gdbarch *gdbarch, int regno)
/* Don't need to worry about little vs big endian until
some jerk tries to port to alpha-unicosmk. */
if (regno >= ALPHA_FP0_REGNUM && regno < ALPHA_FP0_REGNUM + 31)
- return builtin_type_ieee_double;
+ return builtin_type (gdbarch)->builtin_double;
return builtin_type (gdbarch)->builtin_int64;
}
@@ -314,7 +314,7 @@ alpha_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
if (accumulate_size < sizeof (arg_reg_buffer)
&& TYPE_LENGTH (arg_type) == 4)
{
- arg_type = builtin_type_ieee_double;
+ arg_type = builtin_type (gdbarch)->builtin_double;
arg = value_cast (arg_type, arg);
}
/* Tru64 5.1 has a 128-bit long double, and passes this by
diff --git a/gdb/amd64-tdep.c b/gdb/amd64-tdep.c
index a81e35b..904915e 100644
--- a/gdb/amd64-tdep.c
+++ b/gdb/amd64-tdep.c
@@ -102,7 +102,7 @@ amd64_register_type (struct gdbarch *gdbarch, int regnum)
if (regnum >= AMD64_CS_REGNUM && regnum <= AMD64_GS_REGNUM)
return builtin_type (gdbarch)->builtin_int32;
if (regnum >= AMD64_ST0_REGNUM && regnum <= AMD64_ST0_REGNUM + 7)
- return builtin_type_i387_ext;
+ return i387_ext_type (gdbarch);
if (regnum >= AMD64_FCTRL_REGNUM && regnum <= AMD64_FCTRL_REGNUM + 7)
return builtin_type (gdbarch)->builtin_int32;
if (regnum >= AMD64_XMM0_REGNUM && regnum <= AMD64_XMM0_REGNUM + 15)
diff --git a/gdb/arm-tdep.c b/gdb/arm-tdep.c
index 4ca6c51..e0a92a5 100644
--- a/gdb/arm-tdep.c
+++ b/gdb/arm-tdep.c
@@ -1593,6 +1593,20 @@ arm_print_float_info (struct gdbarch *gdbarch, struct ui_file *file,
print_fpu_flags (status);
}
+/* Construct the ARM extended floating point type. */
+static struct type *
+arm_ext_type (struct gdbarch *gdbarch)
+{
+ struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+
+ if (!tdep->arm_ext_type)
+ tdep->arm_ext_type
+ = init_float_type (-1, "builtin_type_arm_ext",
+ floatformats_arm_ext);
+
+ return tdep->arm_ext_type;
+}
+
/* Return the GDB type object for the "standard" data type of data in
register N. */
@@ -1600,7 +1614,7 @@ static struct type *
arm_register_type (struct gdbarch *gdbarch, int regnum)
{
if (regnum >= ARM_F0_REGNUM && regnum < ARM_F0_REGNUM + NUM_FREGS)
- return builtin_type_arm_ext;
+ return arm_ext_type (gdbarch);
else if (regnum == ARM_SP_REGNUM)
return builtin_type (gdbarch)->builtin_data_ptr;
else if (regnum == ARM_PC_REGNUM)
diff --git a/gdb/arm-tdep.h b/gdb/arm-tdep.h
index 7c27f11..9af94ce 100644
--- a/gdb/arm-tdep.h
+++ b/gdb/arm-tdep.h
@@ -170,6 +170,9 @@ struct gdbarch_tdep
/* Cached core file helpers. */
struct regset *gregset, *fpregset;
+
+ /* ISA-specific data types. */
+ struct type *arm_ext_type;
};
diff --git a/gdb/f-lang.c b/gdb/f-lang.c
index c60bfdb..7adb48b 100644
--- a/gdb/f-lang.c
+++ b/gdb/f-lang.c
@@ -391,49 +391,24 @@ build_fortran_types (struct gdbarch *gdbarch)
TYPE_FLAG_UNSIGNED, "logical*4", (struct objfile *) NULL);
builtin_f_type->builtin_real =
- init_type (TYPE_CODE_FLT,
- gdbarch_float_bit (gdbarch) / TARGET_CHAR_BIT,
- 0,
- "real", (struct objfile *) NULL);
-
+ init_float_type (gdbarch_float_bit (gdbarch),
+ "real", NULL);
builtin_f_type->builtin_real_s8 =
- init_type (TYPE_CODE_FLT,
- gdbarch_double_bit (gdbarch) / TARGET_CHAR_BIT,
- 0,
- "real*8", (struct objfile *) NULL);
-
+ init_float_type (gdbarch_double_bit (gdbarch),
+ "real*8", NULL);
builtin_f_type->builtin_real_s16 =
- init_type (TYPE_CODE_FLT,
- gdbarch_long_double_bit (gdbarch) / TARGET_CHAR_BIT,
- 0,
- "real*16", (struct objfile *) NULL);
+ init_float_type (gdbarch_long_double_bit (gdbarch),
+ "real*16", NULL);
builtin_f_type->builtin_complex_s8 =
- init_type (TYPE_CODE_COMPLEX,
- 2 * gdbarch_float_bit (gdbarch) / TARGET_CHAR_BIT,
- 0,
- "complex*8", (struct objfile *) NULL);
- TYPE_TARGET_TYPE (builtin_f_type->builtin_complex_s8)
- = builtin_f_type->builtin_real;
-
+ init_complex_type ("complex*8",
+ builtin_f_type->builtin_real);
builtin_f_type->builtin_complex_s16 =
- init_type (TYPE_CODE_COMPLEX,
- 2 * gdbarch_double_bit (gdbarch) / TARGET_CHAR_BIT,
- 0,
- "complex*16", (struct objfile *) NULL);
- TYPE_TARGET_TYPE (builtin_f_type->builtin_complex_s16)
- = builtin_f_type->builtin_real_s8;
-
- /* We have a new size == 4 double floats for the
- complex*32 data type */
-
+ init_complex_type ("complex*16",
+ builtin_f_type->builtin_real_s8);
builtin_f_type->builtin_complex_s32 =
- init_type (TYPE_CODE_COMPLEX,
- 2 * gdbarch_long_double_bit (gdbarch) / TARGET_CHAR_BIT,
- 0,
- "complex*32", (struct objfile *) NULL);
- TYPE_TARGET_TYPE (builtin_f_type->builtin_complex_s32)
- = builtin_f_type->builtin_real_s16;
+ init_complex_type ("complex*32",
+ builtin_f_type->builtin_real_s16);
return builtin_f_type;
}
diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c
index a06f48a..307ec02 100644
--- a/gdb/gdbtypes.c
+++ b/gdb/gdbtypes.c
@@ -86,13 +86,6 @@ const struct floatformat *floatformats_ibm_long_double[BFD_ENDIAN_UNKNOWN] = {
&floatformat_ibm_long_double
};
-struct type *builtin_type_ieee_single;
-struct type *builtin_type_ieee_double;
-struct type *builtin_type_i387_ext;
-struct type *builtin_type_m68881_ext;
-struct type *builtin_type_arm_ext;
-struct type *builtin_type_ia64_spill;
-struct type *builtin_type_ia64_quad;
int opaque_type_resolution = 1;
static void
@@ -3036,8 +3029,8 @@ copy_type (const struct type *type)
return new_type;
}
-static struct type *
-build_flt (int bit, char *name, const struct floatformat **floatformats)
+struct type *
+init_float_type (int bit, char *name, const struct floatformat **floatformats)
{
struct type *t;
@@ -3054,6 +3047,16 @@ build_flt (int bit, char *name, const struct floatformat **floatformats)
return t;
}
+struct type *
+init_complex_type (char *name, struct type *target_type)
+{
+ struct type *t;
+ t = init_type (TYPE_CODE_COMPLEX, 2 * TYPE_LENGTH (target_type),
+ 0, name, (struct objfile *) NULL);
+ TYPE_TARGET_TYPE (t) = target_type;
+ return t;
+}
+
static struct gdbarch_data *gdbtypes_data;
const struct builtin_type *
@@ -3062,17 +3065,6 @@ builtin_type (struct gdbarch *gdbarch)
return gdbarch_data (gdbarch, gdbtypes_data);
}
-
-static struct type *
-build_complex (int bit, char *name, struct type *target_type)
-{
- struct type *t;
- t = init_type (TYPE_CODE_COMPLEX, 2 * bit / TARGET_CHAR_BIT,
- 0, name, (struct objfile *) NULL);
- TYPE_TARGET_TYPE (t) = target_type;
- return t;
-}
-
static void *
gdbtypes_post_init (struct gdbarch *gdbarch)
{
@@ -3134,20 +3126,18 @@ gdbtypes_post_init (struct gdbarch *gdbarch)
TYPE_FLAG_UNSIGNED, "unsigned long long",
(struct objfile *) NULL);
builtin_type->builtin_float
- = build_flt (gdbarch_float_bit (gdbarch), "float",
- gdbarch_float_format (gdbarch));
+ = init_float_type (gdbarch_float_bit (gdbarch),
+ "float", gdbarch_float_format (gdbarch));
builtin_type->builtin_double
- = build_flt (gdbarch_double_bit (gdbarch), "double",
- gdbarch_double_format (gdbarch));
+ = init_float_type (gdbarch_double_bit (gdbarch),
+ "double", gdbarch_double_format (gdbarch));
builtin_type->builtin_long_double
- = build_flt (gdbarch_long_double_bit (gdbarch), "long double",
- gdbarch_long_double_format (gdbarch));
+ = init_float_type (gdbarch_long_double_bit (gdbarch),
+ "long double", gdbarch_long_double_format (gdbarch));
builtin_type->builtin_complex
- = build_complex (gdbarch_float_bit (gdbarch), "complex",
- builtin_type->builtin_float);
+ = init_complex_type ("complex", builtin_type->builtin_float);
builtin_type->builtin_double_complex
- = build_complex (gdbarch_double_bit (gdbarch), "double complex",
- builtin_type->builtin_double);
+ = init_complex_type ("double complex", builtin_type->builtin_double);
builtin_type->builtin_string =
init_type (TYPE_CODE_STRING, TARGET_CHAR_BIT / TARGET_CHAR_BIT,
0,
@@ -3402,26 +3392,6 @@ _initialize_gdbtypes (void)
gdbtypes_data = gdbarch_data_register_post_init (gdbtypes_post_init);
objfile_type_data = register_objfile_data ();
- /* FIXME: The following types are architecture-neutral. However,
- they contain pointer_type and reference_type fields potentially
- caching pointer or reference types that *are* architecture
- dependent. */
-
- builtin_type_ieee_single =
- build_flt (-1, "builtin_type_ieee_single", floatformats_ieee_single);
- builtin_type_ieee_double =
- build_flt (-1, "builtin_type_ieee_double", floatformats_ieee_double);
- builtin_type_i387_ext =
- build_flt (-1, "builtin_type_i387_ext", floatformats_i387_ext);
- builtin_type_m68881_ext =
- build_flt (-1, "builtin_type_m68881_ext", floatformats_m68881_ext);
- builtin_type_arm_ext =
- build_flt (-1, "builtin_type_arm_ext", floatformats_arm_ext);
- builtin_type_ia64_spill =
- build_flt (-1, "builtin_type_ia64_spill", floatformats_ia64_spill);
- builtin_type_ia64_quad =
- build_flt (-1, "builtin_type_ia64_quad", floatformats_ia64_quad);
-
add_setshow_zinteger_cmd ("overload", no_class, &overload_debug, _("\
Set debugging of C++ overloading."), _("\
Show debugging of C++ overloading."), _("\
diff --git a/gdb/gdbtypes.h b/gdb/gdbtypes.h
index 36a98c8..e7b6272 100644
--- a/gdb/gdbtypes.h
+++ b/gdb/gdbtypes.h
@@ -1084,14 +1084,6 @@ extern const struct floatformat *floatformats_vax_f[BFD_ENDIAN_UNKNOWN];
extern const struct floatformat *floatformats_vax_d[BFD_ENDIAN_UNKNOWN];
extern const struct floatformat *floatformats_ibm_long_double[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_arm_ext;
-extern struct type *builtin_type_ia64_spill;
-extern struct type *builtin_type_ia64_quad;
-
/* Maximum and minimum values of built-in types */
@@ -1151,6 +1143,10 @@ 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 *init_float_type (int bit, char *name,
+ const struct floatformat **floatformats);
+extern struct type *init_complex_type (char *name, struct type *target_type);
+
extern struct type *lookup_reference_type (struct type *);
extern struct type *make_reference_type (struct type *, struct type **);
diff --git a/gdb/hppa-tdep.c b/gdb/hppa-tdep.c
index 36ff8f5..08b1b66 100644
--- a/gdb/hppa-tdep.c
+++ b/gdb/hppa-tdep.c
@@ -2612,7 +2612,7 @@ hppa32_register_type (struct gdbarch *gdbarch, int regnum)
if (regnum < HPPA_FP4_REGNUM)
return builtin_type (gdbarch)->builtin_uint32;
else
- return builtin_type_ieee_single;
+ return builtin_type (gdbarch)->builtin_float;
}
static struct type *
@@ -2621,7 +2621,7 @@ hppa64_register_type (struct gdbarch *gdbarch, int regnum)
if (regnum < HPPA64_FP4_REGNUM)
return builtin_type (gdbarch)->builtin_uint64;
else
- return builtin_type_ieee_double;
+ return builtin_type (gdbarch)->builtin_double;
}
/* Return non-zero if REGNUM is not a register available to the user
diff --git a/gdb/i386-tdep.c b/gdb/i386-tdep.c
index 1dd4bb9..cd7fe4c 100644
--- a/gdb/i386-tdep.c
+++ b/gdb/i386-tdep.c
@@ -1787,7 +1787,7 @@ i386_extract_return_value (struct gdbarch *gdbarch, struct type *type,
exactly how it would happen on the target itself, but it is
the best we can do. */
regcache_raw_read (regcache, I386_ST0_REGNUM, buf);
- convert_typed_floating (buf, builtin_type_i387_ext, valbuf, type);
+ convert_typed_floating (buf, i387_ext_type (gdbarch), valbuf, type);
}
else
{
@@ -1841,7 +1841,7 @@ i386_store_return_value (struct gdbarch *gdbarch, struct type *type,
floating-point format used by the FPU. This is probably
not exactly how it would happen on the target itself, but
it is the best we can do. */
- convert_typed_floating (valbuf, type, buf, builtin_type_i387_ext);
+ convert_typed_floating (valbuf, type, buf, i387_ext_type (gdbarch));
regcache_raw_write (regcache, I386_ST0_REGNUM, buf);
/* Set the top of the floating-point register stack to 7. The
@@ -2044,6 +2044,19 @@ i386_init_types (void)
i386_mxcsr_type = type;
}
+struct type *
+i387_ext_type (struct gdbarch *gdbarch)
+{
+ struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+
+ if (!tdep->i387_ext_type)
+ tdep->i387_ext_type
+ = init_float_type (-1, "builtin_type_i387_ext",
+ floatformats_i387_ext);
+
+ return tdep->i387_ext_type;
+}
+
/* Construct vector type for MMX registers. */
struct type *
i386_mmx_type (struct gdbarch *gdbarch)
@@ -2150,7 +2163,7 @@ i386_register_type (struct gdbarch *gdbarch, int regnum)
return builtin_type (gdbarch)->builtin_data_ptr;
if (i386_fp_regnum_p (gdbarch, regnum))
- return builtin_type_i387_ext;
+ return i387_ext_type (gdbarch);
if (i386_mmx_regnum_p (gdbarch, regnum))
return i386_mmx_type (gdbarch);
diff --git a/gdb/i386-tdep.h b/gdb/i386-tdep.h
index 88de54c..f058273 100644
--- a/gdb/i386-tdep.h
+++ b/gdb/i386-tdep.h
@@ -106,6 +106,7 @@ struct gdbarch_tdep
/* ISA-specific data types. */
struct type *i386_mmx_type;
struct type *i386_sse_type;
+ struct type *i387_ext_type;
/* Process record/replay target. */
/* Parse intx80 args. */
@@ -164,6 +165,7 @@ extern struct type *i386_mxcsr_type;
extern struct type *i386_mmx_type (struct gdbarch *gdbarch);
extern struct type *i386_sse_type (struct gdbarch *gdbarch);
+extern struct type *i387_ext_type (struct gdbarch *gdbarch);
/* Segment selectors. */
#define I386_SEL_RPL 0x0003 /* Requester's Privilege Level mask. */
diff --git a/gdb/i387-tdep.c b/gdb/i387-tdep.c
index ff5a843..2444d5c 100644
--- a/gdb/i387-tdep.c
+++ b/gdb/i387-tdep.c
@@ -37,7 +37,8 @@
/* Print the floating point number specified by RAW. */
static void
-print_i387_value (const gdb_byte *raw, struct ui_file *file)
+print_i387_value (struct gdbarch *gdbarch,
+ const gdb_byte *raw, struct ui_file *file)
{
DOUBLEST value;
@@ -45,7 +46,7 @@ print_i387_value (const gdb_byte *raw, struct ui_file *file)
of certain numbers such as NaNs, even if GDB is running natively.
This is fine since our caller already detects such special
numbers and we print the hexadecimal representation anyway. */
- value = extract_typed_floating (raw, builtin_type_i387_ext);
+ value = extract_typed_floating (raw, i387_ext_type (gdbarch));
/* We try to print 19 digits. The last digit may or may not contain
garbage, but we'd better print one too many. We need enough room
@@ -61,7 +62,8 @@ print_i387_value (const gdb_byte *raw, struct ui_file *file)
/* Print the classification for the register contents RAW. */
static void
-print_i387_ext (const gdb_byte *raw, struct ui_file *file)
+print_i387_ext (struct gdbarch *gdbarch,
+ const gdb_byte *raw, struct ui_file *file)
{
int sign;
int integer;
@@ -92,11 +94,11 @@ print_i387_ext (const gdb_byte *raw, struct ui_file *file)
}
else if (exponent < 0x7fff && exponent > 0x0000 && integer)
/* Normal. */
- print_i387_value (raw, file);
+ print_i387_value (gdbarch, raw, file);
else if (exponent == 0x0000)
{
/* Denormal or zero. */
- print_i387_value (raw, file);
+ print_i387_value (gdbarch, raw, file);
if (integer)
/* Pseudo-denormal. */
@@ -258,7 +260,7 @@ i387_print_float_info (struct gdbarch *gdbarch, struct ui_file *file,
fprintf_filtered (file, "%02x", raw[i]);
if (tag != 3)
- print_i387_ext (raw, file);
+ print_i387_ext (gdbarch, raw, file);
fputs_filtered ("\n", file);
}
@@ -290,7 +292,7 @@ i387_convert_register_p (struct gdbarch *gdbarch, int regnum, struct type *type)
{
/* Floating point registers must be converted unless we are
accessing them in their hardware type. */
- if (type == builtin_type_i387_ext)
+ if (type == i387_ext_type (gdbarch))
return 0;
else
return 1;
@@ -306,9 +308,10 @@ void
i387_register_to_value (struct frame_info *frame, int regnum,
struct type *type, gdb_byte *to)
{
+ struct gdbarch *gdbarch = get_frame_arch (frame);
gdb_byte from[I386_MAX_REGISTER_SIZE];
- gdb_assert (i386_fp_regnum_p (get_frame_arch (frame), regnum));
+ gdb_assert (i386_fp_regnum_p (gdbarch, regnum));
/* We only support floating-point values. */
if (TYPE_CODE (type) != TYPE_CODE_FLT)
@@ -320,7 +323,7 @@ i387_register_to_value (struct frame_info *frame, int regnum,
/* Convert to TYPE. */
get_frame_register (frame, regnum, from);
- convert_typed_floating (from, builtin_type_i387_ext, to, type);
+ convert_typed_floating (from, i387_ext_type (gdbarch), to, type);
}
/* Write the contents FROM of a value of type TYPE into register
@@ -330,9 +333,10 @@ void
i387_value_to_register (struct frame_info *frame, int regnum,
struct type *type, const gdb_byte *from)
{
+ struct gdbarch *gdbarch = get_frame_arch (frame);
gdb_byte to[I386_MAX_REGISTER_SIZE];
- gdb_assert (i386_fp_regnum_p (get_frame_arch (frame), regnum));
+ gdb_assert (i386_fp_regnum_p (gdbarch, regnum));
/* We only support floating-point values. */
if (TYPE_CODE (type) != TYPE_CODE_FLT)
@@ -343,7 +347,7 @@ i387_value_to_register (struct frame_info *frame, int regnum,
}
/* Convert from TYPE. */
- convert_typed_floating (from, type, to, builtin_type_i387_ext);
+ convert_typed_floating (from, type, to, i387_ext_type (gdbarch));
put_frame_register (frame, regnum, to);
}
diff --git a/gdb/ia64-tdep.c b/gdb/ia64-tdep.c
index ef36061..6919650 100644
--- a/gdb/ia64-tdep.c
+++ b/gdb/ia64-tdep.c
@@ -125,8 +125,6 @@ static gdbarch_skip_prologue_ftype ia64_skip_prologue;
static struct type *is_float_or_hfa_type (struct type *t);
static CORE_ADDR ia64_find_global_pointer (CORE_ADDR faddr);
-static struct type *builtin_type_ia64_ext;
-
#define NUM_IA64_RAW_REGS 462
static int sp_regnum = IA64_GR12_REGNUM;
@@ -281,6 +279,37 @@ struct ia64_frame_cache
};
static int
+floatformat_valid (const struct floatformat *fmt, const void *from)
+{
+ return 1;
+}
+
+static const struct floatformat floatformat_ia64_ext =
+{
+ floatformat_little, 82, 0, 1, 17, 65535, 0x1ffff, 18, 64,
+ floatformat_intbit_yes, "floatformat_ia64_ext", floatformat_valid, NULL
+};
+
+static const struct floatformat *floatformats_ia64_ext[2] =
+{
+ &floatformat_ia64_ext,
+ &floatformat_ia64_ext
+};
+
+static struct type *
+ia64_ext_type (struct gdbarch *gdbarch)
+{
+ struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+
+ if (!tdep->ia64_ext_type)
+ tdep->ia64_ext_type
+ = init_float_type (128, "builtin_type_ia64_ext",
+ floatformats_ia64_ext);
+
+ return tdep->ia64_ext_type;
+}
+
+static int
ia64_register_reggroup_p (struct gdbarch *gdbarch, int regnum,
struct reggroup *group)
{
@@ -313,7 +342,7 @@ struct type *
ia64_register_type (struct gdbarch *arch, int reg)
{
if (reg >= IA64_FR0_REGNUM && reg <= IA64_FR127_REGNUM)
- return builtin_type_ia64_ext;
+ return ia64_ext_type (arch);
else
return builtin_type (arch)->builtin_long;
}
@@ -326,24 +355,6 @@ ia64_dwarf_reg_to_regnum (struct gdbarch *gdbarch, int reg)
return reg;
}
-static int
-floatformat_valid (const struct floatformat *fmt, const void *from)
-{
- return 1;
-}
-
-const struct floatformat floatformat_ia64_ext =
-{
- floatformat_little, 82, 0, 1, 17, 65535, 0x1ffff, 18, 64,
- floatformat_intbit_yes, "floatformat_ia64_ext", floatformat_valid, NULL
-};
-
-const struct floatformat *floatformats_ia64_ext[2] =
-{
- &floatformat_ia64_ext,
- &floatformat_ia64_ext
-};
-
/* Extract ``len'' bits from an instruction bundle starting at
bit ``from''. */
@@ -1048,24 +1059,26 @@ static int
ia64_convert_register_p (struct gdbarch *gdbarch, int regno, struct type *type)
{
return (regno >= IA64_FR0_REGNUM && regno <= IA64_FR127_REGNUM
- && type != builtin_type_ia64_ext);
+ && type != ia64_ext_type (gdbarch));
}
static void
ia64_register_to_value (struct frame_info *frame, int regnum,
struct type *valtype, gdb_byte *out)
{
+ struct gdbarch *gdbarch = get_frame_arch (frame);
char in[MAX_REGISTER_SIZE];
frame_register_read (frame, regnum, in);
- convert_typed_floating (in, builtin_type_ia64_ext, out, valtype);
+ convert_typed_floating (in, ia64_ext_type (gdbarch), out, valtype);
}
static void
ia64_value_to_register (struct frame_info *frame, int regnum,
struct type *valtype, const gdb_byte *in)
{
+ struct gdbarch *gdbarch = get_frame_arch (frame);
char out[MAX_REGISTER_SIZE];
- convert_typed_floating (in, valtype, out, builtin_type_ia64_ext);
+ convert_typed_floating (in, valtype, out, ia64_ext_type (gdbarch));
put_frame_register (frame, regnum, out);
}
@@ -2985,6 +2998,7 @@ static void
ia64_extract_return_value (struct type *type, struct regcache *regcache,
gdb_byte *valbuf)
{
+ struct gdbarch *gdbarch = get_regcache_arch (regcache);
struct type *float_elt_type;
float_elt_type = is_float_or_hfa_type (type);
@@ -2998,7 +3012,7 @@ ia64_extract_return_value (struct type *type, struct regcache *regcache,
while (n-- > 0)
{
regcache_cooked_read (regcache, regnum, from);
- convert_typed_floating (from, builtin_type_ia64_ext,
+ convert_typed_floating (from, ia64_ext_type (gdbarch),
(char *)valbuf + offset, float_elt_type);
offset += TYPE_LENGTH (float_elt_type);
regnum++;
@@ -3009,8 +3023,7 @@ ia64_extract_return_value (struct type *type, struct regcache *regcache,
ULONGEST val;
int offset = 0;
int regnum = IA64_GR8_REGNUM;
- int reglen = TYPE_LENGTH (register_type (get_regcache_arch (regcache),
- IA64_GR8_REGNUM));
+ int reglen = TYPE_LENGTH (register_type (gdbarch, IA64_GR8_REGNUM));
int n = TYPE_LENGTH (type) / reglen;
int m = TYPE_LENGTH (type) % reglen;
@@ -3035,6 +3048,7 @@ static void
ia64_store_return_value (struct type *type, struct regcache *regcache,
const gdb_byte *valbuf)
{
+ struct gdbarch *gdbarch = get_regcache_arch (regcache);
struct type *float_elt_type;
float_elt_type = is_float_or_hfa_type (type);
@@ -3048,7 +3062,7 @@ ia64_store_return_value (struct type *type, struct regcache *regcache,
while (n-- > 0)
{
convert_typed_floating ((char *)valbuf + offset, float_elt_type,
- to, builtin_type_ia64_ext);
+ to, ia64_ext_type (gdbarch));
regcache_cooked_write (regcache, regnum, to);
offset += TYPE_LENGTH (float_elt_type);
regnum++;
@@ -3059,8 +3073,7 @@ ia64_store_return_value (struct type *type, struct regcache *regcache,
ULONGEST val;
int offset = 0;
int regnum = IA64_GR8_REGNUM;
- int reglen = TYPE_LENGTH (register_type (get_regcache_arch (regcache),
- IA64_GR8_REGNUM));
+ int reglen = TYPE_LENGTH (register_type (gdbarch, IA64_GR8_REGNUM));
int n = TYPE_LENGTH (type) / reglen;
int m = TYPE_LENGTH (type) % reglen;
@@ -3520,7 +3533,7 @@ ia64_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
{
char to[MAX_REGISTER_SIZE];
convert_typed_floating (value_contents (arg) + argoffset, float_elt_type,
- to, builtin_type_ia64_ext);
+ to, ia64_ext_type (gdbarch));
regcache_cooked_write (regcache, floatreg, (void *)to);
floatreg++;
argoffset += TYPE_LENGTH (float_elt_type);
@@ -3691,11 +3704,5 @@ extern initialize_file_ftype _initialize_ia64_tdep; /* -Wmissing-prototypes */
void
_initialize_ia64_tdep (void)
{
- /* Define the ia64 floating-point format to gdb. */
- builtin_type_ia64_ext =
- init_type (TYPE_CODE_FLT, 128 / 8,
- 0, "builtin_type_ia64_ext", NULL);
- TYPE_FLOATFORMAT (builtin_type_ia64_ext) = floatformats_ia64_ext;
-
gdbarch_register (bfd_arch_ia64, ia64_gdbarch_init, NULL);
}
diff --git a/gdb/ia64-tdep.h b/gdb/ia64-tdep.h
index afa9196..b098a5e 100644
--- a/gdb/ia64-tdep.h
+++ b/gdb/ia64-tdep.h
@@ -198,6 +198,9 @@ struct gdbarch_tdep
{
CORE_ADDR (*sigcontext_register_address) (CORE_ADDR, int);
int (*pc_in_sigtramp) (CORE_ADDR);
+
+ /* ISA-specific data types. */
+ struct type *ia64_ext_type;
};
extern void ia64_write_pc (struct regcache *, CORE_ADDR);
diff --git a/gdb/jv-lang.c b/gdb/jv-lang.c
index 9d24845..c885ec7 100644
--- a/gdb/jv-lang.c
+++ b/gdb/jv-lang.c
@@ -1182,9 +1182,9 @@ build_java_types (struct gdbarch *gdbarch)
builtin_java_type->builtin_char
= init_type (TYPE_CODE_CHAR, 2, TYPE_FLAG_UNSIGNED, "char", NULL);
builtin_java_type->builtin_float
- = init_type (TYPE_CODE_FLT, 4, 0, "float", NULL);
+ = init_float_type (32, "float", NULL);
builtin_java_type->builtin_double
- = init_type (TYPE_CODE_FLT, 8, 0, "double", NULL);
+ = init_float_type (64, "double", NULL);
builtin_java_type->builtin_void
= init_type (TYPE_CODE_VOID, 1, 0, "void", NULL);
diff --git a/gdb/m2-lang.c b/gdb/m2-lang.c
index 90c3b2f..1421149 100644
--- a/gdb/m2-lang.c
+++ b/gdb/m2-lang.c
@@ -416,10 +416,7 @@ build_m2_types (struct gdbarch *gdbarch)
TYPE_FLAG_UNSIGNED,
"CARDINAL", (struct objfile *) NULL);
builtin_m2_type->builtin_real =
- init_type (TYPE_CODE_FLT,
- gdbarch_float_bit (gdbarch) / TARGET_CHAR_BIT,
- 0,
- "REAL", (struct objfile *) NULL);
+ init_float_type (gdbarch_float_bit (gdbarch), "REAL", NULL);
builtin_m2_type->builtin_char =
init_type (TYPE_CODE_CHAR, TARGET_CHAR_BIT / TARGET_CHAR_BIT,
TYPE_FLAG_UNSIGNED,
diff --git a/gdb/m68k-tdep.c b/gdb/m68k-tdep.c
index 386b826..dda67e3 100644
--- a/gdb/m68k-tdep.c
+++ b/gdb/m68k-tdep.c
@@ -96,6 +96,19 @@ m68k_init_types (void)
m68k_ps_type = type;
}
+static struct type *
+m68881_ext_type (struct gdbarch *gdbarch)
+{
+ struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+
+ if (!tdep->m68881_ext_type)
+ tdep->m68881_ext_type
+ = init_float_type (-1, "builtin_type_m68881_ext",
+ floatformats_m68881_ext);
+
+ return tdep->m68881_ext_type;
+}
+
/* Return the GDB type object for the "standard" data type of data in
register N. This should be int for D0-D7, SR, FPCONTROL and
FPSTATUS, long double for FP0-FP7, and void pointer for all others
@@ -117,7 +130,7 @@ m68k_register_type (struct gdbarch *gdbarch, int regnum)
if (tdep->flavour == m68k_coldfire_flavour)
return builtin_type (gdbarch)->builtin_double;
else
- return builtin_type_m68881_ext;
+ return m68881_ext_type (gdbarch);
}
if (regnum == M68K_FPI_REGNUM)
@@ -174,7 +187,7 @@ m68k_convert_register_p (struct gdbarch *gdbarch, int regnum, struct type *type)
if (!gdbarch_tdep (gdbarch)->fpregs_present)
return 0;
return (regnum >= M68K_FP0_REGNUM && regnum <= M68K_FP0_REGNUM + 7
- && type != builtin_type_m68881_ext);
+ && type != m68881_ext_type (gdbarch));
}
/* Read a value of type TYPE from register REGNUM in frame FRAME, and
diff --git a/gdb/m68k-tdep.h b/gdb/m68k-tdep.h
index 627922c..986def1 100644
--- a/gdb/m68k-tdep.h
+++ b/gdb/m68k-tdep.h
@@ -92,6 +92,9 @@ struct gdbarch_tdep
/* Flag set if the floating point registers are present, or assumed
to be present. */
int fpregs_present;
+
+ /* ISA-specific data types. */
+ struct type *m68881_ext_type;
};
/* Initialize a SVR4 architecture variant. */
diff --git a/gdb/mips-tdep.c b/gdb/mips-tdep.c
index 2af536c..f75e386 100644
--- a/gdb/mips-tdep.c
+++ b/gdb/mips-tdep.c
@@ -364,9 +364,6 @@ static CORE_ADDR heuristic_proc_start (struct gdbarch *, CORE_ADDR);
static void reinit_frame_cache_sfunc (char *, int, struct cmd_list_element *);
-static struct type *mips_float_register_type (void);
-static struct type *mips_double_register_type (void);
-
/* The list of available "set mips " and "show mips " commands */
static struct cmd_list_element *setmipscmdlist = NULL;
@@ -670,9 +667,9 @@ mips_register_type (struct gdbarch *gdbarch, int regnum)
/* The floating-point registers raw, or cooked, always match
mips_isa_regsize(), and also map 1:1, byte for byte. */
if (mips_isa_regsize (gdbarch) == 4)
- return builtin_type_ieee_single;
+ return builtin_type (gdbarch)->builtin_float;
else
- return builtin_type_ieee_double;
+ return builtin_type (gdbarch)->builtin_double;
}
else if (regnum < gdbarch_num_regs (gdbarch))
{
@@ -4282,18 +4279,6 @@ mips_o64_return_value (struct gdbarch *gdbarch, struct type *func_type,
regs could be 32 bits wide in one frame and 64 on the frame above
and below). */
-static struct type *
-mips_float_register_type (void)
-{
- return builtin_type_ieee_single;
-}
-
-static struct type *
-mips_double_register_type (void)
-{
- return builtin_type_ieee_double;
-}
-
/* Copy a 32-bit single-precision value from the current frame
into rare_buffer. */
@@ -4393,7 +4378,7 @@ mips_print_fp_register (struct ui_file *file, struct frame_info *frame,
/* 4-byte registers: Print hex and floating. Also print even
numbered registers as doubles. */
mips_read_fp_register_single (frame, regnum, raw_buffer);
- flt1 = unpack_double (mips_float_register_type (), raw_buffer, &inv1);
+ flt1 = unpack_double (builtin_type (gdbarch)->builtin_float, raw_buffer, &inv1);
get_formatted_print_options (&opts, 'x');
print_scalar_formatted (raw_buffer,
@@ -4409,8 +4394,8 @@ mips_print_fp_register (struct ui_file *file, struct frame_info *frame,
if ((regnum - gdbarch_num_regs (gdbarch)) % 2 == 0)
{
mips_read_fp_register_double (frame, regnum, raw_buffer);
- doub = unpack_double (mips_double_register_type (), raw_buffer,
- &inv2);
+ doub = unpack_double (builtin_type (gdbarch)->builtin_double,
+ raw_buffer, &inv2);
fprintf_filtered (file, " dbl: ");
if (inv2)
@@ -4425,10 +4410,12 @@ mips_print_fp_register (struct ui_file *file, struct frame_info *frame,
/* Eight byte registers: print each one as hex, float and double. */
mips_read_fp_register_single (frame, regnum, raw_buffer);
- flt1 = unpack_double (mips_float_register_type (), raw_buffer, &inv1);
+ flt1 = unpack_double (builtin_type (gdbarch)->builtin_float,
+ raw_buffer, &inv1);
mips_read_fp_register_double (frame, regnum, raw_buffer);
- doub = unpack_double (mips_double_register_type (), raw_buffer, &inv2);
+ doub = unpack_double (builtin_type (gdbarch)->builtin_double,
+ raw_buffer, &inv2);
get_formatted_print_options (&opts, 'x');
print_scalar_formatted (raw_buffer,
diff --git a/gdb/target-descriptions.c b/gdb/target-descriptions.c
index 9cdb546..3d0c66b 100644
--- a/gdb/target-descriptions.c
+++ b/gdb/target-descriptions.c
@@ -488,13 +488,16 @@ tdesc_gdb_type (struct gdbarch *gdbarch, struct tdesc_type *tdesc_type)
return builtin_type (gdbarch)->builtin_data_ptr;
case TDESC_TYPE_IEEE_SINGLE:
- return builtin_type_ieee_single;
+ return init_float_type (-1, "builtin_type_ieee_single",
+ floatformats_ieee_single);
case TDESC_TYPE_IEEE_DOUBLE:
- return builtin_type_ieee_double;
+ return init_float_type (-1, "builtin_type_ieee_double",
+ floatformats_ieee_double);
case TDESC_TYPE_ARM_FPA_EXT:
- return builtin_type_arm_ext;
+ return init_float_type (-1, "builtin_type_arm_ext",
+ floatformats_arm_ext);
/* Types defined by a target feature. */
case TDESC_TYPE_VECTOR: