[PATCH] [Sanitizer tests] Define 16- and 64-bit versions of atomic_compare_exchange_strong on Windows

Timur Iskhodzhanov timurrrr at google.com
Tue May 13 07:05:12 PDT 2014


Hi dvyukov,

http://reviews.llvm.org/D3745

Files:
  lib/sanitizer_common/sanitizer_atomic_msvc.h

Index: lib/sanitizer_common/sanitizer_atomic_msvc.h
===================================================================
--- lib/sanitizer_common/sanitizer_atomic_msvc.h
+++ lib/sanitizer_common/sanitizer_atomic_msvc.h
@@ -24,6 +24,15 @@
 extern "C" long _InterlockedExchangeAdd(  // NOLINT
     long volatile * Addend, long Value);  // NOLINT
 #pragma intrinsic(_InterlockedExchangeAdd)
+extern "C" short _InterlockedCompareExchange16(  // NOLINT
+    short volatile *Destination,                 // NOLINT
+    short Exchange, short Comparand);            // NOLINT
+#pragma intrinsic(_InterlockedCompareExchange16)
+extern "C"
+long long _InterlockedCompareExchange64(  // NOLINT
+    long long volatile *Destination,              // NOLINT
+    long long Exchange, long long Comparand);     // NOLINT
+#pragma intrinsic(_InterlockedCompareExchange64)
 
 #ifdef _WIN64
 extern "C" long long _InterlockedExchangeAdd64(     // NOLINT
@@ -205,6 +214,19 @@
   return false;
 }
 
+INLINE bool atomic_compare_exchange_strong(volatile atomic_uint16_t *a,
+                                           u16 *cmp,
+                                           u16 xchg,
+                                           memory_order mo) {
+  u16 cmpv = *cmp;
+  u16 prev = (u16)_InterlockedCompareExchange16(
+      (volatile short*)&a->val_dont_use, (short)xchg, (short)cmpv);
+  if (prev == cmpv)
+    return true;
+  *cmp = prev;
+  return false;
+}
+
 INLINE bool atomic_compare_exchange_strong(volatile atomic_uint32_t *a,
                                            u32 *cmp,
                                            u32 xchg,
@@ -218,6 +240,19 @@
   return false;
 }
 
+INLINE bool atomic_compare_exchange_strong(volatile atomic_uint64_t *a,
+                                           u64 *cmp,
+                                           u64 xchg,
+                                           memory_order mo) {
+  u64 cmpv = *cmp;
+  u64 prev = (u64)_InterlockedCompareExchange64(
+      (volatile long long*)&a->val_dont_use, (long long)xchg, (long long)cmpv);
+  if (prev == cmpv)
+    return true;
+  *cmp = prev;
+  return false;
+}
+
 template<typename T>
 INLINE bool atomic_compare_exchange_weak(volatile T *a,
                                          typename T::Type *cmp,
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D3745.9352.patch
Type: text/x-patch
Size: 2277 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20140513/73db0f96/attachment.bin>


More information about the llvm-commits mailing list