blob: cbf6e0c29e8ee828228134dac9a2aadc02979d31 [file] [log] [blame]
Andrew Walbran3d2c1972020-04-07 12:24:26 +01001//===-- StringExtractorGDBRemote.h ------------------------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#ifndef LLDB_UTILITY_STRINGEXTRACTORGDBREMOTE_H
10#define LLDB_UTILITY_STRINGEXTRACTORGDBREMOTE_H
11
12#include "lldb/Utility/Status.h"
13#include "lldb/Utility/StringExtractor.h"
14#include "llvm/ADT/StringRef.h"
15
16#include <string>
17
18#include <stddef.h>
19#include <stdint.h>
20
21class StringExtractorGDBRemote : public StringExtractor {
22public:
23 typedef bool (*ResponseValidatorCallback)(
24 void *baton, const StringExtractorGDBRemote &response);
25
26 StringExtractorGDBRemote() : StringExtractor(), m_validator(nullptr) {}
27
28 StringExtractorGDBRemote(llvm::StringRef str)
29 : StringExtractor(str), m_validator(nullptr) {}
30
31 StringExtractorGDBRemote(const char *cstr)
32 : StringExtractor(cstr), m_validator(nullptr) {}
33
34 StringExtractorGDBRemote(const StringExtractorGDBRemote &rhs)
35 : StringExtractor(rhs), m_validator(rhs.m_validator) {}
36
37 ~StringExtractorGDBRemote() override {}
38
39 bool ValidateResponse() const;
40
41 void CopyResponseValidator(const StringExtractorGDBRemote &rhs);
42
43 void SetResponseValidator(ResponseValidatorCallback callback, void *baton);
44
45 void SetResponseValidatorToOKErrorNotSupported();
46
47 void SetResponseValidatorToASCIIHexBytes();
48
49 void SetResponseValidatorToJSON();
50
51 enum ServerPacketType {
52 eServerPacketType_nack = 0,
53 eServerPacketType_ack,
54 eServerPacketType_invalid,
55 eServerPacketType_unimplemented,
56 eServerPacketType_interrupt, // CTRL+c packet or "\x03"
57 eServerPacketType_A, // Program arguments packet
58 eServerPacketType_qfProcessInfo,
59 eServerPacketType_qsProcessInfo,
60 eServerPacketType_qC,
61 eServerPacketType_qEcho,
62 eServerPacketType_qGroupName,
63 eServerPacketType_qHostInfo,
64 eServerPacketType_qLaunchGDBServer,
65 eServerPacketType_qQueryGDBServer,
66 eServerPacketType_qKillSpawnedProcess,
67 eServerPacketType_qLaunchSuccess,
68 eServerPacketType_qModuleInfo,
69 eServerPacketType_qProcessInfoPID,
70 eServerPacketType_qSpeedTest,
71 eServerPacketType_qUserName,
72 eServerPacketType_qGetWorkingDir,
73 eServerPacketType_qFileLoadAddress,
74 eServerPacketType_QEnvironment,
75 eServerPacketType_QEnableErrorStrings,
76 eServerPacketType_QLaunchArch,
77 eServerPacketType_QSetDisableASLR,
78 eServerPacketType_QSetDetachOnError,
79 eServerPacketType_QSetSTDIN,
80 eServerPacketType_QSetSTDOUT,
81 eServerPacketType_QSetSTDERR,
82 eServerPacketType_QSetWorkingDir,
83 eServerPacketType_QStartNoAckMode,
84 eServerPacketType_qPlatform_shell,
85 eServerPacketType_qPlatform_mkdir,
86 eServerPacketType_qPlatform_chmod,
87 eServerPacketType_vFile_open,
88 eServerPacketType_vFile_close,
89 eServerPacketType_vFile_pread,
90 eServerPacketType_vFile_pwrite,
91 eServerPacketType_vFile_size,
92 eServerPacketType_vFile_mode,
93 eServerPacketType_vFile_exists,
94 eServerPacketType_vFile_md5,
95 eServerPacketType_vFile_stat,
96 eServerPacketType_vFile_symlink,
97 eServerPacketType_vFile_unlink,
98 // debug server packages
99 eServerPacketType_QEnvironmentHexEncoded,
100 eServerPacketType_QListThreadsInStopReply,
101 eServerPacketType_QPassSignals,
102 eServerPacketType_QRestoreRegisterState,
103 eServerPacketType_QSaveRegisterState,
104 eServerPacketType_QSetLogging,
105 eServerPacketType_QSetMaxPacketSize,
106 eServerPacketType_QSetMaxPayloadSize,
107 eServerPacketType_QSetEnableAsyncProfiling,
108 eServerPacketType_QSyncThreadState,
109 eServerPacketType_QThreadSuffixSupported,
110
111 eServerPacketType_jThreadsInfo,
112 eServerPacketType_qsThreadInfo,
113 eServerPacketType_qfThreadInfo,
114 eServerPacketType_qGetPid,
115 eServerPacketType_qGetProfileData,
116 eServerPacketType_qGDBServerVersion,
117 eServerPacketType_qMemoryRegionInfo,
118 eServerPacketType_qMemoryRegionInfoSupported,
119 eServerPacketType_qProcessInfo,
120 eServerPacketType_qRcmd,
121 eServerPacketType_qRegisterInfo,
122 eServerPacketType_qShlibInfoAddr,
123 eServerPacketType_qStepPacketSupported,
124 eServerPacketType_qSupported,
125 eServerPacketType_qSyncThreadStateSupported,
126 eServerPacketType_qThreadExtraInfo,
127 eServerPacketType_qThreadStopInfo,
128 eServerPacketType_qVAttachOrWaitSupported,
129 eServerPacketType_qWatchpointSupportInfo,
130 eServerPacketType_qWatchpointSupportInfoSupported,
131 eServerPacketType_qXfer,
132
133 eServerPacketType_jSignalsInfo,
134 eServerPacketType_jModulesInfo,
135
136 eServerPacketType_vAttach,
137 eServerPacketType_vAttachWait,
138 eServerPacketType_vAttachOrWait,
139 eServerPacketType_vAttachName,
140 eServerPacketType_vCont,
141 eServerPacketType_vCont_actions, // vCont?
142
143 eServerPacketType_stop_reason, // '?'
144
145 eServerPacketType_c,
146 eServerPacketType_C,
147 eServerPacketType_D,
148 eServerPacketType_g,
149 eServerPacketType_G,
150 eServerPacketType_H,
151 eServerPacketType_I, // stdin notification
152 eServerPacketType_k,
153 eServerPacketType_m,
154 eServerPacketType_M,
155 eServerPacketType_p,
156 eServerPacketType_P,
157 eServerPacketType_s,
158 eServerPacketType_S,
159 eServerPacketType_T,
160 eServerPacketType_x,
161 eServerPacketType_X,
162 eServerPacketType_Z,
163 eServerPacketType_z,
164
165 eServerPacketType__M,
166 eServerPacketType__m,
167 eServerPacketType_notify, // '%' notification
168
169 eServerPacketType_jTraceStart,
170 eServerPacketType_jTraceBufferRead,
171 eServerPacketType_jTraceMetaRead,
172 eServerPacketType_jTraceStop,
173 eServerPacketType_jTraceConfigRead,
174 };
175
176 ServerPacketType GetServerPacketType() const;
177
178 enum ResponseType { eUnsupported = 0, eAck, eNack, eError, eOK, eResponse };
179
180 ResponseType GetResponseType() const;
181
182 bool IsOKResponse() const;
183
184 bool IsUnsupportedResponse() const;
185
186 bool IsNormalResponse() const;
187
188 bool IsErrorResponse() const;
189
190 // Returns zero if the packet isn't a EXX packet where XX are two hex digits.
191 // Otherwise the error encoded in XX is returned.
192 uint8_t GetError();
193
194 lldb_private::Status GetStatus();
195
196 size_t GetEscapedBinaryData(std::string &str);
197
198protected:
199 ResponseValidatorCallback m_validator;
200 void *m_validator_baton;
201};
202
203#endif // LLDB_UTILITY_STRINGEXTRACTORGDBREMOTE_H