summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRussell Gallop <russell.gallop@sony.com>2020-09-16 15:06:07 +0100
committerRussell Gallop <russell.gallop@sony.com>2021-01-28 12:19:56 +0000
commit67b1bc2628b4e8ef624324f622f1243d07df9255 (patch)
treed75118757fc4f86b1d047b98e55ed3d5ac0ea9f2
parent28d86c2f9c9c77c2c686fc65e9eb5bcfa361e3d9 (diff)
downloadllvm-67b1bc2628b4e8ef624324f622f1243d07df9255.tar.gz
Re-add some atomic operations, still not compiling exchange okay.
-rw-r--r--compiler-rt/lib/scudo/standalone/atomic_helpers.h54
1 files changed, 39 insertions, 15 deletions
diff --git a/compiler-rt/lib/scudo/standalone/atomic_helpers.h b/compiler-rt/lib/scudo/standalone/atomic_helpers.h
index 25e856c7f996..e8bf59a4e57d 100644
--- a/compiler-rt/lib/scudo/standalone/atomic_helpers.h
+++ b/compiler-rt/lib/scudo/standalone/atomic_helpers.h
@@ -114,7 +114,31 @@ struct atomic_uptr {
//}
//
//inline void atomic_thread_fence(memory_order) { __sync_synchronize(); }
-//
+
+
+INLINE u32 atomic_fetch_add(volatile atomic_u32 *a, u32 v,
+ memory_order mo) {
+ (void)mo;
+ DCHECK(!((uptr)a % sizeof(*a)));
+ return (u32)_InterlockedExchangeAdd((volatile long *)&a->ValDoNotUse,
+ (long)v);
+}
+
+INLINE uptr atomic_fetch_add(volatile atomic_uptr *a, uptr v,
+ memory_order mo) {
+ (void)mo;
+ DCHECK(!((uptr)a % sizeof(*a)));
+#ifdef _WIN64
+ return (uptr)_InterlockedExchangeAdd64((volatile long long *)&a->ValDoNotUse,
+ (long long)v);
+#else
+ return (uptr)_InterlockedExchangeAdd((volatile long *)&a->ValDoNotUse,
+ (long)v);
+#endif
+}
+
+
+
//template <typename T>
//inline typename T::Type atomic_fetch_add(volatile T *A, typename T::Type V,
// memory_order MO) {
@@ -152,13 +176,13 @@ struct atomic_uptr {
// return R;
//}
//
-//template <typename T>
-//inline bool atomic_compare_exchange_strong(volatile T *A, typename T::Type *Cmp,
-// typename T::Type Xchg,
-// memory_order MO) {
-// return __atomic_compare_exchange(&A->ValDoNotUse, Cmp, &Xchg, false, MO,
-// __ATOMIC_RELAXED);
-//}
+template <typename T>
+inline bool atomic_compare_exchange_strong(volatile T *A, typename T::Type *Cmp,
+ typename T::Type Xchg,
+ memory_order MO) {
+ return __atomic_compare_exchange(&A->ValDoNotUse, Cmp, &Xchg, false, MO,
+ __ATOMIC_RELAXED);
+}
INLINE bool atomic_compare_exchange_strong(volatile atomic_u8 *a, u8 *cmp,
u8 xchgv, memory_order mo) {
@@ -234,13 +258,13 @@ INLINE bool atomic_compare_exchange_strong(volatile atomic_u64 *a,
-//template <typename T>
-//inline bool atomic_compare_exchange_weak(volatile T *A, typename T::Type *Cmp,
-// typename T::Type Xchg,
-// memory_order MO) {
-// return __atomic_compare_exchange(&A->ValDoNotUse, Cmp, &Xchg, true, MO,
-// __ATOMIC_RELAXED);
-//}
+template <typename T>
+inline bool atomic_compare_exchange_weak(volatile T *A, typename T::Type *Cmp,
+ typename T::Type Xchg,
+ memory_order MO) {
+ return __atomic_compare_exchange(&A->ValDoNotUse, Cmp, &Xchg, true, MO,
+ __ATOMIC_RELAXED);
+}
// Clutter-reducing helpers.