From a7c48c8ec55d482e95dddd840a9bdd0fbfad9e33 Mon Sep 17 00:00:00 2001
From: Ian Lance Taylor <ian@gcc.gnu.org>
Date: Tue, 1 Feb 2011 21:23:07 +0000
Subject: [PATCH] Test whether libgcc or kernel defines
 __sync_bool_compare_and_swap_4.

From-SVN: r169504
---
 libgo/config.h.in      |  4 ++++
 libgo/configure        | 28 ++++++++++++++++++++++++++++
 libgo/configure.ac     | 14 ++++++++++++++
 libgo/runtime/thread.c |  2 +-
 4 files changed, 47 insertions(+), 1 deletion(-)

diff --git a/libgo/config.h.in b/libgo/config.h.in
index 5422bdabd202..382362beb40c 100644
--- a/libgo/config.h.in
+++ b/libgo/config.h.in
@@ -39,6 +39,10 @@
 /* Define to 1 if you have the `strsignal' function. */
 #undef HAVE_STRSIGNAL
 
+/* Define to 1 if the compiler provides the __sync_bool_compare_and_swap
+   function for uint32 */
+#undef HAVE_SYNC_BOOL_COMPARE_AND_SWAP_4
+
 /* Define to 1 if you have the <syscall.h> header file. */
 #undef HAVE_SYSCALL_H
 
diff --git a/libgo/configure b/libgo/configure
index dc5ad3fca979..ad4cc25810a2 100644
--- a/libgo/configure
+++ b/libgo/configure
@@ -14099,6 +14099,34 @@ fi
 done
 
 
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for __sync_bool_compare_and_swap_4" >&5
+$as_echo_n "checking for __sync_bool_compare_and_swap_4... " >&6; }
+if test "${libgo_cv_func___sync_bool_compare_and_swap_4+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+typedef unsigned int uint32  __attribute__ ((mode (SI)));
+uint32 i;
+int main() { return __sync_bool_compare_and_swap (&i, 0, 1); }
+
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  libgo_cv_func___sync_bool_compare_and_swap_4=yes
+else
+  libgo_cv_func___sync_bool_compare_and_swap_4=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libgo_cv_func___sync_bool_compare_and_swap_4" >&5
+$as_echo "$libgo_cv_func___sync_bool_compare_and_swap_4" >&6; }
+if test "$libgo_cv_func___sync_bool_compare_and_swap_4" = "yes"; then
+  $as_echo "#define HAVE_SYNC_BOOL_COMPARE_AND_SWAP_4 1" >>confdefs.h
+
+fi
+
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether compiler supports -minline-all-stringops" >&5
 $as_echo_n "checking whether compiler supports -minline-all-stringops... " >&6; }
 if test "${libgo_cv_c_stringops+set}" = set; then :
diff --git a/libgo/configure.ac b/libgo/configure.ac
index e1c0dd0e61e4..6cd04d2609c9 100644
--- a/libgo/configure.ac
+++ b/libgo/configure.ac
@@ -332,6 +332,20 @@ AC_CHECK_HEADERS(sys/mman.h syscall.h sys/epoll.h sys/ptrace.h sys/user.h sys/ut
 AM_CONDITIONAL(HAVE_SYS_MMAN_H, test "$ac_cv_header_sys_mman_h" = yes)
 AC_CHECK_FUNCS(srandom random strsignal)
 
+AC_CACHE_CHECK([for __sync_bool_compare_and_swap_4],
+[libgo_cv_func___sync_bool_compare_and_swap_4],
+[AC_LINK_IFELSE([
+typedef unsigned int uint32  __attribute__ ((mode (SI)));
+uint32 i;
+int main() { return __sync_bool_compare_and_swap (&i, 0, 1); }
+],
+[libgo_cv_func___sync_bool_compare_and_swap_4=yes],
+[libgo_cv_func___sync_bool_compare_and_swap_4=no])])
+if test "$libgo_cv_func___sync_bool_compare_and_swap_4" = "yes"; then
+  AC_DEFINE(HAVE_SYNC_BOOL_COMPARE_AND_SWAP_4, 1,
+    [Define to 1 if the compiler provides the __sync_bool_compare_and_swap function for uint32])
+fi
+
 dnl For x86 we want to use the -minline-all-stringops option to avoid
 dnl forcing a stack split when calling memcpy and friends.
 AC_CACHE_CHECK([whether compiler supports -minline-all-stringops],
diff --git a/libgo/runtime/thread.c b/libgo/runtime/thread.c
index 3f1c8d52e733..b600754f64c1 100644
--- a/libgo/runtime/thread.c
+++ b/libgo/runtime/thread.c
@@ -77,7 +77,7 @@ runtime_destroylock(Lock *l)
 	sem_destroy(&l->sem);
 }
 
-#ifndef __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4
+#ifndef HAVE_SYNC_BOOL_COMPARE_AND_SWAP_4
 
 // For targets which don't have the required sync support.  Really
 // this should be provided by gcc itself.  FIXME.
-- 
GitLab