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 <andrew@aj.id.au>
diff --git a/src/shims/lock.h b/src/shims/lock.h
index 3178793..4bbbb42 100644
--- a/src/shims/lock.h
+++ b/src/shims/lock.h
@@ -548,7 +548,17 @@
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