Index: libcxxabi/src/demangle/Utility.h =================================================================== --- libcxxabi/src/demangle/Utility.h +++ libcxxabi/src/demangle/Utility.h @@ -37,10 +37,10 @@ void grow(size_t N) { size_t Need = N + CurrentPosition; if (Need > BufferCapacity) { - // Avoid many reallocations during startup, with a bit of hysteresis. - constexpr size_t MinInitAlloc = 1024; - if (Need < MinInitAlloc) - Need = MinInitAlloc; + // Reduce the number of reallocations, with a bit of hysteresis. The + // number here is chosen so the first allocation will more-than-likely not + // allocate more than 1K. + Need += 1024 - 32; BufferCapacity *= 2; if (BufferCapacity < Need) BufferCapacity = Need; Index: llvm/include/llvm/Demangle/Utility.h =================================================================== --- llvm/include/llvm/Demangle/Utility.h +++ llvm/include/llvm/Demangle/Utility.h @@ -37,10 +37,10 @@ void grow(size_t N) { size_t Need = N + CurrentPosition; if (Need > BufferCapacity) { - // Avoid many reallocations during startup, with a bit of hysteresis. - constexpr size_t MinInitAlloc = 1024; - if (Need < MinInitAlloc) - Need = MinInitAlloc; + // Reduce the number of reallocations, with a bit of hysteresis. The + // number here is chosen so the first allocation will more-than-likely not + // allocate more than 1K. + Need += 1024 - 32; BufferCapacity *= 2; if (BufferCapacity < Need) BufferCapacity = Need; Index: llvm/unittests/Demangle/OutputBufferTest.cpp =================================================================== --- llvm/unittests/Demangle/OutputBufferTest.cpp +++ llvm/unittests/Demangle/OutputBufferTest.cpp @@ -38,6 +38,12 @@ EXPECT_EQ("?", printToString('?')); EXPECT_EQ("abc", printToString("abc")); + + // Something that's larger than the initial default allocation. + char Massive[2000]; + std::memset(Massive, 'a', sizeof(Massive)); + Massive[sizeof(Massive) - 1] = 0; + EXPECT_EQ(Massive, printToString(Massive)); } TEST(OutputBufferTest, Insert) {