sammccall created this revision. sammccall added a reviewer: kadircet. Herald added a project: All. sammccall requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits.
After building a PCH, the vector capacity is on average ~1/3 unused. If we're going to keep it in memory for a while, reallocate to the right size. Take care to do this once clang is destroyed so that we can reuse its memory rather than requesting more. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D124242 Files: clang/lib/Frontend/PrecompiledPreamble.cpp Index: clang/lib/Frontend/PrecompiledPreamble.cpp =================================================================== --- clang/lib/Frontend/PrecompiledPreamble.cpp +++ clang/lib/Frontend/PrecompiledPreamble.cpp @@ -374,6 +374,15 @@ return StringRef(Memory->Data.data(), Memory->Data.size()); } + // Shrink in-memory buffers to fit. + // This incurs a copy, but preambles tend to be long-lived. + // Only safe to call once nothing can alias the buffer. + void shrink() { + if (!Memory) + return; + Memory->Data = decltype(Memory->Data)(Memory->Data); + } + private: PCHStorage() = default; PCHStorage(const PCHStorage &) = delete; @@ -520,7 +529,7 @@ if (!Act->hasEmittedPreamblePCH()) return BuildPreambleError::CouldntEmitPCH; - Act.reset(); // Frees the PCH buffer frees, unless Storage keeps it in memory. + Act.reset(); // Frees the PCH buffer, unless Storage keeps it in memory. // Keep track of all of the files that the source manager knows about, // so we can verify whether they have changed or not. @@ -545,6 +554,11 @@ } } + // Shrinking the storage requires extra temporary memory. + // Destroying clang first reduces peak memory usage. + CICleanup.unregister(); + Clang.reset(); + Storage->shrink(); return PrecompiledPreamble( std::move(Storage), std::move(PreambleBytes), PreambleEndsAtStartOfLine, std::move(FilesInPreamble), std::move(MissingFiles));
Index: clang/lib/Frontend/PrecompiledPreamble.cpp =================================================================== --- clang/lib/Frontend/PrecompiledPreamble.cpp +++ clang/lib/Frontend/PrecompiledPreamble.cpp @@ -374,6 +374,15 @@ return StringRef(Memory->Data.data(), Memory->Data.size()); } + // Shrink in-memory buffers to fit. + // This incurs a copy, but preambles tend to be long-lived. + // Only safe to call once nothing can alias the buffer. + void shrink() { + if (!Memory) + return; + Memory->Data = decltype(Memory->Data)(Memory->Data); + } + private: PCHStorage() = default; PCHStorage(const PCHStorage &) = delete; @@ -520,7 +529,7 @@ if (!Act->hasEmittedPreamblePCH()) return BuildPreambleError::CouldntEmitPCH; - Act.reset(); // Frees the PCH buffer frees, unless Storage keeps it in memory. + Act.reset(); // Frees the PCH buffer, unless Storage keeps it in memory. // Keep track of all of the files that the source manager knows about, // so we can verify whether they have changed or not. @@ -545,6 +554,11 @@ } } + // Shrinking the storage requires extra temporary memory. + // Destroying clang first reduces peak memory usage. + CICleanup.unregister(); + Clang.reset(); + Storage->shrink(); return PrecompiledPreamble( std::move(Storage), std::move(PreambleBytes), PreambleEndsAtStartOfLine, std::move(FilesInPreamble), std::move(MissingFiles));
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits