libunwind-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Libunwind-devel] [PATCH 08/57] Use __sync builtin atomics on all archit


From: Tommi Rantala
Subject: [Libunwind-devel] [PATCH 08/57] Use __sync builtin atomics on all architectures if available
Date: Fri, 21 Sep 2012 14:11:09 +0300

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          |   13 +++++++++++++
 include/libunwind_i.h |    8 ++++----
 2 files changed, 17 insertions(+), 4 deletions(-)

diff --git a/configure.ac b/configure.ac
index afd63c1..0176c24 100644
--- a/configure.ac
+++ b/configure.ac
@@ -283,6 +283,19 @@ 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_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 f015365..f7e3204 100644
--- a/include/libunwind_i.h
+++ b/include/libunwind_i.h
@@ -99,13 +99,13 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 
SOFTWARE.  */
 # define fetch_and_add1(_ptr)          AO_fetch_and_add1(_ptr)
 # define fetch_and_add(_ptr, value)    AO_fetch_and_add(_ptr, value)
 # define HAVE_FETCH_AND_ADD
-#else
+#elif defined(HAVE_SYNC_ATOMICS) || defined(HAVE_IA64INTRIN_H)
 # ifdef HAVE_IA64INTRIN_H
 #  include <ia64intrin.h>
-#  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_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_FETCH_AND_ADD
 #endif
 #define atomic_read(ptr)       (*(ptr))
 
-- 
1.7.9.5




reply via email to

[Prev in Thread] Current Thread [Next in Thread]