Skip to content

Commit

Permalink
atomic.h: Fix build with clang
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
pm215 authored and Anthony Liguori committed Nov 21, 2013
1 parent 76c2975 commit 33effd3
Showing 1 changed file with 3 additions and 3 deletions.
6 changes: 3 additions & 3 deletions include/qemu/atomic.h
Expand Up @@ -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))
Expand Down

0 comments on commit 33effd3

Please sign in to comment.