Jan Beich
2018-01-15 17:00:11 UTC
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 disablefailure 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
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
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)
/tmp/a-ad8c36.o:(main)
$ 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)