Date: Mon, 15 Jan 2018 18:00:11 +0100 From: Jan Beich <jbeich@FreeBSD.org> To: Tijl Coosemans <tijl@FreeBSD.org> Cc: Luca Pizzamiglio <pizzamig@freebsd.org>, FreeBSD Current <freebsd-current@freebsd.org>, freebsd-ports@freebsd.org Subject: Re: atomic in i386 Current after CLANG 6 upgrade Message-ID: <mv1f-jbvo-wny@FreeBSD.org> In-Reply-To: <20180115125756.37b803ba@kalimero.tijl.coosemans.org> (Tijl Coosemans's message of "Mon, 15 Jan 2018 12:57:56 %2B0100") References: <CAB88xy96bTtauBJtZyRbZCVDgKtgpv%2BQiZ29aWqe%2B_dud9domA@mail.gmail.com> <20180115125756.37b803ba@kalimero.tijl.coosemans.org>
next in thread | previous in thread | raw e-mail | index | archive | help
Tijl Coosemans <tijl@FreeBSD.org> writes: > On Mon, 15 Jan 2018 11:43:44 +0100 Luca Pizzamiglio <pizzamig@freebsd.org> wrote: > >> I've already received a couple of messages from pkg-fallout about build >> failure on head-i386-default [1] [2] both pointing to the same errors, >> about missing intrinsic symbols related to __atomic_* >> >> The clang documentation about C11 atomic builtins [3] stats that __atomic_* >> are GCC extension and Clang provides them. >> >> It seems to me that this specific GCC-compatible builtin are enabled on >> amd64, but not on i386. >> Is there a way to enable GCC compatible __atomic_ builtin also on i386? >> Or should I provide patches to adopt _c11_atomic_* instead of __atomic_* >> for every ports that need it ? >> >> [1] >> http://beefy11.nyi.freebsd.org/data/head-i386-default/p458948_s327953/logs/librdkafka-0.11.3.log >> [2] >> http://beefy11.nyi.freebsd.org/data/head-i386-default/p458948_s327953/logs/stress-ng-0.09.09.log >> [3] https://clang.llvm.org/docs/LanguageExtensions.html#langext-c11-atomic > > 8 byte atomics requires at least i586. So either find a way to disable > the use of these atomics in these ports or add something like this to > the port Makefile. > > .if ${ARCH} == i386 && ! ${MACHINE_CPU:Mi586} > CFLAGS+= -march=i586 > .endif It wouldn't help (see below). Clang 6 accidentally made __atomic* work enough to satisfy configure check but not for the port to build. I guess, it also confuses configure in net/librdkafka and net-mgmt/netdata. $ cat a.c #include <stdint.h> typedef struct { uint64_t val64; } atomic_t; int main() { uint64_t foo; atomic_t bar; #ifdef ATOMIC_STRUCT __atomic_fetch_add(&bar.val64, 1, __ATOMIC_RELAXED); #else __atomic_fetch_add(&foo, 1, __ATOMIC_RELAXED); #endif return 0; } $ cc -m32 -march=i586 a.c $ clang50 -m32 -march=i586 a.c /tmp/a-560ad1.o: In function `main': a.c:(.text+0x46): undefined reference to `__atomic_fetch_add_8' clang-5.0: error: linker command failed with exit code 1 (use -v to see invocation) $ cc -m32 -DATOMIC_STRUCT -march=i586 a.c /usr/bin/ld: error: undefined symbol: __atomic_fetch_add_8 >>> referenced by a.c >>> /tmp/a-ad8c36.o:(main) cc: error: linker command failed with exit code 1 (use -v to see invocation) $ clang50 -m32 -DATOMIC_STRUCT -march=i586 a.c /tmp/a-0fbfd0.o: In function `main': a.c:(.text+0x46): undefined reference to `__atomic_fetch_add_8' clang-5.0: error: linker command failed with exit code 1 (use -v to see invocation)
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?mv1f-jbvo-wny>