diff --git a/llvm/include/llvm/ExecutionEngine/Orc/MachOPlatform.h b/llvm/include/llvm/ExecutionEngine/Orc/MachOPlatform.h index f869ebdfbe4e..15fe079eccaf 100644 --- a/llvm/include/llvm/ExecutionEngine/Orc/MachOPlatform.h +++ b/llvm/include/llvm/ExecutionEngine/Orc/MachOPlatform.h @@ -143,12 +143,15 @@ private: MachOJITDylibInitializers::SectionExtent ObjCSelRefs, MachOJITDylibInitializers::SectionExtent ObjCClassList); - std::mutex PlatformMutex; ExecutionSession &ES; ObjectLinkingLayer &ObjLinkingLayer; std::unique_ptr StandardSymbolsObject; DenseMap RegisteredInitSymbols; + + // InitSeqs gets its own mutex to avoid locking the whole session when + // aggregating data from the jitlink. + std::mutex InitSeqsMutex; DenseMap InitSeqs; }; diff --git a/llvm/lib/ExecutionEngine/Orc/MachOPlatform.cpp b/llvm/lib/ExecutionEngine/Orc/MachOPlatform.cpp index 9a836677ef15..13a187c66387 100644 --- a/llvm/lib/ExecutionEngine/Orc/MachOPlatform.cpp +++ b/llvm/lib/ExecutionEngine/Orc/MachOPlatform.cpp @@ -163,7 +163,6 @@ Error MachOPlatform::notifyAdding(JITDylib &JD, const MaterializationUnit &MU) { if (!InitSym) return Error::success(); - std::lock_guard Lock(PlatformMutex); RegisteredInitSymbols[&JD].add(InitSym); LLVM_DEBUG({ dbgs() << "MachOPlatform: Registered init symbol " << *InitSym << " for MU " @@ -187,11 +186,10 @@ MachOPlatform::getInitializerSequence(JITDylib &JD) { std::vector DFSLinkOrder; while (true) { - // Lock the platform while we search for any initializer symbols to - // look up. + DenseMap NewInitSymbols; - { - std::lock_guard Lock(PlatformMutex); + + ES.runSessionLocked([&]() { DFSLinkOrder = getDFSLinkOrder(JD); for (auto *InitJD : DFSLinkOrder) { @@ -201,7 +199,7 @@ MachOPlatform::getInitializerSequence(JITDylib &JD) { RegisteredInitSymbols.erase(RISItr); } } - } + }); if (NewInitSymbols.empty()) break; @@ -228,7 +226,7 @@ MachOPlatform::getInitializerSequence(JITDylib &JD) { // Lock again to collect the initializers. InitializerSequence FullInitSeq; { - std::lock_guard Lock(PlatformMutex); + std::lock_guard Lock(InitSeqsMutex); for (auto *InitJD : reverse(DFSLinkOrder)) { LLVM_DEBUG({ dbgs() << "MachOPlatform: Appending inits for \"" << InitJD->getName() @@ -251,7 +249,7 @@ MachOPlatform::getDeinitializerSequence(JITDylib &JD) { DeinitializerSequence FullDeinitSeq; { - std::lock_guard Lock(PlatformMutex); + std::lock_guard Lock(InitSeqsMutex); for (auto *DeinitJD : DFSLinkOrder) { FullDeinitSeq.emplace_back(DeinitJD, MachOJITDylibDeinitializers()); } @@ -285,7 +283,7 @@ void MachOPlatform::registerInitInfo( MachOJITDylibInitializers::SectionExtent ModInits, MachOJITDylibInitializers::SectionExtent ObjCSelRefs, MachOJITDylibInitializers::SectionExtent ObjCClassList) { - std::lock_guard Lock(PlatformMutex); + std::lock_guard Lock(InitSeqsMutex); auto &InitSeq = InitSeqs[&JD];