acinclude.m4 (GLIBCXX_ENABLE_ATOMIC_BUILTINS): Check for set of all used __sync built...
authorBenjamin Kosnik <bkoz@redhat.com>
Thu, 24 Apr 2008 14:40:29 +0000 (14:40 +0000)
committerBenjamin Kosnik <bkoz@gcc.gnu.org>
Thu, 24 Apr 2008 14:40:29 +0000 (14:40 +0000)
2008-04-24  Benjamin Kosnik  <bkoz@redhat.com>

* acinclude.m4 (GLIBCXX_ENABLE_ATOMIC_BUILTINS): Check for set of
all used __sync builtins, in two sizes.
* config.h.in: Regenerate.
* configure: Regenerate.
* src/atomic.cc: Use  _GLIBCXX_ATOMIC_BUILTINS_1.
* include/ext/atomicity.h: Use  _GLIBCXX_ATOMIC_BUILTINS_4.
* libsupc++/guard.cc: Use  _GLIBCXX_ATOMIC_BUILTINS_4.
* doc/xml/manual/concurrency.xm: Update docs.

From-SVN: r134629

libstdc++-v3/ChangeLog
libstdc++-v3/acinclude.m4
libstdc++-v3/config.h.in
libstdc++-v3/configure
libstdc++-v3/doc/xml/manual/concurrency.xml
libstdc++-v3/include/ext/atomicity.h
libstdc++-v3/libsupc++/guard.cc
libstdc++-v3/src/atomic.cc

index 14b75c934685cfa29db570630e8bd7b300ae5da4..cdf96562862f039cf1d5435a4272678cf24a9959 100644 (file)
@@ -1,3 +1,14 @@
+2008-04-24  Benjamin Kosnik  <bkoz@redhat.com>
+
+       * acinclude.m4 (GLIBCXX_ENABLE_ATOMIC_BUILTINS): Check for set of
+       all used __sync builtins, in two sizes.
+       * config.h.in: Regenerate.
+       * configure: Regenerate.
+       * src/atomic.cc: Use  _GLIBCXX_ATOMIC_BUILTINS_1.
+       * include/ext/atomicity.h: Use  _GLIBCXX_ATOMIC_BUILTINS_4.
+       * libsupc++/guard.cc: Use  _GLIBCXX_ATOMIC_BUILTINS_4.
+       * doc/xml/manual/concurrency.xm: Update docs.
+       
 2008-04-23  Benjamin Kosnik  <bkoz@redhat.com>
 
        * config/os/hpux/os_defines.h: Use _GLIBCXX_BEGIN_NAMESPACE,
index 108cc10bfd9937c8464dabfe8210f855cd069396..696e51e342958e26b012459d80ac741b7be6019c 100644 (file)
@@ -2129,23 +2129,29 @@ dnl See:
 dnl http://gcc.gnu.org/onlinedocs/gcc/Atomic-Builtins.html#Atomic-Builtins
 dnl
 dnl This checks to see if the host supports the compiler-generated
-dnl builtins for atomic operations. Note, this is intended to be an
-dnl all-or-nothing switch, so all the atomic operations that are used
-dnl should be checked.
+dnl builtins for atomic operations for various integral sizes. Note, this 
+dnl is intended to be an all-or-nothing switch, so all the atomic operations
+dnl that are used should be checked.
 dnl
 dnl Note:
 dnl libgomp and libgfortran do this with a link test, instead of an asm test.
 dnl see: CHECK_SYNC_FETCH_AND_ADD
 dnl
 dnl Defines:
