libcxx-test-fix-lockfree-test-for-i386

Lock is_always_lock free test fails on i386 because std::atomic is aligned
Lock is_always_lock free test fails on i386 because std::atomic is aligned
to 8 bytes while long long is aligned to 4 bytes. clang can't generate inline
code for unaligned 8 byte atomics even tough instruction set and gcc support
it.

That makes it expected thaqt ATOMIC_LLONG_LOCK_FREE and
std::atomic<long long>::is_always_lock_free don't match on i386. Correct test
for std::atomic<long long> is to check if target cpu support cmpxchg8 instruction.
To set instruction support one can check __GCC_HAVE_SYNC_COMPARE_AND_SWAP_8 define.

Bug: https://llvm.org/bugs/show_bug.cgi?id=19355


Gbp-Pq: Topic libcxx
Gbp-Pq: Name libcxx-test-fix-lockfree-test-for-i386.patch
This commit is contained in:
Ubuntu Developers 2022-07-16 17:45:39 +08:00 committed by Lu zhiping
parent 84cbc7d731
commit fcb3ed7a3d
1 changed files with 8 additions and 0 deletions

View File

@ -21,6 +21,14 @@
# error Feature test macro missing. # error Feature test macro missing.
#endif #endif
#if defined(__i386__) && defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8)
/* Fix for clang setting __GCC_ATOMIC_LLONG_LOCK_FREE incorecctly for x86
* https://llvm.org/bugs/show_bug.cgi?id=19355
*/
#undef ATOMIC_LLONG_LOCK_FREE
#define ATOMIC_LLONG_LOCK_FREE 2
#endif
template <typename T> void checkAlwaysLockFree() { template <typename T> void checkAlwaysLockFree() {
if (std::atomic<T>::is_always_lock_free) if (std::atomic<T>::is_always_lock_free)
assert(std::atomic<T>().is_lock_free()); assert(std::atomic<T>().is_lock_free());