summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2017-01-07 11:27:33 +0000
committerDmitry Vyukov <dvyukov@google.com>2017-01-07 11:27:33 +0000
commitffff5f16a4b2e36dae369997fa08cf8b33e777f8 (patch)
tree2631eede51e60d175e1071a0c8170ec27564d968
parent5741d86d112047f839fade3547ada3afaf495b17 (diff)
downloadbcm5719-llvm-ffff5f16a4b2e36dae369997fa08cf8b33e777f8.tar.gz
bcm5719-llvm-ffff5f16a4b2e36dae369997fa08cf8b33e777f8.zip
tsan: Introducing a function to flush the shadow memory from third-party libraries
As discussed with Dmitry (https://goo.gl/SA4izd), I would like to introduce a function to be called from a third-party library to flush the shadow memory. In particular, we ran some experiments with our tool Archer (an OpenMP data race detector based on Tsan, https://github.com/PRUNER/archer) and flushing the memory at the end of an outer parallel region, slightly increase the runtime overhead, but reduce the memory overhead of about 30%. This feature would come very handy in case of very large OpenMP applications that may cause an "out of memory" exception when checked with Tsan. Reviewed in: https://reviews.llvm.org/D28443 Author: Simone Atzeni (simoatze) llvm-svn: 291346
-rw-r--r--compiler-rt/lib/tsan/rtl/tsan.syms.extra1
-rw-r--r--compiler-rt/lib/tsan/rtl/tsan_interface.cc4
-rw-r--r--compiler-rt/lib/tsan/rtl/tsan_interface.h2
3 files changed, 7 insertions, 0 deletions
diff --git a/compiler-rt/lib/tsan/rtl/tsan.syms.extra b/compiler-rt/lib/tsan/rtl/tsan.syms.extra
index 1bc1d93298d..22dfde91413 100644
--- a/compiler-rt/lib/tsan/rtl/tsan.syms.extra
+++ b/compiler-rt/lib/tsan/rtl/tsan.syms.extra
@@ -1,4 +1,5 @@
__tsan_init
+__tsan_flush_memory
__tsan_read*
__tsan_write*
__tsan_vptr*
diff --git a/compiler-rt/lib/tsan/rtl/tsan_interface.cc b/compiler-rt/lib/tsan/rtl/tsan_interface.cc
index 809d2abeb0b..ad9b1fe9a58 100644
--- a/compiler-rt/lib/tsan/rtl/tsan_interface.cc
+++ b/compiler-rt/lib/tsan/rtl/tsan_interface.cc
@@ -28,6 +28,10 @@ void __tsan_init() {
Initialize(cur_thread());
}
+void __tsan_flush_memory() {
+ FlushShadowMemory();
+}
+
void __tsan_read16(void *addr) {
MemoryRead(cur_thread(), CALLERPC, (uptr)addr, kSizeLog8);
MemoryRead(cur_thread(), CALLERPC, (uptr)addr + 8, kSizeLog8);
diff --git a/compiler-rt/lib/tsan/rtl/tsan_interface.h b/compiler-rt/lib/tsan/rtl/tsan_interface.h
index bae01bd707d..4e342a58a06 100644
--- a/compiler-rt/lib/tsan/rtl/tsan_interface.h
+++ b/compiler-rt/lib/tsan/rtl/tsan_interface.h
@@ -32,6 +32,8 @@ extern "C" {
// before any instrumented code is executed and before any call to malloc.
SANITIZER_INTERFACE_ATTRIBUTE void __tsan_init();
+SANITIZER_INTERFACE_ATTRIBUTE void __tsan_flush_memory();
+
SANITIZER_INTERFACE_ATTRIBUTE void __tsan_read1(void *addr);
SANITIZER_INTERFACE_ATTRIBUTE void __tsan_read2(void *addr);
SANITIZER_INTERFACE_ATTRIBUTE void __tsan_read4(void *addr);
OpenPOWER on IntegriCloud