re PR sanitizer/78158 (Strange data race detection with thread sanitizer)
authorJakub Jelinek <jakub@redhat.com>
Wed, 22 Mar 2017 18:46:54 +0000 (19:46 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Wed, 22 Mar 2017 18:46:54 +0000 (19:46 +0100)
PR sanitizer/78158
* tsan/tsan_interface_atomic.cc: Cherry-pick upstream r298378.

From-SVN: r246402

libsanitizer/ChangeLog
libsanitizer/tsan/tsan_interface_atomic.cc

index da8a0ef4c62597192ccd808288fb9ff7e9f2f12f..1beb8d583210646c286f55e0880faf5236a6fbd3 100644 (file)
@@ -1,3 +1,8 @@
+2017-03-22  Jakub Jelinek  <jakub@redhat.com>
+
+       PR sanitizer/78158
+       * tsan/tsan_interface_atomic.cc: Cherry-pick upstream r298378.
+
 2017-02-16  Andreas Tobler  <andreast@gcc.gnu.org>
 
        PR sanitizer/79562
index 5c5c34f3b8761c9210d1c049cdb8681dbaebcd2c..deb4206a624a6820d1d412237919c67e59dfee8b 100644 (file)
@@ -448,10 +448,27 @@ static void AtomicFence(ThreadState *thr, uptr pc, morder mo) {
 
 // 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__); \