summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVitaly Buka <vitalybuka@google.com>2018-05-08 17:59:44 +0000
committerVitaly Buka <vitalybuka@google.com>2018-05-08 17:59:44 +0000
commit7381f26b45d3393e2d4de3ba4311a81b4d1fbdc4 (patch)
tree658ea554c8d6ae15b723e495f5ce35b0f3da1252
parent1aea95a9eafac315b2642ac03ea5c52d9c60ac69 (diff)
downloadbcm5719-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.h11
-rw-r--r--compiler-rt/lib/sanitizer_common/tests/sanitizer_common_test.cc23
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++) {
OpenPOWER on IntegriCloud