Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions lldb/include/lldb/Core/ModuleList.h
Original file line number Diff line number Diff line change
Expand Up @@ -511,6 +511,12 @@ class ModuleList {
/// Atomically swaps the contents of this module list with \a other.
void Swap(ModuleList &other);

/// For each module in this ModuleList, preload its symbols.
///
/// \param[in] parallelize
/// If true, all modules will be preloaded in parallel.
void PreloadSymbols(bool parallelize) const;

protected:
// Class typedefs.
typedef std::vector<lldb::ModuleSP>
Expand Down
1 change: 1 addition & 0 deletions lldb/include/lldb/Target/DynamicLoader.h
Original file line number Diff line number Diff line change
Expand Up @@ -352,6 +352,7 @@ class DynamicLoader : public PluginInterface {
protected:
// Utility methods for derived classes

/// Find a module in the target that matches the given file.
lldb::ModuleSP FindModuleViaTarget(const FileSpec &file);

/// Checks to see if the target module has changed, updates the target
Expand Down
16 changes: 15 additions & 1 deletion lldb/include/lldb/Target/Target.h
Original file line number Diff line number Diff line change
Expand Up @@ -629,13 +629,20 @@ class Target : public std::enable_shared_from_this<Target>,
/// or identify a matching Module already present in the Target,
/// and return a shared pointer to it.
///
/// Note that this function previously also preloaded the module's symbols
/// depending on a setting. This function no longer does any module
/// preloading because that can potentially cause deadlocks when called in
/// parallel with this function.
///
/// \param[in] module_spec
/// The criteria that must be matched for the binary being loaded.
/// e.g. UUID, architecture, file path.
///
/// \param[in] notify
/// If notify is true, and the Module is new to this Target,
/// Target::ModulesDidLoad will be called.
/// Target::ModulesDidLoad will be called. See note in
/// Target::ModulesDidLoad about thread-safety with
/// Target::GetOrCreateModule.
/// If notify is false, it is assumed that the caller is adding
/// multiple Modules and will call ModulesDidLoad with the
/// full list at the end.
Expand Down Expand Up @@ -931,6 +938,13 @@ class Target : public std::enable_shared_from_this<Target>,
// the address of its previous instruction and return that address.
lldb::addr_t GetBreakableLoadAddress(lldb::addr_t addr);

/// This call may preload module symbols, and may do so in parallel depending
/// on the following target settings:
/// - TargetProperties::GetPreloadSymbols()
/// - TargetProperties::GetParallelModuleLoad()
///
/// Warning: if preloading is active and this is called in parallel with
/// Target::GetOrCreateModule, this may result in a ABBA deadlock situation.
void ModulesDidLoad(ModuleList &module_list);

void ModulesDidUnload(ModuleList &module_list, bool delete_locations);
Expand Down
3 changes: 2 additions & 1 deletion lldb/source/Core/DynamicLoader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -165,7 +165,8 @@ ModuleSP DynamicLoader::FindModuleViaTarget(const FileSpec &file) {
if (ModuleSP module_sp = target.GetImages().FindFirstModule(module_spec))
return module_sp;

if (ModuleSP module_sp = target.GetOrCreateModule(module_spec, false))
if (ModuleSP module_sp =
target.GetOrCreateModule(module_spec, /*notify=*/false))
return module_sp;

return nullptr;
Expand Down
20 changes: 20 additions & 0 deletions lldb/source/Core/ModuleList.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
//===----------------------------------------------------------------------===//

#include "lldb/Core/ModuleList.h"
#include "lldb/Core/Debugger.h"
#include "lldb/Core/Module.h"
#include "lldb/Core/ModuleSpec.h"
#include "lldb/Core/PluginManager.h"
Expand All @@ -28,6 +29,7 @@
#include "lldb/Utility/Log.h"
#include "lldb/Utility/UUID.h"
#include "lldb/lldb-defines.h"
#include "llvm/Support/ThreadPool.h"

#if defined(_WIN32)
#include "lldb/Host/windows/PosixApi.h"
Expand Down Expand Up @@ -1381,3 +1383,21 @@ void ModuleList::Swap(ModuleList &other) {
m_modules_mutex, other.m_modules_mutex);
m_modules.swap(other.m_modules);
}

void ModuleList::PreloadSymbols(bool parallelize) const {
std::lock_guard<std::recursive_mutex> guard(m_modules_mutex);

if (!parallelize) {
for (const ModuleSP &module_sp : m_modules)
module_sp->PreloadSymbols();
return;
}

llvm::ThreadPoolTaskGroup task_group(Debugger::GetThreadPool());
for (const ModuleSP &module_sp : m_modules)
task_group.async([module_sp] {
if (module_sp)
module_sp->PreloadSymbols();
});
task_group.wait();
}
Original file line number Diff line number Diff line change
Expand Up @@ -469,7 +469,8 @@ void DynamicLoaderPOSIXDYLD::RefreshModules() {
}

ModuleSP module_sp = LoadModuleAtAddress(
so_entry.file_spec, so_entry.link_addr, so_entry.base_addr, true);
so_entry.file_spec, so_entry.link_addr, so_entry.base_addr,
/*base_addr_is_offset=*/true);
if (!module_sp.get())
return;

Expand Down Expand Up @@ -726,9 +727,8 @@ void DynamicLoaderPOSIXDYLD::LoadAllCurrentModules() {
task_group.async(load_module_fn, *I);
task_group.wait();
} else {
for (I = m_rendezvous.begin(), E = m_rendezvous.end(); I != E; ++I) {
for (I = m_rendezvous.begin(), E = m_rendezvous.end(); I != E; ++I)
load_module_fn(*I);
}
}

m_process->GetTarget().ModulesDidLoad(module_list);
Expand Down
7 changes: 3 additions & 4 deletions lldb/source/Target/Target.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1855,6 +1855,9 @@ void Target::NotifyModulesRemoved(lldb_private::ModuleList &module_list) {
}

void Target::ModulesDidLoad(ModuleList &module_list) {
if (GetPreloadSymbols())
module_list.PreloadSymbols(GetParallelModuleLoad());

const size_t num_images = module_list.GetSize();
if (m_valid && num_images) {
for (size_t idx = 0; idx < num_images; ++idx) {
Expand Down Expand Up @@ -2509,10 +2512,6 @@ ModuleSP Target::GetOrCreateModule(const ModuleSpec &orig_module_spec,
if (symbol_file_spec)
module_sp->SetSymbolFileFileSpec(symbol_file_spec);

// Preload symbols outside of any lock, so hopefully we can do this for
// each library in parallel.
if (GetPreloadSymbols())
module_sp->PreloadSymbols();
llvm::SmallVector<ModuleSP, 1> replaced_modules;
for (ModuleSP &old_module_sp : old_modules) {
if (m_images.GetIndexForModule(old_module_sp.get()) !=
Expand Down
Loading