]> git.proxmox.com Git - qemu.git/commitdiff
atomic.h: Fix build with clang
authorPeter Maydell <peter.maydell@linaro.org>
Tue, 22 Oct 2013 09:58:41 +0000 (10:58 +0100)
committerPaolo Bonzini <pbonzini@redhat.com>
Thu, 21 Nov 2013 16:38:57 +0000 (17:38 +0100)
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>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
include/qemu/atomic.h

index 0aa8913301801cf7e543d3306c077f7fa6a52dac..492bce1c1b6886b558bf54e2450f5e44ffc44eb3 100644 (file)
 #endif
 
 #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)    ({                           \
     typeof(*ptr) _new = (i), _old;                          \
     __atomic_exchange(ptr, &_new, &_old, __ATOMIC_SEQ_CST); \
     _old;                                                   \
 })
-#elif defined __clang__
-#define atomic_xchg(ptr, i)    __sync_exchange(ptr, i)
 #else
 /* __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))