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