[Lldb-commits] [lldb] [lldb] Enable locate module callback for main executable in launch mode (PR #176266)
via lldb-commits
lldb-commits at lists.llvm.org
Thu Jan 15 15:05:04 PST 2026
https://github.com/GeorgeHuyubo updated https://github.com/llvm/llvm-project/pull/176266
>From 6d9532e2a8285395a801cf51d124053704d7d80f Mon Sep 17 00:00:00 2001
From: George Hu <georgehuyubo at gmail.com>
Date: Thu, 15 Jan 2026 15:01:33 -0800
Subject: [PATCH] [lldb] Enable locate module callback for main executable in
launch mode
---
lldb/include/lldb/Core/ModuleSpec.h | 15 +++++++++++++++
lldb/source/Core/ModuleList.cpp | 30 ++++++++++++++++++-----------
lldb/source/Target/TargetList.cpp | 4 ++++
3 files changed, 38 insertions(+), 11 deletions(-)
diff --git a/lldb/include/lldb/Core/ModuleSpec.h b/lldb/include/lldb/Core/ModuleSpec.h
index acbc85b48f02c..1ce857c9765cb 100644
--- a/lldb/include/lldb/Core/ModuleSpec.h
+++ b/lldb/include/lldb/Core/ModuleSpec.h
@@ -138,6 +138,17 @@ class ModuleSpec {
/// the specified module.
void SetTarget(std::shared_ptr<Target> target) { m_target_wp = target; }
+ lldb::PlatformSP GetPlatformSP() const { return m_platform_wp.lock(); }
+
+ /// Set the platform to be used when resolving a module.
+ ///
+ /// This is useful when a Target is not yet available (e.g., during target
+ /// creation) but a Platform is. The platform can be used to invoke locate
+ /// module callbacks and other platform-specific module resolution logic.
+ void SetPlatform(std::shared_ptr<Platform> platform) {
+ m_platform_wp = platform;
+ }
+
void Clear() {
m_file.Clear();
m_platform_file.Clear();
@@ -150,6 +161,7 @@ class ModuleSpec {
m_source_mappings.Clear(false);
m_object_mod_time = llvm::sys::TimePoint<>();
m_target_wp.reset();
+ m_platform_wp.reset();
}
explicit operator bool() const {
@@ -283,6 +295,9 @@ class ModuleSpec {
/// debug info search paths, can be essential. The target's platform can also
/// be used to locate or download the specified module.
std::weak_ptr<Target> m_target_wp;
+ /// The platform used when resolving a module. This is useful when a Target
+ /// is not yet available (e.g., during target creation) but a Platform is.
+ std::weak_ptr<Platform> m_platform_wp;
uint64_t m_object_offset = 0;
uint64_t m_object_size = 0;
llvm::sys::TimePoint<> m_object_mod_time;
diff --git a/lldb/source/Core/ModuleList.cpp b/lldb/source/Core/ModuleList.cpp
index be6ff723e0ffa..e6d8192ea4a55 100644
--- a/lldb/source/Core/ModuleList.cpp
+++ b/lldb/source/Core/ModuleList.cpp
@@ -1103,18 +1103,26 @@ ModuleList::GetSharedModule(const ModuleSpec &module_spec, ModuleSP &module_sp,
if (module_sp)
return error;
- // Try target's platform locate module callback before second attempt.
+ // Try platform's locate module callback before second attempt.
+ // The platform can come from either the Target (if available) or directly
+ // from the ModuleSpec (useful when Target is not yet created, e.g., during
+ // target creation for launch mode).
if (invoke_locate_callback) {
- TargetSP target_sp = module_spec.GetTargetSP();
- if (target_sp && target_sp->IsValid()) {
- if (PlatformSP platform_sp = target_sp->GetPlatform()) {
- FileSpec symbol_file_spec;
- platform_sp->CallLocateModuleCallbackIfSet(
- module_spec, module_sp, symbol_file_spec, did_create_ptr);
- if (module_sp) {
- // The callback found a module.
- return error;
- }
+ PlatformSP platform_sp;
+ if (TargetSP target_sp = module_spec.GetTargetSP()) {
+ if (target_sp->IsValid())
+ platform_sp = target_sp->GetPlatform();
+ }
+ if (!platform_sp)
+ platform_sp = module_spec.GetPlatformSP();
+
+ if (platform_sp) {
+ FileSpec symbol_file_spec;
+ platform_sp->CallLocateModuleCallbackIfSet(
+ module_spec, module_sp, symbol_file_spec, did_create_ptr);
+ if (module_sp) {
+ // The callback found a module.
+ return error;
}
}
}
diff --git a/lldb/source/Target/TargetList.cpp b/lldb/source/Target/TargetList.cpp
index ce04e9c1209b8..623f8c4cf8324 100644
--- a/lldb/source/Target/TargetList.cpp
+++ b/lldb/source/Target/TargetList.cpp
@@ -306,6 +306,10 @@ Status TargetList::CreateTargetInternal(Debugger &debugger,
if (platform_sp) {
ModuleSpec module_spec(file, arch);
module_spec.SetTarget(target_sp);
+ // Set the platform so that GetSharedModule can use it for the locate
+ // module callback, even when Target is not yet available (during target
+ // creation for launch mode).
+ module_spec.SetPlatform(platform_sp);
error = platform_sp->ResolveExecutable(module_spec, exe_module_sp);
}
More information about the lldb-commits
mailing list