diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_ring_buffer.h b/compiler-rt/lib/sanitizer_common/sanitizer_ring_buffer.h --- a/compiler-rt/lib/sanitizer_common/sanitizer_ring_buffer.h +++ b/compiler-rt/lib/sanitizer_common/sanitizer_ring_buffer.h @@ -84,21 +84,24 @@ class CompactRingBuffer { // Top byte of long_ stores the buffer size in pages. // Lower bytes store the address of the next buffer element. - static constexpr int kPageSizeBits = 12; static constexpr int kSizeShift = 56; static constexpr int kSizeBits = 64 - kSizeShift; static constexpr uptr kNextMask = (1ULL << kSizeShift) - 1; - uptr GetStorageSize() const { return (long_ >> kSizeShift) << kPageSizeBits; } + uptr GetStorageSize() const { + unsigned kPageSizeBits = Log2(GetPageSizeCached()); + return (long_ >> kSizeShift) << kPageSizeBits; + } static uptr SignExtend(uptr x) { return ((sptr)x) << kSizeBits >> kSizeBits; } void Init(void *storage, uptr size) { + unsigned kPageSizeBits = Log2(GetPageSizeCached()); CHECK_EQ(sizeof(CompactRingBuffer), sizeof(void *)); CHECK(IsPowerOfTwo(size)); CHECK_GE(size, 1 << kPageSizeBits); CHECK_LE(size, 128 << kPageSizeBits); - CHECK_EQ(size % 4096, 0); + CHECK_EQ(size % GetPageSizeCached(), 0); CHECK_EQ(size % sizeof(T), 0); uptr st = (uptr)storage; CHECK_EQ(st % (size * 2), 0); diff --git a/compiler-rt/lib/sanitizer_common/tests/sanitizer_ring_buffer_test.cpp b/compiler-rt/lib/sanitizer_common/tests/sanitizer_ring_buffer_test.cpp --- a/compiler-rt/lib/sanitizer_common/tests/sanitizer_ring_buffer_test.cpp +++ b/compiler-rt/lib/sanitizer_common/tests/sanitizer_ring_buffer_test.cpp @@ -86,7 +86,7 @@ const size_t page_sizes[] = {1, 2, 4, 128}; for (size_t pages : page_sizes) { - size_t count = 4096 * pages / sizeof(int64_t); + size_t count = GetPageSizeCached() * pages / sizeof(int64_t); auto R = AllocCompactRingBuffer(count); int64_t top = count * 3 + 13; for (int64_t i = 0; i < top; ++i) R->push(i);