xref: /llvm-project/lldb/source/Plugins/Process/Windows/Common/NativeProcessWindows.h (revision e64cc756819d567f453467bf7cc16599ad296fdd)
15146a9eaSAaron Smith //===-- NativeProcessWindows.h ----------------------------------*- C++ -*-===//
25146a9eaSAaron Smith //
35146a9eaSAaron Smith // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
45146a9eaSAaron Smith // See https://llvm.org/LICENSE.txt for license information.
55146a9eaSAaron Smith // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65146a9eaSAaron Smith //
75146a9eaSAaron Smith //===----------------------------------------------------------------------===//
85146a9eaSAaron Smith 
95146a9eaSAaron Smith #ifndef liblldb_NativeProcessWindows_h_
105146a9eaSAaron Smith #define liblldb_NativeProcessWindows_h_
115146a9eaSAaron Smith 
125146a9eaSAaron Smith #include "lldb/Host/common/NativeProcessProtocol.h"
135146a9eaSAaron Smith #include "lldb/lldb-forward.h"
145146a9eaSAaron Smith 
155146a9eaSAaron Smith #include "IDebugDelegate.h"
165146a9eaSAaron Smith #include "ProcessDebugger.h"
175146a9eaSAaron Smith 
185146a9eaSAaron Smith namespace lldb_private {
195146a9eaSAaron Smith 
205146a9eaSAaron Smith class HostProcess;
215146a9eaSAaron Smith class NativeProcessWindows;
225146a9eaSAaron Smith class NativeThreadWindows;
235146a9eaSAaron Smith class NativeDebugDelegate;
245146a9eaSAaron Smith 
255146a9eaSAaron Smith typedef std::shared_ptr<NativeDebugDelegate> NativeDebugDelegateSP;
265146a9eaSAaron Smith 
275146a9eaSAaron Smith //------------------------------------------------------------------
285146a9eaSAaron Smith // NativeProcessWindows
295146a9eaSAaron Smith //------------------------------------------------------------------
305146a9eaSAaron Smith class NativeProcessWindows : public NativeProcessProtocol,
315146a9eaSAaron Smith                              public ProcessDebugger {
325146a9eaSAaron Smith 
335146a9eaSAaron Smith public:
34*e64cc756SPavel Labath   class Manager : public NativeProcessProtocol::Manager {
355146a9eaSAaron Smith   public:
36*e64cc756SPavel Labath     using NativeProcessProtocol::Manager::Manager;
375146a9eaSAaron Smith 
385146a9eaSAaron Smith     llvm::Expected<std::unique_ptr<NativeProcessProtocol>>
39*e64cc756SPavel Labath     Launch(ProcessLaunchInfo &launch_info,
40*e64cc756SPavel Labath            NativeDelegate &native_delegate) override;
41*e64cc756SPavel Labath 
42*e64cc756SPavel Labath     llvm::Expected<std::unique_ptr<NativeProcessProtocol>>
43*e64cc756SPavel Labath     Attach(lldb::pid_t pid, NativeDelegate &native_delegate) override;
445146a9eaSAaron Smith   };
455146a9eaSAaron Smith 
465146a9eaSAaron Smith   Status Resume(const ResumeActionList &resume_actions) override;
475146a9eaSAaron Smith 
485146a9eaSAaron Smith   Status Halt() override;
495146a9eaSAaron Smith 
505146a9eaSAaron Smith   Status Detach() override;
515146a9eaSAaron Smith 
525146a9eaSAaron Smith   Status Signal(int signo) override;
535146a9eaSAaron Smith 
545146a9eaSAaron Smith   Status Interrupt() override;
555146a9eaSAaron Smith 
565146a9eaSAaron Smith   Status Kill() override;
575146a9eaSAaron Smith 
585146a9eaSAaron Smith   Status IgnoreSignals(llvm::ArrayRef<int> signals) override;
595146a9eaSAaron Smith 
605146a9eaSAaron Smith   Status GetMemoryRegionInfo(lldb::addr_t load_addr,
615146a9eaSAaron Smith                              MemoryRegionInfo &range_info) override;
625146a9eaSAaron Smith 
635146a9eaSAaron Smith   Status ReadMemory(lldb::addr_t addr, void *buf, size_t size,
645146a9eaSAaron Smith                     size_t &bytes_read) override;
655146a9eaSAaron Smith 
665146a9eaSAaron Smith   Status WriteMemory(lldb::addr_t addr, const void *buf, size_t size,
675146a9eaSAaron Smith                      size_t &bytes_written) override;
685146a9eaSAaron Smith 
692c4226f8SPavel Labath   llvm::Expected<lldb::addr_t> AllocateMemory(size_t size,
702c4226f8SPavel Labath                                               uint32_t permissions) override;
715146a9eaSAaron Smith 
722c4226f8SPavel Labath   llvm::Error DeallocateMemory(lldb::addr_t addr) override;
735146a9eaSAaron Smith 
745146a9eaSAaron Smith   lldb::addr_t GetSharedLibraryInfoAddress() override;
755146a9eaSAaron Smith 
765146a9eaSAaron Smith   bool IsAlive() const override;
775146a9eaSAaron Smith 
785146a9eaSAaron Smith   size_t UpdateThreads() override;
795146a9eaSAaron Smith 
GetArchitecture()805146a9eaSAaron Smith   const ArchSpec &GetArchitecture() const override { return m_arch; }
815146a9eaSAaron Smith 
SetArchitecture(const ArchSpec & arch_spec)825146a9eaSAaron Smith   void SetArchitecture(const ArchSpec &arch_spec) { m_arch = arch_spec; }
835146a9eaSAaron Smith 
845146a9eaSAaron Smith   Status SetBreakpoint(lldb::addr_t addr, uint32_t size,
855146a9eaSAaron Smith                        bool hardware) override;
865146a9eaSAaron Smith 
875146a9eaSAaron Smith   Status RemoveBreakpoint(lldb::addr_t addr, bool hardware = false) override;
885146a9eaSAaron Smith 
895146a9eaSAaron Smith   llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>>
905146a9eaSAaron Smith   GetAuxvData() const override;
915146a9eaSAaron Smith 
925146a9eaSAaron Smith   Status GetLoadedModuleFileSpec(const char *module_path,
935146a9eaSAaron Smith                                  FileSpec &file_spec) override;
945146a9eaSAaron Smith 
955146a9eaSAaron Smith   Status GetFileLoadAddress(const llvm::StringRef &file_name,
965146a9eaSAaron Smith                             lldb::addr_t &load_addr) override;
975146a9eaSAaron Smith 
985146a9eaSAaron Smith   // ProcessDebugger Overrides
995146a9eaSAaron Smith   void OnExitProcess(uint32_t exit_code) override;
1005146a9eaSAaron Smith   void OnDebuggerConnected(lldb::addr_t image_base) override;
1015146a9eaSAaron Smith   ExceptionResult OnDebugException(bool first_chance,
1025146a9eaSAaron Smith                                    const ExceptionRecord &record) override;
1035146a9eaSAaron Smith   void OnCreateThread(const HostThread &thread) override;
1045146a9eaSAaron Smith   void OnExitThread(lldb::tid_t thread_id, uint32_t exit_code) override;
1055146a9eaSAaron Smith   void OnLoadDll(const ModuleSpec &module_spec,
1065146a9eaSAaron Smith                  lldb::addr_t module_addr) override;
1075146a9eaSAaron Smith   void OnUnloadDll(lldb::addr_t module_addr) override;
1085146a9eaSAaron Smith 
1095146a9eaSAaron Smith protected:
1105146a9eaSAaron Smith   NativeThreadWindows *GetThreadByID(lldb::tid_t thread_id);
1115146a9eaSAaron Smith 
1129f34f75fSMartin Storsjö   llvm::Expected<llvm::ArrayRef<uint8_t>>
1139f34f75fSMartin Storsjö   GetSoftwareBreakpointTrapOpcode(size_t size_hint) override;
1149f34f75fSMartin Storsjö 
1159f34f75fSMartin Storsjö   size_t GetSoftwareBreakpointPCOffset() override;
1169f34f75fSMartin Storsjö 
1175146a9eaSAaron Smith   bool FindSoftwareBreakpoint(lldb::addr_t addr);
1185146a9eaSAaron Smith 
1195146a9eaSAaron Smith   void StopThread(lldb::tid_t thread_id, lldb::StopReason reason,
1205146a9eaSAaron Smith                   std::string description = "");
1215146a9eaSAaron Smith 
1225146a9eaSAaron Smith   void SetStopReasonForThread(NativeThreadWindows &thread,
1235146a9eaSAaron Smith                               lldb::StopReason reason,
1245146a9eaSAaron Smith                               std::string description = "");
1255146a9eaSAaron Smith 
1265146a9eaSAaron Smith private:
1275146a9eaSAaron Smith   ArchSpec m_arch;
1285146a9eaSAaron Smith 
1295146a9eaSAaron Smith   NativeProcessWindows(ProcessLaunchInfo &launch_info, NativeDelegate &delegate,
1305146a9eaSAaron Smith                        llvm::Error &E);
1315146a9eaSAaron Smith 
1325146a9eaSAaron Smith   NativeProcessWindows(lldb::pid_t pid, int terminal_fd,
1335146a9eaSAaron Smith                        NativeDelegate &delegate, llvm::Error &E);
1345146a9eaSAaron Smith 
1355146a9eaSAaron Smith   Status CacheLoadedModules();
1365146a9eaSAaron Smith   std::map<lldb_private::FileSpec, lldb::addr_t> m_loaded_modules;
1375146a9eaSAaron Smith };
1385146a9eaSAaron Smith 
1395146a9eaSAaron Smith //------------------------------------------------------------------
1405146a9eaSAaron Smith // NativeDebugDelegate
1415146a9eaSAaron Smith //------------------------------------------------------------------
1425146a9eaSAaron Smith class NativeDebugDelegate : public IDebugDelegate {
1435146a9eaSAaron Smith public:
NativeDebugDelegate(NativeProcessWindows & process)1445146a9eaSAaron Smith   NativeDebugDelegate(NativeProcessWindows &process) : m_process(process) {}
1455146a9eaSAaron Smith 
OnExitProcess(uint32_t exit_code)146abaca237SMartin Storsjö   void OnExitProcess(uint32_t exit_code) override {
147abaca237SMartin Storsjö     m_process.OnExitProcess(exit_code);
148abaca237SMartin Storsjö   }
1495146a9eaSAaron Smith 
OnDebuggerConnected(lldb::addr_t image_base)150abaca237SMartin Storsjö   void OnDebuggerConnected(lldb::addr_t image_base) override {
1515146a9eaSAaron Smith     m_process.OnDebuggerConnected(image_base);
1525146a9eaSAaron Smith   }
1535146a9eaSAaron Smith 
OnDebugException(bool first_chance,const ExceptionRecord & record)1545146a9eaSAaron Smith   ExceptionResult OnDebugException(bool first_chance,
155abaca237SMartin Storsjö                                    const ExceptionRecord &record) override {
1565146a9eaSAaron Smith     return m_process.OnDebugException(first_chance, record);
1575146a9eaSAaron Smith   }
1585146a9eaSAaron Smith 
OnCreateThread(const HostThread & thread)159abaca237SMartin Storsjö   void OnCreateThread(const HostThread &thread) override {
1605146a9eaSAaron Smith     m_process.OnCreateThread(thread);
1615146a9eaSAaron Smith   }
1625146a9eaSAaron Smith 
OnExitThread(lldb::tid_t thread_id,uint32_t exit_code)163abaca237SMartin Storsjö   void OnExitThread(lldb::tid_t thread_id, uint32_t exit_code) override {
1645146a9eaSAaron Smith     m_process.OnExitThread(thread_id, exit_code);
1655146a9eaSAaron Smith   }
1665146a9eaSAaron Smith 
OnLoadDll(const lldb_private::ModuleSpec & module_spec,lldb::addr_t module_addr)1675146a9eaSAaron Smith   void OnLoadDll(const lldb_private::ModuleSpec &module_spec,
168abaca237SMartin Storsjö                  lldb::addr_t module_addr) override {
1695146a9eaSAaron Smith     m_process.OnLoadDll(module_spec, module_addr);
1705146a9eaSAaron Smith   }
1715146a9eaSAaron Smith 
OnUnloadDll(lldb::addr_t module_addr)172abaca237SMartin Storsjö   void OnUnloadDll(lldb::addr_t module_addr) override {
1735146a9eaSAaron Smith     m_process.OnUnloadDll(module_addr);
1745146a9eaSAaron Smith   }
1755146a9eaSAaron Smith 
OnDebugString(const std::string & string)176abaca237SMartin Storsjö   void OnDebugString(const std::string &string) override {
1775146a9eaSAaron Smith     m_process.OnDebugString(string);
1785146a9eaSAaron Smith   }
1795146a9eaSAaron Smith 
OnDebuggerError(const Status & error,uint32_t type)180abaca237SMartin Storsjö   void OnDebuggerError(const Status &error, uint32_t type) override {
1815146a9eaSAaron Smith     return m_process.OnDebuggerError(error, type);
1825146a9eaSAaron Smith   }
1835146a9eaSAaron Smith 
1845146a9eaSAaron Smith private:
1855146a9eaSAaron Smith   NativeProcessWindows &m_process;
1865146a9eaSAaron Smith };
1875146a9eaSAaron Smith 
1885146a9eaSAaron Smith } // namespace lldb_private
1895146a9eaSAaron Smith 
1905146a9eaSAaron Smith #endif // #ifndef liblldb_NativeProcessWindows_h_
191