On May 10 14:57, Agner Fog wrote: > Bug description: > > The sqrtl function under Clang causes an access violation when the argument > is negative. > > This error occurs only under Cygwin. > > This error occurs only with the sqrtl function, not with sqrt or sqrtf > > Attached: > > sqrt.cpp: program to reproduce the error. Compile clang sqrt.cpp and run > ./a.exe
Thanks for the testcase.
This looks like a bug in clang-5.0. It does not occur when building the
testcase with gcc, nor does it occur when building with clang-4.0.
Looking with GDB, it seems the conversion from float to long double is
screwed up. The sequence converting float to long double prior to
calling sqrtl is very different:
With gcc:
Thread 1 "sqrtl" hit Temporary breakpoint 1, main () at sqrtl.c:6
6 float b = sqrtl(a);
(gdb) s
sqrtl (x=-1)
at /home/corinna/src/cygwin/vanilla/winsup/cygwin/math/sqrt.def.h:69
69 __FLT_TYPE res = __FLT_CST (0.0);
(gdb) n
70 int x_class = fpclassify (x);
(gdb) p x
$1 = -1
(gdb) x/4x &x
0xffffcaf0: 0x00000000 0x80000000 0x0004bfff 0x00000006
=> 0x100401093 <main+19>: lea -0x20(%rbp),%rax
=> 0x100401097 <main+23>: fstpt -0x30(%rbp)
=> 0x10040109a <main+26>: lea -0x30(%rbp),%rdx
=> 0x10040109e <main+30>: mov %rax,%rcx
=> 0x1004010a1 <main+33>: callq 0x100401110 <sqrtl>
With clang:
Thread 1 "sqrtl" hit Temporary breakpoint 1, main () at sqrtl.c:6
6 float b = sqrtl(a);
(gdb) s
sqrtl (x=<invalid float value>)
at /home/corinna/src/cygwin/vanilla/winsup/cygwin/math/sqrt.def.h:69
69 __FLT_TYPE res = __FLT_CST (0.0);
(gdb) n
70 int x_class = fpclassify (x);
(gdb) p x
$1 = <invalid float value>
(gdb) x/4x &x
0xffffcb10: 0x00000000 0x00000000 0x00040524 0x00000006
=> 0x100401096 <main+22>: movabs $0x100402010,%rax
=> 0x1004010a0 <main+32>: flds (%rax)
=> 0x1004010a2 <main+34>: mov %rsp,%rax
=> 0x1004010a5 <main+37>: fstpt 0x20(%rax)
=> 0x1004010a8 <main+40>: callq 0x100401120 <sqrtl>
Corinna
--
Corinna Vinschen
Cygwin Maintainer
signature.asc
Description: PGP signature

