Index: include/llvm/ExecutionEngine/Orc/Core.h =================================================================== --- include/llvm/ExecutionEngine/Orc/Core.h +++ include/llvm/ExecutionEngine/Orc/Core.h @@ -634,6 +634,15 @@ return ES.runSessionLocked([&]() { return F(SearchOrder); }); } + /// Visit related dylibs in search order. This locks a mutex, so SearchOrder + /// can't be modified during visitation. Session lock is NOT acquired. + template + auto visitInSearchOrder(Func &&F) const + -> decltype(F(std::declval())) { + std::lock_guard Lock(SearchOrderMutex); + return F(SearchOrder); + } + /// Define all symbols provided by the materialization unit to be part /// of the given JITDylib. template @@ -753,6 +762,7 @@ MaterializingInfosMap MaterializingInfos; FallbackDefinitionGeneratorFunction FallbackDefinitionGenerator; JITDylibList SearchOrder; + mutable std::mutex SearchOrderMutex; }; /// An ExecutionSession represents a running JIT program. Index: lib/ExecutionEngine/Orc/Core.cpp =================================================================== --- lib/ExecutionEngine/Orc/Core.cpp +++ lib/ExecutionEngine/Orc/Core.cpp @@ -1239,14 +1239,17 @@ if (SearchThisJITDylibFirst && NewSearchOrder.front() != this) NewSearchOrder.insert(NewSearchOrder.begin(), this); + std::lock_guard Lock(SearchOrderMutex); ES.runSessionLocked([&]() { SearchOrder = std::move(NewSearchOrder); }); } void JITDylib::addToSearchOrder(JITDylib &JD) { + std::lock_guard Lock(SearchOrderMutex); ES.runSessionLocked([&]() { SearchOrder.push_back(&JD); }); } void JITDylib::replaceInSearchOrder(JITDylib &OldJD, JITDylib &NewJD) { + std::lock_guard Lock(SearchOrderMutex); ES.runSessionLocked([&]() { auto I = std::find(SearchOrder.begin(), SearchOrder.end(), &OldJD); @@ -1256,6 +1259,7 @@ } void JITDylib::removeFromSearchOrder(JITDylib &JD) { + std::lock_guard Lock(SearchOrderMutex); ES.runSessionLocked([&]() { auto I = std::find(SearchOrder.begin(), SearchOrder.end(), &JD); if (I != SearchOrder.end()) Index: lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp =================================================================== --- lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp +++ lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp @@ -30,7 +30,7 @@ }; auto InternedResult = - MR.getTargetJITDylib().withSearchOrderDo([&](const JITDylibList &JDs) { + MR.getTargetJITDylib().visitInSearchOrder([&](const JITDylibList &JDs) { return ES.lookup(JDs, InternedSymbols, RegisterDependencies, false); });