llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-lldb Author: None (GeorgeHuyubo) <details> <summary>Changes</summary> During target creation for launch mode, the locate module callback was not invoked for the main executable because the Target doesn't exist yet when ModuleList::GetSharedModule is called. This prevented custom module location logic from being applied to the main executable. This change adds a PlatformSP to ModuleSpec so that GetSharedModule can call the locate module callback using the Platform directly, even when Target is not available. The Platform is now set on the ModuleSpec in TargetList::CreateTargetInternal before calling ResolveExecutable. --- Full diff: https://github.com/llvm/llvm-project/pull/176266.diff 3 Files Affected: - (modified) lldb/include/lldb/Core/ModuleSpec.h (+15) - (modified) lldb/source/Core/ModuleList.cpp (+19-11) - (modified) lldb/source/Target/TargetList.cpp (+4) ``````````diff 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); } `````````` </details> https://github.com/llvm/llvm-project/pull/176266 _______________________________________________ lldb-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
