Browse Source

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.)
Ryan C. Gordon 8 years ago
parent
commit
8c00de57f6
1 changed files with 15 additions and 2 deletions
  1. 15 2
      src/atomic/SDL_atomic.c

+ 15 - 2
src/atomic/SDL_atomic.c

@@ -35,6 +35,19 @@
 #include <atomic.h>
 #include <atomic.h>
 #endif
 #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
   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
   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
 int
 SDL_AtomicGet(SDL_atomic_t *a)
 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);
     return __atomic_load_n(&a->value, __ATOMIC_SEQ_CST);
 #else
 #else
     int value;
     int value;
@@ -225,7 +238,7 @@ SDL_AtomicGet(SDL_atomic_t *a)
 void *
 void *
 SDL_AtomicGetPtr(void **a)
 SDL_AtomicGetPtr(void **a)
 {
 {
-#if defined(HAVE_GCC_ATOMICS) && (__GNUC__ >= 5)
+#ifdef HAVE_ATOMIC_LOAD_N
     return __atomic_load_n(a, __ATOMIC_SEQ_CST);
     return __atomic_load_n(a, __ATOMIC_SEQ_CST);
 #else
 #else
     void *value;
     void *value;