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