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>
(cherry picked from commit
d1b9d14324586d02dc6c8dd0a9bdf4b98ae16416)
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)