asmith created this revision.
asmith added reviewers: zturner, llvm-commits.
Herald added a subscriber: lldb-commits.
Implement a few routines for Windows to support some basic process interaction
and file system operations.
Repository:
rLLDB LLDB
https://reviews.llvm.org/D56232
Files:
source/Plugins/Platform/Windows/PlatformWindows.cpp
source/Plugins/Platform/Windows/PlatformWindows.h
Index: source/Plugins/Platform/Windows/PlatformWindows.h
===================================================================
--- source/Plugins/Platform/Windows/PlatformWindows.h
+++ source/Plugins/Platform/Windows/PlatformWindows.h
@@ -54,6 +54,33 @@
return GetPluginDescriptionStatic(IsHost());
}
+ 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;
+
+ bool GetFileExists(const lldb_private::FileSpec &file_spec) override;
+
+ lldb_private::Status Unlink(const lldb_private::FileSpec &file_spec) override;
+
+ lldb_private::FileSpec GetRemoteWorkingDirectory() override;
+
+ bool
+ SetRemoteWorkingDirectory(const lldb_private::FileSpec &working_dir) override;
+
bool GetRemoteOSVersion() override;
bool GetRemoteOSBuildString(std::string &s) override;
@@ -65,6 +92,12 @@
bool IsConnected() const override;
+ lldb_private::Status
+ RunShellCommand(const char *command,
+ const lldb_private::FileSpec &working_dir, int *status_ptr,
+ int *signo_ptr, std::string *command_output,
+ const lldb_private::Timeout<std::micro> &timeout) override;
+
lldb_private::Status ConnectRemote(lldb_private::Args &args) override;
lldb_private::Status DisconnectRemote() override;
@@ -75,6 +108,17 @@
const char *GetGroupName(uint32_t gid) 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 GetProcessInfo(lldb::pid_t pid,
lldb_private::ProcessInstanceInfo &proc_info) override;
@@ -82,9 +126,17 @@
FindProcesses(const lldb_private::ProcessInstanceInfoMatch &match_info,
lldb_private::ProcessInstanceInfoList &process_infos) 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;
+
lldb_private::Status
LaunchProcess(lldb_private::ProcessLaunchInfo &launch_info) override;
+ lldb_private::Status KillProcess(const lldb::pid_t pid) override;
+
lldb::ProcessSP DebugProcess(lldb_private::ProcessLaunchInfo &launch_info,
lldb_private::Debugger &debugger,
lldb_private::Target *target,
@@ -95,6 +147,9 @@
lldb_private::Target *target,
lldb_private::Status &error) override;
+ bool CalculateMD5(const lldb_private::FileSpec &file_spec, uint64_t &low,
+ uint64_t &high) override;
+
lldb_private::Status
GetFileWithUUID(const lldb_private::FileSpec &platform_file,
const lldb_private::UUID *uuid,
Index: source/Plugins/Platform/Windows/PlatformWindows.cpp
===================================================================
--- source/Plugins/Platform/Windows/PlatformWindows.cpp
+++ source/Plugins/Platform/Windows/PlatformWindows.cpp
@@ -21,6 +21,8 @@
#include "lldb/Core/Module.h"
#include "lldb/Core/ModuleSpec.h"
#include "lldb/Core/PluginManager.h"
+#include "lldb/Host/FileCache.h"
+#include "lldb/Host/FileSystem.h"
#include "lldb/Host/HostInfo.h"
#include "lldb/Target/Process.h"
#include "lldb/Utility/Status.h"
@@ -176,6 +178,23 @@
return Platform::GetModuleSpec(module_file_spec, arch, module_spec);
}
+lldb_private::Status
+PlatformWindows::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);
+ 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 PlatformWindows::ResolveExecutable(
const ModuleSpec &ms, lldb::ModuleSP &exe_module_sp,
const FileSpecList *module_search_paths_ptr) {
@@ -208,8 +227,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).
@@ -244,7 +264,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())
@@ -278,6 +299,126 @@
return error;
}
+Status PlatformWindows::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 PlatformWindows::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 PlatformWindows::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 PlatformWindows::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 PlatformWindows::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 PlatformWindows::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 PlatformWindows::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);
+}
+
+lldb::user_id_t PlatformWindows::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 PlatformWindows::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 PlatformWindows::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 PlatformWindows::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);
+}
+FileSpec PlatformWindows::GetRemoteWorkingDirectory() {
+ if (IsRemote() && m_remote_platform_sp)
+ return m_remote_platform_sp->GetRemoteWorkingDirectory();
+ else
+ return Platform::GetRemoteWorkingDirectory();
+}
+
+bool PlatformWindows::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);
+}
+
bool PlatformWindows::GetRemoteOSVersion() {
if (m_remote_platform_sp) {
m_os_version = m_remote_platform_sp->GetOSVersion();
@@ -397,8 +538,21 @@
return match_count;
}
+lldb::ProcessSP PlatformWindows::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);
+}
+
Status PlatformWindows::LaunchProcess(ProcessLaunchInfo &launch_info) {
Status error;
+
if (IsHost()) {
error = Platform::LaunchProcess(launch_info);
} else {
@@ -410,6 +564,16 @@
return error;
}
+lldb_private::Status PlatformWindows::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");
+}
+
ProcessSP PlatformWindows::DebugProcess(ProcessLaunchInfo &launch_info,
Debugger &debugger, Target *target,
Status &error) {
@@ -432,6 +596,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);
@@ -511,6 +683,15 @@
return nullptr;
}
+bool PlatformWindows::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;
+}
+
Status PlatformWindows::GetFileWithUUID(const FileSpec &platform_file,
const UUID *uuid_ptr,
FileSpec &local_file) {
@@ -568,7 +749,7 @@
#ifdef _WIN32
llvm::VersionTuple version = HostInfo::GetOSVersion();
- strm << "Host: Windows " << version.getAsString() << '\n';
+ strm << " Host: Windows " << version.getAsString() << '\n';
#endif
}
_______________________________________________
lldb-commits mailing list
[email protected]
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits