diff --git a/lld/include/lld/Core/ArchiveLibraryFile.h b/lld/include/lld/Core/ArchiveLibraryFile.h index dfb862e7a78d..4de6d17f6a90 100644 --- a/lld/include/lld/Core/ArchiveLibraryFile.h +++ b/lld/include/lld/Core/ArchiveLibraryFile.h @@ -11,7 +11,6 @@ #define LLD_CORE_ARCHIVE_LIBRARY_FILE_H #include "lld/Core/File.h" -#include "lld/Core/Parallel.h" #include namespace lld { @@ -38,12 +37,6 @@ public: virtual std::error_code parseAllMembers(std::vector> &result) = 0; - // Parses a member file containing a given symbol, so that when you - // need the file find() can return that immediately. Calling this function - // has no side effect other than pre-instantiating a file. Calling this - // function doesn't affect correctness. - virtual void preload(TaskGroup &group, StringRef symbolName) {} - protected: /// only subclasses of ArchiveLibraryFile can be instantiated ArchiveLibraryFile(StringRef path) : File(path, kindArchiveLibrary) {} diff --git a/lld/include/lld/Core/LinkingContext.h b/lld/include/lld/Core/LinkingContext.h index bd13961f5f3d..acde577ed1cc 100644 --- a/lld/include/lld/Core/LinkingContext.h +++ b/lld/include/lld/Core/LinkingContext.h @@ -13,7 +13,6 @@ #include "lld/Core/Error.h" #include "lld/Core/LLVM.h" #include "lld/Core/Node.h" -#include "lld/Core/Parallel.h" #include "lld/Core/Reference.h" #include "lld/Core/Reader.h" #include "llvm/Support/ErrorOr.h" @@ -309,8 +308,6 @@ public: return std::error_code(); } - TaskGroup &getTaskGroup() { return _taskGroup; } - /// @} protected: LinkingContext(); // Must be subclassed @@ -354,7 +351,6 @@ protected: private: /// Validate the subclass bits. Only called by validate. virtual bool validateImpl(raw_ostream &diagnostics) = 0; - TaskGroup _taskGroup; }; } // end namespace lld diff --git a/lld/include/lld/Core/Parallel.h b/lld/include/lld/Core/Parallel.h index db6a73ae97f9..2dde97d9e3f0 100644 --- a/lld/include/lld/Core/Parallel.h +++ b/lld/include/lld/Core/Parallel.h @@ -62,41 +62,6 @@ public: } }; -/// \brief An implementation of future. std::future and std::promise in -/// old libstdc++ have a threading bug; there is a small chance that a -/// call of future::get throws an exception in the normal use case. -/// We want to use our own future implementation until we drop support -/// of old versions of libstdc++. -/// https://gcc.gnu.org/ml/gcc-patches/2014-05/msg01389.html -template class Future { -public: - Future() : _hasValue(false) {} - - void set(T &&val) { - assert(!_hasValue); - { - std::unique_lock lock(_mutex); - _val = val; - _hasValue = true; - } - _cond.notify_all(); - } - - T &get() { - std::unique_lock lock(_mutex); - if (_hasValue) - return _val; - _cond.wait(lock, [&] { return _hasValue; }); - return _val; - } - -private: - T _val; - bool _hasValue; - std::mutex _mutex; - std::condition_variable _cond; -}; - // Classes in this namespace are implementation details of this header. namespace internal { diff --git a/lld/include/lld/Core/Resolver.h b/lld/include/lld/Core/Resolver.h index b244a35214a8..0a37e79be6e3 100644 --- a/lld/include/lld/Core/Resolver.h +++ b/lld/include/lld/Core/Resolver.h @@ -64,7 +64,6 @@ private: File *getFile(int &index); /// \brief The main function that iterates over the files to resolve - void updatePreloadArchiveMap(); bool resolveUndefines(); void updateReferences(); void deadStripOptimize(); @@ -76,7 +75,6 @@ private: void markLive(const Atom *atom); void addAtoms(const std::vector&); - void maybePreloadArchiveMember(StringRef sym); class MergedFile : public SimpleFile { public: @@ -98,10 +96,6 @@ private: std::map _newUndefinesAdded; size_t _fileIndex; - // Preloading - llvm::StringMap _archiveMap; - llvm::DenseSet _archiveSeen; - // List of undefined symbols. std::vector _undefines; diff --git a/lld/lib/Core/Resolver.cpp b/lld/lib/Core/Resolver.cpp index de98fb83412d..98d2c71023f4 100644 --- a/lld/lib/Core/Resolver.cpp +++ b/lld/lib/Core/Resolver.cpp @@ -36,10 +36,8 @@ ErrorOr Resolver::handleFile(File &file) { for (const DefinedAtom *atom : file.defined()) doDefinedAtom(*atom); for (const UndefinedAtom *atom : file.undefined()) { - if (doUndefinedAtom(*atom)) { + if (doUndefinedAtom(*atom)) undefAdded = true; - maybePreloadArchiveMember(atom->name()); - } } for (const SharedLibraryAtom *atom : file.sharedLibrary()) doSharedLibraryAtom(*atom); @@ -98,7 +96,6 @@ ErrorOr Resolver::handleArchiveFile(File &file) { bool dataSymbolOnly)->ErrorOr { if (File *member = archiveFile->find(undefName, dataSymbolOnly)) { member->setOrdinal(_ctx.getNextOrdinalAndIncrement()); - updatePreloadArchiveMap(); return handleFile(*member); } return false; @@ -207,17 +204,6 @@ void Resolver::addAtoms(const std::vector &newAtoms) { doDefinedAtom(*newAtom); } -// Instantiate an archive file member if there's a file containing a -// defined symbol for a given symbol name. Instantiation is done in a -// different worker thread and has no visible side effect. -void Resolver::maybePreloadArchiveMember(StringRef sym) { - auto it = _archiveMap.find(sym); - if (it == _archiveMap.end()) - return; - ArchiveLibraryFile *archive = it->second; - archive->preload(_ctx.getTaskGroup(), sym); -} - // Returns true if at least one of N previous files has created an // undefined symbol. bool Resolver::undefinesAdded(int begin, int end) { @@ -248,23 +234,6 @@ File *Resolver::getFile(int &index) { return cast(inputs[index++].get())->getFile(); } -// Update a map of Symbol -> ArchiveFile. The map is used for speculative -// file loading. -void Resolver::updatePreloadArchiveMap() { - std::vector> &nodes = _ctx.getNodes(); - for (int i = nodes.size() - 1; i >= 0; --i) { - auto *fnode = dyn_cast(nodes[i].get()); - if (!fnode) - continue; - auto *archive = dyn_cast(fnode->getFile()); - if (!archive || _archiveSeen.count(archive)) - continue; - _archiveSeen.insert(archive); - for (StringRef sym : archive->getDefinedSymbols()) - _archiveMap[sym] = archive; - } -} - // Keep adding atoms until _ctx.getNextFile() returns an error. This // function is where undefined atoms are resolved. bool Resolver::resolveUndefines() { @@ -287,7 +256,6 @@ bool Resolver::resolveUndefines() { } DEBUG_WITH_TYPE("resolver", llvm::dbgs() << "Loaded file: " << file->path() << "\n"); - updatePreloadArchiveMap(); switch (file->kind()) { case File::kindErrorObject: case File::kindNormalizedObject: @@ -503,7 +471,6 @@ void Resolver::removeCoalescedAwayAtoms() { bool Resolver::resolve() { DEBUG_WITH_TYPE("resolver", llvm::dbgs() << "******** Resolving atom references:\n"); - updatePreloadArchiveMap(); if (!resolveUndefines()) return false; updateReferences(); diff --git a/lld/lib/Driver/Driver.cpp b/lld/lib/Driver/Driver.cpp index 6cc8c7338a78..af638a1076cb 100644 --- a/lld/lib/Driver/Driver.cpp +++ b/lld/lib/Driver/Driver.cpp @@ -11,7 +11,6 @@ #include "lld/Core/File.h" #include "lld/Core/Instrumentation.h" #include "lld/Core/LLVM.h" -#include "lld/Core/Parallel.h" #include "lld/Core/PassManager.h" #include "lld/Core/Reader.h" #include "lld/Core/Resolver.h" @@ -84,7 +83,7 @@ bool Driver::link(LinkingContext &ctx, raw_ostream &diagnostics) { for (std::unique_ptr &ie : ctx.getNodes()) if (FileNode *node = dyn_cast(ie.get())) - ctx.getTaskGroup().spawn([node] { node->getFile()->parse(); }); + node->getFile()->parse(); std::vector> internalFiles; ctx.createInternalFiles(internalFiles); @@ -108,10 +107,8 @@ bool Driver::link(LinkingContext &ctx, raw_ostream &diagnostics) { // Do core linking. ScopedTask resolveTask(getDefaultDomain(), "Resolve"); Resolver resolver(ctx); - if (!resolver.resolve()) { - ctx.getTaskGroup().sync(); + if (!resolver.resolve()) return false; - } std::unique_ptr merged = resolver.resultFile(); resolveTask.end(); diff --git a/lld/lib/ReaderWriter/FileArchive.cpp b/lld/lib/ReaderWriter/FileArchive.cpp index 7786d11dced7..5b4605e1ce5a 100644 --- a/lld/lib/ReaderWriter/FileArchive.cpp +++ b/lld/lib/ReaderWriter/FileArchive.cpp @@ -10,7 +10,6 @@ #include "lld/Core/ArchiveLibraryFile.h" #include "lld/Core/LLVM.h" #include "lld/Core/LinkingContext.h" -#include "lld/Core/Parallel.h" #include "lld/Driver/Driver.h" #include "llvm/ADT/Hashing.h" #include "llvm/ADT/StringRef.h" @@ -64,17 +63,6 @@ public: _membersInstantiated.insert(memberStart); - // Check if a file is preloaded. - { - std::lock_guard lock(_mutex); - auto it = _preloaded.find(memberStart); - if (it != _preloaded.end()) { - std::unique_ptr> &p = it->second; - Future *future = p.get(); - return future->get(); - } - } - std::unique_ptr result; if (instantiateMember(ci, result)) return nullptr; @@ -86,38 +74,6 @@ public: return file; } - // Instantiate a member file containing a given symbol name. - void preload(TaskGroup &group, StringRef name) override { - auto member = _symbolMemberMap.find(name); - if (member == _symbolMemberMap.end()) - return; - Archive::child_iterator ci = member->second; - if (ci->getError()) - return; - - // Do nothing if a member is already instantiated. - ErrorOr buf = (*ci)->getBuffer(); - if (!buf) - return; - const char *memberStart = buf->data(); - if (_membersInstantiated.count(memberStart)) - return; - - std::lock_guard lock(_mutex); - if (_preloaded.find(memberStart) != _preloaded.end()) - return; - - // Instantiate the member - auto *future = new Future(); - _preloaded[memberStart] = std::unique_ptr>(future); - - group.spawn([=] { - std::unique_ptr result; - std::error_code ec = instantiateMember(ci, result); - future->set(ec ? nullptr : result.release()); - }); - } - /// \brief parse each member std::error_code parseAllMembers(std::vector> &result) override { @@ -262,7 +218,6 @@ private: InstantiatedSet _membersInstantiated; bool _logLoading; std::vector> _memberBuffers; - std::map>> _preloaded; std::mutex _mutex; FileVector _filesReturned; };