[compiler-rt] r331784 - [sanitizer] Fix InternalMmapVectorNoCtor reserve and resize
Vitaly Buka via llvm-commits
llvm-commits at lists.llvm.org
Tue May 8 10:59:45 PDT 2018
Author: vitalybuka
Date: Tue May 8 10:59:44 2018
New Revision: 331784
URL: http://llvm.org/viewvc/llvm-project?rev=331784&view=rev
Log:
[sanitizer] Fix InternalMmapVectorNoCtor reserve and resize
Remap on reserve of more than the current size.
Don't remap on downsize.
Modified:
compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.h
compiler-rt/trunk/lib/sanitizer_common/tests/sanitizer_common_test.cc
Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.h
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.h?rev=331784&r1=331783&r2=331784&view=diff
==============================================================================
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.h (original)
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.h Tue May 8 10:59:44 2018
@@ -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),
Modified: compiler-rt/trunk/lib/sanitizer_common/tests/sanitizer_common_test.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/tests/sanitizer_common_test.cc?rev=331784&r1=331783&r2=331784&view=diff
==============================================================================
--- compiler-rt/trunk/lib/sanitizer_common/tests/sanitizer_common_test.cc (original)
+++ compiler-rt/trunk/lib/sanitizer_common/tests/sanitizer_common_test.cc Tue May 8 10:59:44 2018
@@ -88,6 +88,29 @@ TEST(SanitizerCommon, MmapAlignedOrDieOn
}
}
+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++) {
More information about the llvm-commits
mailing list