From: Peter Maydell Date: Tue, 22 Oct 2013 09:58:41 +0000 (+0100) Subject: atomic.h: Fix build with clang X-Git-Tag: v1.7.0-rc2~7^2~7 X-Git-Url: https://git.proxmox.com/?p=qemu.git;a=commitdiff_plain;h=392a4d5b9a1860aae82429d09321dac302d70396 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 Signed-off-by: Paolo Bonzini --- diff --git a/include/qemu/atomic.h b/include/qemu/atomic.h index 0aa891330..492bce1c1 100644 --- a/include/qemu/atomic.h +++ b/include/qemu/atomic.h @@ -168,14 +168,14 @@ #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))