Fix RMW bug
[c11tester.git] / include / impatomic.h
index 55486197c74c2834ac58b6a8ab507529835212f6..70b77de2ddc28cf2c3a5c356f718666eb0ea5a65 100644 (file)
@@ -1,3 +1,4 @@
+#include <stdio.h>
 /**
  * @file impatomic.h
  * @brief Common header for C11/C++11 atomics
@@ -88,14 +89,16 @@ inline void atomic_flag::clear( memory_order __x__ ) volatile
         ({ volatile __typeof__((__a__)->__f__)* __p__ = & ((__a__)->__f__);   \
                 __typeof__(__m__) __v__ = (__m__);                            \
                 model_write_action((void *) __p__,  __x__, (uint64_t) __v__); \
-                __v__; })
+                __v__ = __v__; /* Silence clang (-Wunused-value) */           \
+         })
 
 
 #define _ATOMIC_INIT_( __a__, __m__ )                                         \
         ({ volatile __typeof__((__a__)->__f__)* __p__ = & ((__a__)->__f__);   \
                 __typeof__(__m__) __v__ = (__m__);                            \
                 model_init_action((void *) __p__,  (uint64_t) __v__);         \
-                __v__; })
+                __v__ = __v__; /* Silence clang (-Wunused-value) */           \
+         })
 
 #define _ATOMIC_MODIFY_( __a__, __o__, __m__, __x__ )                         \
         ({ volatile __typeof__((__a__)->__f__)* __p__ = & ((__a__)->__f__);   \
@@ -104,7 +107,8 @@ inline void atomic_flag::clear( memory_order __x__ ) volatile
         __typeof__((__a__)->__f__) __copy__= __old__;                         \
         __copy__ __o__ __v__;                                                 \
         model_rmw_action((void *)__p__, __x__, (uint64_t) __copy__);          \
-        __old__; })
+        __old__ = __old__; /* Silence clang (-Wunused-value) */               \
+         })
 
 /* No spurious failure for now */
 #define _ATOMIC_CMPSWP_WEAK_ _ATOMIC_CMPSWP_
@@ -114,8 +118,8 @@ inline void atomic_flag::clear( memory_order __x__ ) volatile
                 __typeof__(__e__) __q__ = (__e__);                            \
                 __typeof__(__m__) __v__ = (__m__);                            \
                 bool __r__;                                                   \
-                __typeof__((__a__)->__f__) __t__=(__typeof__((__a__)->__f__)) model_rmwr_action((void *)__p__, __x__); \
-                if (__t__ == * __q__ ) {                                      \
+                __typeof__((__a__)->__f__) __t__=(__typeof__((__a__)->__f__)) model_rmwrcas_action((void *)__p__, __x__, (uint64_t) * __q__, sizeof((__a__)->__f__)); \
+                if (__t__ == * __q__ ) {;                                     \
                         model_rmw_action((void *)__p__, __x__, (uint64_t) __v__); __r__ = true; } \
                 else {  model_rmwc_action((void *)__p__, __x__); *__q__ = __t__;  __r__ = false;} \
                 __r__; })
@@ -2327,23 +2331,28 @@ inline bool atomic_compare_exchange_strong
 inline void* atomic_fetch_add_explicit
 ( volatile atomic_address* __a__, ptrdiff_t __m__, memory_order __x__ )
 {
-       void* volatile* __p__ = &((__a__)->__f__);
-       void* __r__ = (void *) model_rmwr_action((void *)__p__, __x__);
-       model_rmw_action((void *)__p__, __x__, (uint64_t) ((char*)(*__p__) + __m__));
-  return __r__; }
+       volatile __typeof__((__a__)->__f__)* __p__ = & ((__a__)->__f__);
+       __typeof__((__a__)->__f__) __old__=(__typeof__((__a__)->__f__)) model_rmwr_action((void *)__p__, __x__);
+       __typeof__((__a__)->__f__) __copy__= __old__;
+       __copy__ = (void *) (((char *)__copy__) + __m__);
+       model_rmw_action((void *)__p__, __x__, (uint64_t) __copy__);
+       return __old__;
+}
 
-inline void* atomic_fetch_add
+ inline void* atomic_fetch_add
 ( volatile atomic_address* __a__, ptrdiff_t __m__ )
 { return atomic_fetch_add_explicit( __a__, __m__, memory_order_seq_cst ); }
 
 
 inline void* atomic_fetch_sub_explicit
 ( volatile atomic_address* __a__, ptrdiff_t __m__, memory_order __x__ )
-{
-       void* volatile* __p__ = &((__a__)->__f__);
-       void* __r__ = (void *) model_rmwr_action((void *)__p__, __x__);
-       model_rmw_action((void *)__p__, __x__, (uint64_t)((char*)(*__p__) - __m__));
-  return __r__; }
+{      volatile __typeof__((__a__)->__f__)* __p__ = & ((__a__)->__f__);
+       __typeof__((__a__)->__f__) __old__=(__typeof__((__a__)->__f__)) model_rmwr_action((void *)__p__, __x__);
+       __typeof__((__a__)->__f__) __copy__= __old__;
+       __copy__ = (void *) (((char *)__copy__) - __m__);
+       model_rmw_action((void *)__p__, __x__, (uint64_t) __copy__);
+       return __old__;
+}
 
 inline void* atomic_fetch_sub
 ( volatile atomic_address* __a__, ptrdiff_t __m__ )