diff --git a/compiler-rt/lib/tsan/rtl/tsan_mman.cpp b/compiler-rt/lib/tsan/rtl/tsan_mman.cpp --- a/compiler-rt/lib/tsan/rtl/tsan_mman.cpp +++ b/compiler-rt/lib/tsan/rtl/tsan_mman.cpp @@ -57,7 +57,7 @@ if (diff != 0) size -= diff; uptr p_meta = (uptr)MemToMeta(p); - ReleaseMemoryPagesToOS(p_meta, p_meta + size / kMetaRatio); + ReleaseTSANPages(p_meta, size / kMetaRatio); } }; diff --git a/compiler-rt/lib/tsan/rtl/tsan_platform.h b/compiler-rt/lib/tsan/rtl/tsan_platform.h --- a/compiler-rt/lib/tsan/rtl/tsan_platform.h +++ b/compiler-rt/lib/tsan/rtl/tsan_platform.h @@ -1023,6 +1023,9 @@ void DestroyThreadState(); void PlatformCleanUpThreadState(ThreadState *thr); +void ZeroPages(uptr addr, uptr size); +void ReleaseTSANPages(uptr addr, uptr size); + } // namespace __tsan #endif // TSAN_PLATFORM_H diff --git a/compiler-rt/lib/tsan/rtl/tsan_platform_linux.cpp b/compiler-rt/lib/tsan/rtl/tsan_platform_linux.cpp --- a/compiler-rt/lib/tsan/rtl/tsan_platform_linux.cpp +++ b/compiler-rt/lib/tsan/rtl/tsan_platform_linux.cpp @@ -147,7 +147,7 @@ void FlushShadowMemoryCallback( const SuspendedThreadsList &suspended_threads_list, void *argument) { - ReleaseMemoryPagesToOS(ShadowBeg(), ShadowEnd()); + ReleaseTSANPages(ShadowBeg(), ShadowEnd() - ShadowBeg()); } #endif diff --git a/compiler-rt/lib/tsan/rtl/tsan_platform_posix.cpp b/compiler-rt/lib/tsan/rtl/tsan_platform_posix.cpp --- a/compiler-rt/lib/tsan/rtl/tsan_platform_posix.cpp +++ b/compiler-rt/lib/tsan/rtl/tsan_platform_posix.cpp @@ -121,6 +121,16 @@ } #endif +void ZeroPages(uptr addr, uptr size) { + UnmapOrDie((void*)addr, size); + if (!MmapFixedSuperNoReserve(addr, size)) + Die(); +} + +void ReleaseTSANPages(uptr addr, uptr size) { + ReleaseMemoryPagesToOS(addr, addr + size); +} + } // namespace __tsan #endif // SANITIZER_POSIX diff --git a/compiler-rt/lib/tsan/rtl/tsan_platform_windows.cpp b/compiler-rt/lib/tsan/rtl/tsan_platform_windows.cpp --- a/compiler-rt/lib/tsan/rtl/tsan_platform_windows.cpp +++ b/compiler-rt/lib/tsan/rtl/tsan_platform_windows.cpp @@ -32,6 +32,15 @@ void InitializePlatform() { } +void ZeroPages(uptr addr, uptr size) { + // Unimplemented. + __builtin_trap(); +} + +void ReleaseTSANPages(uptr addr, uptr size) { + ReleaseMemoryPagesToOS(addr, addr + size); +} + } // namespace __tsan #endif // SANITIZER_WINDOWS diff --git a/compiler-rt/lib/tsan/rtl/tsan_rtl.cpp b/compiler-rt/lib/tsan/rtl/tsan_rtl.cpp --- a/compiler-rt/lib/tsan/rtl/tsan_rtl.cpp +++ b/compiler-rt/lib/tsan/rtl/tsan_rtl.cpp @@ -237,7 +237,8 @@ #endif void DontNeedShadowFor(uptr addr, uptr size) { - ReleaseMemoryPagesToOS(MemToShadow(addr), MemToShadow(addr + size)); + ReleaseTSANPages(MemToShadow(addr), + MemToShadow(addr + size) - MemToShadow(addr)); } #if !SANITIZER_GO @@ -957,11 +958,11 @@ *p++ = 0; } // Reset middle part. - u64 *p1 = p; + uptr p1 = reinterpret_cast(p); p = RoundDown(end, kPageSize); - UnmapOrDie((void*)p1, (uptr)p - (uptr)p1); - if (!MmapFixedSuperNoReserve((uptr)p1, (uptr)p - (uptr)p1)) - Die(); + + ZeroPages(p1, reinterpret_cast(p) - p1); + // Set the ending. while (p < end) { *p++ = val; diff --git a/compiler-rt/lib/tsan/rtl/tsan_rtl_thread.cpp b/compiler-rt/lib/tsan/rtl/tsan_rtl_thread.cpp --- a/compiler-rt/lib/tsan/rtl/tsan_rtl_thread.cpp +++ b/compiler-rt/lib/tsan/rtl/tsan_rtl_thread.cpp @@ -68,8 +68,7 @@ void ThreadContext::OnReset() { CHECK_EQ(sync.size(), 0); uptr trace_p = GetThreadTrace(tid); - ReleaseMemoryPagesToOS(trace_p, trace_p + TraceSize() * sizeof(Event)); - //!!! ReleaseMemoryToOS(GetThreadTraceHeader(tid), sizeof(Trace)); + ReleaseTSANPages(trace_p, TraceSize() * sizeof(Event)); } void ThreadContext::OnDetached(void *arg) { diff --git a/compiler-rt/lib/tsan/rtl/tsan_sync.cpp b/compiler-rt/lib/tsan/rtl/tsan_sync.cpp --- a/compiler-rt/lib/tsan/rtl/tsan_sync.cpp +++ b/compiler-rt/lib/tsan/rtl/tsan_sync.cpp @@ -174,9 +174,7 @@ // meta objects in java heap). uptr metap = (uptr)MemToMeta(p0); uptr metasz = sz0 / kMetaRatio; - UnmapOrDie((void*)metap, metasz); - if (!MmapFixedSuperNoReserve(metap, metasz)) - Die(); + ZeroPages(metap, metasz); } MBlock* MetaMap::GetBlock(uptr p) {