blob: 62b129bb18b9aaf64847534be0373c57b8cd8ed0 [file] [log] [blame]
Tamas Berghammere13c2732015-02-11 10:29:30 +00001//===-- GDBRemoteCommunicationServerCommon.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_GDBRemoteCommunicationServerCommon_h_
11#define liblldb_GDBRemoteCommunicationServerCommon_h_
12
13// C Includes
14// C++ Includes
15#include <set>
16
17// Other libraries and framework includes
18#include "lldb/lldb-private-forward.h"
19#include "lldb/Host/Mutex.h"
20#include "lldb/Target/Process.h"
21
22// Project includes
23#include "GDBRemoteCommunicationServer.h"
24#include "GDBRemoteCommunicationServerCommon.h"
25
Tamas Berghammere13c2732015-02-11 10:29:30 +000026class StringExtractorGDBRemote;
27
Tamas Berghammerdb264a62015-03-31 09:52:22 +000028namespace lldb_private {
29namespace process_gdb_remote {
30
31class ProcessGDBRemote;
32
Tamas Berghammere13c2732015-02-11 10:29:30 +000033class GDBRemoteCommunicationServerCommon :
34 public GDBRemoteCommunicationServer
35{
36public:
37 GDBRemoteCommunicationServerCommon(const char *comm_name, const char *listener_name);
38
39 virtual
40 ~GDBRemoteCommunicationServerCommon();
41
Tamas Berghammere13c2732015-02-11 10:29:30 +000042protected:
43 std::set<lldb::pid_t> m_spawned_pids;
Tamas Berghammerdb264a62015-03-31 09:52:22 +000044 Mutex m_spawned_pids_mutex;
45 ProcessLaunchInfo m_process_launch_info;
46 Error m_process_launch_error;
47 ProcessInstanceInfoList m_proc_infos;
Tamas Berghammere13c2732015-02-11 10:29:30 +000048 uint32_t m_proc_infos_index;
49 bool m_thread_suffix_supported;
50 bool m_list_threads_in_stop_reply;
51
52 PacketResult
53 Handle_A (StringExtractorGDBRemote &packet);
54
55 PacketResult
56 Handle_qHostInfo (StringExtractorGDBRemote &packet);
57
58 PacketResult
59 Handle_qProcessInfoPID (StringExtractorGDBRemote &packet);
60
61 PacketResult
62 Handle_qfProcessInfo (StringExtractorGDBRemote &packet);
63
64 PacketResult
65 Handle_qsProcessInfo (StringExtractorGDBRemote &packet);
66
67 PacketResult
68 Handle_qUserName (StringExtractorGDBRemote &packet);
69
70 PacketResult
71 Handle_qGroupName (StringExtractorGDBRemote &packet);
72
73 PacketResult
74 Handle_qSpeedTest (StringExtractorGDBRemote &packet);
75
76 PacketResult
77 Handle_qKillSpawnedProcess (StringExtractorGDBRemote &packet);
78
79 PacketResult
80 Handle_vFile_Open (StringExtractorGDBRemote &packet);
81
82 PacketResult
83 Handle_vFile_Close (StringExtractorGDBRemote &packet);
84
85 PacketResult
86 Handle_vFile_pRead (StringExtractorGDBRemote &packet);
87
88 PacketResult
89 Handle_vFile_pWrite (StringExtractorGDBRemote &packet);
90
91 PacketResult
92 Handle_vFile_Size (StringExtractorGDBRemote &packet);
93
94 PacketResult
95 Handle_vFile_Mode (StringExtractorGDBRemote &packet);
96
97 PacketResult
98 Handle_vFile_Exists (StringExtractorGDBRemote &packet);
99
100 PacketResult
101 Handle_vFile_symlink (StringExtractorGDBRemote &packet);
102
103 PacketResult
104 Handle_vFile_unlink (StringExtractorGDBRemote &packet);
105
106 PacketResult
107 Handle_vFile_Stat (StringExtractorGDBRemote &packet);
108
109 PacketResult
110 Handle_vFile_MD5 (StringExtractorGDBRemote &packet);
111
112 PacketResult
Greg Clayton420562a2015-05-29 00:15:15 +0000113 Handle_qEcho (StringExtractorGDBRemote &packet);
114
115 PacketResult
Oleksiy Vyalov6801be32015-02-25 22:15:44 +0000116 Handle_qModuleInfo (StringExtractorGDBRemote &packet);
117
118 PacketResult
Tamas Berghammere13c2732015-02-11 10:29:30 +0000119 Handle_qPlatform_shell (StringExtractorGDBRemote &packet);
120
121 PacketResult
122 Handle_qPlatform_mkdir (StringExtractorGDBRemote &packet);
123
124 PacketResult
125 Handle_qPlatform_chmod (StringExtractorGDBRemote &packet);
126
127 PacketResult
128 Handle_qSupported (StringExtractorGDBRemote &packet);
129
130 PacketResult
131 Handle_QThreadSuffixSupported (StringExtractorGDBRemote &packet);
132
133 PacketResult
134 Handle_QListThreadsInStopReply (StringExtractorGDBRemote &packet);
135
136 PacketResult
137 Handle_QSetDetachOnError (StringExtractorGDBRemote &packet);
138
139 PacketResult
140 Handle_QStartNoAckMode (StringExtractorGDBRemote &packet);
141
142 PacketResult
143 Handle_QSetSTDIN (StringExtractorGDBRemote &packet);
144
145 PacketResult
146 Handle_QSetSTDOUT (StringExtractorGDBRemote &packet);
147
148 PacketResult
149 Handle_QSetSTDERR (StringExtractorGDBRemote &packet);
150
151 PacketResult
152 Handle_qLaunchSuccess (StringExtractorGDBRemote &packet);
153
154 PacketResult
Chaoren Lin0ddb7222015-03-31 22:37:59 +0000155 Handle_QEnvironment (StringExtractorGDBRemote &packet);
156
157 PacketResult
158 Handle_QEnvironmentHexEncoded (StringExtractorGDBRemote &packet);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000159
160 PacketResult
161 Handle_QLaunchArch (StringExtractorGDBRemote &packet);
162
163 bool
164 KillSpawnedProcess (lldb::pid_t pid);
165
166 static void
Tamas Berghammerdb264a62015-03-31 09:52:22 +0000167 CreateProcessInfoResponse (const ProcessInstanceInfo &proc_info,
168 StreamString &response);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000169
170 static void
Tamas Berghammerdb264a62015-03-31 09:52:22 +0000171 CreateProcessInfoResponse_DebugServerStyle (const ProcessInstanceInfo &proc_info,
172 StreamString &response);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000173
174 template <typename T>
Tamas Berghammere13c2732015-02-11 10:29:30 +0000175 void
Tamas Berghammer81e92392015-02-18 11:37:46 +0000176 RegisterMemberFunctionHandler (StringExtractorGDBRemote::ServerPacketType packet_type,
177 PacketResult (T::*handler) (StringExtractorGDBRemote& packet))
Tamas Berghammere13c2732015-02-11 10:29:30 +0000178 {
179 RegisterPacketHandler(packet_type,
180 [this, handler] (StringExtractorGDBRemote packet,
Tamas Berghammerdb264a62015-03-31 09:52:22 +0000181 Error &error,
Tamas Berghammere13c2732015-02-11 10:29:30 +0000182 bool &interrupt,
183 bool &quit)
184 {
185 return (static_cast<T*>(this)->*handler) (packet);
186 });
187 }
Tamas Berghammer7cb18bf2015-03-24 11:15:23 +0000188
189 bool
190 GetThreadSuffixSupported () override
191 {
192 return true;
193 }
194
195 //------------------------------------------------------------------
196 /// Launch a process with the current launch settings.
197 ///
198 /// This method supports running an lldb-gdbserver or similar
199 /// server in a situation where the startup code has been provided
200 /// with all the information for a child process to be launched.
201 ///
202 /// @return
203 /// An Error object indicating the success or failure of the
204 /// launch.
205 //------------------------------------------------------------------
Tamas Berghammerdb264a62015-03-31 09:52:22 +0000206 virtual Error
Tamas Berghammer7cb18bf2015-03-24 11:15:23 +0000207 LaunchProcess () = 0;
208
Tamas Berghammerdb264a62015-03-31 09:52:22 +0000209 virtual FileSpec
210 FindModuleFile (const std::string& module_path, const ArchSpec& arch);
Tamas Berghammere13c2732015-02-11 10:29:30 +0000211};
212
Tamas Berghammerdb264a62015-03-31 09:52:22 +0000213} // namespace process_gdb_remote
214} // namespace lldb_private
215
Tamas Berghammere13c2732015-02-11 10:29:30 +0000216#endif // liblldb_GDBRemoteCommunicationServerCommon_h_