summaryrefslogtreecommitdiffstats
path: root/compiler-rt/lib/tsan/rtl/tsan_interface_java.cc
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2014-07-08 20:01:12 +0000
committerDmitry Vyukov <dvyukov@google.com>2014-07-08 20:01:12 +0000
commit3f5ad1a98e211216be9612a60ca30644e0f4073d (patch)
tree82a73f2dc557fd6cbca90e076ba2c7072c4832f6 /compiler-rt/lib/tsan/rtl/tsan_interface_java.cc
parent7a88ec9ac05c4f9e4cc03bd9e84af9e6da73c8b9 (diff)
downloadbcm5719-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.cc12
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;
}
OpenPOWER on IntegriCloud