Index: compiler-rt/trunk/lib/sanitizer_common/sanitizer_allocator_primary32.h =================================================================== --- compiler-rt/trunk/lib/sanitizer_common/sanitizer_allocator_primary32.h +++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_allocator_primary32.h @@ -45,8 +45,22 @@ }; }; +// This template is not necessary but t helps to see values if static_assert +// fails. +// FIXME: Replace check with automatic type detection. D61206 +template +struct CheckTwoLevelByteMapSize { + static_assert((ActualSize >= MinSize) == Expected, + "Unexpected ByteMap type for the size"); +}; + template class SizeClassAllocator32 { + private: + static const u64 TwoLevelByteMapSize1 = + (Params::kSpaceSize >> Params::kRegionSizeLog) >> 12; + static const u64 kMinFirstMapSizeTwoLevelByteMap = 4; + public: using AddressSpaceView = typename Params::AddressSpaceView; static const uptr kSpaceBeg = Params::kSpaceBeg; @@ -58,12 +72,16 @@ typedef typename Params::MapUnmapCallback MapUnmapCallback; #if SANITIZER_WORDSIZE == 32 + CheckTwoLevelByteMapSize + Check; using BM = FlatByteMap<(Params::kSpaceSize >> Params::kRegionSizeLog), AddressSpaceView>; #elif SANITIZER_WORDSIZE == 64 - using BM = - TwoLevelByteMap<((Params::kSpaceSize >> Params::kRegionSizeLog) >> 12), - 1 << 12, AddressSpaceView>; + CheckTwoLevelByteMapSize + Check; + using BM = TwoLevelByteMap; #endif static_assert((Params::kFlags & SizeClassAllocator32FlagMasks::kForTest) || is_same::value,