On 6/27/11 8:29 AM, Dimitry Andric wrote:
On 2011-06-27 04:32, Eric McCorkle wrote:
I've both seen reports and experienced make buildworld with clang
failing in usr.bin/xlint/lint1 (really, make kernel-toolchain is what
fails), because lint1 is statically linked, and there is a definition of
__isnanf in both libc and libm. GCC, on the other hand, builds just fine.
...

I have never seen this failure, and neither does the clang buildbot, so
maybe there is something in your build environment causing this problem?
Can you please post:

- Your build architecture (e.g. i386 or amd64)
- Your /etc/make.conf and /etc/src.conf, if applicable
- Any build-related environment variables (WITH_FOO, WITHOUT_FOO,
CFLAGS, etc)


Sorry.  It's an amd64 system, 9-CURRENT, last updated on friday.

src.conf:
LOADER_ZFS_SUPPORT="YES"

make.conf:
CPUTYPE?=core2
.if !defined(CC) || ${CC} == "cc"
CC=clang
CFLAGS=-Qunused-arguments
.endif
.if !defined(CXX) || ${CXX} == "c++"
CXX=clang++
.endif
NO_WERROR=
WERROR=
NO_FSCHG=
PERL_VERSION=5.12.3

Just noticed, the CFLAGS would disable optimization, which would explain why no one else seems to see this. Still, I think the underlying issue warrants investigation.

I don't see this at all here. Clang simply expands the macro:

#define isnan(x) \
((sizeof (x) == sizeof (float)) ? __isnanf(x) \
: (sizeof (x) == sizeof (double)) ? isnan(x) \
: __isnanl(x))

then sees x is a double, so eliminates the unneeded parts of the ?:
operators, and simply calls the isnan() function. There is no trace of
__isnanf() anywhere in the resulting .s or .o file.

Maybe you compiled with non-default optimization flags? If so, please
supply them.

Hmm. I somehow got clang to generate calls to isnan, __isnanf, and __isnanl, (ie expanding the macro but not simplifying it) last night, but I can't seem to reproduce it now...

However, compiling:

#include <math.h>
double d;
int main() { return isnan(d); }

with gcc -S -O0 produces a .s file with no calls to isnan, so it's definitely replacing calls to isnan.


/*
* XXX These routines belong in libm, but they must remain in libc for
* binary compat until we can bump libm's major version number.
*/

after which both __isnan() and __isnanf() are defined, and weakly bound
to isnan() and isnanf(). Then, in lib/msun/src/s_isnan.c, the isnan()
definition is commented out, but not the __isnanf() definition.

I think this never caused a problem with gcc, since, as you said, it
usually expands it using builtins.

I saw that. Perhaps removing the duplicate __isnanf could be rolled into 9-RELEASE?


Weirdly enough, a small test program that directly calls __isnanf(), and
is linked with -lm doesn't cause any problems here, neither with gcc,
nor with clang.


You need to call __isnanf and something that's in libm, otherwise the linker appears to stop at libc and doesn't link with libm at all. Try this:

double d;
int main() { return __isnanf(d) && __isnanl(d); }
_______________________________________________
freebsd-current@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to "freebsd-current-unsubscr...@freebsd.org"

Reply via email to