diff options
author | Dmitry Vyukov <dvyukov@google.com> | 2014-07-08 20:01:12 +0000 |
---|---|---|
committer | Dmitry Vyukov <dvyukov@google.com> | 2014-07-08 20:01:12 +0000 |
commit | 3f5ad1a98e211216be9612a60ca30644e0f4073d (patch) | |
tree | 82a73f2dc557fd6cbca90e076ba2c7072c4832f6 /compiler-rt/lib/tsan/rtl/tsan_interface_java.cc | |
parent | 7a88ec9ac05c4f9e4cc03bd9e84af9e6da73c8b9 (diff) | |
download | bcm5719-llvm-3f5ad1a98e211216be9612a60ca30644e0f4073d.tar.gz bcm5719-llvm-3f5ad1a98e211216be9612a60ca30644e0f4073d.zip |
tsan: allow memory overlap in __tsan_java_move
JVM actually moves memory between overlapping ranges.
llvm-svn: 212560
Diffstat (limited to 'compiler-rt/lib/tsan/rtl/tsan_interface_java.cc')
-rw-r--r-- | compiler-rt/lib/tsan/rtl/tsan_interface_java.cc | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/compiler-rt/lib/tsan/rtl/tsan_interface_java.cc b/compiler-rt/lib/tsan/rtl/tsan_interface_java.cc index e63b93f4139..5dfb476dd2e 100644 --- a/compiler-rt/lib/tsan/rtl/tsan_interface_java.cc +++ b/compiler-rt/lib/tsan/rtl/tsan_interface_java.cc @@ -126,7 +126,8 @@ void __tsan_java_move(jptr src, jptr dst, jptr size) { CHECK_LE(src + size, jctx->heap_begin + jctx->heap_size); CHECK_GE(dst, jctx->heap_begin); CHECK_LE(dst + size, jctx->heap_begin + jctx->heap_size); - CHECK(dst >= src + size || src >= dst + size); + CHECK_NE(dst, src); + CHECK_NE(size, 0); // Assuming it's not running concurrently with threads that do // memory accesses and mutex operations (stop-the-world phase). @@ -136,7 +137,14 @@ void __tsan_java_move(jptr src, jptr dst, jptr size) { u64 *s = (u64*)MemToShadow(src); u64 *d = (u64*)MemToShadow(dst); u64 *send = (u64*)MemToShadow(src + size); - for (; s != send; s++, d++) { + uptr inc = 1; + if (dst > src) { + s = (u64*)MemToShadow(src + size) - 1; + d = (u64*)MemToShadow(dst + size) - 1; + send = (u64*)MemToShadow(src) - 1; + inc = -1; + } + for (; s != send; s += inc, d += inc) { *d = *s; *s = 0; } |