Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 18 Jan 2004 13:03:56 -0800
From:      Marcel Moolenaar <marcel@xcllnt.net>
To:        src-committers@FreeBSD.ORG, cvs-src@FreeBSD.ORG, cvs-all@FreeBSD.ORG
Subject:   Re: cvs commit: src/lib/libc/gdtoa Makefile.inc _hdtoa.c src/lib/libc/stdio vfprintf.c
Message-ID:  <20040118210356.GA82925@dhcp01.pn.xcllnt.net>
In-Reply-To: <20040118103340.GA44149@VARK.homeunix.com>
References:  <200401181032.i0IAWoMh012953@repoman.freebsd.org> <20040118103340.GA44149@VARK.homeunix.com>

next in thread | previous in thread | raw e-mail | index | archive | help
On Sun, Jan 18, 2004 at 02:33:40AM -0800, David Schultz wrote:
> Any suggestions or bug reports involving this code are welcome, but
> please note the following caveats:
> 
> 	- strtod() has some bugs involving parsing hexadecimal
> 	  floating-point numbers, which should be fixed in the
> 	  next gdtoa import (to come shortly).  Until then, be
> 	  aware that numbers parsed with strtod() may not be
> 	  output as expected because they were not parsed correctly
> 	  in the first place.  In particular, don't specify too
> 	  many digits in the significand for subnormals, and
> 	  don't expect underflow to zero to work correctly.

Currently stdtod() is causing a SIGFPE on ia64 for a kernel build.
This started when obrien@ added the following code to kern.post.mk:

+emu10k1-alsa%diked.h: $S/gnu/dev/sound/pci/emu10k1-alsa.h
+       grep -v '#include' ${.OODATE} | ${CC} -E -D__KERNEL__ -dM - \
+           | awk -F"[  (]" '/define/ \
+           { print "#ifndef " $$2 ; print ; print "#endif" }' \
+           >${.TARGET}
+.if !exists(${.OBJDIR}/.depend)
+_kernel-depend: emu10k1-alsa%diked.h
+.endif
                                                                                
The problem is that awk(1) gets a SIGFPE unconditionally. I haven't
spent too much time on it yet, but I get the following in the gdb(1):
 
Program received signal SIGFPE, Arithmetic exception.
0x40000000000553d2 in strtod (s00=0x600000000001c02d "e-324",
    se=0x9fffffffffffe6f0) at gdtoa_strtod.c:938
938                     dval(rv) *= dval(rv0);
(gdb)

0x40000000000553d0 <strtod+16224>:      [MFB]       nop.m 0x0
0x40000000000553d1 <strtod+16225>:                  fmpy.d.s0 f6=f7,f6
0x40000000000553d2 <strtod+16226>:                  nop.b 0x0;;

(gdb) info reg f6 f7
f6             8.8817841970012523233890533447265625e-16 (raw 0x000000000000fbcd8000000000000000)
f7             4.0083367200179455559922161027003241e-292        (raw 0x000000000000fc378000000000000000)
(gdb) Erroneous arithmetic operation.
      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Very suspicious gdb(1) error. Don't trust the register values.

If you're interested in analyzing this, I have the above trigger case
in ~marcel/strtod on @FreeBSD.org. The awk(1) executable in that
directory has full debugging information (including libc). Run as:

./awk -F"[  (]" '/define/ { print "#ifndef " $2 ; print ; print "#endif" }' < awk.in

FYI,

-- 
 Marcel Moolenaar	  USPA: A-39004		 marcel@xcllnt.net



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20040118210356.GA82925>