[compiler-rt] r274634 - [asan Win64] Implement atomic_compare_exchange_strong for 8 bit
Etienne Bergeron via llvm-commits
llvm-commits at lists.llvm.org
Wed Jul 6 09:33:57 PDT 2016
Author: etienneb
Date: Wed Jul 6 11:33:57 2016
New Revision: 274634
URL: http://llvm.org/viewvc/llvm-project?rev=274634&view=rev
Log:
[asan Win64] Implement atomic_compare_exchange_strong for 8 bit
Patch by: Wei Wang
Differential Revision: http://reviews.llvm.org/D21950
Modified:
compiler-rt/trunk/lib/sanitizer_common/sanitizer_atomic_msvc.h
Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_atomic_msvc.h
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_atomic_msvc.h?rev=274634&r1=274633&r2=274634&view=diff
==============================================================================
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_atomic_msvc.h (original)
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_atomic_msvc.h Wed Jul 6 11:33:57 2016
@@ -33,6 +33,10 @@ extern "C" long _InterlockedExchange(
extern "C" long _InterlockedExchangeAdd( // NOLINT
long volatile * Addend, long Value); // NOLINT
#pragma intrinsic(_InterlockedExchangeAdd)
+extern "C" char _InterlockedCompareExchange8( // NOLINT
+ char volatile *Destination, // NOLINT
+ char Exchange, char Comparand); // NOLINT
+#pragma intrinsic(_InterlockedCompareExchange8)
extern "C" short _InterlockedCompareExchange16( // NOLINT
short volatile *Destination, // NOLINT
short Exchange, short Comparand); // NOLINT
@@ -175,15 +179,13 @@ INLINE bool atomic_compare_exchange_stro
u8 *cmp,
u8 xchgv,
memory_order mo) {
-#ifdef _WIN64
- // TODO(wwchrome): Implement same functionality without inline asm.
- // Inline asm not supported in Win64.
- __debugbreak();
- return false;
-#else
(void)mo;
DCHECK(!((uptr)a % sizeof(*a)));
u8 cmpv = *cmp;
+#ifdef _WIN64
+ u8 prev = (u8)_InterlockedCompareExchange8(
+ (volatile char*)&a->val_dont_use, (char)xchgv, (char)cmpv);
+#else
u8 prev;
__asm {
mov al, cmpv
@@ -192,11 +194,11 @@ INLINE bool atomic_compare_exchange_stro
lock cmpxchg [ecx], dl
mov prev, al
}
+#endif
if (prev == cmpv)
return true;
*cmp = prev;
return false;
-#endif
}
INLINE bool atomic_compare_exchange_strong(volatile atomic_uintptr_t *a,
More information about the llvm-commits
mailing list