This is the mail archive of the
gdb-patches@sources.redhat.com
mailing list for the GDB project.
Re: [rfa/i387] Eliminate HOST_*_FORMAT from i387-tdep.c
- To: Mark Kettenis <kettenis at science dot uva dot nl>
- Subject: Re: [rfa/i387] Eliminate HOST_*_FORMAT from i387-tdep.c
- From: Andrew Cagney <ac131313 at cygnus dot com>
- Date: Wed, 04 Jul 2001 15:18:17 -0400
- Cc: gdb-patches at sources dot redhat dot com
- References: <3B3CB299.5000100@cygnus.com> <s3ipubkolli.fsf@soliton.wins.uva.nl>
Thanks! I've checked in the attatched. It added a few more comments
and the suggested assertion. (and ``. '' :-)
Andrew
2001-06-29 Andrew Cagney <ac131313@redhat.com>
* i387-tdep.c: Include "gdb_assert.h".
(print_i387_value): Use extract_floating to extract the FP value
from a zero padded local buffer.
Index: i387-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/i387-tdep.c,v
retrieving revision 1.9
diff -p -r1.9 i387-tdep.c
*** i387-tdep.c 2001/03/09 16:14:55 1.9
--- i387-tdep.c 2001/07/04 19:17:00
***************
*** 27,32 ****
--- 27,33 ----
#include "gdbcore.h"
#include "floatformat.h"
#include "regcache.h"
+ #include "gdb_assert.h"
/* FIXME: Eliminate the next two functions when we have the time to
*************** static void
*** 160,181 ****
print_i387_value (char *raw)
{
DOUBLEST value;
! /* Avoid call to floatformat_to_doublest if possible to preserve as
! much information as possible. */
! #ifdef HAVE_LONG_DOUBLE
! if (sizeof (value) == sizeof (long double)
! && HOST_LONG_DOUBLE_FORMAT == &floatformat_i387_ext)
! {
! /* Copy straight over, but take care of the padding. */
! memcpy (&value, raw, FPU_REG_RAW_SIZE);
! memset ((char *) &value + FPU_REG_RAW_SIZE, 0,
! sizeof (value) - FPU_REG_RAW_SIZE);
! }
! else
! #endif
! floatformat_to_doublest (&floatformat_i387_ext, raw, &value);
/* 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
--- 161,185 ----
print_i387_value (char *raw)
{
DOUBLEST value;
+ int len = TARGET_LONG_DOUBLE_BIT / TARGET_CHAR_BIT;
+ char *tmp = alloca (len);
! /* This code only works on targets where ... */
! gdb_assert (TARGET_LONG_DOUBLE_FORMAT == &floatformat_i387_ext);
! /* Take care of the padding. FP reg is 80 bits. The same value in
! memory is 96 bits. */
! gdb_assert (FPU_REG_RAW_SIZE < len);
! memcpy (&tmp, raw, FPU_REG_RAW_SIZE);
! memset (&tmp + FPU_REG_RAW_SIZE, 0, len - FPU_REG_RAW_SIZE);
!
! /* Extract the value as a DOUBLEST. */
! /* Use extract_floating() rather than floatformat_to_doublest().
! The latter is lossy in nature. Once GDB gets a host/target
! independent and non-lossy FP it will become possible to bypass
! extract_floating() and call floatformat*() directly. Note also
! the assumptions about TARGET_LONG_DOUBLE above. */
! value = extract_floating (tmp, len);
/* 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