xref: /openbsd-src/gnu/llvm/lldb/source/Plugins/Process/Windows/Common/NativeProcessWindows.h (revision f6aab3d83b51b91c24247ad2c2573574de475a82)
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