summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2013-03-18 15:49:07 +0000
committerDmitry Vyukov <dvyukov@google.com>2013-03-18 15:49:07 +0000
commit2e7f29f042eb203215eb0ccb12ebc5b811fa4c7a (patch)
tree93d5009b1aa6794ed1a677777fbba455646df182
parent2f69d405ccd7d0d9ea653dd4c65e65d13753898c (diff)
downloadbcm5719-llvm-2e7f29f042eb203215eb0ccb12ebc5b811fa4c7a.tar.gz
bcm5719-llvm-2e7f29f042eb203215eb0ccb12ebc5b811fa4c7a.zip
tsan: mark shadow for thread stack as "don't need" when thread exits
llvm-svn: 177288
-rw-r--r--compiler-rt/lib/tsan/rtl/tsan_interceptors.cc6
-rw-r--r--compiler-rt/lib/tsan/rtl/tsan_mman.cc5
-rw-r--r--compiler-rt/lib/tsan/rtl/tsan_rtl.cc6
-rw-r--r--compiler-rt/lib/tsan/rtl/tsan_rtl.h1
-rw-r--r--compiler-rt/lib/tsan/rtl/tsan_rtl_thread.cc16
5 files changed, 13 insertions, 21 deletions
diff --git a/compiler-rt/lib/tsan/rtl/tsan_interceptors.cc b/compiler-rt/lib/tsan/rtl/tsan_interceptors.cc
index 0bc4c7380e0..5c8498996cd 100644
--- a/compiler-rt/lib/tsan/rtl/tsan_interceptors.cc
+++ b/compiler-rt/lib/tsan/rtl/tsan_interceptors.cc
@@ -619,11 +619,7 @@ TSAN_INTERCEPTOR(void*, mmap64, void *addr, long_t sz, int prot,
TSAN_INTERCEPTOR(int, munmap, void *addr, long_t sz) {
SCOPED_TSAN_INTERCEPTOR(munmap, addr, sz);
- // We are about to unmap a chunk of user memory.
- // Mark the corresponding shadow memory as not needed.
- uptr shadow_beg = MemToShadow((uptr)addr);
- uptr shadow_end = MemToShadow((uptr)addr + sz);
- FlushUnneededShadowMemory(shadow_beg, shadow_end - shadow_beg);
+ DontNeedShadowFor((uptr)addr, sz);
int res = REAL(munmap)(addr, sz);
return res;
}
diff --git a/compiler-rt/lib/tsan/rtl/tsan_mman.cc b/compiler-rt/lib/tsan/rtl/tsan_mman.cc
index 355d93b7312..1d887c6854f 100644
--- a/compiler-rt/lib/tsan/rtl/tsan_mman.cc
+++ b/compiler-rt/lib/tsan/rtl/tsan_mman.cc
@@ -34,10 +34,7 @@ struct MapUnmapCallback {
void OnUnmap(uptr p, uptr size) const {
// We are about to unmap a chunk of user memory.
// Mark the corresponding shadow memory as not needed.
- uptr shadow_beg = MemToShadow(p);
- uptr shadow_end = MemToShadow(p + size);
- CHECK(IsAligned(shadow_end|shadow_beg, GetPageSizeCached()));
- FlushUnneededShadowMemory(shadow_beg, shadow_end - shadow_beg);
+ DontNeedShadowFor(p, size);
}
};
diff --git a/compiler-rt/lib/tsan/rtl/tsan_rtl.cc b/compiler-rt/lib/tsan/rtl/tsan_rtl.cc
index 2e9a36b9c36..9ed3a4c8514 100644
--- a/compiler-rt/lib/tsan/rtl/tsan_rtl.cc
+++ b/compiler-rt/lib/tsan/rtl/tsan_rtl.cc
@@ -125,6 +125,12 @@ static void InitializeMemoryProfile() {
internal_start_thread(&MemoryProfileThread, (void*)(uptr)fd);
}
+void DontNeedShadowFor(uptr addr, uptr size) {
+ uptr shadow_beg = MemToShadow(addr);
+ uptr shadow_end = MemToShadow(addr + size);
+ FlushUnneededShadowMemory(shadow_beg, shadow_end - shadow_beg);
+}
+
static void MemoryFlushThread(void *arg) {
ScopedInRtl in_rtl;
for (int i = 0; ; i++) {
diff --git a/compiler-rt/lib/tsan/rtl/tsan_rtl.h b/compiler-rt/lib/tsan/rtl/tsan_rtl.h
index 02d4edd6444..3db1a89c89c 100644
--- a/compiler-rt/lib/tsan/rtl/tsan_rtl.h
+++ b/compiler-rt/lib/tsan/rtl/tsan_rtl.h
@@ -527,6 +527,7 @@ void ALWAYS_INLINE INLINE StatSet(ThreadState *thr, StatType typ, u64 n) {
void MapShadow(uptr addr, uptr size);
void MapThreadTrace(uptr addr, uptr size);
+void DontNeedShadowFor(uptr addr, uptr size);
void InitializeShadowMemory();
void InitializeInterceptors();
void InitializeDynamicAnnotations();
diff --git a/compiler-rt/lib/tsan/rtl/tsan_rtl_thread.cc b/compiler-rt/lib/tsan/rtl/tsan_rtl_thread.cc
index 238baef1530..0372bb53964 100644
--- a/compiler-rt/lib/tsan/rtl/tsan_rtl_thread.cc
+++ b/compiler-rt/lib/tsan/rtl/tsan_rtl_thread.cc
@@ -200,9 +200,8 @@ void ThreadStart(ThreadState *thr, int tid, uptr os_id) {
GetThreadStackAndTls(tid == 0, &stk_addr, &stk_size, &tls_addr, &tls_size);
if (tid) {
- if (stk_addr && stk_size) {
+ if (stk_addr && stk_size)
MemoryResetRange(thr, /*pc=*/ 1, stk_addr, stk_size);
- }
if (tls_addr && tls_size) {
// Check that the thr object is in tls;
@@ -225,17 +224,10 @@ void ThreadStart(ThreadState *thr, int tid, uptr os_id) {
void ThreadFinish(ThreadState *thr) {
CHECK_GT(thr->in_rtl, 0);
StatInc(thr, StatThreadFinish);
- // FIXME: Treat it as write.
if (thr->stk_addr && thr->stk_size)
- MemoryResetRange(thr, /*pc=*/ 3, thr->stk_addr, thr->stk_size);
- if (thr->tls_addr && thr->tls_size) {
- const uptr thr_beg = (uptr)thr;
- const uptr thr_end = (uptr)thr + sizeof(*thr);
- // Since the thr object is huge, skip it.
- MemoryResetRange(thr, /*pc=*/ 4, thr->tls_addr, thr_beg - thr->tls_addr);
- MemoryResetRange(thr, /*pc=*/ 5,
- thr_end, thr->tls_addr + thr->tls_size - thr_end);
- }
+ DontNeedShadowFor(thr->stk_addr, thr->stk_size);
+ if (thr->tls_addr && thr->tls_size)
+ DontNeedShadowFor(thr->tls_addr, thr->tls_size);
thr->is_alive = false;
Context *ctx = CTX();
ctx->thread_registry->FinishThread(thr->tid);
OpenPOWER on IntegriCloud