diff options
-rw-r--r-- | lld/COFF/SymbolTable.cpp | 44 | ||||
-rw-r--r-- | lld/COFF/SymbolTable.h | 11 |
2 files changed, 29 insertions, 26 deletions
diff --git a/lld/COFF/SymbolTable.cpp b/lld/COFF/SymbolTable.cpp index 24f018d8067..accc8ef33fc 100644 --- a/lld/COFF/SymbolTable.cpp +++ b/lld/COFF/SymbolTable.cpp @@ -27,10 +27,12 @@ void SymbolTable::addFile(std::unique_ptr<InputFile> FileP) { InputFile *File = FileP.get(); Files.push_back(std::move(FileP)); if (auto *F = dyn_cast<ArchiveFile>(File)) { - ArchiveQueue.push_back(F); + ArchiveQueue.push_back( + std::async(std::launch::async, [=]() { F->parse(); return F; })); return; } - ObjectQueue.push_back(File); + ObjectQueue.push_back( + std::async(std::launch::async, [=]() { File->parse(); return File; })); if (auto *F = dyn_cast<ObjectFile>(File)) { ObjectFiles.push_back(F); } else if (auto *F = dyn_cast<BitcodeFile>(File)) { @@ -56,13 +58,11 @@ void SymbolTable::readArchives() { if (ArchiveQueue.empty()) return; - parallel_for_each(ArchiveQueue.begin(), ArchiveQueue.end(), - [](ArchiveFile *File) { File->parse(); }); - // Add lazy symbols to the symbol table. Lazy symbols that conflict // with existing undefined symbols are accumulated in LazySyms. std::vector<Symbol *> LazySyms; - for (ArchiveFile *File : ArchiveQueue) { + for (std::future<ArchiveFile *> &Future : ArchiveQueue) { + ArchiveFile *File = Future.get(); if (Config->Verbose) llvm::outs() << "Reading " << File->getShortName() << "\n"; for (Lazy &Sym : File->getLazySymbols()) @@ -82,25 +82,21 @@ void SymbolTable::readObjects() { // Add defined and undefined symbols to the symbol table. std::vector<StringRef> Directives; - for (size_t I = 0; I < ObjectQueue.size();) { - parallel_for_each(ObjectQueue.begin() + I, ObjectQueue.end(), - [](InputFile *File) { File->parse(); }); - for (size_t E = ObjectQueue.size(); I != E; ++I) { - InputFile *File = ObjectQueue[I]; + for (size_t I = 0; I < ObjectQueue.size(); ++I) { + InputFile *File = ObjectQueue[I].get(); + if (Config->Verbose) + llvm::outs() << "Reading " << File->getShortName() << "\n"; + // Adding symbols may add more files to ObjectQueue + // (but not to ArchiveQueue). + for (SymbolBody *Sym : File->getSymbols()) + if (Sym->isExternal()) + addSymbol(Sym); + StringRef S = File->getDirectives(); + if (!S.empty()) { + Directives.push_back(S); if (Config->Verbose) - llvm::outs() << "Reading " << File->getShortName() << "\n"; - // Adding symbols may add more files to ObjectQueue - // (but not to ArchiveQueue). - for (SymbolBody *Sym : File->getSymbols()) - if (Sym->isExternal()) - addSymbol(Sym); - StringRef S = File->getDirectives(); - if (!S.empty()) { - Directives.push_back(S); - if (Config->Verbose) - llvm::outs() << "Directives: " << File->getShortName() - << ": " << S << "\n"; - } + llvm::outs() << "Directives: " << File->getShortName() + << ": " << S << "\n"; } } ObjectQueue.clear(); diff --git a/lld/COFF/SymbolTable.h b/lld/COFF/SymbolTable.h index b8d12c4f92e..ce305bfa874 100644 --- a/lld/COFF/SymbolTable.h +++ b/lld/COFF/SymbolTable.h @@ -16,6 +16,13 @@ #include "llvm/Support/Allocator.h" #include "llvm/Support/raw_ostream.h" +#ifdef _MSC_VER +// <future> depends on <eh.h> for __uncaught_exception. +#include <eh.h> +#endif + +#include <future> + namespace llvm { struct LTOCodeGenerator; } @@ -104,8 +111,8 @@ private: llvm::DenseMap<StringRef, Symbol *> Symtab; std::vector<std::unique_ptr<InputFile>> Files; - std::vector<ArchiveFile *> ArchiveQueue; - std::vector<InputFile *> ObjectQueue; + std::vector<std::future<ArchiveFile *>> ArchiveQueue; + std::vector<std::future<InputFile *>> ObjectQueue; std::vector<BitcodeFile *> BitcodeFiles; std::vector<SmallVector<char, 0>> Objs; |