[Lldb-commits] [lldb] 322b413 - [lldb] Move GetSharedModuleWithLocalCache to PlatformDarwinDevice (NFC)
Jonas Devlieghere via lldb-commits
lldb-commits at lists.llvm.org
Mon May 2 17:34:53 PDT 2022
Author: Jonas Devlieghere
Date: 2022-05-02T17:34:40-07:00
New Revision: 322b4130415ac51ba48c993dfebc9c0b38d5bc32
URL: https://github.com/llvm/llvm-project/commit/322b4130415ac51ba48c993dfebc9c0b38d5bc32
DIFF: https://github.com/llvm/llvm-project/commit/322b4130415ac51ba48c993dfebc9c0b38d5bc32.diff
LOG: [lldb] Move GetSharedModuleWithLocalCache to PlatformDarwinDevice (NFC)
Refactoring in preparation of D124801.
Differential revision: https://reviews.llvm.org/D124800
Added:
Modified:
lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.cpp
lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.h
lldb/source/Plugins/Platform/MacOSX/PlatformDarwinDevice.cpp
lldb/source/Plugins/Platform/MacOSX/PlatformDarwinDevice.h
lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.cpp
lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.h
Removed:
################################################################################
diff --git a/lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.cpp b/lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.cpp
index d1696766166cd..cac9c672afb4c 100644
--- a/lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.cpp
+++ b/lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.cpp
@@ -200,167 +200,6 @@ Status PlatformDarwin::ResolveSymbolFile(Target &target,
return {};
}
-static lldb_private::Status
-MakeCacheFolderForFile(const FileSpec &module_cache_spec) {
- FileSpec module_cache_folder =
- module_cache_spec.CopyByRemovingLastPathComponent();
- return llvm::sys::fs::create_directory(module_cache_folder.GetPath());
-}
-
-static lldb_private::Status
-BringInRemoteFile(Platform *platform,
- const lldb_private::ModuleSpec &module_spec,
- const FileSpec &module_cache_spec) {
- MakeCacheFolderForFile(module_cache_spec);
- Status err = platform->GetFile(module_spec.GetFileSpec(), module_cache_spec);
- return err;
-}
-
-lldb_private::Status PlatformDarwin::GetSharedModuleWithLocalCache(
- const lldb_private::ModuleSpec &module_spec, lldb::ModuleSP &module_sp,
- const lldb_private::FileSpecList *module_search_paths_ptr,
- llvm::SmallVectorImpl<lldb::ModuleSP> *old_modules, bool *did_create_ptr) {
-
- Log *log = GetLog(LLDBLog::Platform);
- LLDB_LOGF(log,
- "[%s] Trying to find module %s/%s - platform path %s/%s symbol "
- "path %s/%s",
- (IsHost() ? "host" : "remote"),
- module_spec.GetFileSpec().GetDirectory().AsCString(),
- module_spec.GetFileSpec().GetFilename().AsCString(),
- module_spec.GetPlatformFileSpec().GetDirectory().AsCString(),
- module_spec.GetPlatformFileSpec().GetFilename().AsCString(),
- module_spec.GetSymbolFileSpec().GetDirectory().AsCString(),
- module_spec.GetSymbolFileSpec().GetFilename().AsCString());
-
- Status err;
-
- if (CheckLocalSharedCache()) {
- // When debugging on the host, we are most likely using the same shared
- // cache as our inferior. The dylibs from the shared cache might not
- // exist on the filesystem, so let's use the images in our own memory
- // to create the modules.
-
- // Check if the requested image is in our shared cache.
- SharedCacheImageInfo image_info =
- HostInfo::GetSharedCacheImageInfo(module_spec.GetFileSpec().GetPath());
-
- // If we found it and it has the correct UUID, let's proceed with
- // creating a module from the memory contents.
- if (image_info.uuid &&
- (!module_spec.GetUUID() || module_spec.GetUUID() == image_info.uuid)) {
- ModuleSpec shared_cache_spec(module_spec.GetFileSpec(), image_info.uuid,
- image_info.data_sp);
- err = ModuleList::GetSharedModule(shared_cache_spec, module_sp,
- module_search_paths_ptr, old_modules,
- did_create_ptr);
- if (module_sp)
- return err;
- }
- }
-
- err = ModuleList::GetSharedModule(module_spec, module_sp,
- module_search_paths_ptr, old_modules,
- did_create_ptr);
- if (module_sp)
- return err;
-
- if (!IsHost()) {
- std::string cache_path(GetLocalCacheDirectory());
- // Only search for a locally cached file if we have a valid cache path
- if (!cache_path.empty()) {
- std::string module_path(module_spec.GetFileSpec().GetPath());
- cache_path.append(module_path);
- FileSpec module_cache_spec(cache_path);
-
- // if rsync is supported, always bring in the file - rsync will be very
- // efficient when files are the same on the local and remote end of the
- // connection
- if (this->GetSupportsRSync()) {
- err = BringInRemoteFile(this, module_spec, module_cache_spec);
- if (err.Fail())
- return err;
- if (FileSystem::Instance().Exists(module_cache_spec)) {
- Log *log = GetLog(LLDBLog::Platform);
- LLDB_LOGF(log, "[%s] module %s/%s was rsynced and is now there",
- (IsHost() ? "host" : "remote"),
- module_spec.GetFileSpec().GetDirectory().AsCString(),
- module_spec.GetFileSpec().GetFilename().AsCString());
- ModuleSpec local_spec(module_cache_spec,
- module_spec.GetArchitecture());
- module_sp = std::make_shared<Module>(local_spec);
- module_sp->SetPlatformFileSpec(module_spec.GetFileSpec());
- return Status();
- }
- }
-
- // try to find the module in the cache
- if (FileSystem::Instance().Exists(module_cache_spec)) {
- // get the local and remote MD5 and compare
- if (m_remote_platform_sp) {
- // when going over the *slow* GDB remote transfer mechanism we first
- // check the hashes of the files - and only do the actual transfer if
- // they
diff er
- uint64_t high_local, high_remote, low_local, low_remote;
- auto MD5 = llvm::sys::fs::md5_contents(module_cache_spec.GetPath());
- if (!MD5)
- return Status(MD5.getError());
- std::tie(high_local, low_local) = MD5->words();
-
- m_remote_platform_sp->CalculateMD5(module_spec.GetFileSpec(),
- low_remote, high_remote);
- if (low_local != low_remote || high_local != high_remote) {
- // bring in the remote file
- Log *log = GetLog(LLDBLog::Platform);
- LLDB_LOGF(log,
- "[%s] module %s/%s needs to be replaced from remote copy",
- (IsHost() ? "host" : "remote"),
- module_spec.GetFileSpec().GetDirectory().AsCString(),
- module_spec.GetFileSpec().GetFilename().AsCString());
- Status err =
- BringInRemoteFile(this, module_spec, module_cache_spec);
- if (err.Fail())
- return err;
- }
- }
-
- ModuleSpec local_spec(module_cache_spec, module_spec.GetArchitecture());
- module_sp = std::make_shared<Module>(local_spec);
- module_sp->SetPlatformFileSpec(module_spec.GetFileSpec());
- Log *log = GetLog(LLDBLog::Platform);
- LLDB_LOGF(log, "[%s] module %s/%s was found in the cache",
- (IsHost() ? "host" : "remote"),
- module_spec.GetFileSpec().GetDirectory().AsCString(),
- module_spec.GetFileSpec().GetFilename().AsCString());
- return Status();
- }
-
- // bring in the remote module file
- LLDB_LOGF(log, "[%s] module %s/%s needs to come in remotely",
- (IsHost() ? "host" : "remote"),
- module_spec.GetFileSpec().GetDirectory().AsCString(),
- module_spec.GetFileSpec().GetFilename().AsCString());
- Status err = BringInRemoteFile(this, module_spec, module_cache_spec);
- if (err.Fail())
- return err;
- if (FileSystem::Instance().Exists(module_cache_spec)) {
- Log *log = GetLog(LLDBLog::Platform);
- LLDB_LOGF(log, "[%s] module %s/%s is now cached and fine",
- (IsHost() ? "host" : "remote"),
- module_spec.GetFileSpec().GetDirectory().AsCString(),
- module_spec.GetFileSpec().GetFilename().AsCString());
- ModuleSpec local_spec(module_cache_spec, module_spec.GetArchitecture());
- module_sp = std::make_shared<Module>(local_spec);
- module_sp->SetPlatformFileSpec(module_spec.GetFileSpec());
- return Status();
- } else
- return Status("unable to obtain valid module file");
- } else
- return Status("no cache path");
- } else
- return Status("unable to resolve module");
-}
-
Status PlatformDarwin::GetSharedModule(
const ModuleSpec &module_spec, Process *process, ModuleSP &module_sp,
const FileSpecList *module_search_paths_ptr,
diff --git a/lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.h b/lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.h
index edc8faaa399c8..b4c791e707a98 100644
--- a/lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.h
+++ b/lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.h
@@ -144,11 +144,6 @@ class PlatformDarwin : public PlatformPOSIX {
void ReadLibdispatchOffsets(Process *process);
- virtual Status GetSharedModuleWithLocalCache(
- const ModuleSpec &module_spec, lldb::ModuleSP &module_sp,
- const FileSpecList *module_search_paths_ptr,
- llvm::SmallVectorImpl<lldb::ModuleSP> *old_modules, bool *did_create_ptr);
-
virtual bool CheckLocalSharedCache() const { return IsHost(); }
struct SDKEnumeratorInfo {
diff --git a/lldb/source/Plugins/Platform/MacOSX/PlatformDarwinDevice.cpp b/lldb/source/Plugins/Platform/MacOSX/PlatformDarwinDevice.cpp
index 90aacc3b4ca64..d4173e4c812b9 100644
--- a/lldb/source/Plugins/Platform/MacOSX/PlatformDarwinDevice.cpp
+++ b/lldb/source/Plugins/Platform/MacOSX/PlatformDarwinDevice.cpp
@@ -7,6 +7,9 @@
//===----------------------------------------------------------------------===//
#include "PlatformDarwinDevice.h"
+#include "lldb/Core/Module.h"
+#include "lldb/Core/ModuleList.h"
+#include "lldb/Core/ModuleSpec.h"
#include "lldb/Host/HostInfo.h"
#include "lldb/Utility/FileSpec.h"
#include "lldb/Utility/LLDBLog.h"
@@ -263,3 +266,168 @@ const char *PlatformDarwinDevice::GetDeviceSupportDirectoryForOSVersion() {
return m_device_support_directory_for_os_version.c_str();
return nullptr;
}
+
+static lldb_private::Status
+MakeCacheFolderForFile(const FileSpec &module_cache_spec) {
+ FileSpec module_cache_folder =
+ module_cache_spec.CopyByRemovingLastPathComponent();
+ return llvm::sys::fs::create_directory(module_cache_folder.GetPath());
+}
+
+static lldb_private::Status
+BringInRemoteFile(Platform *platform,
+ const lldb_private::ModuleSpec &module_spec,
+ const FileSpec &module_cache_spec) {
+ MakeCacheFolderForFile(module_cache_spec);
+ Status err = platform->GetFile(module_spec.GetFileSpec(), module_cache_spec);
+ return err;
+}
+
+lldb_private::Status PlatformDarwinDevice::GetSharedModuleWithLocalCache(
+ const lldb_private::ModuleSpec &module_spec, lldb::ModuleSP &module_sp,
+ const lldb_private::FileSpecList *module_search_paths_ptr,
+ llvm::SmallVectorImpl<lldb::ModuleSP> *old_modules, bool *did_create_ptr) {
+
+ Log *log = GetLog(LLDBLog::Platform);
+ LLDB_LOGF(log,
+ "[%s] Trying to find module %s/%s - platform path %s/%s symbol "
+ "path %s/%s",
+ (IsHost() ? "host" : "remote"),
+ module_spec.GetFileSpec().GetDirectory().AsCString(),
+ module_spec.GetFileSpec().GetFilename().AsCString(),
+ module_spec.GetPlatformFileSpec().GetDirectory().AsCString(),
+ module_spec.GetPlatformFileSpec().GetFilename().AsCString(),
+ module_spec.GetSymbolFileSpec().GetDirectory().AsCString(),
+ module_spec.GetSymbolFileSpec().GetFilename().AsCString());
+
+ Status err;
+
+ if (CheckLocalSharedCache()) {
+ // When debugging on the host, we are most likely using the same shared
+ // cache as our inferior. The dylibs from the shared cache might not
+ // exist on the filesystem, so let's use the images in our own memory
+ // to create the modules.
+
+ // Check if the requested image is in our shared cache.
+ SharedCacheImageInfo image_info =
+ HostInfo::GetSharedCacheImageInfo(module_spec.GetFileSpec().GetPath());
+
+ // If we found it and it has the correct UUID, let's proceed with
+ // creating a module from the memory contents.
+ if (image_info.uuid &&
+ (!module_spec.GetUUID() || module_spec.GetUUID() == image_info.uuid)) {
+ ModuleSpec shared_cache_spec(module_spec.GetFileSpec(), image_info.uuid,
+ image_info.data_sp);
+ err = ModuleList::GetSharedModule(shared_cache_spec, module_sp,
+ module_search_paths_ptr, old_modules,
+ did_create_ptr);
+ if (module_sp) {
+ LLDB_LOGF(log, "[%s] module %s was found in the in-memory shared cache",
+ (IsHost() ? "host" : "remote"),
+ module_spec.GetFileSpec().GetPath().c_str());
+ return err;
+ }
+ }
+ }
+
+ err = ModuleList::GetSharedModule(module_spec, module_sp,
+ module_search_paths_ptr, old_modules,
+ did_create_ptr);
+ if (module_sp)
+ return err;
+
+ if (!IsHost()) {
+ std::string cache_path(GetLocalCacheDirectory());
+ // Only search for a locally cached file if we have a valid cache path
+ if (!cache_path.empty()) {
+ std::string module_path(module_spec.GetFileSpec().GetPath());
+ cache_path.append(module_path);
+ FileSpec module_cache_spec(cache_path);
+
+ // if rsync is supported, always bring in the file - rsync will be very
+ // efficient when files are the same on the local and remote end of the
+ // connection
+ if (this->GetSupportsRSync()) {
+ err = BringInRemoteFile(this, module_spec, module_cache_spec);
+ if (err.Fail())
+ return err;
+ if (FileSystem::Instance().Exists(module_cache_spec)) {
+ Log *log = GetLog(LLDBLog::Platform);
+ LLDB_LOGF(log, "[%s] module %s/%s was rsynced and is now there",
+ (IsHost() ? "host" : "remote"),
+ module_spec.GetFileSpec().GetDirectory().AsCString(),
+ module_spec.GetFileSpec().GetFilename().AsCString());
+ ModuleSpec local_spec(module_cache_spec,
+ module_spec.GetArchitecture());
+ module_sp = std::make_shared<Module>(local_spec);
+ module_sp->SetPlatformFileSpec(module_spec.GetFileSpec());
+ return Status();
+ }
+ }
+
+ // try to find the module in the cache
+ if (FileSystem::Instance().Exists(module_cache_spec)) {
+ // get the local and remote MD5 and compare
+ if (m_remote_platform_sp) {
+ // when going over the *slow* GDB remote transfer mechanism we first
+ // check the hashes of the files - and only do the actual transfer if
+ // they
diff er
+ uint64_t high_local, high_remote, low_local, low_remote;
+ auto MD5 = llvm::sys::fs::md5_contents(module_cache_spec.GetPath());
+ if (!MD5)
+ return Status(MD5.getError());
+ std::tie(high_local, low_local) = MD5->words();
+
+ m_remote_platform_sp->CalculateMD5(module_spec.GetFileSpec(),
+ low_remote, high_remote);
+ if (low_local != low_remote || high_local != high_remote) {
+ // bring in the remote file
+ Log *log = GetLog(LLDBLog::Platform);
+ LLDB_LOGF(log,
+ "[%s] module %s/%s needs to be replaced from remote copy",
+ (IsHost() ? "host" : "remote"),
+ module_spec.GetFileSpec().GetDirectory().AsCString(),
+ module_spec.GetFileSpec().GetFilename().AsCString());
+ Status err =
+ BringInRemoteFile(this, module_spec, module_cache_spec);
+ if (err.Fail())
+ return err;
+ }
+ }
+
+ ModuleSpec local_spec(module_cache_spec, module_spec.GetArchitecture());
+ module_sp = std::make_shared<Module>(local_spec);
+ module_sp->SetPlatformFileSpec(module_spec.GetFileSpec());
+ Log *log = GetLog(LLDBLog::Platform);
+ LLDB_LOGF(log, "[%s] module %s/%s was found in the cache",
+ (IsHost() ? "host" : "remote"),
+ module_spec.GetFileSpec().GetDirectory().AsCString(),
+ module_spec.GetFileSpec().GetFilename().AsCString());
+ return Status();
+ }
+
+ // bring in the remote module file
+ LLDB_LOGF(log, "[%s] module %s/%s needs to come in remotely",
+ (IsHost() ? "host" : "remote"),
+ module_spec.GetFileSpec().GetDirectory().AsCString(),
+ module_spec.GetFileSpec().GetFilename().AsCString());
+ Status err = BringInRemoteFile(this, module_spec, module_cache_spec);
+ if (err.Fail())
+ return err;
+ if (FileSystem::Instance().Exists(module_cache_spec)) {
+ Log *log = GetLog(LLDBLog::Platform);
+ LLDB_LOGF(log, "[%s] module %s/%s is now cached and fine",
+ (IsHost() ? "host" : "remote"),
+ module_spec.GetFileSpec().GetDirectory().AsCString(),
+ module_spec.GetFileSpec().GetFilename().AsCString());
+ ModuleSpec local_spec(module_cache_spec, module_spec.GetArchitecture());
+ module_sp = std::make_shared<Module>(local_spec);
+ module_sp->SetPlatformFileSpec(module_spec.GetFileSpec());
+ return Status();
+ } else
+ return Status("unable to obtain valid module file");
+ } else
+ return Status("no cache path");
+ } else
+ return Status("unable to resolve module");
+}
diff --git a/lldb/source/Plugins/Platform/MacOSX/PlatformDarwinDevice.h b/lldb/source/Plugins/Platform/MacOSX/PlatformDarwinDevice.h
index a3c9128a2c5c2..e1eba08fb5584 100644
--- a/lldb/source/Plugins/Platform/MacOSX/PlatformDarwinDevice.h
+++ b/lldb/source/Plugins/Platform/MacOSX/PlatformDarwinDevice.h
@@ -24,6 +24,11 @@ class PlatformDarwinDevice : public PlatformDarwin {
~PlatformDarwinDevice() override;
protected:
+ virtual Status GetSharedModuleWithLocalCache(
+ const ModuleSpec &module_spec, lldb::ModuleSP &module_sp,
+ const FileSpecList *module_search_paths_ptr,
+ llvm::SmallVectorImpl<lldb::ModuleSP> *old_modules, bool *did_create_ptr);
+
struct SDKDirectoryInfo {
SDKDirectoryInfo(const FileSpec &sdk_dir_spec);
FileSpec directory;
diff --git a/lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.cpp b/lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.cpp
index e48036ebaec1b..65795581b1c90 100644
--- a/lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.cpp
+++ b/lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.cpp
@@ -96,7 +96,7 @@ PlatformSP PlatformMacOSX::CreateInstance(bool force, const ArchSpec *arch) {
}
/// Default Constructor
-PlatformMacOSX::PlatformMacOSX() : PlatformDarwin(true) {}
+PlatformMacOSX::PlatformMacOSX() : PlatformDarwinDevice(true) {}
ConstString PlatformMacOSX::GetSDKDirectory(lldb_private::Target &target) {
ModuleSP exe_module_sp(target.GetExecutableModule());
@@ -211,3 +211,9 @@ lldb_private::Status PlatformMacOSX::GetSharedModule(
}
return error;
}
+
+llvm::StringRef PlatformMacOSX::GetDeviceSupportDirectoryName() {
+ return "macOS DeviceSupport";
+}
+
+llvm::StringRef PlatformMacOSX::GetPlatformName() { return "MacOSX.platform"; }
diff --git a/lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.h b/lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.h
index 2843a8a2ccd73..be844856ef923 100644
--- a/lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.h
+++ b/lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.h
@@ -9,7 +9,7 @@
#ifndef LLDB_SOURCE_PLUGINS_PLATFORM_MACOSX_PLATFORMMACOSX_H
#define LLDB_SOURCE_PLUGINS_PLATFORM_MACOSX_PLATFORMMACOSX_H
-#include "PlatformDarwin.h"
+#include "PlatformDarwinDevice.h"
#include "lldb/Target/Platform.h"
#include "lldb/Utility/ConstString.h"
#include "lldb/Utility/Status.h"
@@ -28,7 +28,7 @@ class ModuleSpec;
class Process;
class Target;
-class PlatformMacOSX : public PlatformDarwin {
+class PlatformMacOSX : public PlatformDarwinDevice {
public:
PlatformMacOSX();
@@ -69,6 +69,10 @@ class PlatformMacOSX : public PlatformDarwin {
return PlatformDarwin::AddClangModuleCompilationOptionsForSDKType(
target, options, XcodeSDK::Type::MacOSX);
}
+
+protected:
+ llvm::StringRef GetDeviceSupportDirectoryName() override;
+ llvm::StringRef GetPlatformName() override;
};
} // namespace lldb_private
More information about the lldb-commits
mailing list