diff --git a/compiler-rt/lib/tsan/lit_tests/java_race.cc b/compiler-rt/lib/tsan/lit_tests/java_race.cc new file mode 100644 index 000000000000..9e842243d2d3 --- /dev/null +++ b/compiler-rt/lib/tsan/lit_tests/java_race.cc @@ -0,0 +1,37 @@ +// RUN: %clangxx_tsan -O1 %s -o %t && %t 2>&1 | FileCheck %s +#include +#include + +extern "C" { +typedef unsigned long jptr; // NOLINT +void __tsan_java_init(jptr heap_begin, jptr heap_size); +int __tsan_java_fini(); +void __tsan_java_alloc(jptr ptr, jptr size); +void __tsan_java_free(jptr ptr, jptr size); +void __tsan_java_move(jptr src, jptr dst, jptr size); +void __tsan_java_mutex_lock(jptr addr); +void __tsan_java_mutex_unlock(jptr addr); +void __tsan_java_mutex_read_lock(jptr addr); +void __tsan_java_mutex_read_unlock(jptr addr); +} + +void *Thread(void *p) { + *(int*)p = 42; + return 0; +} + +int main() { + int const kHeapSize = 1024 * 1024; + void *jheap = malloc(kHeapSize); + __tsan_java_init((jptr)jheap, kHeapSize); + const int kBlockSize = 16; + __tsan_java_alloc((jptr)jheap, kBlockSize); + pthread_t th; + pthread_create(&th, 0, Thread, jheap); + *(int*)jheap = 43; + pthread_join(th, 0); + __tsan_java_free((jptr)jheap, kBlockSize); + return __tsan_java_fini(); +} + +// CHECK: WARNING: ThreadSanitizer: data race diff --git a/compiler-rt/lib/tsan/rtl/tsan_interface_java.cc b/compiler-rt/lib/tsan/rtl/tsan_interface_java.cc new file mode 100644 index 000000000000..72b31b7852bb --- /dev/null +++ b/compiler-rt/lib/tsan/rtl/tsan_interface_java.cc @@ -0,0 +1,46 @@ +//===-- tsan_interface_java.cc --------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file is a part of ThreadSanitizer (TSan), a race detector. +// +//===----------------------------------------------------------------------===// + +#include "tsan_interface_java.h" +#include "tsan_rtl.h" + +using namespace __tsan; // NOLINT + +void __tsan_java_init(jptr heap_begin, jptr heap_size) { +} + +int __tsan_java_fini() { + return 0; +} + +void __tsan_java_alloc(jptr ptr, jptr size) { +} + +void __tsan_java_free(jptr ptr, jptr size) { +} + +void __tsan_java_move(jptr src, jptr dst, jptr size) { +} + +void __tsan_java_mutex_lock(jptr addr) { +} + +void __tsan_java_mutex_unlock(jptr addr) { +} + +void __tsan_java_mutex_read_lock(jptr addr) { +} + +void __tsan_java_mutex_read_unlock(jptr addr) { +} + diff --git a/compiler-rt/lib/tsan/rtl/tsan_interface_java.h b/compiler-rt/lib/tsan/rtl/tsan_interface_java.h index 1f3afc815272..9af31a5293ae 100644 --- a/compiler-rt/lib/tsan/rtl/tsan_interface_java.h +++ b/compiler-rt/lib/tsan/rtl/tsan_interface_java.h @@ -23,7 +23,6 @@ extern "C" { typedef unsigned long jptr; // NOLINT - // Must be called before any other callback from Java. void __tsan_java_init(jptr heap_begin, jptr heap_size) INTERFACE_ATTRIBUTE; // Must be called when the application exits.