-dnl  _GLIBCXX_ATOMIC_BUILTINS if the compiler on this target supports atomics.
+dnl  _GLIBCXX_ATOMIC_BUILTINS_1 
+dnl  _GLIBCXX_ATOMIC_BUILTINS_4
 dnl
 AC_DEFUN([GLIBCXX_ENABLE_ATOMIC_BUILTINS], [
-  AC_MSG_CHECKING([for atomic builtins])
   AC_LANG_SAVE
   AC_LANG_CPLUSPLUS
+  old_CXXFLAGS="$CXXFLAGS"
+  
+  # Compile unoptimized.
+  CXXFLAGS='-O0 -S'
+
+  # Fake what AC_TRY_COMPILE does, without linking as this is
+  # unnecessary for a builtins test.
 
-  # Fake what AC_TRY_COMPILE does.  XXX Look at redoing this new-style.
     cat > conftest.$ac_ext << EOF
 [#]line __oline__ "configure"
 int main()
@@ -2155,34 +2161,71 @@ int main()
   atomic_type c1;
   atomic_type c2;
   const atomic_type c3(0);
-  if (__sync_fetch_and_add(&c1, c2) == c3)
-    {
-      // Do something.
-    }
-   return 0;
+  __sync_fetch_and_add(&c1, c2);
+  __sync_val_compare_and_swap(&c1, c3, c2);
+  __sync_lock_test_and_set(&c1, c3);
+  __sync_lock_release(&c1);
+  __sync_synchronize();
+  return 0;
 }
 EOF
-    old_CXXFLAGS="$CXXFLAGS"
-    CXXFLAGS='-O0 -S'
+
+    AC_MSG_CHECKING([for atomic builtins for int])
     if AC_TRY_EVAL(ac_compile); then
-      if grep __sync_fetch_and_add conftest.s >/dev/null 2>&1 ; then
-        enable_atomic_builtins=no
+      if grep __sync_ conftest.s >/dev/null 2>&1 ; then
+        enable_atomic_builtinsi=no
       else
-      AC_DEFINE(_GLIBCXX_ATOMIC_BUILTINS, 1,
-        [Define if builtin atomic operations are supported on this host.])
-        enable_atomic_builtins=yes
-       atomicity_dir=cpu/generic/atomicity_builtins
+      AC_DEFINE(_GLIBCXX_ATOMIC_BUILTINS_4, 1,
+        [Define if builtin atomic operations for int are supported on this host.])
+        enable_atomic_builtinsi=yes
       fi
     fi
-    AC_MSG_RESULT($enable_atomic_builtins)
-    CXXFLAGS="$old_CXXFLAGS"
+    AC_MSG_RESULT($enable_atomic_builtinsi)
     rm -f conftest*
 
-   # Now, if still generic, set to mutex.
+    cat > conftest.$ac_ext << EOF
+[#]line __oline__ "configure"
+int main()
+{
+  typedef bool atomic_type;
+  atomic_type c1;
+  atomic_type c2;
+  const atomic_type c3(0);
+  __sync_fetch_and_add(&c1, c2);
+  __sync_val_compare_and_swap(&c1, c3, c2);
+  __sync_lock_test_and_set(&c1, c3);
+  __sync_lock_release(&c1);
+  __sync_synchronize();
+  return 0;
+}
+EOF
+
+    AC_MSG_CHECKING([for atomic builtins for bool])
+    if AC_TRY_EVAL(ac_compile); then
+      if grep __sync_ conftest.s >/dev/null 2>&1 ; then
+        enable_atomic_builtinsb=no
+      else
+      AC_DEFINE(_GLIBCXX_ATOMIC_BUILTINS_1, 1,
+      [Define if builtin atomic operations for bool are supported on this host.])
+        enable_atomic_builtinsb=yes
+      fi
+    fi
+    AC_MSG_RESULT($enable_atomic_builtinsb)
+    rm -f conftest*
+
+  CXXFLAGS="$old_CXXFLAGS"
+  AC_LANG_RESTORE
+
+  # Set atomicity_dir to builtins if either of above tests pass.
+  if test $enable_atomic_builtinsi = yes || test $enable_atomic_builtinsb = yes ; then
+    atomicity_dir=cpu/generic/atomicity_builtins
+  fi
+
+  # If still generic, set to mutex.
   if test $atomicity_dir = "cpu/generic" ; then
-       atomicity_dir=cpu/generic/atomicity_mutex
+    atomicity_dir=cpu/generic/atomicity_mutex
   fi
- AC_LANG_RESTORE
+
 ])
 
 
index f02fac2351dfa13a162c0f2c21da62cc3dda93fa..d4eee4482ff676c4c0a679161772c2fbae1967ce 100644 (file)
 /* Version number of package */
 #undef VERSION
 
-/* Define if builtin atomic operations are supported on this host. */
-#undef _GLIBCXX_ATOMIC_BUILTINS
+/* Define if builtin atomic operations for bool are supported on this host. */
+#undef _GLIBCXX_ATOMIC_BUILTINS_1
+
+/* Define if builtin atomic operations for int are supported on this host. */
+#undef _GLIBCXX_ATOMIC_BUILTINS_4
 
 /* Define to use concept checking code from the boost libraries. */
 #undef _GLIBCXX_CONCEPT_CHECKS
index 39b0584bff690a1204355a1870f8411101bb26bb..2601fc0841483292729b54e6f8d85c77a20457e4 100755 (executable)
@@ -18071,8 +18071,6 @@ _ACEOF
 
 
 
-  echo "$as_me:$LINENO: checking for atomic builtins" >&5
-echo $ECHO_N "checking for atomic builtins... $ECHO_C" >&6
 
 
   ac_ext=cc
@@ -18081,10 +18079,16 @@ ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
 ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
 ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
 
+  old_CXXFLAGS="$CXXFLAGS"
+
+  # Compile unoptimized.
+  CXXFLAGS='-O0 -S'
+
+  # Fake what AC_TRY_COMPILE does, without linking as this is
+  # unnecessary for a builtins test.
 
-  # Fake what AC_TRY_COMPILE does.  XXX Look at redoing this new-style.
     cat > conftest.$ac_ext << EOF
-#line 18087 "configure"
+#line 18091 "configure"
 int main()
 {
   // NB: _Atomic_word not necessarily int.
@@ -18092,48 +18096,95 @@ int main()
   atomic_type c1;
   atomic_type c2;
   const atomic_type c3(0);
-  if (__sync_fetch_and_add(&c1, c2) == c3)
-    {
-      // Do something.
-    }
-   return 0;
+  __sync_fetch_and_add(&c1, c2);
+  __sync_val_compare_and_swap(&c1, c3, c2);
+  __sync_lock_test_and_set(&c1, c3);
+  __sync_lock_release(&c1);
+  __sync_synchronize();
+  return 0;
 }
 EOF
-    old_CXXFLAGS="$CXXFLAGS"
-    CXXFLAGS='-O0 -S'
+
+    echo "$as_me:$LINENO: checking for atomic builtins for int" >&5
+echo $ECHO_N "checking for atomic builtins for int... $ECHO_C" >&6
     if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; then
-      if grep __sync_fetch_and_add conftest.s >/dev/null 2>&1 ; then
-        enable_atomic_builtins=no
+      if grep __sync_ conftest.s >/dev/null 2>&1 ; then
+        enable_atomic_builtinsi=no
       else
 
 cat >>confdefs.h <<\_ACEOF
-#define _GLIBCXX_ATOMIC_BUILTINS 1
+#define _GLIBCXX_ATOMIC_BUILTINS_4 1
 _ACEOF
 
-        enable_atomic_builtins=yes
-       atomicity_dir=cpu/generic/atomicity_builtins
+        enable_atomic_builtinsi=yes
       fi
     fi
-    echo "$as_me:$LINENO: result: $enable_atomic_builtins" >&5
-echo "${ECHO_T}$enable_atomic_builtins" >&6
-    CXXFLAGS="$old_CXXFLAGS"
+    echo "$as_me:$LINENO: result: $enable_atomic_builtinsi" >&5
+echo "${ECHO_T}$enable_atomic_builtinsi" >&6
     rm -f conftest*
 
-   # Now, if still generic, set to mutex.
-  if test $atomicity_dir = "cpu/generic" ; then
-       atomicity_dir=cpu/generic/atomicity_mutex
-  fi
- ac_ext=c
+    cat > conftest.$ac_ext << EOF
+#line 18131 "configure"
+int main()
+{
+  typedef bool atomic_type;
+  atomic_type c1;
+  atomic_type c2;
+  const atomic_type c3(0);
+  __sync_fetch_and_add(&c1, c2);
+  __sync_val_compare_and_swap(&c1, c3, c2);
+  __sync_lock_test_and_set(&c1, c3);
+  __sync_lock_release(&c1);
+  __sync_synchronize();
+  return 0;
+}
+EOF
+
+    echo "$as_me:$LINENO: checking for atomic builtins for bool" >&5
+echo $ECHO_N "checking for atomic builtins for bool... $ECHO_C" >&6
+    if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+      if grep __sync_ conftest.s >/dev/null 2>&1 ; then
+        enable_atomic_builtinsb=no
+      else
+
+cat >>confdefs.h <<\_ACEOF
+#define _GLIBCXX_ATOMIC_BUILTINS_1 1
+_ACEOF
+
+        enable_atomic_builtinsb=yes
+      fi
+    fi
+    echo "$as_me:$LINENO: result: $enable_atomic_builtinsb" >&5
+echo "${ECHO_T}$enable_atomic_builtinsb" >&6
+    rm -f conftest*
+
+  CXXFLAGS="$old_CXXFLAGS"
+  ac_ext=c
 ac_cpp='$CPP $CPPFLAGS'
 ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
 ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
 ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
 
+  # Set atomicity_dir to builtins if either of above tests pass.
+  if test $enable_atomic_builtinsi = yes || test $enable_atomic_builtinsb = yes ; then
+    atomicity_dir=cpu/generic/atomicity_builtins
+  fi
+
+  # If still generic, set to mutex.
+  if test $atomicity_dir = "cpu/generic" ; then
+    atomicity_dir=cpu/generic/atomicity_mutex
+  fi
+
+
 if test $atomicity_dir = cpu/generic/atomicity_mutex ; then
   { echo "$as_me:$LINENO: WARNING: No native atomic operations are provided for this platform." >&5
 echo "$as_me: WARNING: No native atomic operations are provided for this platform." >&2;}
index b21d458e96cd095d58ef87c9b299b90ad5f02b30..7efc29568587aa6c9ed0946e21d0a415ca777c27 100644 (file)
@@ -214,8 +214,11 @@ usage vary depending on the target hardware and the flags used during
 compile.
 </para>
 
-<para> If builtins are possible, <code>_GLIBCXX_ATOMIC_BUILTINS</code>
-will be defined.
+<para> 
+If builtins are possible for bool-sized integral types,
+<code>_GLIBCXX_ATOMIC_BUILTINS_1</code> will be defined.
+If builtins are possible for int-sized integral types,
+<code>_GLIBCXX_ATOMIC_BUILTINS_4</code> will be defined.
 </para>
 
 
index 05bac1f46d40ed380cf4159ea03ec35f1e428457..82f9b0dea94ca09c741407cd955487c66e41a930 100644 (file)
@@ -1,6 +1,6 @@
 // Support for atomic operations -*- C++ -*-
 
-// Copyright (C) 2004, 2005, 2006 Free Software Foundation, Inc.
+// Copyright (C) 2004, 2005, 2006, 2008 Free Software Foundation, Inc.
 //
 // This file is part of the GNU ISO C++ Library.  This library is free
 // software; you can redistribute it and/or modify it under the
@@ -45,7 +45,7 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
   // To abstract locking primitives across all thread policies, use:
   // __exchange_and_add_dispatch
   // __atomic_add_dispatch
-#ifdef _GLIBCXX_ATOMIC_BUILTINS
+#ifdef _GLIBCXX_ATOMIC_BUILTINS_4
   static inline _Atomic_word 
   __exchange_and_add(volatile _Atomic_word* __mem, int __val)
   { return __sync_fetch_and_add(__mem, __val); }
index e4665773ca2613c4692a2ee01e5b7a20e1aa94f5..312166201fbe0f6df99b0acf991c6125a97570e6 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2002, 2004, 2006 Free Software Foundation, Inc.
+// Copyright (C) 2002, 2004, 2006, 2008 Free Software Foundation, Inc.
 //  
 // This file is part of GCC.
 //
@@ -36,7 +36,7 @@
 #include <ext/atomicity.h>
 #include <ext/concurrence.h>
 #if defined(__GTHREADS) && defined(__GTHREAD_HAS_COND) \
-    && defined(_GLIBCXX_ATOMIC_BUILTINS) && defined(_GLIBCXX_HAVE_LINUX_FUTEX)
+    && defined(_GLIBCXX_ATOMIC_BUILTINS_4) && defined(_GLIBCXX_HAVE_LINUX_FUTEX)
 # include <climits>
 # include <syscall.h>
 # define _GLIBCXX_USE_FUTEX
index e09a9d201b147d72b41a28d582eeef8e9ff0daff..46d3f7698e90eda22bb0c8860635f4426cf10919 100644 (file)
@@ -54,7 +54,7 @@ namespace std
   atomic_flag_test_and_set_explicit(volatile atomic_flag* __a, 
                                    memory_order __x)
   {
-#ifdef _GLIBCXX_ATOMIC_BUILTINS
+#ifdef _GLIBCXX_ATOMIC_BUILTINS_1
     if (__x >= memory_order_acq_rel)
       __sync_synchronize();
     return __sync_lock_test_and_set(&(__a->_M_base._M_b), 1);
@@ -72,7 +72,7 @@ namespace std
   void 
   atomic_flag_clear_explicit(volatile atomic_flag* __a, memory_order __x)
   {
-#ifdef _GLIBCXX_ATOMIC_BUILTINS
+#ifdef _GLIBCXX_ATOMIC_BUILTINS_1
     __sync_lock_release(&(__a->_M_base._M_b));
     if (__x >= memory_order_acq_rel)
       __sync_synchronize();
@@ -88,7 +88,7 @@ namespace std
   void 
   atomic_flag_fence(const volatile atomic_flag*, memory_order)
   {
-#ifdef _GLIBCXX_ATOMIC_BUILTINS
+#ifdef _GLIBCXX_ATOMIC_BUILTINS_1
     __sync_synchronize(); 
 #endif
   }