From: Daniel Jacobowitz Date: Sun, 21 Sep 2003 19:11:47 +0000 (+0000) Subject: gdb X-Git-Tag: gdb_6_0-2003-10-04-release~23 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=69ed2fbc1951746cafbed9f979b0e3c3034327f9;p=thirdparty%2Fbinutils-gdb.git gdb 2003-09-19 Daniel Jacobowitz Merge from mainline: 2003-09-15 Daniel Jacobowitz * values.c (unpack_double): Call floatformat_is_valid. include 2003-09-15 Andrew Cagney * floatformat.h (floatformat_to_double): Make input buffer constant. (floatformat_from_double, floatformat_is_valid): Ditto. 2003-09-15 Daniel Jacobowitz * floatformat.h (floatformat_is_valid): Add prototype. libiberty 2003-09-15 Andrew Cagney * floatformat.c (get_field): Make "data" constant. (floatformat_is_valid, floatformat_to_double): Make "from" constant, fix casts. (floatformat_from_double): Make "from" constant. 2003-09-15 Daniel Jacobowitz * floatformat.c (floatformat_is_valid): New function. (get_field, put_field): Correct comments. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 5e84f50ca19..fc360bbf783 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,10 @@ +2003-09-19 Daniel Jacobowitz + + Merge from mainline: + 2003-09-15 Daniel Jacobowitz + + * values.c (unpack_double): Call floatformat_is_valid. + 2003-09-19 Jim Blandy Merge from mainline: diff --git a/gdb/values.c b/gdb/values.c index 42395c886e2..912cd2b3152 100644 --- a/gdb/values.c +++ b/gdb/values.c @@ -739,7 +739,14 @@ unpack_double (struct type *type, const char *valaddr, int *invp) also not defined either. Oops! Hopefully someone will add both the missing floatformat - definitions and floatformat_is_invalid() function. */ + definitions and the new cases for floatformat_is_valid (). */ + + if (!floatformat_is_valid (floatformat_from_type (type), valaddr)) + { + *invp = 1; + return 0.0; + } + return extract_typed_floating (valaddr, type); } else if (nosign) diff --git a/include/ChangeLog b/include/ChangeLog index 5e9ac7a10f9..cecf35ca182 100644 --- a/include/ChangeLog +++ b/include/ChangeLog @@ -1,3 +1,12 @@ +2003-09-15 Andrew Cagney + + * floatformat.h (floatformat_to_double): Make input buffer constant. + (floatformat_from_double, floatformat_is_valid): Ditto. + +2003-09-15 Daniel Jacobowitz + + * floatformat.h (floatformat_is_valid): Add prototype. + 2003-06-22 Zack Weinberg * safe-ctype.h (HC_UNKNOWN, HC_ASCII, HC_EBCDIC): Rename to diff --git a/include/floatformat.h b/include/floatformat.h index 53ead3eee61..c92ab93f18a 100644 --- a/include/floatformat.h +++ b/include/floatformat.h @@ -1,5 +1,5 @@ /* IEEE floating point support declarations, for GDB, the GNU Debugger. - Copyright 1991, 1994, 1995, 1997, 2000 Free Software Foundation, Inc. + Copyright 1991, 1994, 1995, 1997, 2000, 2003 Free Software Foundation, Inc. This file is part of GDB. @@ -109,13 +109,18 @@ extern const struct floatformat floatformat_ia64_quad_little; Store the double in *TO. */ extern void -floatformat_to_double PARAMS ((const struct floatformat *, char *, double *)); +floatformat_to_double PARAMS ((const struct floatformat *, const char *, double *)); /* The converse: convert the double *FROM to FMT and store where TO points. */ extern void floatformat_from_double PARAMS ((const struct floatformat *, - double *, char *)); + const double *, char *)); + +/* Return non-zero iff the data at FROM is a valid number in format FMT. */ + +extern int +floatformat_is_valid PARAMS ((const struct floatformat *fmt, const char *from)); #endif /* defined (FLOATFORMAT_H) */ diff --git a/libiberty/ChangeLog b/libiberty/ChangeLog index 913bf54a3e3..39bfcf2b082 100644 --- a/libiberty/ChangeLog +++ b/libiberty/ChangeLog @@ -1,3 +1,15 @@ +2003-09-15 Andrew Cagney + + * floatformat.c (get_field): Make "data" constant. + (floatformat_is_valid, floatformat_to_double): Make "from" + constant, fix casts. + (floatformat_from_double): Make "from" constant. + +2003-09-15 Daniel Jacobowitz + + * floatformat.c (floatformat_is_valid): New function. + (get_field, put_field): Correct comments. + 2003-06-22 Zack Weinberg * safe-ctype.c: Use HOST_CHARSET_ASCII and HOST_CHARSET_EBCDIC, diff --git a/libiberty/floatformat.c b/libiberty/floatformat.c index d69024f7390..ee87e273415 100644 --- a/libiberty/floatformat.c +++ b/libiberty/floatformat.c @@ -1,5 +1,5 @@ /* IEEE floating point support routines, for GDB, the GNU Debugger. - Copyright (C) 1991, 1994, 1999, 2000 Free Software Foundation, Inc. + Copyright (C) 1991, 1994, 1999, 2000, 2003 Free Software Foundation, Inc. This file is part of GDB. @@ -143,17 +143,17 @@ const struct floatformat floatformat_ia64_quad_little = "floatformat_ia64_quad_little" }; -static unsigned long get_field PARAMS ((unsigned char *, +static unsigned long get_field PARAMS ((const unsigned char *, enum floatformat_byteorders, unsigned int, unsigned int, unsigned int)); -/* Extract a field which starts at START and is LEN bytes long. DATA and +/* Extract a field which starts at START and is LEN bits long. DATA and TOTAL_LEN are the thing we are extracting it from, in byteorder ORDER. */ static unsigned long get_field (data, order, total_len, start, len) - unsigned char *data; + const unsigned char *data; enum floatformat_byteorders order; unsigned int total_len; unsigned int start; @@ -207,10 +207,10 @@ get_field (data, order, total_len, start, len) void floatformat_to_double (fmt, from, to) const struct floatformat *fmt; - char *from; + const char *from; double *to; { - unsigned char *ufrom = (unsigned char *)from; + const unsigned char *ufrom = (const unsigned char *)from; double dto; long exponent; unsigned long mant; @@ -273,7 +273,7 @@ static void put_field PARAMS ((unsigned char *, enum floatformat_byteorders, unsigned int, unsigned long)); -/* Set a field which starts at START and is LEN bytes long. DATA and +/* Set a field which starts at START and is LEN bits long. DATA and TOTAL_LEN are the thing we are extracting it from, in byteorder ORDER. */ static void put_field (data, order, total_len, start, len, stuff_to_put) @@ -331,7 +331,7 @@ put_field (data, order, total_len, start, len, stuff_to_put) void floatformat_from_double (fmt, from, to) const struct floatformat *fmt; - double *from; + const double *from; char *to; { double dfrom; @@ -404,6 +404,39 @@ floatformat_from_double (fmt, from, to) } } +/* Return non-zero iff the data at FROM is a valid number in format FMT. */ + +int +floatformat_is_valid (fmt, from) + const struct floatformat *fmt; + const char *from; +{ + if (fmt == &floatformat_i387_ext) + { + /* In the i387 double-extended format, if the exponent is all + ones, then the integer bit must be set. If the exponent + is neither 0 nor ~0, the intbit must also be set. Only + if the exponent is zero can it be zero, and then it must + be zero. */ + unsigned long exponent, int_bit; + const unsigned char *ufrom = (const unsigned char *) from; + + exponent = get_field (ufrom, fmt->byteorder, fmt->totalsize, + fmt->exp_start, fmt->exp_len); + int_bit = get_field (ufrom, fmt->byteorder, fmt->totalsize, + fmt->man_start, 1); + + if ((exponent == 0) != (int_bit == 0)) + return 0; + else + return 1; + } + + /* Other formats with invalid representations should be added + here. */ + return 1; +} + #ifdef IEEE_DEBUG