diff --git a/libcxxabi/src/demangle/Utility.h b/libcxxabi/src/demangle/Utility.h --- a/libcxxabi/src/demangle/Utility.h +++ b/libcxxabi/src/demangle/Utility.h @@ -33,12 +33,14 @@ size_t CurrentPosition = 0; size_t BufferCapacity = 0; - // Ensure there is at least n more positions in buffer. + // Ensure there are at least N more positions in the buffer. void grow(size_t N) { - if (N + CurrentPosition >= BufferCapacity) { - BufferCapacity *= 2; - if (BufferCapacity < N + CurrentPosition) - BufferCapacity = N + CurrentPosition; + size_t Need = N + CurrentPosition; + if (Need > BufferCapacity) { + // Avoid many reallocations during startup, with a bit of hysteresis. + constexpr size_t MinInitAlloc = 1024; + Need = std::max(Need, MinInitAlloc); + BufferCapacity = std::max(Need, BufferCapacity * 2); Buffer = static_cast(std::realloc(Buffer, BufferCapacity)); if (Buffer == nullptr) std::terminate(); diff --git a/llvm/include/llvm/Demangle/Utility.h b/llvm/include/llvm/Demangle/Utility.h --- a/llvm/include/llvm/Demangle/Utility.h +++ b/llvm/include/llvm/Demangle/Utility.h @@ -33,12 +33,14 @@ size_t CurrentPosition = 0; size_t BufferCapacity = 0; - // Ensure there is at least n more positions in buffer. + // Ensure there are at least N more positions in the buffer. void grow(size_t N) { - if (N + CurrentPosition >= BufferCapacity) { - BufferCapacity *= 2; - if (BufferCapacity < N + CurrentPosition) - BufferCapacity = N + CurrentPosition; + size_t Need = N + CurrentPosition; + if (Need > BufferCapacity) { + // Avoid many reallocations during startup, with a bit of hysteresis. + constexpr size_t MinInitAlloc = 1024; + Need = std::max(Need, MinInitAlloc); + BufferCapacity = std::max(Need, BufferCapacity * 2); Buffer = static_cast(std::realloc(Buffer, BufferCapacity)); if (Buffer == nullptr) std::terminate();