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 IS_HIGH_MEM_LOW kHighMemEnd <= (MEM_TO_SHADOW(kHighMemEnd) + 1) +// The above expression decides whether defining the +// kHighMemBeg, kHighShadowBeg and kHighShadowEnd macros as in !SANITIZER_IOS case +// leads to nonsensical situation where kHighMemEnd <= (MEM_TO_SHADOW(kHighMemEnd) + 1) +// If so, the alternate memory layout will be used +# define kHighMemBeg \ + ( IS_HIGH_MEM_LOW ? \ + RoundUpTo(kLowShadowEnd + ((kHighMemEnd - kLowShadowEnd) >> ASAN_SHADOW_SCALE) , GetMmapGranularity()) : \ + MEM_TO_SHADOW(kHighMemEnd) + 1 \ + ) + +# define kHighShadowBeg \ + ( IS_HIGH_MEM_LOW ? \ + kLowShadowEnd + 1 + GetMmapGranularity() : \ + MEM_TO_SHADOW(kHighMemBeg) \ + ) +# define kHighShadowEnd \ + ( IS_HIGH_MEM_LOW ? \ + 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)