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:
345146a9eaSAaron Smith   class Factory : public NativeProcessProtocol::Factory {
355146a9eaSAaron Smith   public:
365146a9eaSAaron Smith     llvm::Expected<std::unique_ptr<NativeProcessProtocol>>
375146a9eaSAaron Smith     Launch(ProcessLaunchInfo &launch_info, NativeDelegate &native_delegate,
385146a9eaSAaron Smith            MainLoop &mainloop) const override;
395146a9eaSAaron Smith 
405146a9eaSAaron Smith     llvm::Expected<std::unique_ptr<NativeProcessProtocol>>
415146a9eaSAaron Smith     Attach(lldb::pid_t pid, NativeDelegate &native_delegate,
425146a9eaSAaron Smith            MainLoop &mainloop) const override;
435146a9eaSAaron Smith   };
445146a9eaSAaron Smith 
455146a9eaSAaron Smith   Status Resume(const ResumeActionList &resume_actions) override;
465146a9eaSAaron Smith 
475146a9eaSAaron Smith   Status Halt() override;
485146a9eaSAaron Smith 
495146a9eaSAaron Smith   Status Detach() override;
505146a9eaSAaron Smith 
515146a9eaSAaron Smith   Status Signal(int signo) override;
525146a9eaSAaron Smith 
535146a9eaSAaron Smith   Status Interrupt() override;
545146a9eaSAaron Smith 
555146a9eaSAaron Smith   Status Kill() override;
565146a9eaSAaron Smith 
575146a9eaSAaron Smith   Status IgnoreSignals(llvm::ArrayRef<int> signals) override;
585146a9eaSAaron Smith 
595146a9eaSAaron Smith   Status GetMemoryRegionInfo(lldb::addr_t load_addr,
605146a9eaSAaron Smith                              MemoryRegionInfo &range_info) override;
615146a9eaSAaron Smith 
625146a9eaSAaron Smith   Status ReadMemory(lldb::addr_t addr, void *buf, size_t size,
635146a9eaSAaron Smith                     size_t &bytes_read) override;
645146a9eaSAaron Smith 
655146a9eaSAaron Smith   Status WriteMemory(lldb::addr_t addr, const void *buf, size_t size,
665146a9eaSAaron Smith                      size_t &bytes_written) override;
675146a9eaSAaron Smith 
682c4226f8SPavel Labath   llvm::Expected<lldb::addr_t> AllocateMemory(size_t size,
692c4226f8SPavel Labath                                               uint32_t permissions) override;
705146a9eaSAaron Smith 
712c4226f8SPavel Labath   llvm::Error DeallocateMemory(lldb::addr_t addr) override;
725146a9eaSAaron Smith 
735146a9eaSAaron Smith   lldb::addr_t GetSharedLibraryInfoAddress() override;
745146a9eaSAaron Smith 
755146a9eaSAaron Smith   bool IsAlive() const override;
765146a9eaSAaron Smith 
775146a9eaSAaron Smith   size_t UpdateThreads() override;
785146a9eaSAaron Smith 
GetArchitecture()795146a9eaSAaron Smith   const ArchSpec &GetArchitecture() const override { return m_arch; }
805146a9eaSAaron Smith 
SetArchitecture(const ArchSpec & arch_spec)815146a9eaSAaron Smith   void SetArchitecture(const ArchSpec &arch_spec) { m_arch = arch_spec; }
825146a9eaSAaron Smith 
835146a9eaSAaron Smith   Status SetBreakpoint(lldb::addr_t addr, uint32_t size,
845146a9eaSAaron Smith                        bool hardware) override;
855146a9eaSAaron Smith 
865146a9eaSAaron Smith   Status RemoveBreakpoint(lldb::addr_t addr, bool hardware = false) override;
875146a9eaSAaron Smith 
885146a9eaSAaron Smith   llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>>
895146a9eaSAaron Smith   GetAuxvData() const override;
905146a9eaSAaron Smith 
915146a9eaSAaron Smith   Status GetLoadedModuleFileSpec(const char *module_path,
925146a9eaSAaron Smith                                  FileSpec &file_spec) override;
935146a9eaSAaron Smith 
945146a9eaSAaron Smith   Status GetFileLoadAddress(const llvm::StringRef &file_name,
955146a9eaSAaron Smith                             lldb::addr_t &load_addr) override;
965146a9eaSAaron Smith 
975146a9eaSAaron Smith   // ProcessDebugger Overrides
985146a9eaSAaron Smith   void OnExitProcess(uint32_t exit_code) override;
995146a9eaSAaron Smith   void OnDebuggerConnected(lldb::addr_t image_base) override;
1005146a9eaSAaron Smith   ExceptionResult OnDebugException(bool first_chance,
1015146a9eaSAaron Smith                                    const ExceptionRecord &record) override;
1025146a9eaSAaron Smith   void OnCreateThread(const HostThread &thread) override;
1035146a9eaSAaron Smith   void OnExitThread(lldb::tid_t thread_id, uint32_t exit_code) override;
1045146a9eaSAaron Smith   void OnLoadDll(const ModuleSpec &module_spec,
1055146a9eaSAaron Smith                  lldb::addr_t module_addr) override;
1065146a9eaSAaron Smith   void OnUnloadDll(lldb::addr_t module_addr) override;
1075146a9eaSAaron Smith 
1085146a9eaSAaron Smith protected:
1095146a9eaSAaron Smith   NativeThreadWindows *GetThreadByID(lldb::tid_t thread_id);
1105146a9eaSAaron Smith 
111*9f34f75fSMartin Storsjö   llvm::Expected<llvm::ArrayRef<uint8_t>>
112*9f34f75fSMartin Storsjö   GetSoftwareBreakpointTrapOpcode(size_t size_hint) override;
113*9f34f75fSMartin Storsjö 
114*9f34f75fSMartin Storsjö   size_t GetSoftwareBreakpointPCOffset() override;
115*9f34f75fSMartin Storsjö 
1165146a9eaSAaron Smith   bool FindSoftwareBreakpoint(lldb::addr_t addr);
1175146a9eaSAaron Smith 
1185146a9eaSAaron Smith   void StopThread(lldb::tid_t thread_id, lldb::StopReason reason,
1195146a9eaSAaron Smith                   std::string description = "");
1205146a9eaSAaron Smith 
1215146a9eaSAaron Smith   void SetStopReasonForThread(NativeThreadWindows &thread,
1225146a9eaSAaron Smith                               lldb::StopReason reason,
1235146a9eaSAaron Smith                               std::string description = "");
1245146a9eaSAaron Smith 
1255146a9eaSAaron Smith private:
1265146a9eaSAaron Smith   ArchSpec m_arch;
1275146a9eaSAaron Smith 
1285146a9eaSAaron Smith   NativeProcessWindows(ProcessLaunchInfo &launch_info, NativeDelegate &delegate,
1295146a9eaSAaron Smith                        llvm::Error &E);
1305146a9eaSAaron Smith 
1315146a9eaSAaron Smith   NativeProcessWindows(lldb::pid_t pid, int terminal_fd,
1325146a9eaSAaron Smith                        NativeDelegate &delegate, llvm::Error &E);
1335146a9eaSAaron Smith 
1345146a9eaSAaron Smith   Status CacheLoadedModules();
1355146a9eaSAaron Smith   std::map<lldb_private::FileSpec, lldb::addr_t> m_loaded_modules;
1365146a9eaSAaron Smith };
1375146a9eaSAaron Smith 
1385146a9eaSAaron Smith //------------------------------------------------------------------
1395146a9eaSAaron Smith // NativeDebugDelegate
1405146a9eaSAaron Smith //------------------------------------------------------------------
1415146a9eaSAaron Smith class NativeDebugDelegate : public IDebugDelegate {
1425146a9eaSAaron Smith public:
NativeDebugDelegate(NativeProcessWindows & process)1435146a9eaSAaron Smith   NativeDebugDelegate(NativeProcessWindows &process) : m_process(process) {}
1445146a9eaSAaron Smith 
OnExitProcess(uint32_t exit_code)145abaca237SMartin Storsjö   void OnExitProcess(uint32_t exit_code) override {
146abaca237SMartin Storsjö     m_process.OnExitProcess(exit_code);
147abaca237SMartin Storsjö   }
1485146a9eaSAaron Smith 
OnDebuggerConnected(lldb::addr_t image_base)149abaca237SMartin Storsjö   void OnDebuggerConnected(lldb::addr_t image_base) override {
1505146a9eaSAaron Smith     m_process.OnDebuggerConnected(image_base);
1515146a9eaSAaron Smith   }
1525146a9eaSAaron Smith 
OnDebugException(bool first_chance,const ExceptionRecord & record)1535146a9eaSAaron Smith   ExceptionResult OnDebugException(bool first_chance,
154abaca237SMartin Storsjö                                    const ExceptionRecord &record) override {
1555146a9eaSAaron Smith     return m_process.OnDebugException(first_chance, record);
1565146a9eaSAaron Smith   }
1575146a9eaSAaron Smith 
OnCreateThread(const HostThread & thread)158abaca237SMartin Storsjö   void OnCreateThread(const HostThread &thread) override {
1595146a9eaSAaron Smith     m_process.OnCreateThread(thread);
1605146a9eaSAaron Smith   }
1615146a9eaSAaron Smith 
OnExitThread(lldb::tid_t thread_id,uint32_t exit_code)162abaca237SMartin Storsjö   void OnExitThread(lldb::tid_t thread_id, uint32_t exit_code) override {
1635146a9eaSAaron Smith     m_process.OnExitThread(thread_id, exit_code);
1645146a9eaSAaron Smith   }
1655146a9eaSAaron Smith 
OnLoadDll(const lldb_private::ModuleSpec & module_spec,lldb::addr_t module_addr)1665146a9eaSAaron Smith   void OnLoadDll(const lldb_private::ModuleSpec &module_spec,
167abaca237SMartin Storsjö                  lldb::addr_t module_addr) override {
1685146a9eaSAaron Smith     m_process.OnLoadDll(module_spec, module_addr);
1695146a9eaSAaron Smith   }
1705146a9eaSAaron Smith 
OnUnloadDll(lldb::addr_t module_addr)171abaca237SMartin Storsjö   void OnUnloadDll(lldb::addr_t module_addr) override {
1725146a9eaSAaron Smith     m_process.OnUnloadDll(module_addr);
1735146a9eaSAaron Smith   }
1745146a9eaSAaron Smith 
OnDebugString(const std::string & string)175abaca237SMartin Storsjö   void OnDebugString(const std::string &string) override {
1765146a9eaSAaron Smith     m_process.OnDebugString(string);
1775146a9eaSAaron Smith   }
1785146a9eaSAaron Smith 
OnDebuggerError(const Status & error,uint32_t type)179abaca237SMartin Storsjö   void OnDebuggerError(const Status &error, uint32_t type) override {
1805146a9eaSAaron Smith     return m_process.OnDebuggerError(error, type);
1815146a9eaSAaron Smith   }
1825146a9eaSAaron Smith 
1835146a9eaSAaron Smith private:
1845146a9eaSAaron Smith   NativeProcessWindows &m_process;
1855146a9eaSAaron Smith };
1865146a9eaSAaron Smith 
1875146a9eaSAaron Smith } // namespace lldb_private
1885146a9eaSAaron Smith 
1895146a9eaSAaron Smith #endif // #ifndef liblldb_NativeProcessWindows_h_
190