Author: jhb
Date: Mon Aug  6 23:51:08 2018
New Revision: 337399
URL: https://svnweb.freebsd.org/changeset/base/337399

Log:
  Make the system C11 atomics headers fully compatible with external GCC.
  
  The <sys/cdefs.h> and <stdatomic.h> headers already included support for
  C11 atomics via intrinsincs in modern versions of GCC, but these versions
  tried to "hide" atomic variables inside a wrapper structure.  This wrapper
  is not compatible with GCC's internal <stdatomic.h> header, so that if
  GCC's <stdatomic.h> was used together with <sys/cdefs.h>, use of C11
  atomics would fail to compile.  Fix this by not hiding atomic variables
  in a structure for modern versions of GCC.  The headers already avoid
  using a wrapper structure on clang.
  
  Note that this wrapper was only used if C11 was not enabled (e.g.
  via -std=c99), so this also fixes compile failures if a modern version
  of GCC was used with -std=c11 but with FreeBSD's <stdatomic.h> instead
  of GCC's <stdatomic.h> and this change fixes that case as well.
  
  Reported by:  Mark Millard
  Reviewed by:  kib
  Differential Revision:        https://reviews.freebsd.org/D16585

Modified:
  head/sys/sys/cdefs.h
  head/sys/sys/stdatomic.h

Modified: head/sys/sys/cdefs.h
==============================================================================
--- head/sys/sys/cdefs.h        Mon Aug  6 23:21:13 2018        (r337398)
+++ head/sys/sys/cdefs.h        Mon Aug  6 23:51:08 2018        (r337399)
@@ -268,7 +268,7 @@
 #endif
 
 #if !defined(__cplusplus) && !__has_extension(c_atomic) && \
-    !__has_extension(cxx_atomic)
+       !__has_extension(cxx_atomic) && !__GNUC_PREREQ__(4, 7)
 /*
  * No native support for _Atomic(). Place object in structure to prevent
  * most forms of direct non-atomic access.

Modified: head/sys/sys/stdatomic.h
==============================================================================
--- head/sys/sys/stdatomic.h    Mon Aug  6 23:21:13 2018        (r337398)
+++ head/sys/sys/stdatomic.h    Mon Aug  6 23:51:08 2018        (r337399)
@@ -171,12 +171,9 @@ atomic_signal_fence(memory_order __order __unused)
 /* Atomics in kernelspace are always lock-free. */
 #define        atomic_is_lock_free(obj) \
        ((void)(obj), (_Bool)1)
-#elif defined(__CLANG_ATOMICS)
+#elif defined(__CLANG_ATOMICS) || defined(__GNUC_ATOMICS)
 #define        atomic_is_lock_free(obj) \
        __atomic_is_lock_free(sizeof(*(obj)), obj)
-#elif defined(__GNUC_ATOMICS)
-#define        atomic_is_lock_free(obj) \
-       __atomic_is_lock_free(sizeof((obj)->__val), &(obj)->__val)
 #else
 #define        atomic_is_lock_free(obj) \
        ((void)(obj), sizeof((obj)->__val) <= sizeof(void *))
@@ -260,28 +257,28 @@ typedef _Atomic(__uintmax_t)              
atomic_uintmax_t;
 #elif defined(__GNUC_ATOMICS)
 #define        atomic_compare_exchange_strong_explicit(object, expected,       
\
     desired, success, failure)                                         \
-       __atomic_compare_exchange_n(&(object)->__val, expected,         \
+       __atomic_compare_exchange_n(object, expected,                   \
            desired, 0, success, failure)
 #define        atomic_compare_exchange_weak_explicit(object, expected,         
\
     desired, success, failure)                                         \
-       __atomic_compare_exchange_n(&(object)->__val, expected,         \
+       __atomic_compare_exchange_n(object, expected,                   \
            desired, 1, success, failure)
 #define        atomic_exchange_explicit(object, desired, order)                
\
-       __atomic_exchange_n(&(object)->__val, desired, order)
+       __atomic_exchange_n(object, desired, order)
 #define        atomic_fetch_add_explicit(object, operand, order)               
\
-       __atomic_fetch_add(&(object)->__val, operand, order)
+       __atomic_fetch_add(object, operand, order)
 #define        atomic_fetch_and_explicit(object, operand, order)               
\
-       __atomic_fetch_and(&(object)->__val, operand, order)
+       __atomic_fetch_and(object, operand, order)
 #define        atomic_fetch_or_explicit(object, operand, order)                
\
-       __atomic_fetch_or(&(object)->__val, operand, order)
+       __atomic_fetch_or(object, operand, order)
 #define        atomic_fetch_sub_explicit(object, operand, order)               
\
-       __atomic_fetch_sub(&(object)->__val, operand, order)
+       __atomic_fetch_sub(object, operand, order)
 #define        atomic_fetch_xor_explicit(object, operand, order)               
\
-       __atomic_fetch_xor(&(object)->__val, operand, order)
+       __atomic_fetch_xor(object, operand, order)
 #define        atomic_load_explicit(object, order)                             
\
-       __atomic_load_n(&(object)->__val, order)
+       __atomic_load_n(object, order)
 #define        atomic_store_explicit(object, desired, order)                   
\
-       __atomic_store_n(&(object)->__val, desired, order)
+       __atomic_store_n(object, desired, order)
 #else
 #define        __atomic_apply_stride(object, operand) \
        (((__typeof__((object)->__val))0) + (operand))
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to