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:
parent
76c2975a6f
commit
33effd3aab
@ -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))
|
||||||
|
Loading…
Reference in New Issue
Block a user