atomic: let Clang always use atomic_load_n if available. (Apple's Clang reports itself as GCC 4.2.1 in preprocessor macros--the final GNU C compiler Apple shipped--as of the macOS 10.12 SDK.)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
diff --git a/src/atomic/SDL_atomic.c b/src/atomic/SDL_atomic.c
index c9cb4a9..1a90283 100644
--- a/src/atomic/SDL_atomic.c
+++ b/src/atomic/SDL_atomic.c
@@ -35,6 +35,19 @@
#include <atomic.h>
#endif
+/* The __atomic_load_n() intrinsic showed up in different times for different compilers. */
+#if defined(HAVE_GCC_ATOMICS)
+# if defined(__clang__)
+# if __has_builtin(__atomic_load_n)
+# define HAVE_ATOMIC_LOAD_N 1
+# endif
+# elif defined(__GNUC__)
+# if (__GNUC__ >= 5)
+# define HAVE_ATOMIC_LOAD_N 1
+# endif
+# endif
+#endif
+
/*
If any of the operations are not provided then we must emulate some
of them. That means we need a nice implementation of spin locks
@@ -211,7 +224,7 @@ SDL_AtomicAdd(SDL_atomic_t *a, int v)
int
SDL_AtomicGet(SDL_atomic_t *a)
{
-#if defined(HAVE_GCC_ATOMICS) && (__GNUC__ >= 5)
+#ifdef HAVE_ATOMIC_LOAD_N
return __atomic_load_n(&a->value, __ATOMIC_SEQ_CST);
#else
int value;
@@ -225,7 +238,7 @@ SDL_AtomicGet(SDL_atomic_t *a)
void *
SDL_AtomicGetPtr(void **a)
{
-#if defined(HAVE_GCC_ATOMICS) && (__GNUC__ >= 5)
+#ifdef HAVE_ATOMIC_LOAD_N
return __atomic_load_n(a, __ATOMIC_SEQ_CST);
#else
void *value;