[lld] 11d1aa0 - [COFF] Free some memory used for chunks

David Blaikie via llvm-commits llvm-commits at lists.llvm.org
Mon Jun 8 18:55:16 PDT 2020


Would std::vector's shrink_to_fit (
https://en.cppreference.com/w/cpp/container/vector/shrink_to_fit ) be
a more clear way of writing this?

On Mon, Jun 1, 2020 at 6:52 PM Reid Kleckner via llvm-commits
<llvm-commits at lists.llvm.org> wrote:
>
>
> Author: Reid Kleckner
> Date: 2020-06-01T18:51:47-07:00
> New Revision: 11d1aa0bcc1197f1b3010171b02c6e9662f34b75
>
> URL: https://github.com/llvm/llvm-project/commit/11d1aa0bcc1197f1b3010171b02c6e9662f34b75
> DIFF: https://github.com/llvm/llvm-project/commit/11d1aa0bcc1197f1b3010171b02c6e9662f34b75.diff
>
> LOG: [COFF] Free some memory used for chunks
>
> First, do not reserve numSections in the Chunks array. In cases where
> there are many non-prevailing sections, this will overallocate memory
> which will not be used.
>
> Second, free the memory for sparseChunks after initializeSymbols. After
> that, it is never used.
>
> This saves 50MB of 627MB for my use case without affecting performance.
>
> Added:
>
>
> Modified:
>     lld/COFF/InputFiles.cpp
>     lld/COFF/InputFiles.h
>
> Removed:
>
>
>
> ################################################################################
> diff  --git a/lld/COFF/InputFiles.cpp b/lld/COFF/InputFiles.cpp
> index 3d4a27b60743..0adc2b91bd99 100644
> --- a/lld/COFF/InputFiles.cpp
> +++ b/lld/COFF/InputFiles.cpp
> @@ -215,7 +215,6 @@ static SectionChunk *const pendingComdat = reinterpret_cast<SectionChunk *>(1);
>
>  void ObjFile::initializeChunks() {
>    uint32_t numSections = coffObj->getNumberOfSections();
> -  chunks.reserve(numSections);
>    sparseChunks.resize(numSections + 1);
>    for (uint32_t i = 1; i < numSections + 1; ++i) {
>      const coff_section *sec = getSection(i);
> @@ -458,6 +457,9 @@ void ObjFile::initializeSymbols() {
>      uint32_t idx = kv.second;
>      checkAndSetWeakAlias(symtab, this, sym, symbols[idx]);
>    }
> +
> +  // Free the memory used by sparseChunks now that symbol loading is finished.
> +  decltype(sparseChunks)().swap(sparseChunks);
>  }
>
>  Symbol *ObjFile::createUndefined(COFFSymbolRef sym) {
>
> diff  --git a/lld/COFF/InputFiles.h b/lld/COFF/InputFiles.h
> index a8ddf29eee04..50323f596e2c 100644
> --- a/lld/COFF/InputFiles.h
> +++ b/lld/COFF/InputFiles.h
> @@ -285,19 +285,19 @@ class ObjFile : public InputFile {
>    std::vector<SectionChunk *> guardFidChunks;
>    std::vector<SectionChunk *> guardLJmpChunks;
>
> -  // This vector contains the same chunks as Chunks, but they are
> -  // indexed such that you can get a SectionChunk by section index.
> -  // Nonexistent section indices are filled with null pointers.
> -  // (Because section number is 1-based, the first slot is always a
> -  // null pointer.)
> -  std::vector<SectionChunk *> sparseChunks;
> -
>    // This vector contains a list of all symbols defined or referenced by this
>    // file. They are indexed such that you can get a Symbol by symbol
>    // index. Nonexistent indices (which are occupied by auxiliary
>    // symbols in the real symbol table) are filled with null pointers.
>    std::vector<Symbol *> symbols;
>
> +  // This vector contains the same chunks as Chunks, but they are
> +  // indexed such that you can get a SectionChunk by section index.
> +  // Nonexistent section indices are filled with null pointers.
> +  // (Because section number is 1-based, the first slot is always a
> +  // null pointer.) This vector is only valid during initialization.
> +  std::vector<SectionChunk *> sparseChunks;
> +
>    DWARFCache *dwarf = nullptr;
>  };
>
>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits


More information about the llvm-commits mailing list