[compiler-rt] r269855 - [tsan] Ensure mmap respects ignore_interceptors_accesses

Anna Zaks via llvm-commits llvm-commits at lists.llvm.org
Tue May 17 15:24:55 PDT 2016


Author: zaks
Date: Tue May 17 17:24:55 2016
New Revision: 269855

URL: http://llvm.org/viewvc/llvm-project?rev=269855&view=rev
Log:
[tsan] Ensure mmap respects ignore_interceptors_accesses

The ignore_interceptors_accesses setting did not have an effect on mmap, so
let's change that. It helps in cases user code is accessing the memory
written to by mmap when the synchronization is ensured by the code that
does not get rebuilt.

(This effects Swift interoperability since it's runtime is mapping memory
which gets accessed by the code emitted into the Swift application by the
compiler.)

Differential Revision: http://reviews.llvm.org/D20294

Added:
    compiler-rt/trunk/test/tsan/ignored-interceptors-mmap.cc
Modified:
    compiler-rt/trunk/lib/tsan/rtl/tsan_interceptors.cc

Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_interceptors.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_interceptors.cc?rev=269855&r1=269854&r2=269855&view=diff
==============================================================================
--- compiler-rt/trunk/lib/tsan/rtl/tsan_interceptors.cc (original)
+++ compiler-rt/trunk/lib/tsan/rtl/tsan_interceptors.cc Tue May 17 17:24:55 2016
@@ -711,7 +711,11 @@ TSAN_INTERCEPTOR(void *, mmap, void *add
   if (res != MAP_FAILED) {
     if (fd > 0)
       FdAccess(thr, pc, fd);
-    MemoryRangeImitateWrite(thr, pc, (uptr)res, sz);
+
+    if (thr->ignore_reads_and_writes == 0)
+      MemoryRangeImitateWrite(thr, pc, (uptr)res, sz);
+    else
+      MemoryResetRange(thr, pc, (uptr)res, sz);
   }
   return res;
 }
@@ -726,7 +730,11 @@ TSAN_INTERCEPTOR(void *, mmap64, void *a
   if (res != MAP_FAILED) {
     if (fd > 0)
       FdAccess(thr, pc, fd);
-    MemoryRangeImitateWrite(thr, pc, (uptr)res, sz);
+
+    if (thr->ignore_reads_and_writes == 0)
+      MemoryRangeImitateWrite(thr, pc, (uptr)res, sz);
+    else
+      MemoryResetRange(thr, pc, (uptr)res, sz);
   }
   return res;
 }

Added: compiler-rt/trunk/test/tsan/ignored-interceptors-mmap.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/tsan/ignored-interceptors-mmap.cc?rev=269855&view=auto
==============================================================================
--- compiler-rt/trunk/test/tsan/ignored-interceptors-mmap.cc (added)
+++ compiler-rt/trunk/test/tsan/ignored-interceptors-mmap.cc Tue May 17 17:24:55 2016
@@ -0,0 +1,61 @@
+// RUN: %clangxx_tsan -O0 %s -o %t
+// RUN: not %run %t 2>&1 | FileCheck %s --check-prefix=CHECK-NORMAL
+// RUN: %env_tsan_opts=ignore_interceptors_accesses=1 %run %t 2>&1 | FileCheck %s --check-prefix=CHECK-IGNORE
+
+#include <errno.h>
+#include <sys/mman.h>
+
+#include "test.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 *global_p;
+
+int mmap_and_ignore_reads_and_writes() {
+  const size_t kSize = sysconf(_SC_PAGESIZE);
+  void *p = mmap(0, kSize, PROT_READ|PROT_WRITE,
+                 MAP_PRIVATE|MAP_ANON, -1, 0);
+  if (p == MAP_FAILED)
+    return printf("mmap failed with %d\n", errno);
+  munmap(p, kSize);
+
+  void *new_p = mmap(p, kSize, PROT_READ|PROT_WRITE,
+                     MAP_PRIVATE|MAP_ANON, -1, 0);
+  if (p == MAP_FAILED || p != new_p)
+    return printf("second mmap failed with %d\n", errno);
+
+  AnnotateIgnoreWritesBegin(__FILE__, __LINE__);
+  global_p = p;
+  AnnotateIgnoreWritesEnd(__FILE__, __LINE__);
+  barrier_wait(&barrier);
+  return 0;
+}
+
+void *Thread(void *a) {
+  barrier_wait(&barrier);
+
+  ((int*)global_p)[1] = 10;
+  printf("Read the zero value from mmapped memory %d\n", ((int*)global_p)[1]);
+  return 0;
+}
+
+int main() {
+  barrier_init(&barrier, 2);
+  pthread_t t;
+  pthread_create(&t, 0, Thread, 0);
+  if (mmap_and_ignore_reads_and_writes())
+    return 1;
+  pthread_join(t, 0);
+  printf("OK\n");
+  return 0;
+}
+
+// CHECK-NORMAL: WARNING: ThreadSanitizer: data race
+// CHECK-NORMAL: OK
+// CHECK-IGNORE_NOT: WARNING: ThreadSanitizer: data race
+// CHECK-IGNORE: OK




More information about the llvm-commits mailing list