asmith updated this revision to Diff 186580.
Herald added subscribers: jdoerfert, emaste.
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D56232/new/
https://reviews.llvm.org/D56232
Files:
include/lldb/Target/RemoteAwarePlatform.h
source/Plugins/Platform/POSIX/PlatformPOSIX.cpp
source/Plugins/Platform/POSIX/PlatformPOSIX.h
source/Plugins/Platform/Windows/PlatformWindows.cpp
source/Plugins/Platform/Windows/PlatformWindows.h
source/Target/RemoteAwarePlatform.cpp
Index: source/Target/RemoteAwarePlatform.cpp
===================================================================
--- source/Target/RemoteAwarePlatform.cpp
+++ source/Target/RemoteAwarePlatform.cpp
@@ -7,6 +7,8 @@
//===----------------------------------------------------------------------===//
#include "lldb/Target/RemoteAwarePlatform.h"
+#include "lldb/Host/FileCache.h"
+#include "lldb/Host/FileSystem.h"
#include "lldb/Host/Host.h"
using namespace lldb_private;
@@ -21,6 +23,139 @@
return Platform::GetModuleSpec(module_file_spec, arch, module_spec);
}
+Status RemoteAwarePlatform::RunShellCommand(
+ const char *command, const FileSpec &working_dir, int *status_ptr,
+ int *signo_ptr, std::string *command_output,
+ const Timeout<std::micro> &timeout) {
+ if (IsHost())
+ return Host::RunShellCommand(command, working_dir, status_ptr, signo_ptr,
+ command_output, timeout);
+ if (m_remote_platform_sp)
+ return m_remote_platform_sp->RunShellCommand(
+ command, working_dir, status_ptr, signo_ptr, command_output, timeout);
+ return Status("unable to run a remote command without a platform");
+}
+
+Status RemoteAwarePlatform::MakeDirectory(const FileSpec &file_spec,
+ uint32_t file_permissions) {
+ if (m_remote_platform_sp)
+ return m_remote_platform_sp->MakeDirectory(file_spec, file_permissions);
+ return Platform::MakeDirectory(file_spec, file_permissions);
+}
+
+Status RemoteAwarePlatform::GetFilePermissions(const FileSpec &file_spec,
+ uint32_t &file_permissions) {
+ if (m_remote_platform_sp)
+ return m_remote_platform_sp->GetFilePermissions(file_spec,
+ file_permissions);
+ return Platform::GetFilePermissions(file_spec, file_permissions);
+}
+
+Status RemoteAwarePlatform::SetFilePermissions(const FileSpec &file_spec,
+ uint32_t file_permissions) {
+ if (m_remote_platform_sp)
+ return m_remote_platform_sp->SetFilePermissions(file_spec,
+ file_permissions);
+ return Platform::SetFilePermissions(file_spec, file_permissions);
+}
+
+lldb::user_id_t RemoteAwarePlatform::OpenFile(const FileSpec &file_spec,
+ uint32_t flags, uint32_t mode,
+ Status &error) {
+ if (IsHost())
+ return FileCache::GetInstance().OpenFile(file_spec, flags, mode, error);
+ if (m_remote_platform_sp)
+ return m_remote_platform_sp->OpenFile(file_spec, flags, mode, error);
+ return Platform::OpenFile(file_spec, flags, mode, error);
+}
+
+bool RemoteAwarePlatform::CloseFile(lldb::user_id_t fd, Status &error) {
+ if (IsHost())
+ return FileCache::GetInstance().CloseFile(fd, error);
+ if (m_remote_platform_sp)
+ return m_remote_platform_sp->CloseFile(fd, error);
+ return Platform::CloseFile(fd, error);
+}
+
+uint64_t RemoteAwarePlatform::ReadFile(lldb::user_id_t fd, uint64_t offset,
+ void *dst, uint64_t dst_len,
+ Status &error) {
+ if (IsHost())
+ return FileCache::GetInstance().ReadFile(fd, offset, dst, dst_len, error);
+ if (m_remote_platform_sp)
+ return m_remote_platform_sp->ReadFile(fd, offset, dst, dst_len, error);
+ return Platform::ReadFile(fd, offset, dst, dst_len, error);
+}
+
+uint64_t RemoteAwarePlatform::WriteFile(lldb::user_id_t fd, uint64_t offset,
+ const void *src, uint64_t src_len,
+ Status &error) {
+ if (IsHost())
+ return FileCache::GetInstance().WriteFile(fd, offset, src, src_len, error);
+ if (m_remote_platform_sp)
+ return m_remote_platform_sp->WriteFile(fd, offset, src, src_len, error);
+ return Platform::WriteFile(fd, offset, src, src_len, error);
+}
+
+lldb::user_id_t RemoteAwarePlatform::GetFileSize(const FileSpec &file_spec) {
+ if (IsHost()) {
+ uint64_t Size;
+ if (llvm::sys::fs::file_size(file_spec.GetPath(), Size))
+ return 0;
+ return Size;
+ }
+ if (m_remote_platform_sp)
+ return m_remote_platform_sp->GetFileSize(file_spec);
+ return Platform::GetFileSize(file_spec);
+}
+
+Status RemoteAwarePlatform::CreateSymlink(const FileSpec &src,
+ const FileSpec &dst) {
+ if (IsHost())
+ return FileSystem::Instance().Symlink(src, dst);
+ if (m_remote_platform_sp)
+ return m_remote_platform_sp->CreateSymlink(src, dst);
+ return Platform::CreateSymlink(src, dst);
+}
+
+bool RemoteAwarePlatform::GetFileExists(const FileSpec &file_spec) {
+ if (IsHost())
+ return FileSystem::Instance().Exists(file_spec);
+ if (m_remote_platform_sp)
+ return m_remote_platform_sp->GetFileExists(file_spec);
+ return Platform::GetFileExists(file_spec);
+}
+
+Status RemoteAwarePlatform::Unlink(const FileSpec &file_spec) {
+ if (IsHost())
+ return llvm::sys::fs::remove(file_spec.GetPath());
+ if (m_remote_platform_sp)
+ return m_remote_platform_sp->Unlink(file_spec);
+ return Platform::Unlink(file_spec);
+}
+
+bool RemoteAwarePlatform::CalculateMD5(const FileSpec &file_spec, uint64_t &low,
+ uint64_t &high) {
+ if (IsHost())
+ return Platform::CalculateMD5(file_spec, low, high);
+ if (m_remote_platform_sp)
+ return m_remote_platform_sp->CalculateMD5(file_spec, low, high);
+ return false;
+}
+
+FileSpec RemoteAwarePlatform::GetRemoteWorkingDirectory() {
+ if (IsRemote() && m_remote_platform_sp)
+ return m_remote_platform_sp->GetRemoteWorkingDirectory();
+ return Platform::GetRemoteWorkingDirectory();
+}
+
+bool RemoteAwarePlatform::SetRemoteWorkingDirectory(
+ const FileSpec &working_dir) {
+ if (IsRemote() && m_remote_platform_sp)
+ return m_remote_platform_sp->SetRemoteWorkingDirectory(working_dir);
+ return Platform::SetRemoteWorkingDirectory(working_dir);
+}
+
Status RemoteAwarePlatform::GetFileWithUUID(const FileSpec &platform_file,
const UUID *uuid_ptr,
FileSpec &local_file) {
@@ -64,7 +199,6 @@
const char *RemoteAwarePlatform::GetHostname() {
if (IsHost())
return Platform::GetHostname();
-
if (m_remote_platform_sp)
return m_remote_platform_sp->GetHostname();
return nullptr;
@@ -127,6 +261,18 @@
return 0;
}
+lldb::ProcessSP RemoteAwarePlatform::ConnectProcess(llvm::StringRef connect_url,
+ llvm::StringRef plugin_name,
+ Debugger &debugger,
+ Target *target,
+ Status &error) {
+ if (m_remote_platform_sp)
+ return m_remote_platform_sp->ConnectProcess(connect_url, plugin_name,
+ debugger, target, error);
+ return Platform::ConnectProcess(connect_url, plugin_name, debugger, target,
+ error);
+}
+
Status RemoteAwarePlatform::LaunchProcess(ProcessLaunchInfo &launch_info) {
Status error;
@@ -140,3 +286,11 @@
}
return error;
}
+
+Status RemoteAwarePlatform::KillProcess(const lldb::pid_t pid) {
+ if (IsHost())
+ return Platform::KillProcess(pid);
+ if (m_remote_platform_sp)
+ return m_remote_platform_sp->KillProcess(pid);
+ return Status("the platform is not currently connected");
+}
Index: source/Plugins/Platform/Windows/PlatformWindows.h
===================================================================
--- source/Plugins/Platform/Windows/PlatformWindows.h
+++ source/Plugins/Platform/Windows/PlatformWindows.h
@@ -63,13 +63,6 @@
lldb_private::Target *target,
lldb_private::Status &error) override;
- lldb_private::Status
- GetSharedModule(const lldb_private::ModuleSpec &module_spec,
- lldb_private::Process *process, lldb::ModuleSP &module_sp,
- const lldb_private::FileSpecList *module_search_paths_ptr,
- lldb::ModuleSP *old_module_sp_ptr,
- bool *did_create_ptr) override;
-
bool GetSupportedArchitectureAtIndex(uint32_t idx,
lldb_private::ArchSpec &arch) override;
Index: source/Plugins/Platform/Windows/PlatformWindows.cpp
===================================================================
--- source/Plugins/Platform/Windows/PlatformWindows.cpp
+++ source/Plugins/Platform/Windows/PlatformWindows.cpp
@@ -197,8 +197,9 @@
}
} else {
if (m_remote_platform_sp) {
- error = GetCachedExecutable(resolved_module_spec, exe_module_sp, nullptr,
- *m_remote_platform_sp);
+ error =
+ GetCachedExecutable(resolved_module_spec, exe_module_sp,
+ module_search_paths_ptr, *m_remote_platform_sp);
} else {
// We may connect to a process and use the provided executable (Don't use
// local $PATH).
@@ -233,7 +234,8 @@
idx, resolved_module_spec.GetArchitecture());
++idx) {
error = ModuleList::GetSharedModule(resolved_module_spec, exe_module_sp,
- nullptr, nullptr, nullptr);
+ module_search_paths_ptr, nullptr,
+ nullptr);
// Did we find an executable using one of the
if (error.Success()) {
if (exe_module_sp && exe_module_sp->GetObjectFile())
@@ -335,6 +337,14 @@
// plugin, and PlatformWindows::DebugProcess is just a pass-through to get to
// the process plugin.
+ if (IsRemote()) {
+ if (m_remote_platform_sp)
+ return m_remote_platform_sp->DebugProcess(launch_info, debugger, target,
+ error);
+ else
+ error.SetErrorString("the platform is not currently connected");
+ }
+
if (launch_info.GetProcessID() != LLDB_INVALID_PROCESS_ID) {
// This is a process attach. Don't need to launch anything.
ProcessAttachInfo attach_info(launch_info);
@@ -392,34 +402,6 @@
return process_sp;
}
-Status PlatformWindows::GetSharedModule(
- const ModuleSpec &module_spec, Process *process, ModuleSP &module_sp,
- const FileSpecList *module_search_paths_ptr, ModuleSP *old_module_sp_ptr,
- bool *did_create_ptr) {
- Status error;
- module_sp.reset();
-
- if (IsRemote()) {
- // If we have a remote platform always, let it try and locate the shared
- // module first.
- if (m_remote_platform_sp) {
- error = m_remote_platform_sp->GetSharedModule(
- module_spec, process, module_sp, module_search_paths_ptr,
- old_module_sp_ptr, 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,
- module_search_paths_ptr,
- old_module_sp_ptr, did_create_ptr);
- }
- if (module_sp)
- module_sp->SetPlatformFileSpec(module_spec.GetFileSpec());
- return error;
-}
-
bool PlatformWindows::GetSupportedArchitectureAtIndex(uint32_t idx,
ArchSpec &arch) {
static SupportedArchList architectures;
@@ -435,7 +417,7 @@
#ifdef _WIN32
llvm::VersionTuple version = HostInfo::GetOSVersion();
- strm << "Host: Windows " << version.getAsString() << '\n';
+ strm << " Host: Windows " << version.getAsString() << '\n';
#endif
}
Index: source/Plugins/Platform/POSIX/PlatformPOSIX.h
===================================================================
--- source/Plugins/Platform/POSIX/PlatformPOSIX.h
+++ source/Plugins/Platform/POSIX/PlatformPOSIX.h
@@ -33,68 +33,16 @@
uint32_t uid = UINT32_MAX,
uint32_t gid = UINT32_MAX) override;
- lldb::user_id_t OpenFile(const lldb_private::FileSpec &file_spec,
- uint32_t flags, uint32_t mode,
- lldb_private::Status &error) override;
-
- bool CloseFile(lldb::user_id_t fd, lldb_private::Status &error) override;
-
- uint64_t ReadFile(lldb::user_id_t fd, uint64_t offset, void *dst,
- uint64_t dst_len, lldb_private::Status &error) override;
-
- uint64_t WriteFile(lldb::user_id_t fd, uint64_t offset, const void *src,
- uint64_t src_len, lldb_private::Status &error) override;
-
- lldb::user_id_t GetFileSize(const lldb_private::FileSpec &file_spec) override;
-
- lldb_private::Status
- CreateSymlink(const lldb_private::FileSpec &src,
- const lldb_private::FileSpec &dst) override;
-
lldb_private::Status
GetFile(const lldb_private::FileSpec &source,
const lldb_private::FileSpec &destination) override;
- lldb_private::FileSpec GetRemoteWorkingDirectory() override;
-
- bool
- SetRemoteWorkingDirectory(const lldb_private::FileSpec &working_dir) override;
-
const lldb::UnixSignalsSP &GetRemoteUnixSignals() override;
- lldb_private::Status RunShellCommand(
- const char *command, // Shouldn't be nullptr
- const lldb_private::FileSpec &working_dir, // Pass empty FileSpec to use
- // the current working
- // directory
- int *status_ptr, // Pass nullptr if you don't want the process exit status
- int *signo_ptr, // Pass nullptr if you don't want the signal that caused
- // the process to exit
- std::string
- *command_output, // Pass nullptr if you don't want the command output
- const lldb_private::Timeout<std::micro> &timeout) override;
-
lldb_private::Status ResolveExecutable(
const lldb_private::ModuleSpec &module_spec, lldb::ModuleSP &module_sp,
const lldb_private::FileSpecList *module_search_paths_ptr) override;
- lldb_private::Status MakeDirectory(const lldb_private::FileSpec &file_spec,
- uint32_t mode) override;
-
- lldb_private::Status
- GetFilePermissions(const lldb_private::FileSpec &file_spec,
- uint32_t &file_permissions) override;
-
- lldb_private::Status
- SetFilePermissions(const lldb_private::FileSpec &file_spec,
- uint32_t file_permissions) override;
-
- bool GetFileExists(const lldb_private::FileSpec &file_spec) override;
-
- lldb_private::Status Unlink(const lldb_private::FileSpec &file_spec) override;
-
- lldb_private::Status KillProcess(const lldb::pid_t pid) override;
-
lldb::ProcessSP Attach(lldb_private::ProcessAttachInfo &attach_info,
lldb_private::Debugger &debugger,
lldb_private::Target *target, // Can be nullptr, if
@@ -114,9 +62,6 @@
std::string GetPlatformSpecificConnectionInformation() override;
- bool CalculateMD5(const lldb_private::FileSpec &file_spec, uint64_t &low,
- uint64_t &high) override;
-
void CalculateTrapHandlerSymbolNames() override;
lldb_private::Status ConnectRemote(lldb_private::Args &args) override;
@@ -132,16 +77,11 @@
lldb_private::Status UnloadImage(lldb_private::Process *process,
uint32_t image_token) override;
- lldb::ProcessSP ConnectProcess(llvm::StringRef connect_url,
- llvm::StringRef plugin_name,
- lldb_private::Debugger &debugger,
- lldb_private::Target *target,
- lldb_private::Status &error) override;
-
size_t ConnectToWaitingProcesses(lldb_private::Debugger &debugger,
lldb_private::Status &error) override;
- lldb_private::ConstString GetFullNameForDylib(lldb_private::ConstString basename) override;
+ lldb_private::ConstString
+ GetFullNameForDylib(lldb_private::ConstString basename) override;
protected:
std::unique_ptr<lldb_private::OptionGroupPlatformRSync>
@@ -164,8 +104,8 @@
MakeLoadImageUtilityFunction(lldb_private::ExecutionContext &exe_ctx,
lldb_private::Status &error);
- virtual
- llvm::StringRef GetLibdlFunctionDeclarations(lldb_private::Process *process);
+ virtual llvm::StringRef
+ GetLibdlFunctionDeclarations(lldb_private::Process *process);
private:
DISALLOW_COPY_AND_ASSIGN(PlatformPOSIX);
Index: source/Plugins/Platform/POSIX/PlatformPOSIX.cpp
===================================================================
--- source/Plugins/Platform/POSIX/PlatformPOSIX.cpp
+++ source/Plugins/Platform/POSIX/PlatformPOSIX.cpp
@@ -68,28 +68,6 @@
return m_options.at(&interpreter).get();
}
-lldb_private::Status PlatformPOSIX::RunShellCommand(
- const char *command, // Shouldn't be NULL
- const FileSpec &
- working_dir, // Pass empty FileSpec to use the current working directory
- int *status_ptr, // Pass NULL if you don't want the process exit status
- int *signo_ptr, // Pass NULL if you don't want the signal that caused the
- // process to exit
- std::string
- *command_output, // Pass NULL if you don't want the command output
- const Timeout<std::micro> &timeout) {
- if (IsHost())
- return Host::RunShellCommand(command, working_dir, status_ptr, signo_ptr,
- command_output, timeout);
- else {
- if (m_remote_platform_sp)
- return m_remote_platform_sp->RunShellCommand(
- command, working_dir, status_ptr, signo_ptr, command_output, timeout);
- else
- return Status("unable to run a remote command without a platform");
- }
-}
-
Status
PlatformPOSIX::ResolveExecutable(const ModuleSpec &module_spec,
lldb::ModuleSP &exe_module_sp,
@@ -156,11 +134,12 @@
if (error.Success()) {
if (resolved_module_spec.GetArchitecture().IsValid()) {
error = ModuleList::GetSharedModule(resolved_module_spec, exe_module_sp,
- module_search_paths_ptr, nullptr, nullptr);
+ module_search_paths_ptr, nullptr,
+ nullptr);
if (error.Fail()) {
// If we failed, it may be because the vendor and os aren't known. If
- // that is the case, try setting them to the host architecture and give
- // it another try.
+ // that is the case, try setting them to the host architecture and give
+ // it another try.
llvm::Triple &module_triple =
resolved_module_spec.GetArchitecture().GetTriple();
bool is_vendor_specified =
@@ -176,8 +155,9 @@
if (!is_os_specified)
module_triple.setOSName(host_triple.getOSName());
- error = ModuleList::GetSharedModule(resolved_module_spec,
- exe_module_sp, module_search_paths_ptr, nullptr, nullptr);
+ error = ModuleList::GetSharedModule(
+ resolved_module_spec, exe_module_sp, module_search_paths_ptr,
+ nullptr, nullptr);
}
}
@@ -198,7 +178,8 @@
idx, resolved_module_spec.GetArchitecture());
++idx) {
error = ModuleList::GetSharedModule(resolved_module_spec, exe_module_sp,
- module_search_paths_ptr, nullptr, nullptr);
+ module_search_paths_ptr, nullptr,
+ nullptr);
// Did we find an executable using one of the
if (error.Success()) {
if (exe_module_sp && exe_module_sp->GetObjectFile())
@@ -232,73 +213,6 @@
return error;
}
-Status PlatformPOSIX::MakeDirectory(const FileSpec &file_spec,
- uint32_t file_permissions) {
- if (m_remote_platform_sp)
- return m_remote_platform_sp->MakeDirectory(file_spec, file_permissions);
- else
- return Platform::MakeDirectory(file_spec, file_permissions);
-}
-
-Status PlatformPOSIX::GetFilePermissions(const FileSpec &file_spec,
- uint32_t &file_permissions) {
- if (m_remote_platform_sp)
- return m_remote_platform_sp->GetFilePermissions(file_spec,
- file_permissions);
- else
- return Platform::GetFilePermissions(file_spec, file_permissions);
-}
-
-Status PlatformPOSIX::SetFilePermissions(const FileSpec &file_spec,
- uint32_t file_permissions) {
- if (m_remote_platform_sp)
- return m_remote_platform_sp->SetFilePermissions(file_spec,
- file_permissions);
- else
- return Platform::SetFilePermissions(file_spec, file_permissions);
-}
-
-lldb::user_id_t PlatformPOSIX::OpenFile(const FileSpec &file_spec,
- uint32_t flags, uint32_t mode,
- Status &error) {
- if (IsHost())
- return FileCache::GetInstance().OpenFile(file_spec, flags, mode, error);
- else if (m_remote_platform_sp)
- return m_remote_platform_sp->OpenFile(file_spec, flags, mode, error);
- else
- return Platform::OpenFile(file_spec, flags, mode, error);
-}
-
-bool PlatformPOSIX::CloseFile(lldb::user_id_t fd, Status &error) {
- if (IsHost())
- return FileCache::GetInstance().CloseFile(fd, error);
- else if (m_remote_platform_sp)
- return m_remote_platform_sp->CloseFile(fd, error);
- else
- return Platform::CloseFile(fd, error);
-}
-
-uint64_t PlatformPOSIX::ReadFile(lldb::user_id_t fd, uint64_t offset, void *dst,
- uint64_t dst_len, Status &error) {
- if (IsHost())
- return FileCache::GetInstance().ReadFile(fd, offset, dst, dst_len, error);
- else if (m_remote_platform_sp)
- return m_remote_platform_sp->ReadFile(fd, offset, dst, dst_len, error);
- else
- return Platform::ReadFile(fd, offset, dst, dst_len, error);
-}
-
-uint64_t PlatformPOSIX::WriteFile(lldb::user_id_t fd, uint64_t offset,
- const void *src, uint64_t src_len,
- Status &error) {
- if (IsHost())
- return FileCache::GetInstance().WriteFile(fd, offset, src, src_len, error);
- else if (m_remote_platform_sp)
- return m_remote_platform_sp->WriteFile(fd, offset, src, src_len, error);
- else
- return Platform::WriteFile(fd, offset, src, src_len, error);
-}
-
static uint32_t chown_file(Platform *platform, const char *path,
uint32_t uid = UINT32_MAX,
uint32_t gid = UINT32_MAX) {
@@ -387,45 +301,6 @@
return Platform::PutFile(source, destination, uid, gid);
}
-lldb::user_id_t PlatformPOSIX::GetFileSize(const FileSpec &file_spec) {
- if (IsHost()) {
- uint64_t Size;
- if (llvm::sys::fs::file_size(file_spec.GetPath(), Size))
- return 0;
- return Size;
- } else if (m_remote_platform_sp)
- return m_remote_platform_sp->GetFileSize(file_spec);
- else
- return Platform::GetFileSize(file_spec);
-}
-
-Status PlatformPOSIX::CreateSymlink(const FileSpec &src, const FileSpec &dst) {
- if (IsHost())
- return FileSystem::Instance().Symlink(src, dst);
- else if (m_remote_platform_sp)
- return m_remote_platform_sp->CreateSymlink(src, dst);
- else
- return Platform::CreateSymlink(src, dst);
-}
-
-bool PlatformPOSIX::GetFileExists(const FileSpec &file_spec) {
- if (IsHost())
- return FileSystem::Instance().Exists(file_spec);
- else if (m_remote_platform_sp)
- return m_remote_platform_sp->GetFileExists(file_spec);
- else
- return Platform::GetFileExists(file_spec);
-}
-
-Status PlatformPOSIX::Unlink(const FileSpec &file_spec) {
- if (IsHost())
- return llvm::sys::fs::remove(file_spec.GetPath());
- else if (m_remote_platform_sp)
- return m_remote_platform_sp->Unlink(file_spec);
- else
- return Platform::Unlink(file_spec);
-}
-
lldb_private::Status PlatformPOSIX::GetFile(
const lldb_private::FileSpec &source, // remote file path
const lldb_private::FileSpec &destination) // local file path
@@ -496,8 +371,9 @@
permissions = lldb::eFilePermissionsFileDefault;
user_id_t fd_dst = FileCache::GetInstance().OpenFile(
- destination, File::eOpenOptionCanCreate | File::eOpenOptionWrite |
- File::eOpenOptionTruncate,
+ destination,
+ File::eOpenOptionCanCreate | File::eOpenOptionWrite |
+ File::eOpenOptionTruncate,
permissions, error);
if (fd_dst == UINT64_MAX) {
@@ -569,35 +445,12 @@
return "";
}
-bool PlatformPOSIX::CalculateMD5(const FileSpec &file_spec, uint64_t &low,
- uint64_t &high) {
- if (IsHost())
- return Platform::CalculateMD5(file_spec, low, high);
- if (m_remote_platform_sp)
- return m_remote_platform_sp->CalculateMD5(file_spec, low, high);
- return false;
-}
-
const lldb::UnixSignalsSP &PlatformPOSIX::GetRemoteUnixSignals() {
if (IsRemote() && m_remote_platform_sp)
return m_remote_platform_sp->GetRemoteUnixSignals();
return Platform::GetRemoteUnixSignals();
}
-FileSpec PlatformPOSIX::GetRemoteWorkingDirectory() {
- if (IsRemote() && m_remote_platform_sp)
- return m_remote_platform_sp->GetRemoteWorkingDirectory();
- else
- return Platform::GetRemoteWorkingDirectory();
-}
-
-bool PlatformPOSIX::SetRemoteWorkingDirectory(const FileSpec &working_dir) {
- if (IsRemote() && m_remote_platform_sp)
- return m_remote_platform_sp->SetRemoteWorkingDirectory(working_dir);
- else
- return Platform::SetRemoteWorkingDirectory(working_dir);
-}
-
Status PlatformPOSIX::ConnectRemote(Args &args) {
Status error;
if (IsHost()) {
@@ -657,16 +510,6 @@
return error;
}
-lldb_private::Status PlatformPOSIX::KillProcess(const lldb::pid_t pid) {
- if (IsHost())
- return Platform::KillProcess(pid);
-
- if (m_remote_platform_sp)
- return m_remote_platform_sp->KillProcess(pid);
-
- return Status("the platform is not currently connected");
-}
-
lldb::ProcessSP PlatformPOSIX::Attach(ProcessAttachInfo &attach_info,
Debugger &debugger, Target *target,
Status &error) {
@@ -854,20 +697,19 @@
expr.append(dlopen_wrapper_code);
Status utility_error;
DiagnosticManager diagnostics;
-
- std::unique_ptr<UtilityFunction> dlopen_utility_func_up(process
- ->GetTarget().GetUtilityFunctionForLanguage(expr.c_str(),
- eLanguageTypeObjC,
- dlopen_wrapper_name,
- utility_error));
+
+ std::unique_ptr<UtilityFunction> dlopen_utility_func_up(
+ process->GetTarget().GetUtilityFunctionForLanguage(
+ expr.c_str(), eLanguageTypeObjC, dlopen_wrapper_name, utility_error));
if (utility_error.Fail()) {
error.SetErrorStringWithFormat("dlopen error: could not make utility"
- "function: %s", utility_error.AsCString());
+ "function: %s",
+ utility_error.AsCString());
return nullptr;
}
if (!dlopen_utility_func_up->Install(diagnostics, exe_ctx)) {
error.SetErrorStringWithFormat("dlopen error: could not install utility"
- "function: %s",
+ "function: %s",
diagnostics.GetString().c_str());
return nullptr;
}
@@ -879,10 +721,10 @@
// Fetch the clang types we will need:
ClangASTContext *ast = process->GetTarget().GetScratchClangASTContext();
- CompilerType clang_void_pointer_type
- = ast->GetBasicType(eBasicTypeVoid).GetPointerType();
- CompilerType clang_char_pointer_type
- = ast->GetBasicType(eBasicTypeChar).GetPointerType();
+ CompilerType clang_void_pointer_type =
+ ast->GetBasicType(eBasicTypeVoid).GetPointerType();
+ CompilerType clang_char_pointer_type =
+ ast->GetBasicType(eBasicTypeChar).GetPointerType();
// We are passing four arguments, the basename, the list of places to look,
// a buffer big enough for all the path + name combos, and
@@ -894,21 +736,22 @@
arguments.PushValue(value);
arguments.PushValue(value);
arguments.PushValue(value);
-
+
do_dlopen_function = dlopen_utility_func_up->MakeFunctionCaller(
clang_void_pointer_type, arguments, exe_ctx.GetThreadSP(), utility_error);
if (utility_error.Fail()) {
error.SetErrorStringWithFormat("dlopen error: could not make function"
- "caller: %s", utility_error.AsCString());
+ "caller: %s",
+ utility_error.AsCString());
return nullptr;
}
-
+
do_dlopen_function = dlopen_utility_func_up->GetFunctionCaller();
if (!do_dlopen_function) {
error.SetErrorString("dlopen error: could not get function caller.");
return nullptr;
}
-
+
// We made a good utility function, so cache it in the process:
return dlopen_utility_func_up;
}
@@ -923,15 +766,15 @@
std::string path;
path = remote_file.GetPath();
-
+
ThreadSP thread_sp = process->GetThreadList().GetExpressionExecutionThread();
if (!thread_sp) {
error.SetErrorString("dlopen error: no thread available to call dlopen.");
return LLDB_INVALID_IMAGE_TOKEN;
}
-
+
DiagnosticManager diagnostics;
-
+
ExecutionContext exe_ctx;
thread_sp->CalculateExecutionContext(exe_ctx);
@@ -949,70 +792,69 @@
// If we couldn't make it, the error will be in error, so we can exit here.
if (!dlopen_utility_func)
return LLDB_INVALID_IMAGE_TOKEN;
-
+
do_dlopen_function = dlopen_utility_func->GetFunctionCaller();
if (!do_dlopen_function) {
error.SetErrorString("dlopen error: could not get function caller.");
return LLDB_INVALID_IMAGE_TOKEN;
}
arguments = do_dlopen_function->GetArgumentValues();
-
+
// Now insert the path we are searching for and the result structure into the
// target.
- uint32_t permissions = ePermissionsReadable|ePermissionsWritable;
+ uint32_t permissions = ePermissionsReadable | ePermissionsWritable;
size_t path_len = path.size() + 1;
- lldb::addr_t path_addr = process->AllocateMemory(path_len,
- permissions,
- utility_error);
+ lldb::addr_t path_addr =
+ process->AllocateMemory(path_len, permissions, utility_error);
if (path_addr == LLDB_INVALID_ADDRESS) {
error.SetErrorStringWithFormat("dlopen error: could not allocate memory"
- "for path: %s", utility_error.AsCString());
+ "for path: %s",
+ utility_error.AsCString());
return LLDB_INVALID_IMAGE_TOKEN;
}
-
+
// Make sure we deallocate the input string memory:
- CleanUp path_cleanup([process, path_addr] {
- process->DeallocateMemory(path_addr);
- });
-
+ CleanUp path_cleanup(
+ [process, path_addr] { process->DeallocateMemory(path_addr); });
+
process->WriteMemory(path_addr, path.c_str(), path_len, utility_error);
if (utility_error.Fail()) {
error.SetErrorStringWithFormat("dlopen error: could not write path string:"
- " %s", utility_error.AsCString());
+ " %s",
+ utility_error.AsCString());
return LLDB_INVALID_IMAGE_TOKEN;
}
-
+
// Make space for our return structure. It is two pointers big: the token
// and the error string.
const uint32_t addr_size = process->GetAddressByteSize();
- lldb::addr_t return_addr = process->CallocateMemory(2*addr_size,
- permissions,
- utility_error);
+ lldb::addr_t return_addr =
+ process->CallocateMemory(2 * addr_size, permissions, utility_error);
if (utility_error.Fail()) {
error.SetErrorStringWithFormat("dlopen error: could not allocate memory"
- "for path: %s", utility_error.AsCString());
+ "for path: %s",
+ utility_error.AsCString());
return LLDB_INVALID_IMAGE_TOKEN;
}
-
+
// Make sure we deallocate the result structure memory
- CleanUp return_cleanup([process, return_addr] {
- process->DeallocateMemory(return_addr);
- });
-
+ CleanUp return_cleanup(
+ [process, return_addr] { process->DeallocateMemory(return_addr); });
+
// This will be the address of the storage for paths, if we are using them,
// or nullptr to signal we aren't.
lldb::addr_t path_array_addr = 0x0;
llvm::Optional<CleanUp> path_array_cleanup;
// This is the address to a buffer large enough to hold the largest path
- // conjoined with the library name we're passing in. This is a convenience
+ // conjoined with the library name we're passing in. This is a convenience
// to avoid having to call malloc in the dlopen function.
lldb::addr_t buffer_addr = 0x0;
llvm::Optional<CleanUp> buffer_cleanup;
-
+
// Set the values into our args and write them to the target:
if (paths != nullptr) {
- // First insert the paths into the target. This is expected to be a
+ // First insert the paths into the target. This is expected to be a
// continuous buffer with the strings laid out null terminated and
// end to end with an empty string terminating the buffer.
// We also compute the buffer's required size as we go.
@@ -1030,75 +872,71 @@
buffer_size = path_size;
}
path_array.push_back('\0');
-
- path_array_addr = process->AllocateMemory(path_array.size(),
- permissions,
- utility_error);
+
+ path_array_addr =
+ process->AllocateMemory(path_array.size(), permissions, utility_error);
if (path_array_addr == LLDB_INVALID_ADDRESS) {
error.SetErrorStringWithFormat("dlopen error: could not allocate memory"
- "for path array: %s",
- utility_error.AsCString());
+ "for path array: %s",
+ utility_error.AsCString());
return LLDB_INVALID_IMAGE_TOKEN;
}
-
+
// Make sure we deallocate the paths array.
- path_array_cleanup.emplace([process, path_array_addr] {
- process->DeallocateMemory(path_array_addr);
+ path_array_cleanup.emplace([process, path_array_addr] {
+ process->DeallocateMemory(path_array_addr);
});
- process->WriteMemory(path_array_addr, path_array.data(),
- path_array.size(), utility_error);
+ process->WriteMemory(path_array_addr, path_array.data(), path_array.size(),
+ utility_error);
if (utility_error.Fail()) {
error.SetErrorStringWithFormat("dlopen error: could not write path array:"
- " %s", utility_error.AsCString());
+ " %s",
+ utility_error.AsCString());
return LLDB_INVALID_IMAGE_TOKEN;
}
// Now make spaces in the target for the buffer. We need to add one for
// the '/' that the utility function will insert and one for the '\0':
buffer_size += path.size() + 2;
-
- buffer_addr = process->AllocateMemory(buffer_size,
- permissions,
- utility_error);
+
+ buffer_addr =
+ process->AllocateMemory(buffer_size, permissions, utility_error);
if (buffer_addr == LLDB_INVALID_ADDRESS) {
error.SetErrorStringWithFormat("dlopen error: could not allocate memory"
- "for buffer: %s",
- utility_error.AsCString());
+ "for buffer: %s",
+ utility_error.AsCString());
return LLDB_INVALID_IMAGE_TOKEN;
}
-
+
// Make sure we deallocate the buffer memory:
- buffer_cleanup.emplace([process, buffer_addr] {
- process->DeallocateMemory(buffer_addr);
- });
+ buffer_cleanup.emplace(
+ [process, buffer_addr] { process->DeallocateMemory(buffer_addr); });
}
-
+
arguments.GetValueAtIndex(0)->GetScalar() = path_addr;
arguments.GetValueAtIndex(1)->GetScalar() = path_array_addr;
arguments.GetValueAtIndex(2)->GetScalar() = buffer_addr;
arguments.GetValueAtIndex(3)->GetScalar() = return_addr;
lldb::addr_t func_args_addr = LLDB_INVALID_ADDRESS;
-
+
diagnostics.Clear();
- if (!do_dlopen_function->WriteFunctionArguments(exe_ctx,
- func_args_addr,
- arguments,
- diagnostics)) {
+ if (!do_dlopen_function->WriteFunctionArguments(exe_ctx, func_args_addr,
+ arguments, diagnostics)) {
error.SetErrorStringWithFormat("dlopen error: could not write function "
- "arguments: %s",
+ "arguments: %s",
diagnostics.GetString().c_str());
return LLDB_INVALID_IMAGE_TOKEN;
}
-
+
// Make sure we clean up the args structure. We can't reuse it because the
// Platform lives longer than the process and the Platforms don't get a
// signal to clean up cached data when a process goes away.
CleanUp args_cleanup([do_dlopen_function, &exe_ctx, func_args_addr] {
do_dlopen_function->DeallocateFunctionResults(exe_ctx, func_args_addr);
});
-
+
// Now run the caller:
EvaluateExpressionOptions options;
options.SetExecutionPolicy(eExecutionPolicyAlways);
@@ -1114,33 +952,33 @@
// Fetch the clang types we will need:
ClangASTContext *ast = process->GetTarget().GetScratchClangASTContext();
- CompilerType clang_void_pointer_type
- = ast->GetBasicType(eBasicTypeVoid).GetPointerType();
+ CompilerType clang_void_pointer_type =
+ ast->GetBasicType(eBasicTypeVoid).GetPointerType();
return_value.SetCompilerType(clang_void_pointer_type);
-
+
ExpressionResults results = do_dlopen_function->ExecuteFunction(
exe_ctx, &func_args_addr, options, diagnostics, return_value);
if (results != eExpressionCompleted) {
error.SetErrorStringWithFormat("dlopen error: failed executing "
- "dlopen wrapper function: %s",
+ "dlopen wrapper function: %s",
diagnostics.GetString().c_str());
return LLDB_INVALID_IMAGE_TOKEN;
}
-
+
// Read the dlopen token from the return area:
- lldb::addr_t token = process->ReadPointerFromMemory(return_addr,
- utility_error);
+ lldb::addr_t token =
+ process->ReadPointerFromMemory(return_addr, utility_error);
if (utility_error.Fail()) {
error.SetErrorStringWithFormat("dlopen error: could not read the return "
- "struct: %s", utility_error.AsCString());
+ "struct: %s",
+ utility_error.AsCString());
return LLDB_INVALID_IMAGE_TOKEN;
}
-
+
// The dlopen succeeded!
if (token != 0x0) {
- if (loaded_image && buffer_addr != 0x0)
- {
+ if (loaded_image && buffer_addr != 0x0) {
// Capture the image which was loaded. We leave it in the buffer on
// exit from the dlopen function, so we can just read it from there:
std::string name_string;
@@ -1150,20 +988,20 @@
}
return process->AddImageToken(token);
}
-
+
// We got an error, lets read in the error string:
std::string dlopen_error_str;
- lldb::addr_t error_addr
- = process->ReadPointerFromMemory(return_addr + addr_size, utility_error);
+ lldb::addr_t error_addr =
+ process->ReadPointerFromMemory(return_addr + addr_size, utility_error);
if (utility_error.Fail()) {
error.SetErrorStringWithFormat("dlopen error: could not read error string: "
- "%s", utility_error.AsCString());
+ "%s",
+ utility_error.AsCString());
return LLDB_INVALID_IMAGE_TOKEN;
}
-
- size_t num_chars = process->ReadCStringFromMemory(error_addr + addr_size,
- dlopen_error_str,
- utility_error);
+
+ size_t num_chars = process->ReadCStringFromMemory(
+ error_addr + addr_size, dlopen_error_str, utility_error);
if (utility_error.Success() && num_chars > 0)
error.SetErrorStringWithFormat("dlopen error: %s",
dlopen_error_str.c_str());
@@ -1200,19 +1038,6 @@
return Status();
}
-lldb::ProcessSP PlatformPOSIX::ConnectProcess(llvm::StringRef connect_url,
- llvm::StringRef plugin_name,
- lldb_private::Debugger &debugger,
- lldb_private::Target *target,
- lldb_private::Status &error) {
- if (m_remote_platform_sp)
- return m_remote_platform_sp->ConnectProcess(connect_url, plugin_name,
- debugger, target, error);
-
- return Platform::ConnectProcess(connect_url, plugin_name, debugger, target,
- error);
-}
-
llvm::StringRef
PlatformPOSIX::GetLibdlFunctionDeclarations(lldb_private::Process *process) {
return R"(
Index: include/lldb/Target/RemoteAwarePlatform.h
===================================================================
--- include/lldb/Target/RemoteAwarePlatform.h
+++ include/lldb/Target/RemoteAwarePlatform.h
@@ -21,6 +21,41 @@
bool GetModuleSpec(const FileSpec &module_file_spec, const ArchSpec &arch,
ModuleSpec &module_spec) override;
+
+ lldb::user_id_t OpenFile(const FileSpec &file_spec, uint32_t flags,
+ uint32_t mode, Status &error) override;
+
+ bool CloseFile(lldb::user_id_t fd, Status &error) override;
+
+ uint64_t ReadFile(lldb::user_id_t fd, uint64_t offset, void *dst,
+ uint64_t dst_len, Status &error) override;
+
+ uint64_t WriteFile(lldb::user_id_t fd, uint64_t offset, const void *src,
+ uint64_t src_len, Status &error) override;
+
+ lldb::user_id_t GetFileSize(const FileSpec &file_spec) override;
+
+ Status CreateSymlink(const FileSpec &src, const FileSpec &dst) override;
+
+ bool GetFileExists(const FileSpec &file_spec) override;
+
+ Status Unlink(const FileSpec &file_spec) override;
+
+ FileSpec GetRemoteWorkingDirectory() override;
+
+ bool SetRemoteWorkingDirectory(const FileSpec &working_dir) override;
+
+ Status MakeDirectory(const FileSpec &file_spec, uint32_t mode) override;
+
+ Status GetFilePermissions(const FileSpec &file_spec,
+ uint32_t &file_permissions) override;
+
+ Status SetFilePermissions(const FileSpec &file_spec,
+ uint32_t file_permissions) override;
+
+ bool CalculateMD5(const FileSpec &file_spec, uint64_t &low,
+ uint64_t &high) override;
+
Status GetFileWithUUID(const FileSpec &platform_file, const UUID *uuid,
FileSpec &local_file) override;
@@ -29,6 +64,11 @@
bool GetRemoteOSKernelDescription(std::string &s) override;
ArchSpec GetRemoteSystemArchitecture() override;
+ Status RunShellCommand(const char *command, const FileSpec &working_dir,
+ int *status_ptr, int *signo_ptr,
+ std::string *command_output,
+ const Timeout<std::micro> &timeout) override;
+
const char *GetHostname() override;
const char *GetUserName(uint32_t uid) override;
const char *GetGroupName(uint32_t gid) override;
@@ -39,8 +79,16 @@
bool GetProcessInfo(lldb::pid_t pid, ProcessInstanceInfo &proc_info) override;
uint32_t FindProcesses(const ProcessInstanceInfoMatch &match_info,
ProcessInstanceInfoList &process_infos) override;
+
+ lldb::ProcessSP ConnectProcess(llvm::StringRef connect_url,
+ llvm::StringRef plugin_name,
+ Debugger &debugger, Target *target,
+ Status &error) override;
+
Status LaunchProcess(ProcessLaunchInfo &launch_info) override;
+ Status KillProcess(const lldb::pid_t pid) override;
+
protected:
lldb::PlatformSP m_remote_platform_sp;
};
_______________________________________________
lldb-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits