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