Fix test_stack failure if AO_PREFER_BUILTIN_ATOMICS (GCC/Aarch64)
authorIvan Maidanski <ivmai@mail.ru>
Wed, 6 Dec 2017 21:00:18 +0000 (00:00 +0300)
committerIvan Maidanski <ivmai@mail.ru>
Fri, 22 Dec 2017 07:44:53 +0000 (10:44 +0300)
As of gcc-5.4/aarch64, not all of the built-in double-word atomics
are implemented correctly.

* src/atomic_ops/sysdeps/gcc/aarch64.h [!__clang__
|| AO_AARCH64_ASM_LOAD_STORE_CAS] (AO_double_load,
AO_double_load_acquire, AO_double_store, AO_double_store_release,
AO_double_compare_and_swap, AO_double_compare_and_swap_acquire,
AO_double_compare_and_swap_release, AO_double_compare_and_swap_full):
Define (asm-based implementation) even if AO_PREFER_BUILTIN_ATOMICS
or AO_THREAD_SANITIZER; update comment.

src/atomic_ops/sysdeps/gcc/aarch64.h

index e63a6a1..f58ad62 100644 (file)
 # include "../standard_ao_double_t.h"
 
 /* As of gcc-5.4, all built-in load/store and CAS atomics for double    */
-/* word require -latomic (and are not lock-free), so we use the         */
-/* asm-based implementation by default.                                 */
-/* TODO: Update it when GCC has lock-free double-word load/store/CAS.   */
-#if !defined(AO_PREFER_BUILTIN_ATOMICS) && !defined(AO_THREAD_SANITIZER) \
-    && (!defined(__clang__) || defined(AO_AARCH64_ASM_LOAD_STORE_CAS))
+/* word require -latomic, are not lock-free and cause test_stack        */
+/* failure, so the asm-based implementation is used for now.            */
+/* TODO: Update it for newer GCC releases. */
+#if !defined(__clang__) || defined(AO_AARCH64_ASM_LOAD_STORE_CAS)
 
 # ifndef AO_PREFER_GENERALIZED
     AO_INLINE AO_double_t
   }
 # define AO_HAVE_double_compare_and_swap_full
 
-#endif /* !AO_PREFER_BUILTIN_ATOMICS && !__clang__ */
+#endif /* !__clang__ || AO_AARCH64_ASM_LOAD_STORE_CAS */
 
 /* As of clang-5.0 and gcc-5.4, __GCC_HAVE_SYNC_COMPARE_AND_SWAP_16     */
 /* macro is still missing (while the double-word CAS is available).     */