From 7355ddbacef086a00575d289049611428fbf8087 Mon Sep 17 00:00:00 2001 From: Jim Blandy Date: Fri, 14 Apr 2000 19:14:19 +0000 Subject: [PATCH] Bring IEEE_FLOAT under gdbarch's control. * gdbarch.sh (IEEE_FLOAT): New entry. * gdbarch.c, gdbarch.h: Regenerated. * valprint.c (IEEE_FLOAT): Provide a default #definition for this. (print_floating): Use IEEE_FLOAT as if it were an expression; use the code specific to IEEE-format numbers whenever the value of IEEE_FLOAT is non-zero. * config/a29k/tm-a29k.h, config/alpha/tm-alpha.h, config/arc/tm-arc.h, config/arm/tm-arm.h, config/fr30/tm-fr30.h, config/h8300/tm-h8300.h, config/i386/tm-i386.h, config/i960/tm-i960.h, config/m88k/tm-m88k.h, config/mips/tm-mips.h, config/pa/tm-hppa.h, config/sparc/tm-sparc.h, config/delta/tm-delta.h, config/frv/tm-frv.h (IEEE_FLOAT): For all ports that #define IEEE_FLOAT, make sure they give it the value (1). --- gdb/config/a29k/tm-a29k.h | 2 +- gdb/config/alpha/tm-alpha.h | 2 +- gdb/config/arc/tm-arc.h | 2 +- gdb/config/arm/tm-arm.h | 2 +- gdb/config/fr30/tm-fr30.h | 2 +- gdb/config/h8300/tm-h8300.h | 2 +- gdb/config/h8500/tm-h8500.h | 2 +- gdb/config/i386/tm-i386.h | 2 +- gdb/config/i960/tm-i960.h | 2 +- gdb/config/m68k/tm-m68k.h | 2 +- gdb/config/m88k/tm-m88k.h | 2 +- gdb/config/mips/tm-mips.h | 2 +- gdb/config/pa/tm-hppa.h | 2 +- gdb/config/sh/tm-sh.h | 2 +- gdb/config/sparc/tm-sparc.h | 2 +- gdb/config/w65/tm-w65.h | 2 +- gdb/config/z8k/tm-z8k.h | 2 +- gdb/gdbarch.c | 23 ++++++ gdb/gdbarch.h | 8 ++ gdb/gdbarch.sh | 3 +- gdb/valprint.c | 144 ++++++++++++++++++------------------ 21 files changed, 124 insertions(+), 88 deletions(-) diff --git a/gdb/config/a29k/tm-a29k.h b/gdb/config/a29k/tm-a29k.h index 25a5bea74d0..7a884a4b563 100644 --- a/gdb/config/a29k/tm-a29k.h +++ b/gdb/config/a29k/tm-a29k.h @@ -31,7 +31,7 @@ #define TARGET_BYTE_ORDER BIG_ENDIAN /* Floating point uses IEEE representations. */ -#define IEEE_FLOAT +#define IEEE_FLOAT (1) /* Recognize our magic number. */ #define BADMAG(x) ((x).f_magic != 0572) diff --git a/gdb/config/alpha/tm-alpha.h b/gdb/config/alpha/tm-alpha.h index d63dcc1296d..37559936923 100644 --- a/gdb/config/alpha/tm-alpha.h +++ b/gdb/config/alpha/tm-alpha.h @@ -42,7 +42,7 @@ struct symbol; #define TARGET_PTR_BIT 64 /* Floating point is IEEE compliant */ -#define IEEE_FLOAT +#define IEEE_FLOAT (1) /* Number of traps that happen between exec'ing the shell * to run an inferior, and when we finally get to diff --git a/gdb/config/arc/tm-arc.h b/gdb/config/arc/tm-arc.h index 34fabaf4f3a..a6531a51adc 100644 --- a/gdb/config/arc/tm-arc.h +++ b/gdb/config/arc/tm-arc.h @@ -26,7 +26,7 @@ #define TARGET_BYTE_ORDER_SELECTABLE /* We have IEEE floating point, if we have any float at all. */ -#define IEEE_FLOAT +#define IEEE_FLOAT (1) /* Offset from address of function to start of its code. Zero on most machines. */ diff --git a/gdb/config/arm/tm-arm.h b/gdb/config/arm/tm-arm.h index e64b77633dd..ed8e80c7d58 100644 --- a/gdb/config/arm/tm-arm.h +++ b/gdb/config/arm/tm-arm.h @@ -31,7 +31,7 @@ struct value; #define TARGET_BYTE_ORDER_DEFAULT LITTLE_ENDIAN /* IEEE format floating point. */ -#define IEEE_FLOAT +#define IEEE_FLOAT (1) #define TARGET_DOUBLE_FORMAT (target_byte_order == BIG_ENDIAN \ ? &floatformat_ieee_double_big \ : &floatformat_ieee_double_littlebyte_bigword) diff --git a/gdb/config/fr30/tm-fr30.h b/gdb/config/fr30/tm-fr30.h index d289f6e3450..69c85aacaa6 100644 --- a/gdb/config/fr30/tm-fr30.h +++ b/gdb/config/fr30/tm-fr30.h @@ -186,7 +186,7 @@ extern void fr30_store_return_value PARAMS ((struct type * type, char *valbuf)); #define TARGET_FR30 /* IEEE format floating point */ -#define IEEE_FLOAT +#define IEEE_FLOAT (1) /* Define other aspects of the stack frame. */ diff --git a/gdb/config/h8300/tm-h8300.h b/gdb/config/h8300/tm-h8300.h index 44b5e0d3e7a..8ee68162ff3 100644 --- a/gdb/config/h8300/tm-h8300.h +++ b/gdb/config/h8300/tm-h8300.h @@ -50,7 +50,7 @@ extern int h8300smode; extern void h8300_init_extra_frame_info (); -#define IEEE_FLOAT +#define IEEE_FLOAT (1) /* Define the bit, byte, and word ordering of the machine. */ #define TARGET_BYTE_ORDER BIG_ENDIAN #undef TARGET_INT_BIT diff --git a/gdb/config/h8500/tm-h8500.h b/gdb/config/h8500/tm-h8500.h index eb21a5c6fb1..070ac275042 100644 --- a/gdb/config/h8500/tm-h8500.h +++ b/gdb/config/h8500/tm-h8500.h @@ -22,7 +22,7 @@ #define GDB_TARGET_IS_H8500 -#define IEEE_FLOAT 1 +#define IEEE_FLOAT (1) /* Define the bit, byte, and word ordering of the machine. */ diff --git a/gdb/config/i386/tm-i386.h b/gdb/config/i386/tm-i386.h index bcb99fced41..33cb7f687b0 100644 --- a/gdb/config/i386/tm-i386.h +++ b/gdb/config/i386/tm-i386.h @@ -44,7 +44,7 @@ struct type; /* Used for example in valprint.c:print_floating() to enable checking for NaN's */ -#define IEEE_FLOAT +#define IEEE_FLOAT (1) /* Number of traps that happen between exec'ing the shell to run an inferior, and when we finally get to the inferior code. This is 2 diff --git a/gdb/config/i960/tm-i960.h b/gdb/config/i960/tm-i960.h index 73bb8dbfff4..1c25118d791 100644 --- a/gdb/config/i960/tm-i960.h +++ b/gdb/config/i960/tm-i960.h @@ -40,7 +40,7 @@ /* We have IEEE floating point, if we have any float at all. */ -#define IEEE_FLOAT +#define IEEE_FLOAT (1) /* Offset from address of function to start of its code. Zero on most machines. */ diff --git a/gdb/config/m68k/tm-m68k.h b/gdb/config/m68k/tm-m68k.h index c3574ee0a9a..03cf9b38f10 100644 --- a/gdb/config/m68k/tm-m68k.h +++ b/gdb/config/m68k/tm-m68k.h @@ -20,7 +20,7 @@ /* Generic 68000 stuff, to be included by other tm-*.h files. */ -#define IEEE_FLOAT 1 +#define IEEE_FLOAT (1) /* Define the bit, byte, and word ordering of the machine. */ #define TARGET_BYTE_ORDER BIG_ENDIAN diff --git a/gdb/config/m88k/tm-m88k.h b/gdb/config/m88k/tm-m88k.h index 1acb83e9584..6effedc4436 100644 --- a/gdb/config/m88k/tm-m88k.h +++ b/gdb/config/m88k/tm-m88k.h @@ -43,7 +43,7 @@ init_extra_frame_info (fromleaf, fi) extern void init_extra_frame_info (); -#define IEEE_FLOAT +#define IEEE_FLOAT (1) /* Offset from address of function to start of its code. Zero on most machines. */ diff --git a/gdb/config/mips/tm-mips.h b/gdb/config/mips/tm-mips.h index 3b8330fb0e8..2f52fbe9815 100644 --- a/gdb/config/mips/tm-mips.h +++ b/gdb/config/mips/tm-mips.h @@ -58,7 +58,7 @@ struct value; #endif /* Floating point is IEEE compliant */ -#define IEEE_FLOAT +#define IEEE_FLOAT (1) /* The name of the usual type of MIPS processor that is in the target system. */ diff --git a/gdb/config/pa/tm-hppa.h b/gdb/config/pa/tm-hppa.h index 9307fa56721..975820a86ec 100644 --- a/gdb/config/pa/tm-hppa.h +++ b/gdb/config/pa/tm-hppa.h @@ -53,7 +53,7 @@ struct inferior_status; /* Watch out for NaNs */ -#define IEEE_FLOAT +#define IEEE_FLOAT (1) /* On the PA, any pass-by-value structure > 8 bytes is actually passed via a pointer regardless of its type or the compiler diff --git a/gdb/config/sh/tm-sh.h b/gdb/config/sh/tm-sh.h index a3367131180..ad26ec17fac 100644 --- a/gdb/config/sh/tm-sh.h +++ b/gdb/config/sh/tm-sh.h @@ -27,7 +27,7 @@ struct type; #define GDB_TARGET_IS_SH -#define IEEE_FLOAT 1 +#define IEEE_FLOAT (1) /* Define the bit, byte, and word ordering of the machine. */ diff --git a/gdb/config/sparc/tm-sparc.h b/gdb/config/sparc/tm-sparc.h index 5419ecb88e2..29cf746ee1b 100644 --- a/gdb/config/sparc/tm-sparc.h +++ b/gdb/config/sparc/tm-sparc.h @@ -28,7 +28,7 @@ struct value; #define TARGET_BYTE_ORDER BIG_ENDIAN /* Floating point is IEEE compatible. */ -#define IEEE_FLOAT +#define IEEE_FLOAT (1) /* If an argument is declared "register", Sun cc will keep it in a register, never saving it onto the stack. So we better not believe the "p" symbol diff --git a/gdb/config/w65/tm-w65.h b/gdb/config/w65/tm-w65.h index b1fe4eddceb..c8da6bf875c 100644 --- a/gdb/config/w65/tm-w65.h +++ b/gdb/config/w65/tm-w65.h @@ -22,7 +22,7 @@ #define GDB_TARGET_IS_W65 -#define IEEE_FLOAT 1 +#define IEEE_FLOAT (1) /* Define the bit, byte, and word ordering of the machine. */ diff --git a/gdb/config/z8k/tm-z8k.h b/gdb/config/z8k/tm-z8k.h index f781e0a868e..9cc12ec843a 100644 --- a/gdb/config/z8k/tm-z8k.h +++ b/gdb/config/z8k/tm-z8k.h @@ -18,7 +18,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#define IEEE_FLOAT 1 +#define IEEE_FLOAT (1) #undef TARGET_INT_BIT #undef TARGET_LONG_BIT diff --git a/gdb/gdbarch.c b/gdb/gdbarch.c index a1b02ace829..6b587608f10 100644 --- a/gdb/gdbarch.c +++ b/gdb/gdbarch.c @@ -135,6 +135,7 @@ struct gdbarch int float_bit; int double_bit; int long_double_bit; + int ieee_float; gdbarch_read_pc_ftype *read_pc; gdbarch_write_pc_ftype *write_pc; gdbarch_read_fp_ftype *read_fp; @@ -273,6 +274,7 @@ struct gdbarch startup_gdbarch = { 0, 0, 0, + 0, generic_get_saved_register, 0, 0, @@ -335,6 +337,7 @@ gdbarch_alloc (const struct gdbarch_info *info, /* Force the explicit initialization of these. */ gdbarch->bfd_vma_bit = TARGET_ARCHITECTURE->bits_per_address; + gdbarch->ieee_float = 1; gdbarch->num_regs = -1; gdbarch->sp_regnum = -1; gdbarch->fp_regnum = -1; @@ -423,6 +426,7 @@ verify_gdbarch (struct gdbarch *gdbarch) if ((GDB_MULTI_ARCH >= 1) && (gdbarch->long_double_bit == 0)) internal_error ("gdbarch: verify_gdbarch: long_double_bit invalid"); + /* Skip verify of ieee_float, invalid_p == 0 */ if ((GDB_MULTI_ARCH >= 1) && (gdbarch->read_pc == 0)) internal_error ("gdbarch: verify_gdbarch: read_pc invalid"); @@ -655,6 +659,9 @@ gdbarch_dump (void) fprintf_unfiltered (gdb_stdlog, "gdbarch_update: TARGET_LONG_DOUBLE_BIT = %ld\n", (long) TARGET_LONG_DOUBLE_BIT); + fprintf_unfiltered (gdb_stdlog, + "gdbarch_update: IEEE_FLOAT = %ld\n", + (long) IEEE_FLOAT); fprintf_unfiltered (gdb_stdlog, "gdbarch_update: TARGET_READ_PC = 0x%08lx\n", (long) current_gdbarch->read_pc @@ -1120,6 +1127,22 @@ set_gdbarch_long_double_bit (struct gdbarch *gdbarch, gdbarch->long_double_bit = long_double_bit; } +int +gdbarch_ieee_float (struct gdbarch *gdbarch) +{ + /* Skip verify of ieee_float, invalid_p == 0 */ + if (gdbarch_debug >= 2) + fprintf_unfiltered (gdb_stdlog, "gdbarch_ieee_float called\n"); + return gdbarch->ieee_float; +} + +void +set_gdbarch_ieee_float (struct gdbarch *gdbarch, + int ieee_float) +{ + gdbarch->ieee_float = ieee_float; +} + CORE_ADDR gdbarch_read_pc (struct gdbarch *gdbarch, int pid) { diff --git a/gdb/gdbarch.h b/gdb/gdbarch.h index f24c26e76f8..4f837c11768 100644 --- a/gdb/gdbarch.h +++ b/gdb/gdbarch.h @@ -171,6 +171,14 @@ extern void set_gdbarch_long_double_bit (struct gdbarch *gdbarch, int long_doubl #endif #endif +extern int gdbarch_ieee_float (struct gdbarch *gdbarch); +extern void set_gdbarch_ieee_float (struct gdbarch *gdbarch, int ieee_float); +#if GDB_MULTI_ARCH +#if (GDB_MULTI_ARCH > 1) || !defined (IEEE_FLOAT) +#define IEEE_FLOAT (gdbarch_ieee_float (current_gdbarch)) +#endif +#endif + typedef CORE_ADDR (gdbarch_read_pc_ftype) (int pid); extern CORE_ADDR gdbarch_read_pc (struct gdbarch *gdbarch, int pid); extern void set_gdbarch_read_pc (struct gdbarch *gdbarch, gdbarch_read_pc_ftype *read_pc); diff --git a/gdb/gdbarch.sh b/gdb/gdbarch.sh index 9575e7fbac5..93d9871ec71 100755 --- a/gdb/gdbarch.sh +++ b/gdb/gdbarch.sh @@ -193,6 +193,7 @@ v:1:TARGET_LONG_LONG_BIT:int:long_long_bit::::8 * sizeof (LONGEST):0 v:1:TARGET_FLOAT_BIT:int:float_bit::::8 * sizeof (float):0 v:1:TARGET_DOUBLE_BIT:int:double_bit::::8 * sizeof (double):0 v:1:TARGET_LONG_DOUBLE_BIT:int:long_double_bit::::8 * sizeof (long double):0 +v:1:IEEE_FLOAT:int:ieee_float::::0:1:0 # f:1:TARGET_READ_PC:CORE_ADDR:read_pc:int pid:pid::0:0 f:1:TARGET_WRITE_PC:void:write_pc:CORE_ADDR val, int pid:val, pid::0:0 @@ -815,7 +816,7 @@ copyright cat <> 23) & 0xFF) == 0xFF) + && 0 != (low & 0x7FFFFF)); + low &= 0x7fffff; + high = 0; + } + else if (len == 8) + { + /* It's double precision. Get the high and low words. */ - { - unsigned long low, high; - /* Is the sign bit 0? */ - int nonnegative; - /* Is it is a NaN (i.e. the exponent is all ones and - the fraction is nonzero)? */ - int is_nan; - - /* For lint, initialize these two variables to suppress warning: */ - low = high = nonnegative = 0; - if (len == 4) - { - /* It's single precision. */ - /* Assume that floating point byte order is the same as - integer byte order. */ - low = extract_unsigned_integer (valaddr, 4); - nonnegative = ((low & 0x80000000) == 0); - is_nan = ((((low >> 23) & 0xFF) == 0xFF) - && 0 != (low & 0x7FFFFF)); - low &= 0x7fffff; - high = 0; - } - else if (len == 8) - { - /* It's double precision. Get the high and low words. */ - - /* Assume that floating point byte order is the same as - integer byte order. */ - if (TARGET_BYTE_ORDER == BIG_ENDIAN) - { - low = extract_unsigned_integer (valaddr + 4, 4); - high = extract_unsigned_integer (valaddr, 4); - } - else - { - low = extract_unsigned_integer (valaddr, 4); - high = extract_unsigned_integer (valaddr + 4, 4); - } - nonnegative = ((high & 0x80000000) == 0); - is_nan = (((high >> 20) & 0x7ff) == 0x7ff - && !((((high & 0xfffff) == 0)) && (low == 0))); - high &= 0xfffff; - } - else - { + /* Assume that floating point byte order is the same as + integer byte order. */ + if (TARGET_BYTE_ORDER == BIG_ENDIAN) + { + low = extract_unsigned_integer (valaddr + 4, 4); + high = extract_unsigned_integer (valaddr, 4); + } + else + { + low = extract_unsigned_integer (valaddr, 4); + high = extract_unsigned_integer (valaddr + 4, 4); + } + nonnegative = ((high & 0x80000000) == 0); + is_nan = (((high >> 20) & 0x7ff) == 0x7ff + && !((((high & 0xfffff) == 0)) && (low == 0))); + high &= 0xfffff; + } + else + { #ifdef TARGET_ANALYZE_FLOATING - TARGET_ANALYZE_FLOATING; + TARGET_ANALYZE_FLOATING; #else - /* Extended. We can't detect extended NaNs for this target. - Also note that currently extendeds get nuked to double in - REGISTER_CONVERTIBLE. */ - is_nan = 0; + /* Extended. We can't detect extended NaNs for this target. + Also note that currently extendeds get nuked to double in + REGISTER_CONVERTIBLE. */ + is_nan = 0; #endif - } - - if (is_nan) - { - /* The meaning of the sign and fraction is not defined by IEEE. - But the user might know what they mean. For example, they - (in an implementation-defined manner) distinguish between - signaling and quiet NaN's. */ - if (high) - fprintf_filtered (stream, "-NaN(0x%lx%.8lx)" + !!nonnegative, - high, low); - else - fprintf_filtered (stream, "-NaN(0x%lx)" + nonnegative, low); - return; - } - } -#endif /* IEEE_FLOAT. */ + } + + if (is_nan) + { + /* The meaning of the sign and fraction is not defined by IEEE. + But the user might know what they mean. For example, they + (in an implementation-defined manner) distinguish between + signaling and quiet NaN's. */ + if (high) + fprintf_filtered (stream, "-NaN(0x%lx%.8lx)" + !!nonnegative, + high, low); + else + fprintf_filtered (stream, "-NaN(0x%lx)" + nonnegative, low); + return; + } + } doub = unpack_double (type, valaddr, &inv); if (inv) -- 2.30.2