Switch Java heap move to the new scheme required for the new tsan runtime. Instead of copying the shadow we reset the destination range. The new v3 trace contains addresses of accesses, so we cannot simply copy the shadow. This can lead to false negatives, but cannot lead to false positives. Depends on D110159. Reviewed By: vitalybuka Differential Revision: https://reviews.llvm.org/D110190
57 lines
1.5 KiB
C++
57 lines
1.5 KiB
C++
// RUN: %clangxx_tsan -O1 %s -o %t
|
|
// RUN: %run %t 2>&1 | FileCheck %s
|
|
// RUN: %run %t arg 2>&1 | FileCheck %s
|
|
#include "java.h"
|
|
|
|
jptr varaddr1_old;
|
|
jptr varaddr2_old;
|
|
jptr varaddr1_new;
|
|
jptr varaddr2_new;
|
|
|
|
void *Thread(void *p) {
|
|
barrier_wait(&barrier);
|
|
*(int*)varaddr1_new = 43;
|
|
*(int*)varaddr2_new = 43;
|
|
return 0;
|
|
}
|
|
|
|
int main(int argc, char **argv) {
|
|
barrier_init(&barrier, 2);
|
|
int const kHeapSize = 1024 * 1024;
|
|
void *jheap = malloc(kHeapSize);
|
|
jheap = (char*)jheap + 8;
|
|
__tsan_java_init((jptr)jheap, kHeapSize);
|
|
const int kBlockSize = 64;
|
|
int const kMove = 32;
|
|
varaddr1_old = (jptr)jheap;
|
|
varaddr2_old = (jptr)jheap + kBlockSize - 1;
|
|
varaddr1_new = varaddr1_old + kMove;
|
|
varaddr2_new = varaddr2_old + kMove;
|
|
if (argc > 1) {
|
|
// Move memory backwards.
|
|
varaddr1_old += kMove;
|
|
varaddr2_old += kMove;
|
|
varaddr1_new -= kMove;
|
|
varaddr2_new -= kMove;
|
|
}
|
|
__tsan_java_alloc(varaddr1_old, kBlockSize);
|
|
|
|
pthread_t th;
|
|
pthread_create(&th, 0, Thread, 0);
|
|
|
|
*(int*)varaddr1_old = 43;
|
|
*(int*)varaddr2_old = 43;
|
|
|
|
__tsan_java_move(varaddr1_old, varaddr1_new, kBlockSize);
|
|
barrier_wait(&barrier);
|
|
pthread_join(th, 0);
|
|
__tsan_java_free(varaddr1_new, kBlockSize);
|
|
fprintf(stderr, "DONE\n");
|
|
return __tsan_java_fini();
|
|
}
|
|
|
|
// 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
|