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 @@ -132,6 +132,10 @@ ctx->trace_part_finished_excess = 0; } +uptr mapped_shadow_begin; +uptr mapped_shadow_end; +bool mapped_shadow_captured; + static void DoResetImpl(uptr epoch) { ThreadRegistryLock lock0(&ctx->thread_registry); Lock lock1(&ctx->slot_mtx); @@ -197,8 +201,13 @@ } DPrintf("Resetting shadow...\n"); - if (!MmapFixedSuperNoReserve(ShadowBeg(), ShadowEnd() - ShadowBeg(), - "shadow")) { + auto shadow_begin = ShadowBeg(); + auto shadow_end = ShadowEnd(); + if (mapped_shadow_captured) { + shadow_begin = mapped_shadow_begin; + shadow_end = mapped_shadow_end; + } + if (!MmapFixedSuperNoReserve(shadow_begin, shadow_end - shadow_begin, "shadow")) { Printf("failed to reset shadow memory\n"); Die(); } @@ -563,9 +572,10 @@ // so we can get away with unaligned mapping. // CHECK_EQ(addr, addr & ~((64 << 10) - 1)); // windows wants 64K alignment const uptr kPageSize = GetPageSizeCached(); - uptr shadow_begin = RoundDownTo((uptr)MemToShadow(addr), kPageSize); - uptr shadow_end = RoundUpTo((uptr)MemToShadow(addr + size), kPageSize); - if (!MmapFixedSuperNoReserve(shadow_begin, shadow_end - shadow_begin, + mapped_shadow_begin = RoundDownTo((uptr)MemToShadow(addr), kPageSize); + mapped_shadow_end = RoundUpTo((uptr)MemToShadow(addr + size), kPageSize); + mapped_shadow_captured = true; + if (!MmapFixedSuperNoReserve(mapped_shadow_begin, mapped_shadow_end - mapped_shadow_begin, "shadow")) Die();