[compiler-rt] r298378 - tsan: support __ATOMIC_HLE_ACQUIRE/RELEASE flags

Dmitry Vyukov via llvm-commits llvm-commits at lists.llvm.org
Wed Mar 22 02:44:21 PDT 2017


On Tue, Mar 21, 2017 at 8:50 PM, Sean Silva <chisophugis at gmail.com> wrote:
> s/covert_morder/convert_morder/ ?

Fixed:
http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_interface_atomic.cc?r1=298492&r2=298491&pathrev=298492
Thanks!

> On Tuesday, March 21, 2017, Dmitry Vyukov via llvm-commits
> <llvm-commits at lists.llvm.org> wrote:
>>
>> Author: dvyukov
>> Date: Tue Mar 21 09:28:55 2017
>> New Revision: 298378
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=298378&view=rev
>> Log:
>> tsan: support __ATOMIC_HLE_ACQUIRE/RELEASE flags
>>
>> HLE flags can be combined with memory order in atomic operations.
>> Currently tsan runtime crashes on e.g. IsStoreOrder(mo) in atomic store
>> if any of these additional flags are specified.
>>
>> Filter these flags out.
>> See the comment as to why it is safe.
>>
>>
>> Added:
>>     compiler-rt/trunk/test/tsan/atomic_hle.cc
>> Modified:
>>     compiler-rt/trunk/lib/tsan/rtl/tsan_interface_atomic.cc
>>
>> Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_interface_atomic.cc
>> URL:
>> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_interface_atomic.cc?rev=298378&r1=298377&r2=298378&view=diff
>>
>> ==============================================================================
>> --- compiler-rt/trunk/lib/tsan/rtl/tsan_interface_atomic.cc (original)
>> +++ compiler-rt/trunk/lib/tsan/rtl/tsan_interface_atomic.cc Tue Mar 21
>> 09:28:55 2017
>> @@ -450,10 +450,27 @@ static void AtomicFence(ThreadState *thr
>>
>>  // C/C++
>>
>> +static morder covert_morder(morder mo) {
>> +  if (flags()->force_seq_cst_atomics)
>> +    return (morder)mo_seq_cst;
>> +
>> +  // Filter out additional memory order flags:
>> +  // MEMMODEL_SYNC        = 1 << 15
>> +  // __ATOMIC_HLE_ACQUIRE = 1 << 16
>> +  // __ATOMIC_HLE_RELEASE = 1 << 17
>> +  //
>> +  // HLE is an optimization, and we pretend that elision always fails.
>> +  // MEMMODEL_SYNC is used when lowering __sync_ atomics,
>> +  // since we use __sync_ atomics for actual atomic operations,
>> +  // we can safely ignore it as well. It also subtly affects semantics,
>> +  // but we don't model the difference.
>> +  return (morder)(mo & 0x7fff);
>> +}
>> +
>>  #define SCOPED_ATOMIC(func, ...) \
>>      const uptr callpc = (uptr)__builtin_return_address(0); \
>>      uptr pc = StackTrace::GetCurrentPc(); \
>> -    mo = flags()->force_seq_cst_atomics ? (morder)mo_seq_cst : mo; \
>> +    mo = covert_morder(mo); \
>>      ThreadState *const thr = cur_thread(); \
>>      if (thr->ignore_interceptors) \
>>        return NoTsanAtomic##func(__VA_ARGS__); \
>>
>> Added: compiler-rt/trunk/test/tsan/atomic_hle.cc
>> URL:
>> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/tsan/atomic_hle.cc?rev=298378&view=auto
>>
>> ==============================================================================
>> --- compiler-rt/trunk/test/tsan/atomic_hle.cc (added)
>> +++ compiler-rt/trunk/test/tsan/atomic_hle.cc Tue Mar 21 09:28:55 2017
>> @@ -0,0 +1,25 @@
>> +// RUN: %clangxx_tsan -O1 %s -o %t && %run %t 2>&1 | FileCheck %s
>> +#include "test.h"
>> +#include <sanitizer/tsan_interface_atomic.h>
>> +
>> +#ifndef __ATOMIC_HLE_ACQUIRE
>> +#define __ATOMIC_HLE_ACQUIRE (1 << 16)
>> +#endif
>> +#ifndef __ATOMIC_HLE_RELEASE
>> +#define __ATOMIC_HLE_RELEASE (1 << 17)
>> +#endif
>> +
>> +int main() {
>> +  volatile int x = 0;
>> +  //__atomic_fetch_add(&x, 1, __ATOMIC_ACQUIRE | __ATOMIC_HLE_ACQUIRE);
>> +  //__atomic_store_n(&x, 0, __ATOMIC_RELEASE | __ATOMIC_HLE_RELEASE);
>> +  __tsan_atomic32_fetch_add(&x, 1,
>> +      (__tsan_memory_order)(__ATOMIC_ACQUIRE | __ATOMIC_HLE_ACQUIRE));
>> +  __tsan_atomic32_store(&x, 0,
>> +      (__tsan_memory_order)(__ATOMIC_RELEASE | __ATOMIC_HLE_RELEASE));
>> +  fprintf(stderr, "DONE\n");
>> +  return 0;
>> +}
>> +
>> +// CHECK: DONE
>> +
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits


More information about the llvm-commits mailing list