From c2d6f85a0ac0562f9edaaefd584376af89412a17 Mon Sep 17 00:00:00 2001 From: Tommi Rantala Date: Thu, 6 Sep 2012 15:42:35 +0300 Subject: [PATCH] Use __sync builtin atomics on all architectures if available We can use the __sync builtin atomics also on other architectures than IA64. GCC 4.7 documentation notes that these builtins are ``legacy'' -- adding support for the newer GCC __atomic atomics should be fairly easy. --- configure.ac | 14 ++++++++++++++ include/libunwind_i.h | 12 ++++++------ 2 files changed, 20 insertions(+), 6 deletions(-) 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))