diff --git a/compiler-rt/lib/tsan/rtl/tsan_interface_java.cpp b/compiler-rt/lib/tsan/rtl/tsan_interface_java.cpp --- a/compiler-rt/lib/tsan/rtl/tsan_interface_java.cpp +++ b/compiler-rt/lib/tsan/rtl/tsan_interface_java.cpp @@ -128,21 +128,12 @@ // memory accesses and mutex operations (stop-the-world phase). ctx->metamap.MoveMemory(src, dst, size); - // Move shadow. - RawShadow *s = MemToShadow(src); + // Clear the destination shadow range. + // We used to move shadow from src to dst, but the trace format does not + // support that anymore as it contains addresses of accesses. RawShadow *d = MemToShadow(dst); - RawShadow *send = MemToShadow(src + size); - uptr inc = 1; - if (dst > src) { - s = MemToShadow(src + size) - 1; - d = MemToShadow(dst + size) - 1; - send = MemToShadow(src) - 1; - inc = -1; - } - for (; s != send; s += inc, d += inc) { - *d = *s; - *s = 0; - } + RawShadow *dend = MemToShadow(dst + size); + internal_memset(d, 0, (dend - d) * sizeof(*d)); } jptr __tsan_java_find(jptr *from_ptr, jptr to) { diff --git a/compiler-rt/test/tsan/java_move_overlap_race.cpp b/compiler-rt/test/tsan/java_move_overlap_race.cpp --- a/compiler-rt/test/tsan/java_move_overlap_race.cpp +++ b/compiler-rt/test/tsan/java_move_overlap_race.cpp @@ -1,6 +1,6 @@ // RUN: %clangxx_tsan -O1 %s -o %t -// RUN: %deflake %run %t 2>&1 | FileCheck %s -// RUN: %deflake %run %t arg 2>&1 | FileCheck %s +// RUN: %run %t 2>&1 | FileCheck %s +// RUN: %run %t arg 2>&1 | FileCheck %s #include "java.h" jptr varaddr1_old; @@ -50,6 +50,7 @@ return __tsan_java_fini(); } -// CHECK: WARNING: ThreadSanitizer: data race -// CHECK: WARNING: ThreadSanitizer: data race +// Note: there is a race on the moved object (which we used to detect), +// but now __tsan_java_move resets the object shadow, so we don't detect it anymore. +// CHECK-NOT: WARNING: ThreadSanitizer: data race // CHECK: DONE diff --git a/compiler-rt/test/tsan/java_race_move.cpp b/compiler-rt/test/tsan/java_race_move.cpp --- a/compiler-rt/test/tsan/java_race_move.cpp +++ b/compiler-rt/test/tsan/java_race_move.cpp @@ -1,4 +1,4 @@ -// RUN: %clangxx_tsan -O1 %s -o %t && %deflake %run %t | FileCheck %s +// RUN: %clangxx_tsan -O1 %s -o %t && %run %t 2>&1 | FileCheck %s #include "java.h" jptr varaddr; @@ -31,5 +31,7 @@ return __tsan_java_fini(); } -// CHECK: WARNING: ThreadSanitizer: data race +// Note: there is a race on the moved object (which we used to detect), +// but now __tsan_java_move resets the object shadow, so we don't detect it anymore. +// CHECK-NOT: WARNING: ThreadSanitizer: data race // CHECK: DONE