diff --git a/configure.ac b/configure.ac index 58b662e1..f3adafb5 100644 --- a/configure.ac +++ b/configure.ac @@ -283,6 +283,20 @@ if test x$have__builtin___clear_cache = xyes; then fi AC_MSG_RESULT([$have__builtin___clear_cache]) +AC_MSG_CHECKING([for __sync atomics]) +AC_LINK_IFELSE( + [AC_LANG_PROGRAM([[]], [[ + __sync_bool_compare_and_swap((int *)0, 0, 1); + __sync_fetch_and_add((int *)0, 1); + ]])], + [have_sync_atomics=yes], + [have_sync_atomics=no]) +if test x$have_sync_atomics = xyes; then + AC_DEFINE([HAVE_SYNC_ATOMICS], [1], + [Defined if __sync atomics are available]) +fi +AC_MSG_RESULT([$have_sync_atomics]) + CCASFLAGS="${CCASFLAGS} ${CPPFLAGS}" arch="$target_arch" diff --git a/include/libunwind_i.h b/include/libunwind_i.h index 15a79735..e0fb64b4 100644 --- a/include/libunwind_i.h +++ b/include/libunwind_i.h @@ -116,9 +116,10 @@ cmpxchg_ptr (void *addr, void *old, void *new) # define HAVE_CMPXCHG # endif # define HAVE_FETCH_AND_ADD -#else +#elif defined(HAVE_SYNC_ATOMICS) || defined(HAVE_IA64INTRIN_H) # ifdef HAVE_IA64INTRIN_H # include +# endif static inline int cmpxchg_ptr (void *addr, void *old, void *new) { @@ -132,11 +133,10 @@ cmpxchg_ptr (void *addr, void *old, void *new) u.vp = addr; return __sync_bool_compare_and_swap(u.vlp, (long) old, (long) new); } -# define fetch_and_add1(_ptr) __sync_fetch_and_add(_ptr, 1) -# define fetch_and_add(_ptr, value) __sync_fetch_and_add(_ptr, value) -# define HAVE_CMPXCHG -# define HAVE_FETCH_AND_ADD -# endif +# define fetch_and_add1(_ptr) __sync_fetch_and_add(_ptr, 1) +# define fetch_and_add(_ptr, value) __sync_fetch_and_add(_ptr, value) +# define HAVE_CMPXCHG +# define HAVE_FETCH_AND_ADD #endif #define atomic_read(ptr) (*(ptr))