diff options
author | Rui Ueyama <ruiu@google.com> | 2015-07-05 22:50:00 +0000 |
---|---|---|
committer | Rui Ueyama <ruiu@google.com> | 2015-07-05 22:50:00 +0000 |
commit | adcde5384eb90bd8340b0bfe8f85f9435cc94abf (patch) | |
tree | a493018e36a376485a9b545cb036ff56a8ac6c7f | |
parent | 787e12aec1e21b225775a9a351b6fcc276e6b6ed (diff) | |
download | bcm5719-llvm-adcde5384eb90bd8340b0bfe8f85f9435cc94abf.tar.gz bcm5719-llvm-adcde5384eb90bd8340b0bfe8f85f9435cc94abf.zip |
COFF: Make ArchiveFile::getMember thread-safe.
This function is called SymbolTable::readObjects, so in order to
parallelize that function, we have to make this function thread-safe.
llvm-svn: 241420
-rw-r--r-- | lld/COFF/InputFiles.cpp | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/lld/COFF/InputFiles.cpp b/lld/COFF/InputFiles.cpp index 87efd07e68c..6bdfd4faa82 100644 --- a/lld/COFF/InputFiles.cpp +++ b/lld/COFF/InputFiles.cpp @@ -18,6 +18,7 @@ #include "llvm/Support/Debug.h" #include "llvm/Support/Endian.h" #include "llvm/Support/raw_ostream.h" +#include <mutex> using namespace llvm::object; using namespace llvm::support::endian; @@ -76,7 +77,9 @@ std::error_code ArchiveFile::parse() { } // Returns a buffer pointing to a member file containing a given symbol. +// This function is thread-safe. ErrorOr<MemoryBufferRef> ArchiveFile::getMember(const Archive::Symbol *Sym) { + static std::mutex Mu; auto ItOrErr = Sym->getMember(); if (auto EC = ItOrErr.getError()) return EC; @@ -84,7 +87,9 @@ ErrorOr<MemoryBufferRef> ArchiveFile::getMember(const Archive::Symbol *Sym) { // Return an empty buffer if we have already returned the same buffer. const char *StartAddr = It->getBuffer().data(); + Mu.lock(); auto Pair = Seen.insert(StartAddr); + Mu.unlock(); if (!Pair.second) return MemoryBufferRef(); return It->getMemoryBufferRef(); |