diff options
author | Vitaly Buka <vitalybuka@google.com> | 2018-05-08 17:59:44 +0000 |
---|---|---|
committer | Vitaly Buka <vitalybuka@google.com> | 2018-05-08 17:59:44 +0000 |
commit | 7381f26b45d3393e2d4de3ba4311a81b4d1fbdc4 (patch) | |
tree | 658ea554c8d6ae15b723e495f5ce35b0f3da1252 | |
parent | 1aea95a9eafac315b2642ac03ea5c52d9c60ac69 (diff) | |
download | bcm5719-llvm-7381f26b45d3393e2d4de3ba4311a81b4d1fbdc4.tar.gz bcm5719-llvm-7381f26b45d3393e2d4de3ba4311a81b4d1fbdc4.zip |
[sanitizer] Fix InternalMmapVectorNoCtor reserve and resize
Remap on reserve of more than the current size.
Don't remap on downsize.
llvm-svn: 331784
-rw-r--r-- | compiler-rt/lib/sanitizer_common/sanitizer_common.h | 11 | ||||
-rw-r--r-- | compiler-rt/lib/sanitizer_common/tests/sanitizer_common_test.cc | 23 |
2 files changed, 29 insertions, 5 deletions
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_common.h b/compiler-rt/lib/sanitizer_common/sanitizer_common.h index 52958de6de0..267903ebca3 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_common.h +++ b/compiler-rt/lib/sanitizer_common/sanitizer_common.h @@ -458,7 +458,7 @@ class InternalMmapVectorNoCtor { CHECK_LE(size_, capacity_); if (size_ == capacity_) { uptr new_capacity = RoundUpToPowerOfTwo(size_ + 1); - Resize(new_capacity); + Realloc(new_capacity); } internal_memcpy(&data_[size_++], &element, sizeof(T)); } @@ -483,12 +483,13 @@ class InternalMmapVectorNoCtor { return capacity_; } void reserve(uptr new_size) { - if (new_size >= size()) return; - Resize(new_size); + // Never downsize internal buffer. + if (new_size > capacity()) + Realloc(new_size); } void resize(uptr new_size) { - Resize(new_size); if (new_size > size_) { + reserve(new_size); internal_memset(&data_[size_], 0, sizeof(T) * (new_size - size_)); } size_ = new_size; @@ -517,7 +518,7 @@ class InternalMmapVectorNoCtor { } private: - void Resize(uptr new_capacity) { + void Realloc(uptr new_capacity) { CHECK_GT(new_capacity, 0); CHECK_LE(size_, new_capacity); T *new_data = (T *)MmapOrDie(new_capacity * sizeof(T), 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 da761bef689..02fecddbcc6 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,29 @@ TEST(SanitizerCommon, MmapAlignedOrDieOnFatalError) { } } +TEST(SanitizerCommon, InternalMmapVectorReize) { + InternalMmapVector<uptr> v; + CHECK_EQ(0U, v.size()); + CHECK_GE(v.capacity(), v.size()); + + v.reserve(1000); + CHECK_EQ(0U, v.size()); + CHECK_GE(v.capacity(), 1000U); + + v.resize(10000); + CHECK_EQ(10000U, v.size()); + CHECK_GE(v.capacity(), v.size()); + uptr cap = v.capacity(); + + v.resize(100); + CHECK_EQ(100U, v.size()); + CHECK_EQ(v.capacity(), cap); + + v.reserve(10); + CHECK_EQ(100U, v.size()); + CHECK_EQ(v.capacity(), cap); +} + TEST(SanitizerCommon, InternalMmapVector) { InternalMmapVector<uptr> vector; for (uptr i = 0; i < 100; i++) { |