diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2015-01-07 19:55:37 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2015-01-07 19:55:37 +0000 |
commit | ca9211ecdede9bdedb812b2243a4abdb8dacd1b9 (patch) | |
tree | 9b19e801150082c33e9152275829a6ce90614b55 /lib/sanitizer_common/tests/sanitizer_atomic_test.cc | |
parent | 8ef50bf3d1c287b5013c3168de77a462dfce3495 (diff) | |
download | src-ca9211ecdede9bdedb812b2243a4abdb8dacd1b9.tar.gz src-ca9211ecdede9bdedb812b2243a4abdb8dacd1b9.zip |
Import compiler-rt trunk r224034.vendor/compiler-rt/compiler-rt-r224034
Notes
Notes:
svn path=/vendor/compiler-rt/dist/; revision=276789
svn path=/vendor/compiler-rt/compiler-rt-r224034/; revision=276790; tag=vendor/compiler-rt/compiler-rt-r224034
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 a4a97c43e00f..56bcd35c826c 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 |