From adcde5384eb90bd8340b0bfe8f85f9435cc94abf Mon Sep 17 00:00:00 2001 From: Rui Ueyama Date: Sun, 5 Jul 2015 22:50:00 +0000 Subject: [PATCH] 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 --- lld/COFF/InputFiles.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lld/COFF/InputFiles.cpp b/lld/COFF/InputFiles.cpp index 87efd07e68c5..6bdfd4faa826 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 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 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 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();