[compiler-rt] r191072 - tsan: allow to ignore memory accesses in malloc and free

Dmitry Vyukov dvyukov at google.com
Thu Sep 19 22:37:36 PDT 2013


Author: dvyukov
Date: Fri Sep 20 00:37:36 2013
New Revision: 191072

URL: http://llvm.org/viewvc/llvm-project?rev=191072&view=rev
Log:
tsan: allow to ignore memory accesses in malloc and free

Added:
    compiler-rt/trunk/lib/tsan/lit_tests/ignore_free.cc
    compiler-rt/trunk/lib/tsan/lit_tests/ignore_malloc.cc
Modified:
    compiler-rt/trunk/lib/tsan/rtl/tsan_mman.cc

Added: compiler-rt/trunk/lib/tsan/lit_tests/ignore_free.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/lit_tests/ignore_free.cc?rev=191072&view=auto
==============================================================================
--- compiler-rt/trunk/lib/tsan/lit_tests/ignore_free.cc (added)
+++ compiler-rt/trunk/lib/tsan/lit_tests/ignore_free.cc Fri Sep 20 00:37:36 2013
@@ -0,0 +1,35 @@
+// RUN: %clang_tsan -O1 %s -o %t && %t 2>&1 | FileCheck %s
+#include <pthread.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <unistd.h>
+
+extern "C" {
+void AnnotateIgnoreReadsBegin(const char *f, int l);
+void AnnotateIgnoreReadsEnd(const char *f, int l);
+void AnnotateIgnoreWritesBegin(const char *f, int l);
+void AnnotateIgnoreWritesEnd(const char *f, int l);
+}
+
+void *Thread(void *p) {
+  *(int*)p = 42;
+  return 0;
+}
+
+int main() {
+  int *p = new int(0);
+  pthread_t t;
+  pthread_create(&t, 0, Thread, p);
+  sleep(1);
+  AnnotateIgnoreReadsBegin(__FILE__, __LINE__);
+  AnnotateIgnoreWritesBegin(__FILE__, __LINE__);
+  free(p);
+  AnnotateIgnoreReadsEnd(__FILE__, __LINE__);
+  AnnotateIgnoreWritesEnd(__FILE__, __LINE__);
+  pthread_join(t, 0);
+  fprintf(stderr, "OK\n");
+  return 0;
+}
+
+// CHECK-NOT: WARNING: ThreadSanitizer: data race
+// CHECK: OK

Added: compiler-rt/trunk/lib/tsan/lit_tests/ignore_malloc.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/lit_tests/ignore_malloc.cc?rev=191072&view=auto
==============================================================================
--- compiler-rt/trunk/lib/tsan/lit_tests/ignore_malloc.cc (added)
+++ compiler-rt/trunk/lib/tsan/lit_tests/ignore_malloc.cc Fri Sep 20 00:37:36 2013
@@ -0,0 +1,38 @@
+// RUN: %clang_tsan -O1 %s -o %t && %t 2>&1 | FileCheck %s
+#include <pthread.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <unistd.h>
+
+extern "C" {
+void AnnotateIgnoreReadsBegin(const char *f, int l);
+void AnnotateIgnoreReadsEnd(const char *f, int l);
+void AnnotateIgnoreWritesBegin(const char *f, int l);
+void AnnotateIgnoreWritesEnd(const char *f, int l);
+}
+
+int *g;
+
+void *Thread(void *a) {
+  int *p = 0;
+  while ((p = __atomic_load_n(&g, __ATOMIC_RELAXED)) == 0)
+    usleep(100);
+  *p = 42;
+  return 0;
+}
+
+int main() {
+  pthread_t t;
+  pthread_create(&t, 0, Thread, 0);
+  AnnotateIgnoreWritesBegin(__FILE__, __LINE__);
+  int *p = new int(0);
+  AnnotateIgnoreWritesEnd(__FILE__, __LINE__);
+  __atomic_store_n(&g, p, __ATOMIC_RELAXED);
+  pthread_join(t, 0);
+  delete p;
+  fprintf(stderr, "OK\n");
+  return 0;
+}
+
+// CHECK-NOT: WARNING: ThreadSanitizer: data race
+// CHECK: OK

Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_mman.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_mman.cc?rev=191072&r1=191071&r2=191072&view=diff
==============================================================================
--- compiler-rt/trunk/lib/tsan/rtl/tsan_mman.cc (original)
+++ compiler-rt/trunk/lib/tsan/rtl/tsan_mman.cc Fri Sep 20 00:37:36 2013
@@ -110,8 +110,12 @@ void *user_alloc(ThreadState *thr, uptr
     return 0;
   MBlock *b = new(allocator()->GetMetaData(p)) MBlock;
   b->Init(sz, thr->tid, CurrentStackId(thr, pc));
-  if (CTX() && CTX()->initialized)
-    MemoryRangeImitateWrite(thr, pc, (uptr)p, sz);
+  if (CTX() && CTX()->initialized) {
+    if (thr->ignore_reads_and_writes == 0)
+      MemoryRangeImitateWrite(thr, pc, (uptr)p, sz);
+    else
+      MemoryResetRange(thr, pc, (uptr)p, sz);
+  }
   DPrintf("#%d: alloc(%zu) = %p\n", thr->tid, sz, p);
   SignalUnsafeCall(thr, pc);
   return p;
@@ -134,8 +138,10 @@ void user_free(ThreadState *thr, uptr pc
     }
     b->ListReset();
   }
-  if (CTX() && CTX()->initialized && thr->in_rtl == 1)
-    MemoryRangeFreed(thr, pc, (uptr)p, b->Size());
+  if (CTX() && CTX()->initialized && thr->in_rtl == 1) {
+    if (thr->ignore_reads_and_writes == 0)
+      MemoryRangeFreed(thr, pc, (uptr)p, b->Size());
+  }
   allocator()->Deallocate(&thr->alloc_cache, p);
   SignalUnsafeCall(thr, pc);
 }





More information about the llvm-commits mailing list