diff options
author | Dmitry Vyukov <dvyukov@google.com> | 2014-01-22 14:13:37 +0000 |
---|---|---|
committer | Dmitry Vyukov <dvyukov@google.com> | 2014-01-22 14:13:37 +0000 |
commit | 36e6a26362205dc9e7f674c36c6ca41107bc4acd (patch) | |
tree | ddc56cf572b2ed9bb1ef840f363fbab6de634eb5 /lib/sanitizer_common/tests/sanitizer_atomic_test.cc | |
parent | 70c39f7784fdddece120557e83ee0d6910ee2333 (diff) |
asan: fix atomic operations on ARM
implement correct atomic load/store for ARM
add test for atomic load/store
http://llvm-reviews.chandlerc.com/D2582
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@199802 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/sanitizer_common/tests/sanitizer_atomic_test.cc')
-rw-r--r-- | lib/sanitizer_common/tests/sanitizer_atomic_test.cc | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/lib/sanitizer_common/tests/sanitizer_atomic_test.cc b/lib/sanitizer_common/tests/sanitizer_atomic_test.cc index a4a97c43e..56bcd35c8 100644 --- a/lib/sanitizer_common/tests/sanitizer_atomic_test.cc +++ b/lib/sanitizer_common/tests/sanitizer_atomic_test.cc @@ -15,6 +15,79 @@ namespace __sanitizer { +template<typename T> +struct ValAndMagic { + typename T::Type magic0; + T a; + typename T::Type magic1; + + static ValAndMagic<T> *sink; +}; + +template<typename T> +ValAndMagic<T> *ValAndMagic<T>::sink; + +template<typename T, memory_order load_mo, memory_order store_mo> +void CheckStoreLoad() { + typedef typename T::Type Type; + ValAndMagic<T> val; + // Prevent the compiler from scalarizing the struct. + ValAndMagic<T>::sink = &val; + // Ensure that surrounding memory is not overwritten. + val.magic0 = val.magic1 = (Type)-3; + for (u64 i = 0; i < 100; i++) { + // Generate a value that occupies all bytes of the variable. + u64 v = i; + v |= v << 8; + v |= v << 16; + v |= v << 32; + val.a.val_dont_use = (Type)v; + EXPECT_EQ(atomic_load(&val.a, load_mo), (Type)v); + val.a.val_dont_use = (Type)-1; + atomic_store(&val.a, (Type)v, store_mo); + EXPECT_EQ(val.a.val_dont_use, (Type)v); + } + EXPECT_EQ(val.magic0, (Type)-3); + EXPECT_EQ(val.magic1, (Type)-3); +} + +TEST(SanitizerCommon, AtomicStoreLoad) { + CheckStoreLoad<atomic_uint8_t, memory_order_relaxed, memory_order_relaxed>(); + CheckStoreLoad<atomic_uint8_t, memory_order_consume, memory_order_relaxed>(); + CheckStoreLoad<atomic_uint8_t, memory_order_acquire, memory_order_relaxed>(); + CheckStoreLoad<atomic_uint8_t, memory_order_relaxed, memory_order_release>(); + CheckStoreLoad<atomic_uint8_t, memory_order_seq_cst, memory_order_seq_cst>(); + + CheckStoreLoad<atomic_uint16_t, memory_order_relaxed, memory_order_relaxed>(); + CheckStoreLoad<atomic_uint16_t, memory_order_consume, memory_order_relaxed>(); + CheckStoreLoad<atomic_uint16_t, memory_order_acquire, memory_order_relaxed>(); + CheckStoreLoad<atomic_uint16_t, memory_order_relaxed, memory_order_release>(); + CheckStoreLoad<atomic_uint16_t, memory_order_seq_cst, memory_order_seq_cst>(); + + CheckStoreLoad<atomic_uint32_t, memory_order_relaxed, memory_order_relaxed>(); + CheckStoreLoad<atomic_uint32_t, memory_order_consume, memory_order_relaxed>(); + CheckStoreLoad<atomic_uint32_t, memory_order_acquire, memory_order_relaxed>(); + CheckStoreLoad<atomic_uint32_t, memory_order_relaxed, memory_order_release>(); + CheckStoreLoad<atomic_uint32_t, memory_order_seq_cst, memory_order_seq_cst>(); + + CheckStoreLoad<atomic_uint64_t, memory_order_relaxed, memory_order_relaxed>(); + CheckStoreLoad<atomic_uint64_t, memory_order_consume, memory_order_relaxed>(); + CheckStoreLoad<atomic_uint64_t, memory_order_acquire, memory_order_relaxed>(); + CheckStoreLoad<atomic_uint64_t, memory_order_relaxed, memory_order_release>(); + CheckStoreLoad<atomic_uint64_t, memory_order_seq_cst, memory_order_seq_cst>(); + + CheckStoreLoad<atomic_uintptr_t, memory_order_relaxed, memory_order_relaxed> + (); + CheckStoreLoad<atomic_uintptr_t, memory_order_consume, memory_order_relaxed> + (); + CheckStoreLoad<atomic_uintptr_t, memory_order_acquire, memory_order_relaxed> + (); + CheckStoreLoad<atomic_uintptr_t, memory_order_relaxed, memory_order_release> + (); + CheckStoreLoad<atomic_uintptr_t, memory_order_seq_cst, memory_order_seq_cst> + (); +} + // Clang crashes while compiling this test for Android: // http://llvm.org/bugs/show_bug.cgi?id=15587 #if !SANITIZER_ANDROID |