On IBM Z the Boost tagged pointer implementation cannot use
"pointer compression" as there are no unused bits in an address;
the whole 64-bit address space is available to user space code.
Instead, Boost uses 16-byte atomics. This is always supported
on IBM Z, but depending on the particular compiler (version)
it may require linking against libatomic. The existing checks
in CheckCxxAtomic.cmake do not catch this, however, as they only
test for (up to) 8-byte atomic support.
Fixed by adding a test for 16-byte atomic support on IBM Z.
Signed-off-by: Ulrich Weigand <ulrich.weigand@de.ibm.com>
std::atomic<uint16_t> w2;
std::atomic<uint32_t> w4;
std::atomic<uint64_t> w8;
- return w1 + w2 + w4 + w8;
+#ifdef __s390x__
+ // Boost needs 16-byte atomics for tagged pointers.
+ std::atomic<unsigned __int128> w16;
+#else
+ #define w16 0
+#endif
+ return w1 + w2 + w4 + w8 + w16;
}
" ${var})
endfunction(check_cxx_atomics)