Index: ReaderWriter/ELF/OutputELFWriter.cpp =================================================================== --- ReaderWriter/ELF/OutputELFWriter.cpp +++ ReaderWriter/ELF/OutputELFWriter.cpp @@ -45,8 +45,15 @@ assert(!_file->hasAtoms() && "The file shouldn't have atoms yet"); _resolver(sym, *_file); - // If atoms were added - release the file to the caller. - return _file->hasAtoms() ? _file.release() : nullptr; + + if (!_file->hasAtoms()) + return nullptr; + + // If atoms were added - return the file but also store it for later + // destruction. + File *result = _file.get(); + _returnedFiles.push_back(std::move(_file)); + return result; } private: @@ -57,6 +64,7 @@ // reversed destruction order. llvm::BumpPtrAllocator _alloc; unique_bump_ptr> _file; + std::vector>> _returnedFiles; }; } // end anon namespace Index: ReaderWriter/FileArchive.cpp =================================================================== --- ReaderWriter/FileArchive.cpp +++ ReaderWriter/FileArchive.cpp @@ -7,6 +7,7 @@ // //===----------------------------------------------------------------------===// +#include "lld/Driver/Driver.h" #include "lld/Core/ArchiveLibraryFile.h" #include "lld/Core/LLVM.h" #include "lld/Core/LinkingContext.h" @@ -76,8 +77,11 @@ if (instantiateMember(ci, result)) return nullptr; - // give up the pointer so that this object no longer manages it - return result.release(); + File *file = result.get(); + _filesReturned.push_back(std::move(result)); + + // Give up the file pointer. It was stored and will be destroyed with destruction of FileArchive + return file; } // Instantiate a member file containing a given symbol name. @@ -259,6 +263,7 @@ std::vector> _memberBuffers; std::map>> _preloaded; std::mutex _mutex; + FileVector _filesReturned; }; class ArchiveReader : public Reader {