diff --git a/compiler-rt/lib/asan/asan_mapping.h b/compiler-rt/lib/asan/asan_mapping.h --- a/compiler-rt/lib/asan/asan_mapping.h +++ b/compiler-rt/lib/asan/asan_mapping.h @@ -279,10 +279,34 @@ # define kLowShadowBeg ASAN_SHADOW_OFFSET # define kLowShadowEnd MEM_TO_SHADOW(kLowMemEnd) +#if !SANITIZER_IOS # define kHighMemBeg (MEM_TO_SHADOW(kHighMemEnd) + 1) # define kHighShadowBeg MEM_TO_SHADOW(kHighMemBeg) # define kHighShadowEnd MEM_TO_SHADOW(kHighMemEnd) +#else // !SANITIZER_IOS +# define WOULD_SHADOWS_OVERLAP MEM_TO_SHADOW(kHighMemEnd) + 1 <= kLowShadowEnd + (kHighMemEnd >> ASAN_SHADOW_SCALE) +// The above expression says, if true, that you can't really fit low shadow, high shadow, +// and the shadowed high memory in the current available address space while using the old algorithm +// where kHighMemBeg == (MEM_TO_SHADOW(kHighMemEnd) + 1) and +// highShadowSize == (kHighMemEnd >> ASAN_SHADOW_SCALE) +# define kHighMemBeg \ + ( WOULD_SHADOWS_OVERLAP ? \ + RoundUpTo(kLowShadowEnd + ((kHighMemEnd - kLowShadowEnd) >> ASAN_SHADOW_SCALE) , GetMmapGranularity()) : \ + MEM_TO_SHADOW(kHighMemEnd) + 1 \ + ) + +# define kHighShadowBeg \ + ( WOULD_SHADOWS_OVERLAP ? \ + kLowShadowEnd + 1 + GetMmapGranularity() : \ + MEM_TO_SHADOW(kHighMemBeg) \ + ) +# define kHighShadowEnd \ + ( WOULD_SHADOWS_OVERLAP ? \ + RoundUpTo(kLowShadowEnd + ((kHighMemEnd - kLowShadowEnd) >> ASAN_SHADOW_SCALE) , GetMmapGranularity()) - 1 : \ + MEM_TO_SHADOW(kHighMemEnd) \ + ) +#endif // !SANITIZER_IOS # define kMidShadowBeg MEM_TO_SHADOW(kMidMemBeg) # define kMidShadowEnd MEM_TO_SHADOW(kMidMemEnd)