From d53fe63ef8ab88018bec940d067ae965144e2dab Mon Sep 17 00:00:00 2001 From: Andrew Jeffery Date: Tue, 4 Apr 2017 16:03:06 +0930 Subject: [PATCH] lock: Avoid use of undefined DISPATCH_INTERNAL_CRASH Building swift-corelibs-libdispatch on powerpc64le under Linux lead to the following build failure: /bin/bash ../libtool --tag=CXX --mode=compile /home/ubuntu/swift-dev/build/buildbot_incremental/llvm-linux-powerpc64le/bin/clang++ -DHAVE_CONFIG_H -I. -I../config -I.. -I.. -I../private -DDISPATCH_USE_DTRACE=0 -I../libpwq/include -Wall -fvisibility=hidden -momit-leaf-frame-pointer -isystem /usr/include/bsd -DLIBBSD_OVERLAY -fblocks -I../src/BlocksRuntime -std=gnu++11 -fno-exceptions -O2 -c -o libdispatch_la-block.lo `test -f 'block.cpp' || echo './'`block.cpp libtool: compile: /home/ubuntu/swift-dev/build/buildbot_incremental/llvm-linux-powerpc64le/bin/clang++ -DHAVE_CONFIG_H -I. -I../config -I.. -I.. -I../private -DDISPATCH_USE_DTRACE=0 -I../libpwq/include -Wall -fvisibility=hidden -momit-leaf-frame-pointer -isystem /usr/include/bsd -DLIBBSD_OVERLAY -fblocks -I../src/BlocksRuntime -std=gnu++11 -fno-exce ptions -O2 -c block.cpp -fPIC -DPIC -o .libs/libdispatch_la-block.o In file included from block.cpp:32: In file included from ./internal.h:628: In file included from ./shims.h:171: ./shims/lock.h:550:3: error: use of undeclared identifier 'DISPATCH_INTERNAL_CRASH' DISPATCH_INTERNAL_CRASH(errno, "sys_membarrier not supported"); ^ 1 error generated. Makefile:701: recipe for target 'libdispatch_la-block.lo' failed make[2]: *** [libdispatch_la-block.lo] Error 1 make[2]: Leaving directory '/home/ubuntu/swift-dev/swift-corelibs-libdispatch/src' Makefile:541: recipe for target 'all' failed make[1]: *** [all] Error 2 make[1]: Leaving directory '/home/ubuntu/swift-dev/swift-corelibs-libdispatch/src' Makefile:457: recipe for target 'all-recursive' failed make: *** [all-recursive] Error 1 Include ordering in internal.h is tightly constrained, so open-code the macro to avoid the dependency problem. Signed-off-by: Andrew Jeffery --- src/shims/lock.h | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/shims/lock.h b/src/shims/lock.h index a22517e6e..ea77097f6 100644 --- a/src/shims/lock.h +++ b/src/shims/lock.h @@ -547,7 +547,17 @@ _dispatch_once_xchg_done(dispatch_once_t *pred) return os_atomic_xchg(pred, DLOCK_ONCE_DONE, release); #elif defined(__linux__) if (unlikely(syscall(__NR_membarrier, MEMBARRIER_CMD_SHARED, 0) < 0)) { - DISPATCH_INTERNAL_CRASH(errno, "sys_membarrier not supported"); + /* + * sys_membarrier not supported + * + * Ideally we would call DISPATCH_INTERNAL_CRASH() here, but + * due to ordering constraints in internal.h required by Darwin + * the macro is undefined when this header is included. + * Instead, open-code what would be a call to + * _dispatch_hardware_crash() inside DISPATCH_INTERNAL_CRASH(). + */ + __asm__(""); + __builtin_trap(); } return os_atomic_xchg(pred, DLOCK_ONCE_DONE, relaxed); #else