]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/tools/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.h
Merge llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp
[FreeBSD/FreeBSD.git] / contrib / llvm / tools / lldb / source / Plugins / Process / gdb-remote / GDBRemoteCommunicationServerLLGS.h
1 //===-- GDBRemoteCommunicationServerLLGS.h ----------------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9
10 #ifndef liblldb_GDBRemoteCommunicationServerLLGS_h_
11 #define liblldb_GDBRemoteCommunicationServerLLGS_h_
12
13 #include <mutex>
14 #include <unordered_map>
15
16 #include "lldb/Core/Communication.h"
17 #include "lldb/Host/MainLoop.h"
18 #include "lldb/Host/common/NativeProcessProtocol.h"
19 #include "lldb/lldb-private-forward.h"
20
21 #include "GDBRemoteCommunicationServerCommon.h"
22
23 class StringExtractorGDBRemote;
24
25 namespace lldb_private {
26
27 namespace process_gdb_remote {
28
29 class ProcessGDBRemote;
30
31 class GDBRemoteCommunicationServerLLGS
32     : public GDBRemoteCommunicationServerCommon,
33       public NativeProcessProtocol::NativeDelegate {
34 public:
35   //------------------------------------------------------------------
36   // Constructors and Destructors
37   //------------------------------------------------------------------
38   GDBRemoteCommunicationServerLLGS(
39       MainLoop &mainloop,
40       const NativeProcessProtocol::Factory &process_factory);
41
42   void SetLaunchInfo(const ProcessLaunchInfo &info);
43
44   //------------------------------------------------------------------
45   /// Launch a process with the current launch settings.
46   ///
47   /// This method supports running an lldb-gdbserver or similar
48   /// server in a situation where the startup code has been provided
49   /// with all the information for a child process to be launched.
50   ///
51   /// @return
52   ///     An Status object indicating the success or failure of the
53   ///     launch.
54   //------------------------------------------------------------------
55   Status LaunchProcess() override;
56
57   //------------------------------------------------------------------
58   /// Attach to a process.
59   ///
60   /// This method supports attaching llgs to a process accessible via the
61   /// configured Platform.
62   ///
63   /// @return
64   ///     An Status object indicating the success or failure of the
65   ///     attach operation.
66   //------------------------------------------------------------------
67   Status AttachToProcess(lldb::pid_t pid);
68
69   //------------------------------------------------------------------
70   // NativeProcessProtocol::NativeDelegate overrides
71   //------------------------------------------------------------------
72   void InitializeDelegate(NativeProcessProtocol *process) override;
73
74   void ProcessStateChanged(NativeProcessProtocol *process,
75                            lldb::StateType state) override;
76
77   void DidExec(NativeProcessProtocol *process) override;
78
79   Status InitializeConnection(std::unique_ptr<Connection> &&connection);
80
81 protected:
82   MainLoop &m_mainloop;
83   MainLoop::ReadHandleUP m_network_handle_up;
84   const NativeProcessProtocol::Factory &m_process_factory;
85   lldb::tid_t m_current_tid = LLDB_INVALID_THREAD_ID;
86   lldb::tid_t m_continue_tid = LLDB_INVALID_THREAD_ID;
87   std::recursive_mutex m_debugged_process_mutex;
88   std::unique_ptr<NativeProcessProtocol> m_debugged_process_up;
89
90   Communication m_stdio_communication;
91   MainLoop::ReadHandleUP m_stdio_handle_up;
92
93   lldb::StateType m_inferior_prev_state = lldb::StateType::eStateInvalid;
94   std::unique_ptr<llvm::MemoryBuffer> m_active_auxv_buffer_up;
95   std::mutex m_saved_registers_mutex;
96   std::unordered_map<uint32_t, lldb::DataBufferSP> m_saved_registers_map;
97   uint32_t m_next_saved_registers_id = 1;
98   bool m_handshake_completed = false;
99
100   PacketResult SendONotification(const char *buffer, uint32_t len);
101
102   PacketResult SendWResponse(NativeProcessProtocol *process);
103
104   PacketResult SendStopReplyPacketForThread(lldb::tid_t tid);
105
106   PacketResult SendStopReasonForState(lldb::StateType process_state);
107
108   PacketResult Handle_k(StringExtractorGDBRemote &packet);
109
110   PacketResult Handle_qProcessInfo(StringExtractorGDBRemote &packet);
111
112   PacketResult Handle_qC(StringExtractorGDBRemote &packet);
113
114   PacketResult Handle_QSetDisableASLR(StringExtractorGDBRemote &packet);
115
116   PacketResult Handle_QSetWorkingDir(StringExtractorGDBRemote &packet);
117
118   PacketResult Handle_qGetWorkingDir(StringExtractorGDBRemote &packet);
119
120   PacketResult Handle_C(StringExtractorGDBRemote &packet);
121
122   PacketResult Handle_c(StringExtractorGDBRemote &packet);
123
124   PacketResult Handle_vCont(StringExtractorGDBRemote &packet);
125
126   PacketResult Handle_vCont_actions(StringExtractorGDBRemote &packet);
127
128   PacketResult Handle_stop_reason(StringExtractorGDBRemote &packet);
129
130   PacketResult Handle_qRegisterInfo(StringExtractorGDBRemote &packet);
131
132   PacketResult Handle_qfThreadInfo(StringExtractorGDBRemote &packet);
133
134   PacketResult Handle_qsThreadInfo(StringExtractorGDBRemote &packet);
135
136   PacketResult Handle_p(StringExtractorGDBRemote &packet);
137
138   PacketResult Handle_P(StringExtractorGDBRemote &packet);
139
140   PacketResult Handle_H(StringExtractorGDBRemote &packet);
141
142   PacketResult Handle_I(StringExtractorGDBRemote &packet);
143
144   PacketResult Handle_interrupt(StringExtractorGDBRemote &packet);
145
146   // Handles $m and $x packets.
147   PacketResult Handle_memory_read(StringExtractorGDBRemote &packet);
148
149   PacketResult Handle_M(StringExtractorGDBRemote &packet);
150
151   PacketResult
152   Handle_qMemoryRegionInfoSupported(StringExtractorGDBRemote &packet);
153
154   PacketResult Handle_qMemoryRegionInfo(StringExtractorGDBRemote &packet);
155
156   PacketResult Handle_Z(StringExtractorGDBRemote &packet);
157
158   PacketResult Handle_z(StringExtractorGDBRemote &packet);
159
160   PacketResult Handle_s(StringExtractorGDBRemote &packet);
161
162   PacketResult Handle_qXfer_auxv_read(StringExtractorGDBRemote &packet);
163
164   PacketResult Handle_QSaveRegisterState(StringExtractorGDBRemote &packet);
165
166   PacketResult Handle_jTraceStart(StringExtractorGDBRemote &packet);
167
168   PacketResult Handle_jTraceRead(StringExtractorGDBRemote &packet);
169
170   PacketResult Handle_jTraceStop(StringExtractorGDBRemote &packet);
171
172   PacketResult Handle_jTraceConfigRead(StringExtractorGDBRemote &packet);
173
174   PacketResult Handle_QRestoreRegisterState(StringExtractorGDBRemote &packet);
175
176   PacketResult Handle_vAttach(StringExtractorGDBRemote &packet);
177
178   PacketResult Handle_D(StringExtractorGDBRemote &packet);
179
180   PacketResult Handle_qThreadStopInfo(StringExtractorGDBRemote &packet);
181
182   PacketResult Handle_jThreadsInfo(StringExtractorGDBRemote &packet);
183
184   PacketResult Handle_qWatchpointSupportInfo(StringExtractorGDBRemote &packet);
185
186   PacketResult Handle_qFileLoadAddress(StringExtractorGDBRemote &packet);
187
188   PacketResult Handle_QPassSignals(StringExtractorGDBRemote &packet);
189
190   void SetCurrentThreadID(lldb::tid_t tid);
191
192   lldb::tid_t GetCurrentThreadID() const;
193
194   void SetContinueThreadID(lldb::tid_t tid);
195
196   lldb::tid_t GetContinueThreadID() const { return m_continue_tid; }
197
198   Status SetSTDIOFileDescriptor(int fd);
199
200   FileSpec FindModuleFile(const std::string &module_path,
201                           const ArchSpec &arch) override;
202
203 private:
204   void HandleInferiorState_Exited(NativeProcessProtocol *process);
205
206   void HandleInferiorState_Stopped(NativeProcessProtocol *process);
207
208   NativeThreadProtocol *GetThreadFromSuffix(StringExtractorGDBRemote &packet);
209
210   uint32_t GetNextSavedRegistersID();
211
212   void MaybeCloseInferiorTerminalConnection();
213
214   void ClearProcessSpecificData();
215
216   void RegisterPacketHandlers();
217
218   void DataAvailableCallback();
219
220   void SendProcessOutput();
221
222   void StartSTDIOForwarding();
223
224   void StopSTDIOForwarding();
225
226   //------------------------------------------------------------------
227   // For GDBRemoteCommunicationServerLLGS only
228   //------------------------------------------------------------------
229   DISALLOW_COPY_AND_ASSIGN(GDBRemoteCommunicationServerLLGS);
230 };
231
232 } // namespace process_gdb_remote
233 } // namespace lldb_private
234
235 #endif // liblldb_GDBRemoteCommunicationServerLLGS_h_