From 83c6d10b62a9575c19dfb0977ef675aeb996319a Mon Sep 17 00:00:00 2001 From: Vitaly Buka Date: Sat, 27 Apr 2019 02:13:26 +0000 Subject: [PATCH] [sanitizer] NFC: add static_assert to confirm that we use reasonable ByteMap type Summary: If bots work we can replace #ifs with template specialization by TwoLevelByteMapSize1. There is known users of TwoLevelByteMap with TwoLevelByteMapSize1 equal 8, and users of FlatByteMap with TwoLevelByteMapSize1 equal 2. Reviewers: eugenis Subscribers: kubamracek, #sanitizers, llvm-commits Tags: #sanitizers, #llvm Differential Revision: https://reviews.llvm.org/D61200 llvm-svn: 359364 --- .../sanitizer_allocator_primary32.h | 24 +++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_allocator_primary32.h b/compiler-rt/lib/sanitizer_common/sanitizer_allocator_primary32.h index d773815..cb0cdbe 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_allocator_primary32.h +++ b/compiler-rt/lib/sanitizer_common/sanitizer_allocator_primary32.h @@ -45,8 +45,22 @@ struct SizeClassAllocator32FlagMasks { // Bit masks. }; }; +// 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 @@ class SizeClassAllocator32 { 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, -- 2.7.4