1 //===-- StringExtractorGDBRemote.cpp ----------------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
14 // Other libraries and framework includes
16 #include "Utility/StringExtractorGDBRemote.h"
20 StringExtractorGDBRemote::ResponseType
21 StringExtractorGDBRemote::GetResponseType () const
29 if (m_packet.size() == 3 &&
30 isxdigit(m_packet[1]) &&
31 isxdigit(m_packet[2]))
36 if (m_packet.size() == 2 && m_packet[1] == 'K')
41 if (m_packet.size() == 1)
46 if (m_packet.size() == 1)
53 StringExtractorGDBRemote::ServerPacketType
54 StringExtractorGDBRemote::GetServerPacketType () const
56 #define PACKET_MATCHES(s) ((packet_size == (sizeof(s)-1)) && (strcmp((packet_cstr),(s)) == 0))
57 #define PACKET_STARTS_WITH(s) ((packet_size >= (sizeof(s)-1)) && ::strncmp(packet_cstr, s, (sizeof(s)-1))==0)
59 // Empty is not a supported packet...
61 return eServerPacketType_invalid;
63 const size_t packet_size = m_packet.size();
64 const char *packet_cstr = m_packet.c_str();
69 return eServerPacketType_notify;
72 if (packet_size == 1) return eServerPacketType_interrupt;
76 if (packet_size == 1) return eServerPacketType_nack;
80 if (packet_size == 1) return eServerPacketType_ack;
84 return eServerPacketType_A;
88 switch (packet_cstr[1])
91 if (PACKET_STARTS_WITH ("QEnvironment:")) return eServerPacketType_QEnvironment;
92 if (PACKET_STARTS_WITH ("QEnvironmentHexEncoded:")) return eServerPacketType_QEnvironmentHexEncoded;
96 if (PACKET_MATCHES ("QStartNoAckMode")) return eServerPacketType_QStartNoAckMode;
97 if (PACKET_STARTS_WITH ("QSaveRegisterState")) return eServerPacketType_QSaveRegisterState;
98 if (PACKET_STARTS_WITH ("QSetDisableASLR:")) return eServerPacketType_QSetDisableASLR;
99 if (PACKET_STARTS_WITH ("QSetDetachOnError:")) return eServerPacketType_QSetDetachOnError;
100 if (PACKET_STARTS_WITH ("QSetSTDIN:")) return eServerPacketType_QSetSTDIN;
101 if (PACKET_STARTS_WITH ("QSetSTDOUT:")) return eServerPacketType_QSetSTDOUT;
102 if (PACKET_STARTS_WITH ("QSetSTDERR:")) return eServerPacketType_QSetSTDERR;
103 if (PACKET_STARTS_WITH ("QSetWorkingDir:")) return eServerPacketType_QSetWorkingDir;
104 if (PACKET_STARTS_WITH ("QSetLogging:")) return eServerPacketType_QSetLogging;
105 if (PACKET_STARTS_WITH ("QSetMaxPacketSize:")) return eServerPacketType_QSetMaxPacketSize;
106 if (PACKET_STARTS_WITH ("QSetMaxPayloadSize:")) return eServerPacketType_QSetMaxPayloadSize;
107 if (PACKET_STARTS_WITH ("QSetEnableAsyncProfiling;")) return eServerPacketType_QSetEnableAsyncProfiling;
108 if (PACKET_STARTS_WITH ("QSyncThreadState:")) return eServerPacketType_QSyncThreadState;
112 if (PACKET_STARTS_WITH ("QLaunchArch:")) return eServerPacketType_QLaunchArch;
113 if (PACKET_MATCHES("QListThreadsInStopReply")) return eServerPacketType_QListThreadsInStopReply;
117 if (PACKET_STARTS_WITH ("QRestoreRegisterState:")) return eServerPacketType_QRestoreRegisterState;
121 if (PACKET_MATCHES ("QThreadSuffixSupported")) return eServerPacketType_QThreadSuffixSupported;
127 switch (packet_cstr[1])
130 if (PACKET_MATCHES ("qsProcessInfo")) return eServerPacketType_qsProcessInfo;
131 if (PACKET_MATCHES ("qsThreadInfo")) return eServerPacketType_qsThreadInfo;
135 if (PACKET_STARTS_WITH ("qfProcessInfo")) return eServerPacketType_qfProcessInfo;
136 if (PACKET_STARTS_WITH ("qfThreadInfo")) return eServerPacketType_qfThreadInfo;
140 if (packet_size == 2) return eServerPacketType_qC;
144 if (PACKET_STARTS_WITH ("qEcho:")) return eServerPacketType_qEcho;
148 if (PACKET_STARTS_WITH ("qFileLoadAddress:")) return eServerPacketType_qFileLoadAddress;
152 if (PACKET_STARTS_WITH ("qGroupName:")) return eServerPacketType_qGroupName;
153 if (PACKET_MATCHES ("qGetWorkingDir")) return eServerPacketType_qGetWorkingDir;
154 if (PACKET_MATCHES ("qGetPid")) return eServerPacketType_qGetPid;
155 if (PACKET_STARTS_WITH ("qGetProfileData;")) return eServerPacketType_qGetProfileData;
156 if (PACKET_MATCHES ("qGDBServerVersion")) return eServerPacketType_qGDBServerVersion;
160 if (PACKET_MATCHES ("qHostInfo")) return eServerPacketType_qHostInfo;
164 if (PACKET_STARTS_WITH ("qKillSpawnedProcess")) return eServerPacketType_qKillSpawnedProcess;
168 if (PACKET_STARTS_WITH ("qLaunchGDBServer")) return eServerPacketType_qLaunchGDBServer;
169 if (PACKET_MATCHES ("qLaunchSuccess")) return eServerPacketType_qLaunchSuccess;
173 if (PACKET_STARTS_WITH ("qMemoryRegionInfo:")) return eServerPacketType_qMemoryRegionInfo;
174 if (PACKET_MATCHES ("qMemoryRegionInfo")) return eServerPacketType_qMemoryRegionInfoSupported;
175 if (PACKET_STARTS_WITH ("qModuleInfo:")) return eServerPacketType_qModuleInfo;
179 if (PACKET_STARTS_WITH ("qProcessInfoPID:")) return eServerPacketType_qProcessInfoPID;
180 if (PACKET_STARTS_WITH ("qPlatform_shell:")) return eServerPacketType_qPlatform_shell;
181 if (PACKET_STARTS_WITH ("qPlatform_mkdir:")) return eServerPacketType_qPlatform_mkdir;
182 if (PACKET_STARTS_WITH ("qPlatform_chmod:")) return eServerPacketType_qPlatform_chmod;
183 if (PACKET_MATCHES ("qProcessInfo")) return eServerPacketType_qProcessInfo;
187 if (PACKET_MATCHES ("qQueryGDBServer")) return eServerPacketType_qQueryGDBServer;
191 if (PACKET_STARTS_WITH ("qRcmd,")) return eServerPacketType_qRcmd;
192 if (PACKET_STARTS_WITH ("qRegisterInfo")) return eServerPacketType_qRegisterInfo;
196 if (PACKET_STARTS_WITH ("qSpeedTest:")) return eServerPacketType_qSpeedTest;
197 if (PACKET_MATCHES ("qShlibInfoAddr")) return eServerPacketType_qShlibInfoAddr;
198 if (PACKET_MATCHES ("qStepPacketSupported")) return eServerPacketType_qStepPacketSupported;
199 if (PACKET_STARTS_WITH ("qSupported")) return eServerPacketType_qSupported;
200 if (PACKET_MATCHES ("qSyncThreadStateSupported")) return eServerPacketType_qSyncThreadStateSupported;
204 if (PACKET_STARTS_WITH ("qThreadExtraInfo,")) return eServerPacketType_qThreadExtraInfo;
205 if (PACKET_STARTS_WITH ("qThreadStopInfo")) return eServerPacketType_qThreadStopInfo;
209 if (PACKET_STARTS_WITH ("qUserName:")) return eServerPacketType_qUserName;
213 if (PACKET_MATCHES ("qVAttachOrWaitSupported")) return eServerPacketType_qVAttachOrWaitSupported;
217 if (PACKET_STARTS_WITH ("qWatchpointSupportInfo:")) return eServerPacketType_qWatchpointSupportInfo;
218 if (PACKET_MATCHES ("qWatchpointSupportInfo")) return eServerPacketType_qWatchpointSupportInfoSupported;
222 if (PACKET_STARTS_WITH ("qXfer:auxv:read::")) return eServerPacketType_qXfer_auxv_read;
228 if (PACKET_MATCHES("jSignalsInfo")) return eServerPacketType_jSignalsInfo;
229 if (PACKET_MATCHES("jThreadsInfo")) return eServerPacketType_jThreadsInfo;
233 if (PACKET_STARTS_WITH("vFile:"))
235 if (PACKET_STARTS_WITH("vFile:open:")) return eServerPacketType_vFile_open;
236 else if (PACKET_STARTS_WITH("vFile:close:")) return eServerPacketType_vFile_close;
237 else if (PACKET_STARTS_WITH("vFile:pread")) return eServerPacketType_vFile_pread;
238 else if (PACKET_STARTS_WITH("vFile:pwrite")) return eServerPacketType_vFile_pwrite;
239 else if (PACKET_STARTS_WITH("vFile:size")) return eServerPacketType_vFile_size;
240 else if (PACKET_STARTS_WITH("vFile:exists")) return eServerPacketType_vFile_exists;
241 else if (PACKET_STARTS_WITH("vFile:stat")) return eServerPacketType_vFile_stat;
242 else if (PACKET_STARTS_WITH("vFile:mode")) return eServerPacketType_vFile_mode;
243 else if (PACKET_STARTS_WITH("vFile:MD5")) return eServerPacketType_vFile_md5;
244 else if (PACKET_STARTS_WITH("vFile:symlink")) return eServerPacketType_vFile_symlink;
245 else if (PACKET_STARTS_WITH("vFile:unlink")) return eServerPacketType_vFile_unlink;
248 if (PACKET_STARTS_WITH ("vAttach;")) return eServerPacketType_vAttach;
249 if (PACKET_STARTS_WITH ("vAttachWait;")) return eServerPacketType_vAttachWait;
250 if (PACKET_STARTS_WITH ("vAttachOrWait;")) return eServerPacketType_vAttachOrWait;
251 if (PACKET_STARTS_WITH ("vAttachName;")) return eServerPacketType_vAttachName;
252 if (PACKET_STARTS_WITH("vCont;")) return eServerPacketType_vCont;
253 if (PACKET_MATCHES ("vCont?")) return eServerPacketType_vCont_actions;
257 switch (packet_cstr[1])
260 return eServerPacketType__M;
263 return eServerPacketType__m;
268 if (packet_size == 1) return eServerPacketType_stop_reason;
272 return eServerPacketType_c;
275 return eServerPacketType_C;
278 if (packet_size == 1) return eServerPacketType_D;
282 if (packet_size == 1) return eServerPacketType_g;
286 return eServerPacketType_G;
289 return eServerPacketType_H;
292 return eServerPacketType_I;
295 if (packet_size == 1) return eServerPacketType_k;
299 return eServerPacketType_m;
302 return eServerPacketType_M;
305 return eServerPacketType_p;
308 return eServerPacketType_P;
311 if (packet_size == 1) return eServerPacketType_s;
315 return eServerPacketType_S;
318 return eServerPacketType_x;
321 return eServerPacketType_X;
324 return eServerPacketType_T;
327 if (packet_cstr[1] >= '0' && packet_cstr[1] <= '4')
328 return eServerPacketType_z;
332 if (packet_cstr[1] >= '0' && packet_cstr[1] <= '4')
333 return eServerPacketType_Z;
336 return eServerPacketType_unimplemented;
340 StringExtractorGDBRemote::IsOKResponse() const
342 return GetResponseType () == eOK;
347 StringExtractorGDBRemote::IsUnsupportedResponse() const
349 return GetResponseType () == eUnsupported;
353 StringExtractorGDBRemote::IsNormalResponse() const
355 return GetResponseType () == eResponse;
359 StringExtractorGDBRemote::IsErrorResponse() const
361 return GetResponseType () == eError &&
362 m_packet.size() == 3 &&
363 isxdigit(m_packet[1]) &&
364 isxdigit(m_packet[2]);
368 StringExtractorGDBRemote::GetError ()
370 if (GetResponseType() == eError)
373 return GetHexU8(255);
379 StringExtractorGDBRemote::GetEscapedBinaryData (std::string &str)
381 // Just get the data bytes in the string as GDBRemoteCommunication::CheckForPacket()
382 // already removes any 0x7d escaped characters. If any 0x7d characters are left in
383 // the packet, then they are supposed to be there...
385 const size_t bytes_left = GetBytesLeft();
388 str.assign(m_packet, m_index, bytes_left);
389 m_index += bytes_left;