Index: lldb/source/Plugins/DynamicLoader/POSIX-DYLD/DynamicLoaderPOSIXDYLD.cpp =================================================================== --- lldb/source/Plugins/DynamicLoader/POSIX-DYLD/DynamicLoaderPOSIXDYLD.cpp +++ lldb/source/Plugins/DynamicLoader/POSIX-DYLD/DynamicLoaderPOSIXDYLD.cpp @@ -24,6 +24,7 @@ #include "lldb/Utility/LLDBLog.h" #include "lldb/Utility/Log.h" #include "lldb/Utility/ProcessInfo.h" +#include "llvm/Support/ThreadPool.h" #include @@ -602,9 +603,24 @@ m_process->PrefetchModuleSpecs( module_names, m_process->GetTarget().GetArchitecture().GetTriple()); - for (I = m_rendezvous.begin(), E = m_rendezvous.end(); I != E; ++I) { - ModuleSP module_sp = + std::vector infos; + for (I = m_rendezvous.begin(), E = m_rendezvous.end(); I != E; ++I) + infos.push_back(I); + std::vector loaded_modules; + loaded_modules.resize(infos.size()); + llvm::ThreadPool pool(llvm::optimal_concurrency(infos.size())); + auto load_module_fn = [&](size_t idx) { + DYLDRendezvous::iterator I = infos[idx]; + loaded_modules[idx] = LoadModuleAtAddress(I->file_spec, I->link_addr, I->base_addr, true); + }; + for (size_t i = 0; i < infos.size(); ++i) + pool.async(load_module_fn, i); + pool.wait(); + + for (size_t i = 0; i < infos.size(); ++i) { + DYLDRendezvous::iterator I = infos[i]; + ModuleSP module_sp = loaded_modules[i]; if (module_sp.get()) { LLDB_LOG(log, "LoadAllCurrentModules loading module: {0}", I->file_spec.GetFilename());