atomic.h: Fix build with clang

clang defines __ATOMIC_SEQ_CST but its implementation of the
__atomic_exchange() builtin differs from that of gcc. Move the
__clang__ branch of the ifdef ladder to the top and fix its
implementation (there is no such builtin as __sync_exchange),
so we can compile with clang again.

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
Message-id: 1382435921-18438-1-git-send-email-peter.maydell@linaro.org
Signed-off-by: Anthony Liguori <aliguori@amazon.com>
This commit is contained in:
Peter Maydell 2013-10-22 10:58:41 +01:00 committed by Anthony Liguori
parent 76c2975a6f
commit 33effd3aab

View File

@ -168,14 +168,14 @@
#endif #endif
#ifndef atomic_xchg #ifndef atomic_xchg
#ifdef __ATOMIC_SEQ_CST #if defined(__clang__)
#define atomic_xchg(ptr, i) __sync_swap(ptr, i)
#elif defined(__ATOMIC_SEQ_CST)
#define atomic_xchg(ptr, i) ({ \ #define atomic_xchg(ptr, i) ({ \
typeof(*ptr) _new = (i), _old; \ typeof(*ptr) _new = (i), _old; \
__atomic_exchange(ptr, &_new, &_old, __ATOMIC_SEQ_CST); \ __atomic_exchange(ptr, &_new, &_old, __ATOMIC_SEQ_CST); \
_old; \ _old; \
}) })
#elif defined __clang__
#define atomic_xchg(ptr, i) __sync_exchange(ptr, i)
#else #else
/* __sync_lock_test_and_set() is documented to be an acquire barrier only. */ /* __sync_lock_test_and_set() is documented to be an acquire barrier only. */
#define atomic_xchg(ptr, i) (smp_mb(), __sync_lock_test_and_set(ptr, i)) #define atomic_xchg(ptr, i) (smp_mb(), __sync_lock_test_and_set(ptr, i))