summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZachary Turner <zturner@google.com>2014-07-28 16:45:18 +0000
committerZachary Turner <zturner@google.com>2014-07-28 16:45:18 +0000
commit35ed13262d1f9a6434dab9f00e7abf011f854bdc (patch)
tree3373e37d8d0c23cdfbe04055723526fdfb6f4aad
parent9e757b7ebe5c3e1a07d4e3f5757f2dd19a78a8a1 (diff)
downloadbcm5719-llvm-35ed13262d1f9a6434dab9f00e7abf011f854bdc.tar.gz
bcm5719-llvm-35ed13262d1f9a6434dab9f00e7abf011f854bdc.zip
Teach LLDB about Windows processes.
This patch creates a simple ProcessWindows process plugin. The only thing it knows how to do currently is create processes. Differential Revision: http://reviews.llvm.org/D4681 llvm-svn: 214094
-rw-r--r--lldb/source/CMakeLists.txt1
-rw-r--r--lldb/source/Plugins/Process/CMakeLists.txt1
-rw-r--r--lldb/source/Plugins/Process/Windows/CMakeLists.txt9
-rw-r--r--lldb/source/Plugins/Process/Windows/ProcessWindows.cpp203
-rw-r--r--lldb/source/Plugins/Process/Windows/ProcessWindows.h109
-rw-r--r--lldb/source/lldb.cpp7
6 files changed, 330 insertions, 0 deletions
diff --git a/lldb/source/CMakeLists.txt b/lldb/source/CMakeLists.txt
index b8b4d0ae3e6..46998af8b93 100644
--- a/lldb/source/CMakeLists.txt
+++ b/lldb/source/CMakeLists.txt
@@ -98,6 +98,7 @@ endif ()
if ( CMAKE_SYSTEM_NAME MATCHES "Windows" )
list(APPEND LLDB_USED_LIBS
lldbHostWindows
+ lldbPluginProcessWindows
lldbPluginProcessElfCore
lldbPluginJITLoaderGDB
Ws2_32
diff --git a/lldb/source/Plugins/Process/CMakeLists.txt b/lldb/source/Plugins/Process/CMakeLists.txt
index 8937fb4af38..b6008cfcd5d 100644
--- a/lldb/source/Plugins/Process/CMakeLists.txt
+++ b/lldb/source/Plugins/Process/CMakeLists.txt
@@ -5,6 +5,7 @@ elseif (CMAKE_SYSTEM_NAME MATCHES "FreeBSD")
add_subdirectory(FreeBSD)
add_subdirectory(POSIX)
elseif (CMAKE_SYSTEM_NAME MATCHES "Windows")
+ add_subdirectory(Windows)
elseif (CMAKE_SYSTEM_NAME MATCHES "Darwin")
add_subdirectory(POSIX)
add_subdirectory(MacOSX-Kernel)
diff --git a/lldb/source/Plugins/Process/Windows/CMakeLists.txt b/lldb/source/Plugins/Process/Windows/CMakeLists.txt
new file mode 100644
index 00000000000..55a9be83f04
--- /dev/null
+++ b/lldb/source/Plugins/Process/Windows/CMakeLists.txt
@@ -0,0 +1,9 @@
+set(LLVM_NO_RTTI 1)
+
+include_directories(.)
+include_directories(../Utility)
+
+add_lldb_library(lldbPluginProcessWindows
+ ProcessWindows.cpp
+ )
+
diff --git a/lldb/source/Plugins/Process/Windows/ProcessWindows.cpp b/lldb/source/Plugins/Process/Windows/ProcessWindows.cpp
new file mode 100644
index 00000000000..8aeed4b8252
--- /dev/null
+++ b/lldb/source/Plugins/Process/Windows/ProcessWindows.cpp
@@ -0,0 +1,203 @@
+//===-- ProcessWindows.cpp --------------------------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// Windows includes
+#include "lldb/Host/windows/windows.h"
+
+// C++ Includes
+// Other libraries and framework includes
+#include "lldb/Core/Module.h"
+#include "lldb/Core/PluginManager.h"
+#include "lldb/Core/State.h"
+#include "lldb/Host/Host.h"
+#include "lldb/Symbol/ObjectFile.h"
+#include "lldb/Target/DynamicLoader.h"
+#include "lldb/Target/Target.h"
+
+#include "ProcessWindows.h"
+
+using namespace lldb;
+using namespace lldb_private;
+
+//------------------------------------------------------------------------------
+// Static functions.
+
+ProcessSP
+ProcessWindows::CreateInstance(Target &target, Listener &listener, const FileSpec *)
+{
+ return ProcessSP(new ProcessWindows(target, listener));
+}
+
+void
+ProcessWindows::Initialize()
+{
+ static bool g_initialized = false;
+
+ if (!g_initialized)
+ {
+ g_initialized = true;
+ PluginManager::RegisterPlugin(GetPluginNameStatic(),
+ GetPluginDescriptionStatic(),
+ CreateInstance);
+ }
+}
+
+//------------------------------------------------------------------------------
+// Constructors and destructors.
+
+ProcessWindows::ProcessWindows(Target& target, Listener &listener)
+ : lldb_private::Process(target, listener)
+{
+}
+
+void
+ProcessWindows::Terminate()
+{
+}
+
+lldb_private::ConstString
+ProcessWindows::GetPluginNameStatic()
+{
+ static ConstString g_name("windows");
+ return g_name;
+}
+
+const char *
+ProcessWindows::GetPluginDescriptionStatic()
+{
+ return "Process plugin for Windows";
+}
+
+
+bool
+ProcessWindows::UpdateThreadList(ThreadList &old_thread_list, ThreadList &new_thread_list)
+{
+ new_thread_list = old_thread_list;
+ return new_thread_list.GetSize(false) > 0;
+}
+
+Error
+ProcessWindows::DoLaunch(Module *exe_module,
+ ProcessLaunchInfo &launch_info)
+{
+ std::string executable;
+ std::string commandLine;
+ std::vector<char> environment;
+ STARTUPINFO startupinfo = {0};
+ PROCESS_INFORMATION pi = {0};
+ startupinfo.cb = sizeof(startupinfo);
+
+ executable = launch_info.GetExecutableFile().GetPath();
+ launch_info.GetArguments().GetQuotedCommandString(commandLine);
+ BOOL result = ::CreateProcessA(executable.c_str(),
+ const_cast<char*>(commandLine.c_str()),
+ NULL,
+ NULL,
+ FALSE,
+ CREATE_NEW_CONSOLE,
+ NULL,
+ launch_info.GetWorkingDirectory(),
+ &startupinfo,
+ &pi);
+ Error error;
+ if (!result)
+ error.SetErrorToErrno();
+ return error;
+}
+
+Error
+ProcessWindows::DoResume()
+{
+ Error error;
+ return error;
+}
+
+
+//------------------------------------------------------------------------------
+// ProcessInterface protocol.
+
+lldb_private::ConstString
+ProcessWindows::GetPluginName()
+{
+ return GetPluginNameStatic();
+}
+
+uint32_t
+ProcessWindows::GetPluginVersion()
+{
+ return 1;
+}
+
+void
+ProcessWindows::GetPluginCommandHelp(const char *command, Stream *strm)
+{
+}
+
+Error
+ProcessWindows::ExecutePluginCommand(Args &command, Stream *strm)
+{
+ return Error(1, eErrorTypeGeneric);
+}
+
+Log *
+ProcessWindows::EnablePluginLogging(Stream *strm, Args &command)
+{
+ return NULL;
+}
+
+Error
+ProcessWindows::DoDetach(bool keep_stopped)
+{
+ Error error;
+ error.SetErrorString("Detaching from processes is not currently supported on Windows.");
+ return error;
+}
+
+Error
+ProcessWindows::DoDestroy()
+{
+ Error error;
+ error.SetErrorString("Destroying processes is not currently supported on Windows.");
+ return error;
+}
+
+void
+ProcessWindows::RefreshStateAfterStop()
+{
+}
+
+bool
+ProcessWindows::IsAlive()
+{
+ return false;
+}
+
+size_t
+ProcessWindows::DoReadMemory(lldb::addr_t vm_addr,
+ void *buf,
+ size_t size,
+ Error &error)
+{
+ return 0;
+}
+
+
+bool
+ProcessWindows::CanDebug(Target &target, bool plugin_specified_by_name)
+{
+ if (plugin_specified_by_name)
+ return true;
+
+ // For now we are just making sure the file exists for a given module
+ ModuleSP exe_module_sp(target.GetExecutableModule());
+ if (exe_module_sp.get())
+ return exe_module_sp->GetFileSpec().Exists();
+ return false;
+}
+
diff --git a/lldb/source/Plugins/Process/Windows/ProcessWindows.h b/lldb/source/Plugins/Process/Windows/ProcessWindows.h
new file mode 100644
index 00000000000..2feb46ffa5e
--- /dev/null
+++ b/lldb/source/Plugins/Process/Windows/ProcessWindows.h
@@ -0,0 +1,109 @@
+//===-- ProcessWindows.h ----------------------------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef liblldb_Plugins_Process_Windows_ProcessWindows_H_
+#define liblldb_Plugins_Process_Windows_ProcessWindows_H_
+
+// C Includes
+
+// C++ Includes
+#include <queue>
+
+// Other libraries and framework includes
+#include "lldb/Target/Process.h"
+
+class ProcessMonitor;
+
+class ProcessWindows :
+ public lldb_private::Process
+{
+public:
+ //------------------------------------------------------------------
+ // Static functions.
+ //------------------------------------------------------------------
+ static lldb::ProcessSP
+ CreateInstance(lldb_private::Target& target,
+ lldb_private::Listener &listener,
+ const lldb_private::FileSpec *);
+
+ static void
+ Initialize();
+
+ static void
+ Terminate();
+
+ static lldb_private::ConstString
+ GetPluginNameStatic();
+
+ static const char *
+ GetPluginDescriptionStatic();
+
+ //------------------------------------------------------------------
+ // Constructors and destructors
+ //------------------------------------------------------------------
+ ProcessWindows(lldb_private::Target& target,
+ lldb_private::Listener &listener);
+
+ virtual lldb_private::Error
+ DoDetach(bool keep_stopped);
+
+ virtual bool
+ DetachRequiresHalt() { return true; }
+
+ virtual bool
+ UpdateThreadList(lldb_private::ThreadList &old_thread_list, lldb_private::ThreadList &new_thread_list);
+
+ virtual lldb_private::Error
+ DoLaunch (lldb_private::Module *exe_module,
+ lldb_private::ProcessLaunchInfo &launch_info);
+
+ virtual lldb_private::Error
+ DoResume ();
+
+ //------------------------------------------------------------------
+ // PluginInterface protocol
+ //------------------------------------------------------------------
+ virtual lldb_private::ConstString
+ GetPluginName();
+
+ virtual uint32_t
+ GetPluginVersion();
+
+ virtual void
+ GetPluginCommandHelp(const char *command, lldb_private::Stream *strm);
+
+ virtual lldb_private::Error
+ ExecutePluginCommand(lldb_private::Args &command,
+ lldb_private::Stream *strm);
+
+ virtual lldb_private::Log *
+ EnablePluginLogging(lldb_private::Stream *strm,
+ lldb_private::Args &command);
+
+
+ virtual bool
+ CanDebug(lldb_private::Target &target, bool plugin_specified_by_name);
+
+ virtual lldb_private::Error
+ DoDestroy ();
+
+ virtual void
+ RefreshStateAfterStop ();
+
+ virtual bool
+ IsAlive ();
+
+ virtual size_t
+ DoReadMemory (lldb::addr_t vm_addr,
+ void *buf,
+ size_t size,
+ lldb_private::Error &error);
+};
+
+#endif // liblldb_Plugins_Process_Windows_ProcessWindows_H_
diff --git a/lldb/source/lldb.cpp b/lldb/source/lldb.cpp
index aa8a4ffde88..befcc3c9c91 100644
--- a/lldb/source/lldb.cpp
+++ b/lldb/source/lldb.cpp
@@ -78,6 +78,10 @@
#include "Plugins/Process/Linux/ProcessLinux.h"
#endif
+#if defined (_WIN32)
+#include "Plugins/Process/Windows/ProcessWindows.h"
+#endif
+
#if defined (__FreeBSD__)
#include "Plugins/Process/POSIX/ProcessPOSIX.h"
#include "Plugins/Process/FreeBSD/ProcessFreeBSD.h"
@@ -159,6 +163,9 @@ lldb_private::Initialize ()
//----------------------------------------------------------------------
ProcessLinux::Initialize();
#endif
+#if defined(_WIN32)
+ ProcessWindows::Initialize();
+#endif
#if defined (__FreeBSD__)
ProcessFreeBSD::Initialize();
#endif
OpenPOWER on IntegriCloud