The attached change enables future support using the kernel assisted atomic support. It's a bit of a fudge since the libcall routines are not lock free, but everything appears to work.

Tested on hppa-unknown-linux-gnu.  Committed to trunk.

Dave
--
John David Anglin       dave.ang...@bell.net



2014-07-17  John David Anglin  <dang...@gcc.gnu.org>

        * config/pa/pa-linux.h (TARGET_OS_CPP_BUILTINS): Remove defines for
        __GCC_HAVE_SYNC_COMPARE_AND_SWAP_1, __GCC_HAVE_SYNC_COMPARE_AND_SWAP_2
        and __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4.
        (HAVE_sync_compare_and_swapqi): Define.
        (HAVE_sync_compare_and_swaphi): Likewise.
        (HAVE_sync_compare_and_swapsi): Likewise.

Index: config/pa/pa-linux.h
===================================================================
--- config/pa/pa-linux.h        (revision 212767)
+++ config/pa/pa-linux.h        (working copy)
@@ -22,9 +22,6 @@
 #define TARGET_OS_CPP_BUILTINS()               \
   do                                           \
     {                                          \
-       builtin_define ("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");  \
-       builtin_define ("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");  \
-       builtin_define ("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");  \
        GNU_USER_TARGET_OS_CPP_BUILTINS();      \
        builtin_assert ("machine=bigendian");   \
     }                                          \
@@ -133,3 +130,13 @@
 
 #undef TARGET_SYNC_LIBCALL
 #define TARGET_SYNC_LIBCALL 1
+
+/* The SYNC operations are implemented as library functions, not
+   INSN patterns.  As a result, the HAVE defines for the patterns are
+   not defined.  We need to define them to generate the corresponding
+   __GCC_HAVE_SYNC_COMPARE_AND_SWAP_* and __GCC_ATOMIC_*_LOCK_FREE
+   defines.  */
+
+#define HAVE_sync_compare_and_swapqi 1
+#define HAVE_sync_compare_and_swaphi 1
+#define HAVE_sync_compare_and_swapsi 1

Reply via email to