From da78be74f3e942bdee6ef33202796ce9dd11ee89 Mon Sep 17 00:00:00 2001 From: Dmitry Vyukov Date: Tue, 6 Nov 2012 16:48:46 +0000 Subject: [PATCH] tsan: slightly relax requirements for lazy shadow memory (can overlap and may not be properly aligned) it's problematic on windows where allocation granularity is much larger than page size llvm-svn: 167466 --- compiler-rt/lib/sanitizer_common/sanitizer_posix.cc | 11 ++++++----- compiler-rt/lib/tsan/go/test.c | 2 +- compiler-rt/lib/tsan/rtl/tsan_rtl.cc | 10 +--------- 3 files changed, 8 insertions(+), 15 deletions(-) diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_posix.cc b/compiler-rt/lib/sanitizer_common/sanitizer_posix.cc index 521271e..8117fd4 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_posix.cc +++ b/compiler-rt/lib/sanitizer_common/sanitizer_posix.cc @@ -74,11 +74,12 @@ void UnmapOrDie(void *addr, uptr size) { } void *MmapFixedNoReserve(uptr fixed_addr, uptr size) { - void *p = internal_mmap((void*)fixed_addr, size, - PROT_READ | PROT_WRITE, - MAP_PRIVATE | MAP_ANON | MAP_FIXED | MAP_NORESERVE, - -1, 0); - if (p != (void*)fixed_addr) + void *p = internal_mmap((void*)(fixed_addr & ~(kPageSize - 1)), + RoundUpTo(size, kPageSize), + PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANON | MAP_FIXED | MAP_NORESERVE, + -1, 0); + if (p == (void*)-1) Report("ERROR: Failed to allocate 0x%zx (%zd) bytes at address %p (%d)\n", size, size, fixed_addr, errno); return p; diff --git a/compiler-rt/lib/tsan/go/test.c b/compiler-rt/lib/tsan/go/test.c index 865da4e..ae63d66 100644 --- a/compiler-rt/lib/tsan/go/test.c +++ b/compiler-rt/lib/tsan/go/test.c @@ -36,7 +36,7 @@ char buf[10]; int main(void) { __tsan_init(); - __tsan_map_shadow((unsigned long)buf & ~(4096-1), 4096); + __tsan_map_shadow(buf, sizeof(buf)); __tsan_func_enter(0, &main); __tsan_malloc(0, buf, 10, 0); __tsan_release(0, buf); diff --git a/compiler-rt/lib/tsan/rtl/tsan_rtl.cc b/compiler-rt/lib/tsan/rtl/tsan_rtl.cc index f5b5d46..bb3f1a1 100644 --- a/compiler-rt/lib/tsan/rtl/tsan_rtl.cc +++ b/compiler-rt/lib/tsan/rtl/tsan_rtl.cc @@ -162,15 +162,7 @@ static void InitializeMemoryFlush() { } void MapShadow(uptr addr, uptr size) { - uptr saddr = MemToShadow(addr); - uptr ssize = size * kShadowMultiplier; - void *p = MmapFixedNoReserve(saddr, ssize); - if ((uptr)p != saddr) { - Printf("FATAL: ThreadSanitizer failed to mmap shadow memory" - " %p(%p) -> %p(%p) = %p\n", - addr, size, saddr, ssize, p); - Die(); - } + MmapFixedNoReserve(MemToShadow(addr), size * kShadowMultiplier); } void Initialize(ThreadState *thr) { -- 2.7.4