https://github.com/JDevlieghere updated https://github.com/llvm/llvm-project/pull/214633
>From 1bef383af6cf386d60a8f90c7437e43a183e2145 Mon Sep 17 00:00:00 2001 From: Jonas Devlieghere <[email protected]> Date: Fri, 7 Aug 2026 15:46:35 -0700 Subject: [PATCH] Pass the target rather than the process --- lldb/include/lldb/Target/Platform.h | 23 ++++++------ .../DynamicLoaderDarwinKernel.cpp | 2 +- .../MacOSX/PlatformAppleSimulator.cpp | 6 ++-- .../Platform/MacOSX/PlatformAppleSimulator.h | 2 +- .../Platform/MacOSX/PlatformDarwin.cpp | 31 +++++++--------- .../Plugins/Platform/MacOSX/PlatformDarwin.h | 13 +++---- .../Platform/MacOSX/PlatformDarwinDevice.cpp | 6 ++-- .../Platform/MacOSX/PlatformDarwinDevice.h | 2 +- .../Platform/MacOSX/PlatformDarwinKernel.cpp | 27 +++++++------- .../Platform/MacOSX/PlatformDarwinKernel.h | 12 +++---- .../Platform/MacOSX/PlatformMacOSX.cpp | 8 ++--- .../Plugins/Platform/MacOSX/PlatformMacOSX.h | 2 +- .../MacOSX/PlatformRemoteDarwinDevice.cpp | 6 ++-- .../MacOSX/PlatformRemoteDarwinDevice.h | 2 +- lldb/source/Target/Platform.cpp | 10 +++--- lldb/source/Target/Target.cpp | 3 +- .../test/API/macosx/load-kext/TestLoadKext.py | 35 +++++++++++++++++++ 17 files changed, 106 insertions(+), 84 deletions(-) diff --git a/lldb/include/lldb/Target/Platform.h b/lldb/include/lldb/Target/Platform.h index 8760cb9fc6a8c..b1a28d1b118a0 100644 --- a/lldb/include/lldb/Target/Platform.h +++ b/lldb/include/lldb/Target/Platform.h @@ -304,17 +304,15 @@ class Platform : public PluginInterface { /// \param[in] module_spec /// The ModuleSpec of a binary to find. /// - /// \param[in] process - /// A Process. + /// \param[in] target + /// The Target the binary is being located for. Its settings guide the + /// search, and it may not have a Process yet. /// /// \param[out] module_sp /// A Module that matches the ModuleSpec, if one is found. /// - /// \param[in] module_search_paths_ptr - /// Locations to possibly look for a binary that matches the ModuleSpec. - /// /// \param[out] old_modules - /// Existing Modules in the Process' Target image list which match + /// Existing Modules in the Target's image list which match /// the FileSpec. /// /// \param[out] did_create_ptr @@ -327,11 +325,9 @@ class Platform : public PluginInterface { /// \return /// The Status object for any errors found while searching for /// the binary. - virtual Status - GetSharedModule(const ModuleSpec &module_spec, Process *process, - lldb::ModuleSP &module_sp, - llvm::SmallVectorImpl<lldb::ModuleSP> *old_modules, - bool *did_create_ptr); + virtual Status GetSharedModule( + const ModuleSpec &module_spec, Target &target, lldb::ModuleSP &module_sp, + llvm::SmallVectorImpl<lldb::ModuleSP> *old_modules, bool *did_create_ptr); void CallLocateModuleCallbackIfSet(const ModuleSpec &module_spec, lldb::ModuleSP &module_sp, @@ -1137,7 +1133,10 @@ class Platform : public PluginInterface { private: typedef std::function<Status(const ModuleSpec &)> ModuleResolver; - Status GetRemoteSharedModule(const ModuleSpec &module_spec, Process *process, + /// \param[in] target + /// The Target the binary is being located for, or nullptr when the + /// lookup is not on behalf of one. + Status GetRemoteSharedModule(const ModuleSpec &module_spec, Target *target, lldb::ModuleSP &module_sp, const ModuleResolver &module_resolver, bool *did_create_ptr); diff --git a/lldb/source/Plugins/DynamicLoader/Darwin-Kernel/DynamicLoaderDarwinKernel.cpp b/lldb/source/Plugins/DynamicLoader/Darwin-Kernel/DynamicLoaderDarwinKernel.cpp index 7959a49fd03a1..ea2783e75e72b 100644 --- a/lldb/source/Plugins/DynamicLoader/Darwin-Kernel/DynamicLoaderDarwinKernel.cpp +++ b/lldb/source/Plugins/DynamicLoader/Darwin-Kernel/DynamicLoaderDarwinKernel.cpp @@ -811,7 +811,7 @@ bool DynamicLoaderDarwinKernel::KextImageInfo::LoadImageUsingMemoryModule( // system. PlatformSP platform_sp(target.GetPlatform()); if (platform_sp) { - platform_sp->GetSharedModule(module_spec, process, m_module_sp, nullptr, + platform_sp->GetSharedModule(module_spec, target, m_module_sp, nullptr, nullptr); } diff --git a/lldb/source/Plugins/Platform/MacOSX/PlatformAppleSimulator.cpp b/lldb/source/Plugins/Platform/MacOSX/PlatformAppleSimulator.cpp index 8a1cb715111d5..6a04a9a3840cc 100644 --- a/lldb/source/Plugins/Platform/MacOSX/PlatformAppleSimulator.cpp +++ b/lldb/source/Plugins/Platform/MacOSX/PlatformAppleSimulator.cpp @@ -417,12 +417,12 @@ Status PlatformAppleSimulator::GetSymbolFile(const FileSpec &platform_file, } Status PlatformAppleSimulator::GetSharedModule( - const ModuleSpec &module_spec, Process *process, ModuleSP &module_sp, + const ModuleSpec &module_spec, Target &target, ModuleSP &module_sp, llvm::SmallVectorImpl<lldb::ModuleSP> *old_modules, bool *did_create_ptr) { Status error; - error = GetModuleFromSharedCaches(module_spec, process, module_sp, - old_modules, did_create_ptr); + error = GetModuleFromSharedCaches(module_spec, target, module_sp, old_modules, + did_create_ptr); if (module_sp) return error; diff --git a/lldb/source/Plugins/Platform/MacOSX/PlatformAppleSimulator.h b/lldb/source/Plugins/Platform/MacOSX/PlatformAppleSimulator.h index 2c40a2ac9a39c..9d0c1764e84a6 100644 --- a/lldb/source/Plugins/Platform/MacOSX/PlatformAppleSimulator.h +++ b/lldb/source/Plugins/Platform/MacOSX/PlatformAppleSimulator.h @@ -87,7 +87,7 @@ class PlatformAppleSimulator : public PlatformDarwin { std::vector<ArchSpec> GetSupportedArchitectures(const ArchSpec &process_host_arch) override; - Status GetSharedModule(const ModuleSpec &module_spec, Process *process, + Status GetSharedModule(const ModuleSpec &module_spec, Target &target, lldb::ModuleSP &module_sp, llvm::SmallVectorImpl<lldb::ModuleSP> *old_modules, bool *did_create_ptr) override; diff --git a/lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.cpp b/lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.cpp index 8efe164dd2901..93125c9554958 100644 --- a/lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.cpp +++ b/lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.cpp @@ -343,7 +343,7 @@ Status PlatformDarwin::ResolveSymbolFile(Target &target, } Status PlatformDarwin::GetSharedModule( - const ModuleSpec &module_spec, Process *process, ModuleSP &module_sp, + const ModuleSpec &module_spec, Target &target, ModuleSP &module_sp, llvm::SmallVectorImpl<ModuleSP> *old_modules, bool *did_create_ptr) { Status error; module_sp.reset(); @@ -353,21 +353,17 @@ Status PlatformDarwin::GetSharedModule( // module first. if (m_remote_platform_sp) { error = m_remote_platform_sp->GetSharedModule( - module_spec, process, module_sp, old_modules, did_create_ptr); + module_spec, target, module_sp, old_modules, did_create_ptr); } } if (!module_sp) { // Fall back to the local platform and find the file locally - error = Platform::GetSharedModule(module_spec, process, module_sp, + error = Platform::GetSharedModule(module_spec, target, module_sp, old_modules, did_create_ptr); const FileSpec &platform_file = module_spec.GetFileSpec(); - // Get module search paths from the target if available. - TargetSP target_sp = module_spec.GetTargetSP(); - FileSpecList module_search_paths; - if (target_sp) - module_search_paths = target_sp->GetExecutableSearchPaths(); + FileSpecList module_search_paths = target.GetExecutableSearchPaths(); if (!module_sp && !module_search_paths.IsEmpty() && platform_file) { // We can try to pull off part of the file path up to the bundle // directory level and try any module search paths... @@ -377,7 +373,7 @@ Status PlatformDarwin::GetSharedModule( ModuleSpec new_module_spec(module_spec); new_module_spec.GetFileSpec() = bundle_directory; if (Host::ResolveExecutableInBundle(new_module_spec.GetFileSpec())) { - Status new_error(Platform::GetSharedModule(new_module_spec, process, + Status new_error(Platform::GetSharedModule(new_module_spec, target, module_sp, old_modules, did_create_ptr)); @@ -405,7 +401,7 @@ Status PlatformDarwin::GetSharedModule( ModuleSpec new_module_spec(module_spec); new_module_spec.GetFileSpec() = new_file_spec; Status new_error(Platform::GetSharedModule( - new_module_spec, process, module_sp, old_modules, + new_module_spec, target, module_sp, old_modules, did_create_ptr)); if (module_sp) { @@ -424,13 +420,14 @@ Status PlatformDarwin::GetSharedModule( return error; } Status PlatformDarwin::GetModuleFromSharedCaches( - const ModuleSpec &module_spec, Process *process, ModuleSP &module_sp, + const ModuleSpec &module_spec, Target &target, ModuleSP &module_sp, llvm::SmallVectorImpl<ModuleSP> *old_modules, bool *did_create_ptr) { Status err; SymbolSharedCacheUse sc_mode = ModuleList::GetGlobalModuleListProperties().GetSharedCacheBinaryLoading(); SharedCacheImageInfo image_info; + Process *process = target.GetProcessSP().get(); if (process && process->GetDynamicLoader()) { addr_t sc_base_addr; UUID sc_uuid; @@ -1362,13 +1359,10 @@ PlatformDarwin::LaunchProcess(lldb_private::ProcessLaunchInfo &launch_info) { } lldb_private::Status PlatformDarwin::FindBundleBinaryInExecSearchPaths( - const ModuleSpec &module_spec, Process *process, ModuleSP &module_sp, + const ModuleSpec &module_spec, Target &target, ModuleSP &module_sp, llvm::SmallVectorImpl<ModuleSP> *old_modules, bool *did_create_ptr) { const FileSpec &platform_file = module_spec.GetFileSpec(); - TargetSP target_sp = module_spec.GetTargetSP(); - FileSpecList module_search_paths; - if (target_sp) - module_search_paths = target_sp->GetExecutableSearchPaths(); + FileSpecList module_search_paths = target.GetExecutableSearchPaths(); // See if the file is present in any of the module_search_paths // directories. if (!module_sp && !module_search_paths.IsEmpty() && platform_file) { @@ -1419,9 +1413,8 @@ lldb_private::Status PlatformDarwin::FindBundleBinaryInExecSearchPaths( if (FileSystem::Instance().Exists(path_to_try)) { ModuleSpec new_module_spec(module_spec); new_module_spec.GetFileSpec() = path_to_try; - Status new_error(Platform::GetSharedModule(new_module_spec, process, - module_sp, old_modules, - did_create_ptr)); + Status new_error(Platform::GetSharedModule( + new_module_spec, target, module_sp, old_modules, did_create_ptr)); if (module_sp) { module_sp->SetPlatformFileSpec(path_to_try); diff --git a/lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.h b/lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.h index 7c10216bb8b2e..52371c855e386 100644 --- a/lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.h +++ b/lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.h @@ -73,16 +73,14 @@ class PlatformDarwin : public PlatformPOSIX { bool IsSymbolFileTrusted(Module &module) override; - Status GetSharedModule(const ModuleSpec &module_spec, Process *process, + Status GetSharedModule(const ModuleSpec &module_spec, Target &target, lldb::ModuleSP &module_sp, llvm::SmallVectorImpl<lldb::ModuleSP> *old_modules, bool *did_create_ptr) override; - Status - GetModuleFromSharedCaches(const ModuleSpec &module_spec, Process *process, - lldb::ModuleSP &module_sp, - llvm::SmallVectorImpl<lldb::ModuleSP> *old_modules, - bool *did_create_ptr); + Status GetModuleFromSharedCaches( + const ModuleSpec &module_spec, Target &target, lldb::ModuleSP &module_sp, + llvm::SmallVectorImpl<lldb::ModuleSP> *old_modules, bool *did_create_ptr); size_t GetSoftwareBreakpointTrapOpcode(Target &target, BreakpointSite *bp_site) override; @@ -225,8 +223,7 @@ class PlatformDarwin : public PlatformPOSIX { XcodeSDK::Type sdk_type); Status FindBundleBinaryInExecSearchPaths( - const ModuleSpec &module_spec, Process *process, - lldb::ModuleSP &module_sp, + const ModuleSpec &module_spec, Target &target, lldb::ModuleSP &module_sp, llvm::SmallVectorImpl<lldb::ModuleSP> *old_modules, bool *did_create_ptr); // The OSType where lldb is running. diff --git a/lldb/source/Plugins/Platform/MacOSX/PlatformDarwinDevice.cpp b/lldb/source/Plugins/Platform/MacOSX/PlatformDarwinDevice.cpp index ef62070c80816..825b9df61f2e8 100644 --- a/lldb/source/Plugins/Platform/MacOSX/PlatformDarwinDevice.cpp +++ b/lldb/source/Plugins/Platform/MacOSX/PlatformDarwinDevice.cpp @@ -272,7 +272,7 @@ BringInRemoteFile(Platform *platform, lldb_private::Status PlatformDarwinDevice::GetSharedModuleWithLocalCache( const lldb_private::ModuleSpec &module_spec, lldb::ModuleSP &module_sp, llvm::SmallVectorImpl<lldb::ModuleSP> *old_modules, bool *did_create_ptr, - Process *process) { + Target &target) { Log *log = GetLog(LLDBLog::Platform); LLDB_LOG(log, @@ -289,8 +289,8 @@ lldb_private::Status PlatformDarwinDevice::GetSharedModuleWithLocalCache( Status err; if (CheckLocalSharedCache()) { - err = GetModuleFromSharedCaches(module_spec, process, module_sp, - old_modules, did_create_ptr); + err = GetModuleFromSharedCaches(module_spec, target, module_sp, old_modules, + did_create_ptr); if (module_sp) return err; } diff --git a/lldb/source/Plugins/Platform/MacOSX/PlatformDarwinDevice.h b/lldb/source/Plugins/Platform/MacOSX/PlatformDarwinDevice.h index 115cda9fe51d8..e2699db983368 100644 --- a/lldb/source/Plugins/Platform/MacOSX/PlatformDarwinDevice.h +++ b/lldb/source/Plugins/Platform/MacOSX/PlatformDarwinDevice.h @@ -27,7 +27,7 @@ class PlatformDarwinDevice : public PlatformDarwin { virtual Status GetSharedModuleWithLocalCache( const ModuleSpec &module_spec, lldb::ModuleSP &module_sp, llvm::SmallVectorImpl<lldb::ModuleSP> *old_modules, bool *did_create_ptr, - lldb_private::Process *process); + Target &target); struct SDKDirectoryInfo { SDKDirectoryInfo(const FileSpec &sdk_dir_spec, llvm::StringRef dirname_str); diff --git a/lldb/source/Plugins/Platform/MacOSX/PlatformDarwinKernel.cpp b/lldb/source/Plugins/Platform/MacOSX/PlatformDarwinKernel.cpp index 22fbfcb817570..e297925917fc4 100644 --- a/lldb/source/Plugins/Platform/MacOSX/PlatformDarwinKernel.cpp +++ b/lldb/source/Plugins/Platform/MacOSX/PlatformDarwinKernel.cpp @@ -666,9 +666,11 @@ bool PlatformDarwinKernel::KerneldSYMHasNoSiblingBinary( if (kernel_dsym.GetFileNameExtension() != g_dsym_suffix) return false; + // Chop off the '.dSYM' extension. A FileSpec owns its filename storage, so + // the new name has to be copied out before it can be assigned back. + std::string binary_filename(kernel_dsym.GetFileNameStrippingExtension()); FileSpec binary_filespec = kernel_dsym; - // Chop off the '.dSYM' extension on the filename - binary_filespec.SetFilename(binary_filespec.GetFileNameStrippingExtension()); + binary_filespec.SetFilename(binary_filename); // Is there a binary next to this this? Then return false. if (FileSystem::Instance().Exists(binary_filespec)) @@ -717,7 +719,7 @@ void PlatformDarwinKernel::UpdateKextandKernelsLocalScan() { } Status PlatformDarwinKernel::GetSharedModule( - const ModuleSpec &module_spec, Process *process, ModuleSP &module_sp, + const ModuleSpec &module_spec, Target &target, ModuleSP &module_sp, llvm::SmallVectorImpl<ModuleSP> *old_modules, bool *did_create_ptr) { Status error; module_sp.reset(); @@ -731,25 +733,25 @@ Status PlatformDarwinKernel::GetSharedModule( // DynamicLoaderDarwinKernel uses the magic name mach_kernel, // UUID search can get here with no name - and it may be a kernel. if (kext_bundle_id == "mach_kernel" || kext_bundle_id.empty()) { - error = GetSharedModuleKernel(module_spec, process, module_sp, - old_modules, did_create_ptr); + error = GetSharedModuleKernel(module_spec, target, module_sp, old_modules, + did_create_ptr); if (error.Success() && module_sp) { return error; } } else { - return GetSharedModuleKext(module_spec, process, module_sp, old_modules, + return GetSharedModuleKext(module_spec, target, module_sp, old_modules, did_create_ptr); } } // Give the generic methods, including possibly calling into DebugSymbols // framework on macOS systems, a chance. - return PlatformDarwin::GetSharedModule(module_spec, process, module_sp, + return PlatformDarwin::GetSharedModule(module_spec, target, module_sp, old_modules, did_create_ptr); } Status PlatformDarwinKernel::GetSharedModuleKext( - const ModuleSpec &module_spec, Process *process, ModuleSP &module_sp, + const ModuleSpec &module_spec, Target &target, ModuleSP &module_sp, llvm::SmallVectorImpl<ModuleSP> *old_modules, bool *did_create_ptr) { Status error; module_sp.reset(); @@ -776,7 +778,7 @@ Status PlatformDarwinKernel::GetSharedModuleKext( // Give the generic methods, including possibly calling into DebugSymbols // framework on macOS systems, a chance. - error = PlatformDarwin::GetSharedModule(module_spec, process, module_sp, + error = PlatformDarwin::GetSharedModule(module_spec, target, module_sp, old_modules, did_create_ptr); if (error.Success() && module_sp.get()) { return error; @@ -786,7 +788,7 @@ Status PlatformDarwinKernel::GetSharedModuleKext( } Status PlatformDarwinKernel::GetSharedModuleKernel( - const ModuleSpec &module_spec, Process *process, ModuleSP &module_sp, + const ModuleSpec &module_spec, Target &target, ModuleSP &module_sp, llvm::SmallVectorImpl<ModuleSP> *old_modules, bool *did_create_ptr) { assert(module_sp.get() == nullptr); UpdateKextandKernelsLocalScan(); @@ -805,8 +807,7 @@ Status PlatformDarwinKernel::GetSharedModuleKernel( // way it ends up in the index), but it might be a // .dSYM.yaa that needs to be expanded, don't just // append ".dSYM" to the filename for the SymbolFile. - FileSpecList search_paths = - process->GetTarget().GetDebugFileSearchPaths(); + FileSpecList search_paths = target.GetDebugFileSearchPaths(); FileSpec dsym_fspec = PluginManager::LocateExecutableSymbolFile( kern_spec, search_paths, module_sp->GetSymbolLocatorStatistics()); if (FileSystem::Instance().Exists(dsym_fspec)) @@ -840,7 +841,7 @@ Status PlatformDarwinKernel::GetSharedModuleKernel( // Give the generic methods, including possibly calling into DebugSymbols // framework on macOS systems, a chance. - return PlatformDarwin::GetSharedModule(module_spec, process, module_sp, + return PlatformDarwin::GetSharedModule(module_spec, target, module_sp, old_modules, did_create_ptr); } diff --git a/lldb/source/Plugins/Platform/MacOSX/PlatformDarwinKernel.h b/lldb/source/Plugins/Platform/MacOSX/PlatformDarwinKernel.h index b5cf701a76b4d..13f6fb7e7e8d4 100644 --- a/lldb/source/Plugins/Platform/MacOSX/PlatformDarwinKernel.h +++ b/lldb/source/Plugins/Platform/MacOSX/PlatformDarwinKernel.h @@ -58,7 +58,7 @@ class PlatformDarwinKernel : public PlatformDarwin { void GetStatus(Stream &strm) override; - Status GetSharedModule(const ModuleSpec &module_spec, Process *process, + Status GetSharedModule(const ModuleSpec &module_spec, Target &target, lldb::ModuleSP &module_sp, llvm::SmallVectorImpl<lldb::ModuleSP> *old_modules, bool *did_create_ptr) override; @@ -139,16 +139,14 @@ class PlatformDarwinKernel : public PlatformDarwin { static std::vector<FileSpec> GetDWARFBinaryInDSYMBundle(const FileSpec &dsym_bundle); - Status GetSharedModuleKext(const ModuleSpec &module_spec, Process *process, + Status GetSharedModuleKext(const ModuleSpec &module_spec, Target &target, lldb::ModuleSP &module_sp, llvm::SmallVectorImpl<lldb::ModuleSP> *old_modules, bool *did_create_ptr); - Status - GetSharedModuleKernel(const ModuleSpec &module_spec, Process *process, - lldb::ModuleSP &module_sp, - llvm::SmallVectorImpl<lldb::ModuleSP> *old_modules, - bool *did_create_ptr); + Status GetSharedModuleKernel( + const ModuleSpec &module_spec, Target &target, lldb::ModuleSP &module_sp, + llvm::SmallVectorImpl<lldb::ModuleSP> *old_modules, bool *did_create_ptr); Status ExamineKextForMatchingUUID(const FileSpec &kext_bundle_path, const UUID &uuid, const ArchSpec &arch, diff --git a/lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.cpp b/lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.cpp index 991ccedcb650d..8b34cc0b69def 100644 --- a/lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.cpp +++ b/lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.cpp @@ -176,11 +176,11 @@ PlatformMacOSX::GetSupportedArchitectures(const ArchSpec &process_host_arch) { } lldb_private::Status PlatformMacOSX::GetSharedModule( - const lldb_private::ModuleSpec &module_spec, Process *process, + const lldb_private::ModuleSpec &module_spec, Target &target, lldb::ModuleSP &module_sp, llvm::SmallVectorImpl<lldb::ModuleSP> *old_modules, bool *did_create_ptr) { Status error = GetSharedModuleWithLocalCache( - module_spec, module_sp, old_modules, did_create_ptr, process); + module_spec, module_sp, old_modules, did_create_ptr, target); if (module_sp) { if (module_spec.GetArchitecture().GetCore() == @@ -195,7 +195,7 @@ lldb_private::Status PlatformMacOSX::GetSharedModule( bool did_create = false; Status x86_64_error = GetSharedModuleWithLocalCache( module_spec_x86_64, x86_64_module_sp, &old_x86_64_modules, - &did_create, process); + &did_create, target); if (x86_64_module_sp && x86_64_module_sp->GetObjectFile()) { module_sp = x86_64_module_sp; if (old_modules) @@ -210,7 +210,7 @@ lldb_private::Status PlatformMacOSX::GetSharedModule( } if (!module_sp) { - error = FindBundleBinaryInExecSearchPaths(module_spec, process, module_sp, + error = FindBundleBinaryInExecSearchPaths(module_spec, target, module_sp, old_modules, did_create_ptr); } return error; diff --git a/lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.h b/lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.h index 9555b16551d5a..cc67458231864 100644 --- a/lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.h +++ b/lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.h @@ -46,7 +46,7 @@ class PlatformMacOSX : public PlatformDarwinDevice { llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); } - Status GetSharedModule(const ModuleSpec &module_spec, Process *process, + Status GetSharedModule(const ModuleSpec &module_spec, Target &target, lldb::ModuleSP &module_sp, llvm::SmallVectorImpl<lldb::ModuleSP> *old_modules, bool *did_create_ptr) override; diff --git a/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteDarwinDevice.cpp b/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteDarwinDevice.cpp index d9a998fdccb03..9ed6839fbfca8 100644 --- a/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteDarwinDevice.cpp +++ b/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteDarwinDevice.cpp @@ -157,7 +157,7 @@ Status PlatformRemoteDarwinDevice::GetSymbolFile(const FileSpec &platform_file, } Status PlatformRemoteDarwinDevice::GetSharedModule( - const ModuleSpec &module_spec, Process *process, ModuleSP &module_sp, + const ModuleSpec &module_spec, Target &target, ModuleSP &module_sp, llvm::SmallVectorImpl<ModuleSP> *old_modules, bool *did_create_ptr) { // For iOS, the SDK files are all cached locally on the host system. So first // we ask for the file in the cached SDK, then we attempt to get a shared @@ -262,7 +262,7 @@ Status PlatformRemoteDarwinDevice::GetSharedModule( // This may not be an SDK-related module. Try whether we can bring in the // thing to our local cache. error = GetSharedModuleWithLocalCache(module_spec, module_sp, old_modules, - did_create_ptr, process); + did_create_ptr, target); if (error.Success()) return error; @@ -270,7 +270,7 @@ Status PlatformRemoteDarwinDevice::GetSharedModule( // directories. if (!module_sp) error = PlatformDarwin::FindBundleBinaryInExecSearchPaths( - module_spec, process, module_sp, old_modules, did_create_ptr); + module_spec, target, module_sp, old_modules, did_create_ptr); if (error.Success()) return error; diff --git a/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteDarwinDevice.h b/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteDarwinDevice.h index 4abd74ed07584..fe0b44eec9d0d 100644 --- a/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteDarwinDevice.h +++ b/lldb/source/Plugins/Platform/MacOSX/PlatformRemoteDarwinDevice.h @@ -45,7 +45,7 @@ class PlatformRemoteDarwinDevice : public PlatformDarwinDevice { virtual Status GetSymbolFile(const FileSpec &platform_file, const UUID *uuid_ptr, FileSpec &local_file); - Status GetSharedModule(const ModuleSpec &module_spec, Process *process, + Status GetSharedModule(const ModuleSpec &module_spec, Target &target, lldb::ModuleSP &module_sp, llvm::SmallVectorImpl<lldb::ModuleSP> *old_modules, bool *did_create_ptr) override; diff --git a/lldb/source/Target/Platform.cpp b/lldb/source/Target/Platform.cpp index 0b2290c98d55e..6b26f3f802a69 100644 --- a/lldb/source/Target/Platform.cpp +++ b/lldb/source/Target/Platform.cpp @@ -257,7 +257,7 @@ Platform::LocateExecutableScriptingResources(Target *target, Module &module, } Status Platform::GetSharedModule( - const ModuleSpec &module_spec, Process *process, ModuleSP &module_sp, + const ModuleSpec &module_spec, Target &target, ModuleSP &module_sp, llvm::SmallVectorImpl<lldb::ModuleSP> *old_modules, bool *did_create_ptr) { if (IsHost()) // Note: module_search_paths_ptr functionality is now handled internally @@ -293,7 +293,7 @@ Status Platform::GetSharedModule( return error; }; - return GetRemoteSharedModule(module_spec, process, module_sp, resolver, + return GetRemoteSharedModule(module_spec, &target, module_sp, resolver, did_create_ptr); } @@ -1542,7 +1542,7 @@ Status Platform::GetCachedExecutable(ModuleSpec &module_spec, lldb::ModuleSP &module_sp) { FileSpec platform_spec = module_spec.GetFileSpec(); Status error = GetRemoteSharedModule( - module_spec, nullptr, module_sp, + module_spec, /*target=*/nullptr, module_sp, [&](const ModuleSpec &spec) { return Platform::ResolveExecutable(spec, module_sp); }, @@ -1556,7 +1556,7 @@ Status Platform::GetCachedExecutable(ModuleSpec &module_spec, } Status Platform::GetRemoteSharedModule(const ModuleSpec &module_spec, - Process *process, + Target *target, lldb::ModuleSP &module_sp, const ModuleResolver &module_resolver, bool *did_create_ptr) { @@ -1564,7 +1564,7 @@ Status Platform::GetRemoteSharedModule(const ModuleSpec &module_spec, ModuleSpec resolved_module_spec; ArchSpec process_host_arch; bool got_module_spec = false; - if (process) { + if (Process *process = target ? target->GetProcessSP().get() : nullptr) { process_host_arch = process->GetSystemArchitecture(); // Try to get module information from the process if (process->GetModuleSpec(module_spec.GetFileSpec(), diff --git a/lldb/source/Target/Target.cpp b/lldb/source/Target/Target.cpp index b83d67bbf045e..12af26b599b30 100644 --- a/lldb/source/Target/Target.cpp +++ b/lldb/source/Target/Target.cpp @@ -2541,8 +2541,7 @@ ModuleSP Target::GetOrCreateModule(const ModuleSpec &orig_module_spec, // module in the shared module cache. if (m_platform_sp) { error = m_platform_sp->GetSharedModule( - module_spec, m_process_sp.get(), module_sp, &old_modules, - &did_create_module); + module_spec, *this, module_sp, &old_modules, &did_create_module); } else { error = Status::FromErrorString("no platform is currently set"); } diff --git a/lldb/test/API/macosx/load-kext/TestLoadKext.py b/lldb/test/API/macosx/load-kext/TestLoadKext.py index fa4387d18e5cb..39300e8b8673b 100644 --- a/lldb/test/API/macosx/load-kext/TestLoadKext.py +++ b/lldb/test/API/macosx/load-kext/TestLoadKext.py @@ -3,6 +3,8 @@ """ +import os + import lldb from lldbsuite.test.decorators import * from lldbsuite.test.lldbtest import * @@ -25,3 +27,36 @@ def test_load_kext(self): self.assertEqual(target.GetNumModules(), 1) mod = target.GetModuleAtIndex(0) self.assertEqual(mod.GetFileSpec().GetFilename(), "mykext") + + @skipUnlessDarwin + def test_kernel_lookup_by_uuid_without_a_process(self): + """Search the darwin-kernel platform for a kernel before there is a + process to search on behalf of.""" + + # PlatformDarwinKernel only indexes a kernel binary that has a .dSYM + # sibling, and only that branch goes looking for a symbol file. + kernel_dir = self.getBuildArtifact("kernels") + lldbutil.mkdir_p(kernel_dir) + kernel = os.path.join(kernel_dir, "kernel.test") + self.yaml2obj("mykext.yaml", kernel) + lldbutil.mkdir_p(kernel + ".dSYM") + + self.runCmd( + "settings set platform.plugin.darwin-kernel.kext-directories " + kernel_dir + ) + self.runCmd("platform select darwin-kernel") + + def cleanup(): + self.runCmd("platform select host") + self.runCmd("settings clear platform.plugin.darwin-kernel.kext-directories") + + self.addTearDownHook(cleanup) + + target = self.dbg.CreateTarget("") + self.assertTrue(target.IsValid()) + + # A UUID with no file name reaches the kernel branch of + # PlatformDarwinKernel::GetSharedModule, which matches the binary above + # and then searches for its symbols. There is no process here, and the + # search must not need one. + target.AddModule(None, None, "17A97B33-09B7-3195-9408-DBD965D578A5") _______________________________________________ lldb-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
