From: Vitaly Buka Date: Wed, 9 May 2018 23:31:05 +0000 (+0000) Subject: [sanitizer] Use all available rounded up capacity X-Git-Tag: llvmorg-7.0.0-rc1~6382 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=c779388c7bfbdd38b31923aea1ccb4cd35ca23b6;p=platform%2Fupstream%2Fllvm.git [sanitizer] Use all available rounded up capacity Reviewers: eugenis Subscribers: kubamracek, llvm-commits Differential Revision: https://reviews.llvm.org/D46617 llvm-svn: 331940 --- diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_common.h b/compiler-rt/lib/sanitizer_common/sanitizer_common.h index 81336d2..150c97e 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_common.h +++ b/compiler-rt/lib/sanitizer_common/sanitizer_common.h @@ -428,13 +428,12 @@ template class InternalMmapVectorNoCtor { public: void Initialize(uptr initial_capacity) { - capacity_ = Max(initial_capacity, (uptr)1); + capacity_bytes_ = 0; size_ = 0; - data_ = (T *)MmapOrDie(capacity_ * sizeof(T), "InternalMmapVectorNoCtor"); - } - void Destroy() { - UnmapOrDie(data_, capacity_ * sizeof(T)); + data_ = 0; + reserve(initial_capacity); } + void Destroy() { UnmapOrDie(data_, capacity_bytes_); } T &operator[](uptr i) { CHECK_LT(i, size_); return data_[i]; @@ -444,8 +443,8 @@ class InternalMmapVectorNoCtor { return data_[i]; } void push_back(const T &element) { - CHECK_LE(size_, capacity_); - if (size_ == capacity_) { + CHECK_LE(size_, capacity()); + if (size_ == capacity()) { uptr new_capacity = RoundUpToPowerOfTwo(size_ + 1); Realloc(new_capacity); } @@ -468,9 +467,7 @@ class InternalMmapVectorNoCtor { T *data() { return data_; } - uptr capacity() const { - return capacity_; - } + uptr capacity() const { return capacity_bytes_ / sizeof(T); } void reserve(uptr new_size) { // Never downsize internal buffer. if (new_size > capacity()) @@ -502,7 +499,7 @@ class InternalMmapVectorNoCtor { void swap(InternalMmapVectorNoCtor &other) { Swap(data_, other.data_); - Swap(capacity_, other.capacity_); + Swap(capacity_bytes_, other.capacity_bytes_); Swap(size_, other.size_); } @@ -510,17 +507,17 @@ class InternalMmapVectorNoCtor { void Realloc(uptr new_capacity) { CHECK_GT(new_capacity, 0); CHECK_LE(size_, new_capacity); - T *new_data = (T *)MmapOrDie(new_capacity * sizeof(T), - "InternalMmapVector"); + uptr new_capacity_bytes = + RoundUpTo(new_capacity * sizeof(T), GetPageSizeCached()); + T *new_data = (T *)MmapOrDie(new_capacity_bytes, "InternalMmapVector"); internal_memcpy(new_data, data_, size_ * sizeof(T)); - T *old_data = data_; + UnmapOrDie(data_, capacity_bytes_); data_ = new_data; - UnmapOrDie(old_data, capacity_ * sizeof(T)); - capacity_ = new_capacity; + capacity_bytes_ = new_capacity_bytes; } T *data_; - uptr capacity_; + uptr capacity_bytes_; uptr size_; }; diff --git a/compiler-rt/lib/sanitizer_common/tests/sanitizer_common_test.cc b/compiler-rt/lib/sanitizer_common/tests/sanitizer_common_test.cc index 6e5bb5b..0177484 100644 --- a/compiler-rt/lib/sanitizer_common/tests/sanitizer_common_test.cc +++ b/compiler-rt/lib/sanitizer_common/tests/sanitizer_common_test.cc @@ -88,6 +88,12 @@ TEST(SanitizerCommon, MmapAlignedOrDieOnFatalError) { } } +TEST(SanitizerCommon, InternalMmapVectorRoundUpCapacity) { + InternalMmapVector v; + v.reserve(1); + CHECK_EQ(v.capacity(), GetPageSizeCached() / sizeof(uptr)); +} + TEST(SanitizerCommon, InternalMmapVectorReize) { InternalMmapVector v; CHECK_EQ(0U, v.size());