1061da546Spatrick //===-- NativeProcessWindows.h ----------------------------------*- C++ -*-===// 2061da546Spatrick // 3061da546Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4061da546Spatrick // See https://llvm.org/LICENSE.txt for license information. 5061da546Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6061da546Spatrick // 7061da546Spatrick //===----------------------------------------------------------------------===// 8061da546Spatrick 9061da546Spatrick #ifndef liblldb_NativeProcessWindows_h_ 10061da546Spatrick #define liblldb_NativeProcessWindows_h_ 11061da546Spatrick 12061da546Spatrick #include "lldb/Host/common/NativeProcessProtocol.h" 13061da546Spatrick #include "lldb/lldb-forward.h" 14061da546Spatrick 15061da546Spatrick #include "IDebugDelegate.h" 16061da546Spatrick #include "ProcessDebugger.h" 17061da546Spatrick 18061da546Spatrick namespace lldb_private { 19061da546Spatrick 20061da546Spatrick class HostProcess; 21061da546Spatrick class NativeProcessWindows; 22061da546Spatrick class NativeThreadWindows; 23061da546Spatrick class NativeDebugDelegate; 24061da546Spatrick 25061da546Spatrick typedef std::shared_ptr<NativeDebugDelegate> NativeDebugDelegateSP; 26061da546Spatrick 27061da546Spatrick //------------------------------------------------------------------ 28061da546Spatrick // NativeProcessWindows 29061da546Spatrick //------------------------------------------------------------------ 30061da546Spatrick class NativeProcessWindows : public NativeProcessProtocol, 31061da546Spatrick public ProcessDebugger { 32061da546Spatrick 33061da546Spatrick public: 34061da546Spatrick class Factory : public NativeProcessProtocol::Factory { 35061da546Spatrick public: 36061da546Spatrick llvm::Expected<std::unique_ptr<NativeProcessProtocol>> 37061da546Spatrick Launch(ProcessLaunchInfo &launch_info, NativeDelegate &native_delegate, 38061da546Spatrick MainLoop &mainloop) const override; 39061da546Spatrick 40061da546Spatrick llvm::Expected<std::unique_ptr<NativeProcessProtocol>> 41061da546Spatrick Attach(lldb::pid_t pid, NativeDelegate &native_delegate, 42061da546Spatrick MainLoop &mainloop) const override; 43061da546Spatrick }; 44061da546Spatrick 45061da546Spatrick Status Resume(const ResumeActionList &resume_actions) override; 46061da546Spatrick 47061da546Spatrick Status Halt() override; 48061da546Spatrick 49061da546Spatrick Status Detach() override; 50061da546Spatrick 51061da546Spatrick Status Signal(int signo) override; 52061da546Spatrick 53061da546Spatrick Status Interrupt() override; 54061da546Spatrick 55061da546Spatrick Status Kill() override; 56061da546Spatrick 57061da546Spatrick Status IgnoreSignals(llvm::ArrayRef<int> signals) override; 58061da546Spatrick 59061da546Spatrick Status GetMemoryRegionInfo(lldb::addr_t load_addr, 60061da546Spatrick MemoryRegionInfo &range_info) override; 61061da546Spatrick 62061da546Spatrick Status ReadMemory(lldb::addr_t addr, void *buf, size_t size, 63061da546Spatrick size_t &bytes_read) override; 64061da546Spatrick 65061da546Spatrick Status WriteMemory(lldb::addr_t addr, const void *buf, size_t size, 66061da546Spatrick size_t &bytes_written) override; 67061da546Spatrick 68be691f3bSpatrick llvm::Expected<lldb::addr_t> AllocateMemory(size_t size, 69be691f3bSpatrick uint32_t permissions) override; 70061da546Spatrick 71be691f3bSpatrick llvm::Error DeallocateMemory(lldb::addr_t addr) override; 72061da546Spatrick 73061da546Spatrick lldb::addr_t GetSharedLibraryInfoAddress() override; 74061da546Spatrick 75061da546Spatrick bool IsAlive() const override; 76061da546Spatrick 77061da546Spatrick size_t UpdateThreads() override; 78061da546Spatrick GetArchitecture()79061da546Spatrick const ArchSpec &GetArchitecture() const override { return m_arch; } 80061da546Spatrick SetArchitecture(const ArchSpec & arch_spec)81061da546Spatrick void SetArchitecture(const ArchSpec &arch_spec) { m_arch = arch_spec; } 82061da546Spatrick 83061da546Spatrick Status SetBreakpoint(lldb::addr_t addr, uint32_t size, 84061da546Spatrick bool hardware) override; 85061da546Spatrick 86061da546Spatrick Status RemoveBreakpoint(lldb::addr_t addr, bool hardware = false) override; 87061da546Spatrick 88061da546Spatrick llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> 89061da546Spatrick GetAuxvData() const override; 90061da546Spatrick 91061da546Spatrick Status GetLoadedModuleFileSpec(const char *module_path, 92061da546Spatrick FileSpec &file_spec) override; 93061da546Spatrick 94061da546Spatrick Status GetFileLoadAddress(const llvm::StringRef &file_name, 95061da546Spatrick lldb::addr_t &load_addr) override; 96061da546Spatrick 97061da546Spatrick // ProcessDebugger Overrides 98061da546Spatrick void OnExitProcess(uint32_t exit_code) override; 99061da546Spatrick void OnDebuggerConnected(lldb::addr_t image_base) override; 100061da546Spatrick ExceptionResult OnDebugException(bool first_chance, 101061da546Spatrick const ExceptionRecord &record) override; 102061da546Spatrick void OnCreateThread(const HostThread &thread) override; 103061da546Spatrick void OnExitThread(lldb::tid_t thread_id, uint32_t exit_code) override; 104061da546Spatrick void OnLoadDll(const ModuleSpec &module_spec, 105061da546Spatrick lldb::addr_t module_addr) override; 106061da546Spatrick void OnUnloadDll(lldb::addr_t module_addr) override; 107061da546Spatrick 108061da546Spatrick protected: 109061da546Spatrick NativeThreadWindows *GetThreadByID(lldb::tid_t thread_id); 110061da546Spatrick 111*f6aab3d8Srobert llvm::Expected<llvm::ArrayRef<uint8_t>> 112*f6aab3d8Srobert GetSoftwareBreakpointTrapOpcode(size_t size_hint) override; 113*f6aab3d8Srobert 114*f6aab3d8Srobert size_t GetSoftwareBreakpointPCOffset() override; 115*f6aab3d8Srobert 116061da546Spatrick bool FindSoftwareBreakpoint(lldb::addr_t addr); 117061da546Spatrick 118061da546Spatrick void StopThread(lldb::tid_t thread_id, lldb::StopReason reason, 119061da546Spatrick std::string description = ""); 120061da546Spatrick 121061da546Spatrick void SetStopReasonForThread(NativeThreadWindows &thread, 122061da546Spatrick lldb::StopReason reason, 123061da546Spatrick std::string description = ""); 124061da546Spatrick 125061da546Spatrick private: 126061da546Spatrick ArchSpec m_arch; 127061da546Spatrick 128061da546Spatrick NativeProcessWindows(ProcessLaunchInfo &launch_info, NativeDelegate &delegate, 129061da546Spatrick llvm::Error &E); 130061da546Spatrick 131061da546Spatrick NativeProcessWindows(lldb::pid_t pid, int terminal_fd, 132061da546Spatrick NativeDelegate &delegate, llvm::Error &E); 133061da546Spatrick 134061da546Spatrick Status CacheLoadedModules(); 135061da546Spatrick std::map<lldb_private::FileSpec, lldb::addr_t> m_loaded_modules; 136061da546Spatrick }; 137061da546Spatrick 138061da546Spatrick //------------------------------------------------------------------ 139061da546Spatrick // NativeDebugDelegate 140061da546Spatrick //------------------------------------------------------------------ 141061da546Spatrick class NativeDebugDelegate : public IDebugDelegate { 142061da546Spatrick public: NativeDebugDelegate(NativeProcessWindows & process)143061da546Spatrick NativeDebugDelegate(NativeProcessWindows &process) : m_process(process) {} 144061da546Spatrick OnExitProcess(uint32_t exit_code)145be691f3bSpatrick void OnExitProcess(uint32_t exit_code) override { 146be691f3bSpatrick m_process.OnExitProcess(exit_code); 147be691f3bSpatrick } 148061da546Spatrick OnDebuggerConnected(lldb::addr_t image_base)149be691f3bSpatrick void OnDebuggerConnected(lldb::addr_t image_base) override { 150061da546Spatrick m_process.OnDebuggerConnected(image_base); 151061da546Spatrick } 152061da546Spatrick OnDebugException(bool first_chance,const ExceptionRecord & record)153061da546Spatrick ExceptionResult OnDebugException(bool first_chance, 154be691f3bSpatrick const ExceptionRecord &record) override { 155061da546Spatrick return m_process.OnDebugException(first_chance, record); 156061da546Spatrick } 157061da546Spatrick OnCreateThread(const HostThread & thread)158be691f3bSpatrick void OnCreateThread(const HostThread &thread) override { 159061da546Spatrick m_process.OnCreateThread(thread); 160061da546Spatrick } 161061da546Spatrick OnExitThread(lldb::tid_t thread_id,uint32_t exit_code)162be691f3bSpatrick void OnExitThread(lldb::tid_t thread_id, uint32_t exit_code) override { 163061da546Spatrick m_process.OnExitThread(thread_id, exit_code); 164061da546Spatrick } 165061da546Spatrick OnLoadDll(const lldb_private::ModuleSpec & module_spec,lldb::addr_t module_addr)166061da546Spatrick void OnLoadDll(const lldb_private::ModuleSpec &module_spec, 167be691f3bSpatrick lldb::addr_t module_addr) override { 168061da546Spatrick m_process.OnLoadDll(module_spec, module_addr); 169061da546Spatrick } 170061da546Spatrick OnUnloadDll(lldb::addr_t module_addr)171be691f3bSpatrick void OnUnloadDll(lldb::addr_t module_addr) override { 172061da546Spatrick m_process.OnUnloadDll(module_addr); 173061da546Spatrick } 174061da546Spatrick OnDebugString(const std::string & string)175be691f3bSpatrick void OnDebugString(const std::string &string) override { 176061da546Spatrick m_process.OnDebugString(string); 177061da546Spatrick } 178061da546Spatrick OnDebuggerError(const Status & error,uint32_t type)179be691f3bSpatrick void OnDebuggerError(const Status &error, uint32_t type) override { 180061da546Spatrick return m_process.OnDebuggerError(error, type); 181061da546Spatrick } 182061da546Spatrick 183061da546Spatrick private: 184061da546Spatrick NativeProcessWindows &m_process; 185061da546Spatrick }; 186061da546Spatrick 187061da546Spatrick } // namespace lldb_private 188061da546Spatrick 189061da546Spatrick #endif // #ifndef liblldb_NativeProcessWindows_h_ 190