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:
parent
84cbc7d731
commit
fcb3ed7a3d
|
@ -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());
|
||||||
|
|
Loading…
Reference in New Issue