diff options
-rw-r--r-- | compiler-rt/lib/asan/asan_mapping.h | 1 | ||||
-rw-r--r-- | compiler-rt/lib/asan/asan_rtl.cc | 14 |
2 files changed, 13 insertions, 2 deletions
diff --git a/compiler-rt/lib/asan/asan_mapping.h b/compiler-rt/lib/asan/asan_mapping.h index 40ff54fd0d1..24584e94f74 100644 --- a/compiler-rt/lib/asan/asan_mapping.h +++ b/compiler-rt/lib/asan/asan_mapping.h @@ -125,6 +125,7 @@ // || `[0x00000000, 0x2fffffff]` || LowMem || static const u64 kDefaultShadowScale = 3; +static const u64 kDefaultShadowSentinel = ~(uptr)0; static const u64 kDefaultShadowOffset32 = 1ULL << 29; // 0x20000000 static const u64 kDefaultShadowOffset64 = 1ULL << 44; static const u64 kDefaultShort64bitShadowOffset = 0x7FFF8000; // < 2G. diff --git a/compiler-rt/lib/asan/asan_rtl.cc b/compiler-rt/lib/asan/asan_rtl.cc index 1d676bd0d27..c232db5cdae 100644 --- a/compiler-rt/lib/asan/asan_rtl.cc +++ b/compiler-rt/lib/asan/asan_rtl.cc @@ -461,9 +461,18 @@ static void AsanInitInternal() { ReplaceSystemMalloc(); - __asan_shadow_memory_dynamic_address = 0; + // Set the shadow memory address to uninitialized. + __asan_shadow_memory_dynamic_address = kDefaultShadowSentinel; + uptr shadow_start = kLowShadowBeg; - if (shadow_start == 0) { + // Detect if a dynamic shadow address must used and find a available location + // when necessary. When dynamic address is used, the macro |kLowShadowBeg| + // expands to |__asan_shadow_memory_dynamic_address| which is + // |kDefaultShadowSentinel|. + if (shadow_start == kDefaultShadowSentinel) { + __asan_shadow_memory_dynamic_address = 0; + CHECK_EQ(0, kLowShadowBeg); + uptr granularity = GetMmapGranularity(); uptr alignment = 8 * granularity; uptr left_padding = granularity; @@ -473,6 +482,7 @@ static void AsanInitInternal() { CHECK_NE((uptr)0, shadow_start); CHECK(IsAligned(shadow_start, alignment)); } + // Update the shadow memory address (potentially) used by instrumentation. __asan_shadow_memory_dynamic_address = shadow_start; if (kLowShadowBeg) |