aboutsummaryrefslogtreecommitdiff
path: root/gdb/config
diff options
context:
space:
mode:
authorMark Kettenis <kettenis@gnu.org>2000-03-26 21:21:50 +0000
committerMark Kettenis <kettenis@gnu.org>2000-03-26 21:21:50 +0000
commitac27f131b2fc0c5e0872c5855c599974b7416d07 (patch)
tree399afc0505a8f76691e4d2f234516cd003e5961e /gdb/config
parent9f10757c407c9946029436682ae554f9739fa62d (diff)
downloadgdb-ac27f131b2fc0c5e0872c5855c599974b7416d07.zip
gdb-ac27f131b2fc0c5e0872c5855c599974b7416d07.tar.gz
gdb-ac27f131b2fc0c5e0872c5855c599974b7416d07.tar.bz2
2000-03-26 Mark Kettenis <kettenis@gnu.org>
Provide `long double' support for most i386 targets. * config/i386/tm-i386.h (TARGET_LONG_DOUBLE_FORMAT): Define as &floatformat_i387_ext. (TARGET_LONG_DOUBLE_BITS): Define as 96. (REGISTER_VIRTUAL_TYPE): Change type for FPU registers to `builtin_type_long_double'. (REGISTER_CONVERT_TO_VIRTUAL): Call i386_register_convert_to_virtual. (REGISTER_CONVERT_TO_RAW): Call i386_register_convert_to_raw. (i387_to_double, double_to_i387): Remove prototypes. (i386_extract_return_value): Change prototype to match definition in i386-tdep.c. * config/i386/tm-i386mk.h (TARGET_LONG_DOUBLE_FORMAT): #undef. (TARGET_LONG_DOUBLE_BITS): #undef. * config/i386/tm-linux.h (TARGET_LONG_DOUBLE_BIT): Remove. [HAVE_LONG_DOUBLE && HOST_I386] (LD_I387): Remove. (i387_extract_floating, i387_store_floating): Remove prototypes. (TARGET_EXTRACT_FLOATING, TARGET_STORE_FLOATING): Remove. (REGISTER_CONVERT_TO_VIRTUAL, REGOISTER_CONVERT_TO_RAW): Remove. (REGISTER_VIRTUAL_TYPE): Remove. * i386-tdep.c (i386_register_convert_to_virtual): New function. (i386_register_convert_to_raw): New function. * i387-tdep.c [LD_I387] (i387_extract_floating): Remove. (i387_store_floating): Remove.
Diffstat (limited to 'gdb/config')
-rw-r--r--gdb/config/i386/tm-i386.h52
-rw-r--r--gdb/config/i386/tm-i386mk.h14
-rw-r--r--gdb/config/i386/tm-linux.h37
3 files changed, 48 insertions, 55 deletions
diff --git a/gdb/config/i386/tm-i386.h b/gdb/config/i386/tm-i386.h
index 6e3207e..f241884 100644
--- a/gdb/config/i386/tm-i386.h
+++ b/gdb/config/i386/tm-i386.h
@@ -1,5 +1,5 @@
/* Macro definitions for GDB on an Intel i[345]86.
- Copyright (C) 1995, 1996 Free Software Foundation, Inc.
+ Copyright (C) 1995, 1996, 2000 Free Software Foundation, Inc.
This file is part of GDB.
@@ -28,6 +28,19 @@ struct type;
#define TARGET_BYTE_ORDER LITTLE_ENDIAN
+/* The format used for `long double' on almost all i386 targets is the
+ i387 extended floating-point format. In fact, of all targets in the
+ GCC 2.95 tree, only OSF/1 does it different, and insists on having
+ a `long double' that's not `long' at all. */
+
+#define TARGET_LONG_DOUBLE_FORMAT &floatformat_i387_ext
+
+/* Although the i386 extended floating-point has only 80 significant
+ bits, a `long double' actually takes up 96, probably to enforce
+ alignment. */
+
+#define TARGET_LONG_DOUBLE_BITS 96
+
/* Used for example in valprint.c:print_floating() to enable checking
for NaN's */
@@ -229,7 +242,7 @@ extern int i386_register_virtual_size[];
#define REGISTER_VIRTUAL_TYPE(N) \
(((N) == PC_REGNUM || (N) == FP_REGNUM || (N) == SP_REGNUM) \
? lookup_pointer_type (builtin_type_void) \
- : IS_FP_REGNUM(N) ? builtin_type_double \
+ : IS_FP_REGNUM(N) ? builtin_type_long_double \
: IS_SSE_REGNUM(N) ? builtin_type_v4sf \
: builtin_type_int)
@@ -240,24 +253,21 @@ extern int i386_register_virtual_size[];
counterexample, this is still sloppy. */
#define REGISTER_CONVERTIBLE(n) (IS_FP_REGNUM (n))
-/* Convert data from raw format for register REGNUM in buffer FROM
- to virtual format with type TYPE in buffer TO. */
-extern void i387_to_double (char *, char *);
+/* Convert data from raw format for register REGNUM in buffer FROM to
+ virtual format with type TYPE in buffer TO. */
-#define REGISTER_CONVERT_TO_VIRTUAL(REGNUM,TYPE,FROM,TO) \
-{ \
- double val; \
- i387_to_double ((FROM), (char *)&val); \
- store_floating ((TO), TYPE_LENGTH (TYPE), val); \
-}
+#define REGISTER_CONVERT_TO_VIRTUAL(regnum, type, from, to) \
+ i386_register_convert_to_virtual ((regnum), (type), (from), (to));
+extern void i386_register_convert_to_virtual (int regnum, struct type *type,
+ char *from, char *to);
-extern void double_to_i387 (char *, char *);
+/* Convert data from virtual format with type TYPE in buffer FROM to
+ raw format for register REGNUM in buffer TO. */
-#define REGISTER_CONVERT_TO_RAW(TYPE,REGNUM,FROM,TO) \
-{ \
- double val = extract_floating ((FROM), TYPE_LENGTH (TYPE)); \
- double_to_i387((char *)&val, (TO)); \
-}
+#define REGISTER_CONVERT_TO_RAW(type, regnum, from, to) \
+ i386_register_convert_to_raw ((type), (regnum), (from), (to));
+extern void i386_register_convert_to_raw (struct type *type, int regnum,
+ char *from, char *to);
/* Print out the i387 floating point state. */
#ifdef HAVE_I387_REGS
@@ -279,10 +289,10 @@ extern void i387_float_info (void);
a function return value of type TYPE, and copy that, in virtual format,
into VALBUF. */
-#define EXTRACT_RETURN_VALUE(TYPE,REGBUF,VALBUF) \
- i386_extract_return_value ((TYPE),(REGBUF),(VALBUF))
-
-extern void i386_extract_return_value PARAMS ((struct type *, char[], char *));
+#define EXTRACT_RETURN_VALUE(type, regbuf, valbuf) \
+ i386_extract_return_value ((type), (regbuf), (valbuf))
+extern void i386_extract_return_value (struct type *type, char *regbuf,
+ char *valbuf);
/* Write into appropriate registers a function return value of type TYPE, given
in virtual format. */
diff --git a/gdb/config/i386/tm-i386mk.h b/gdb/config/i386/tm-i386mk.h
index cb18e3c..de66a69 100644
--- a/gdb/config/i386/tm-i386mk.h
+++ b/gdb/config/i386/tm-i386mk.h
@@ -1,5 +1,5 @@
/* Macro definitions for i386, Mach 3.0, OSF 1/MK
- Copyright (C) 1992 Free Software Foundation, Inc.
+ Copyright (C) 1992, 2000 Free Software Foundation, Inc.
This file is part of GDB.
@@ -24,3 +24,15 @@
#define MK67 1
#include "i386/tm-i386m3.h"
+
+/* FIMXE: kettenis/2000-03-26: On OSF 1, `long double' is equivalent
+ to `double'. However, I'm not sure what is the consequence of:
+
+ #define TARGET_LONG_DOUBLE_FORMAT TARGET_DOUBLE_FORMAT
+ #define TARGET_LONG_DOUBLE_BITS TARGET_DOUBLE_BITS
+
+ So I'll go with the current status quo instead. It looks like this
+ target won't compile anyway. Perhaps it should be obsoleted? */
+
+#undef TARGET_LONG_DOUBLE_FORMAT
+#undef TARGET_LONG_DOUBLE_BITS
diff --git a/gdb/config/i386/tm-linux.h b/gdb/config/i386/tm-linux.h
index 2e86a5c..d6a4616 100644
--- a/gdb/config/i386/tm-linux.h
+++ b/gdb/config/i386/tm-linux.h
@@ -30,20 +30,15 @@
#include "i386/tm-i386.h"
#include "tm-linux.h"
-/* This should probably move to tm-i386.h. */
-#define TARGET_LONG_DOUBLE_BIT 80
+/* FIXME: kettenis/2000-03-26: We should get rid of this last piece of
+ Linux-specific `long double'-support code, probably by adding code
+ to valprint.c:print_floating() to recognize various extended
+ floating-point formats. */
#if defined(HAVE_LONG_DOUBLE) && defined(HOST_I386)
/* The host and target are i386 machines and the compiler supports
long doubles. Long doubles on the host therefore have the same
layout as a 387 FPU stack register. */
-#define LD_I387
-
-extern int i387_extract_floating (PTR addr, int len, long double *dretptr);
-extern int i387_store_floating (PTR addr, int len, long double val);
-
-#define TARGET_EXTRACT_FLOATING i387_extract_floating
-#define TARGET_STORE_FLOATING i387_store_floating
#define TARGET_ANALYZE_FLOATING \
do \
@@ -61,30 +56,6 @@ extern int i387_store_floating (PTR addr, int len, long double val);
} \
while (0)
-#undef REGISTER_CONVERT_TO_VIRTUAL
-#define REGISTER_CONVERT_TO_VIRTUAL(REGNUM,TYPE,FROM,TO) \
-{ \
- long double val = *((long double *)FROM); \
- store_floating ((TO), TYPE_LENGTH (TYPE), val); \
-}
-
-#undef REGISTER_CONVERT_TO_RAW
-#define REGISTER_CONVERT_TO_RAW(TYPE,REGNUM,FROM,TO) \
-{ \
- long double val = extract_floating ((FROM), TYPE_LENGTH (TYPE)); \
- *((long double *)TO) = val; \
-}
-
-/* Return the GDB type object for the "standard" data type
- of data in register N. */
-#undef REGISTER_VIRTUAL_TYPE
-#define REGISTER_VIRTUAL_TYPE(N) \
- (((N) == PC_REGNUM || (N) == FP_REGNUM || (N) == SP_REGNUM) \
- ? lookup_pointer_type (builtin_type_void) \
- : IS_FP_REGNUM(N) ? builtin_type_long_double \
- : IS_SSE_REGNUM(N) ? builtin_type_v4sf \
- : builtin_type_int)
-
#endif
/* The following works around a problem with /usr/include/sys/procfs.h */