This is the mail archive of the
gdb-patches@sources.redhat.com
mailing list for the GDB project.
PATCH for Re: Problems with floatformat on Alpha
- From: Daniel Jacobowitz <drow at mvista dot com>
- To: gdb-patches at sources dot redhat dot com
- Date: Sun, 24 Nov 2002 17:56:05 -0500
- Subject: PATCH for Re: Problems with floatformat on Alpha
- References: <20021124214447.GA1222@nevyn.them.org>
On Sun, Nov 24, 2002 at 04:44:47PM -0500, Daniel Jacobowitz wrote:
> I spent some time today tracking problems in Alpha/Linux testsuite results.
> One of the biggies was SIGFPE in convert_floatformat_to_doublest. The first
> problem was pretty easy:
>
> else if (exponent == 0)
> exponent = 1 - fmt->exp_bias;
>
> 1 is an int, exp_bias is an unsigned int, exponent is a long int. The math
> is done unsigned and exponent is ridiculously large.
>
> I'm not sending a patch yet because I can't test it; something goes wrong
> later, in the call to ldexp and elsewhere, that looks suspiciously like GDB
> is miscompiled.
Blech. Doublest is assuming an IEEE-ish host. More particularly, it
appears that the mechanism doublest.c uses to construct doubles is not
usable on Alpha in non-IEE mode. The instruction "addt $f10,$f11,$f10"
can trap if $f10 is a denormal - even if $f11 is 0.0. I have test code
which demonstrates this to my satisfaction. So when we accumulate in
dto, we take a SIGFPE.
Here's the patch I'm using. The doublest part is obvious and no one's
caring for alpha-linux right now; so I'll check this in in a few days
unless someone sees a problem. It assumes that the compiler for an
alpha-linux host recognizes -mieee, which I'm comfortable with.
--
Daniel Jacobowitz
MontaVista Software Debian GNU/Linux Developer
2002-11-24 Daniel Jacobowitz <drow@mvista.com>
* doublest.c (convert_floatformat_to_doublest): Cast exp_bias to int.
* config/alpha/alpha-linux.mh (MH_CFLAGS): Add -mieee.
--- gdb-5.2.debian90.cvs20021120/gdb/doublest.c.orig 2002-11-24 17:48:16.000000000 -0500
+++ gdb-5.2.debian90.cvs20021120/gdb/doublest.c 2002-11-24 17:48:25.000000000 -0500
@@ -177,7 +177,7 @@
if (!special_exponent)
exponent -= fmt->exp_bias;
else if (exponent == 0)
- exponent = 1 - fmt->exp_bias;
+ exponent = 1 - (int)fmt->exp_bias;
/* Build the result algebraically. Might go infinite, underflow, etc;
who cares. */
--- gdb-5.2.debian90.cvs20021120/gdb/config/alpha/alpha-linux.mh.orig 2002-11-24 17:50:30.000000000 -0500
+++ gdb-5.2.debian90.cvs20021120/gdb/config/alpha/alpha-linux.mh 2002-11-24 17:50:41.000000000 -0500
@@ -8,3 +8,5 @@
MMALLOC =
MMALLOC_CFLAGS = -DNO_MMALLOC
+
+MH_CFLAGS = -mieee