[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