summaryrefslogtreecommitdiffstats
path: root/compiler-rt/test/tsan/java_heap_init.cc
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2015-03-12 11:24:16 +0000
committerDmitry Vyukov <dvyukov@google.com>2015-03-12 11:24:16 +0000
commita60829a1b68f23b03e4b037d2e212f33a74801ac (patch)
tree3b23e856a47033168bde3ab334c1986ccd111ab6 /compiler-rt/test/tsan/java_heap_init.cc
parent41c072e63bbacf04699b0d3c32486e932f74de90 (diff)
downloadbcm5719-llvm-a60829a1b68f23b03e4b037d2e212f33a74801ac.tar.gz
bcm5719-llvm-a60829a1b68f23b03e4b037d2e212f33a74801ac.zip
tsan: fix crash during __tsan_java_move
Munmap interceptor did not reset meta shadow for the range, and __tsan_java_move crashed because it encountered non-zero meta shadow for the destination. llvm-svn: 232029
Diffstat (limited to 'compiler-rt/test/tsan/java_heap_init.cc')
-rw-r--r--compiler-rt/test/tsan/java_heap_init.cc28
1 files changed, 28 insertions, 0 deletions
diff --git a/compiler-rt/test/tsan/java_heap_init.cc b/compiler-rt/test/tsan/java_heap_init.cc
new file mode 100644
index 00000000000..bb7357c25b4
--- /dev/null
+++ b/compiler-rt/test/tsan/java_heap_init.cc
@@ -0,0 +1,28 @@
+// RUN: %clangxx_tsan -O1 %s -o %t && %run %t 2>&1 | FileCheck %s
+#include "java.h"
+#include <errno.h>
+#include <sys/mman.h>
+
+int main() {
+ // Test that munmap interceptor resets meta shadow for the memory range.
+ // Previously __tsan_java_move failed because it encountered non-zero meta
+ // shadow for the destination.
+ int const kHeapSize = 1024 * 1024;
+ jptr jheap = (jptr)mmap(0, kHeapSize, PROT_READ | PROT_WRITE,
+ MAP_ANON | MAP_PRIVATE, -1, 0);
+ if (jheap == (jptr)MAP_FAILED)
+ return printf("mmap failed with %d\n", errno);
+ __atomic_store_n((int*)jheap, 1, __ATOMIC_RELEASE);
+ munmap((void*)jheap, kHeapSize);
+ jheap = (jptr)mmap((void*)jheap, kHeapSize, PROT_READ | PROT_WRITE,
+ MAP_ANON | MAP_PRIVATE, -1, 0);
+ if (jheap == (jptr)MAP_FAILED)
+ return printf("second mmap failed with %d\n", errno);
+ __tsan_java_init(jheap, kHeapSize);
+ __tsan_java_move(jheap + 16, jheap, 16);
+ printf("DONE\n");
+ return __tsan_java_fini();
+}
+
+// CHECK-NOT: WARNING: ThreadSanitizer: data race
+// CHECK: DONE
OpenPOWER on IntegriCloud