Coverage Report

Created: 2023-09-30 09:22

/Users/buildslave/jenkins/workspace/coverage/llvm-project/lldb/include/lldb/Utility/StringExtractorGDBRemote.h
Line
Count
Source
1
//===-- 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 <optional>
17
#include <string>
18
19
#include <cstddef>
20
#include <cstdint>
21
22
class StringExtractorGDBRemote : public StringExtractor {
23
public:
24
  typedef bool (*ResponseValidatorCallback)(
25
      void *baton, const StringExtractorGDBRemote &response);
26
27
453k
  StringExtractorGDBRemote() = default;
28
29
  StringExtractorGDBRemote(llvm::StringRef str)
30
498k
      : StringExtractor(str), m_validator(nullptr) {}
31
32
  StringExtractorGDBRemote(const char *cstr)
33
2
      : StringExtractor(cstr), m_validator(nullptr) {}
34
35
  bool ValidateResponse() const;
36
37
  void CopyResponseValidator(const StringExtractorGDBRemote &rhs);
38
39
  void SetResponseValidator(ResponseValidatorCallback callback, void *baton);
40
41
  void SetResponseValidatorToOKErrorNotSupported();
42
43
  void SetResponseValidatorToASCIIHexBytes();
44
45
  void SetResponseValidatorToJSON();
46
47
  enum ServerPacketType {
48
    eServerPacketType_nack = 0,
49
    eServerPacketType_ack,
50
    eServerPacketType_invalid,
51
    eServerPacketType_unimplemented,
52
    eServerPacketType_interrupt, // CTRL+c packet or "\x03"
53
    eServerPacketType_A,         // Program arguments packet
54
    eServerPacketType_qfProcessInfo,
55
    eServerPacketType_qsProcessInfo,
56
    eServerPacketType_qC,
57
    eServerPacketType_qEcho,
58
    eServerPacketType_qGroupName,
59
    eServerPacketType_qHostInfo,
60
    eServerPacketType_qLaunchGDBServer,
61
    eServerPacketType_qQueryGDBServer,
62
    eServerPacketType_qKillSpawnedProcess,
63
    eServerPacketType_qLaunchSuccess,
64
    eServerPacketType_qModuleInfo,
65
    eServerPacketType_qProcessInfoPID,
66
    eServerPacketType_qSpeedTest,
67
    eServerPacketType_qUserName,
68
    eServerPacketType_qGetWorkingDir,
69
    eServerPacketType_qFileLoadAddress,
70
    eServerPacketType_QEnvironment,
71
    eServerPacketType_QEnableErrorStrings,
72
    eServerPacketType_QLaunchArch,
73
    eServerPacketType_QSetDisableASLR,
74
    eServerPacketType_QSetDetachOnError,
75
    eServerPacketType_QSetSTDIN,
76
    eServerPacketType_QSetSTDOUT,
77
    eServerPacketType_QSetSTDERR,
78
    eServerPacketType_QSetWorkingDir,
79
    eServerPacketType_QStartNoAckMode,
80
    eServerPacketType_qPathComplete,
81
    eServerPacketType_qPlatform_shell,
82
    eServerPacketType_qPlatform_mkdir,
83
    eServerPacketType_qPlatform_chmod,
84
    eServerPacketType_vFile_open,
85
    eServerPacketType_vFile_close,
86
    eServerPacketType_vFile_pread,
87
    eServerPacketType_vFile_pwrite,
88
    eServerPacketType_vFile_size,
89
    eServerPacketType_vFile_mode,
90
    eServerPacketType_vFile_exists,
91
    eServerPacketType_vFile_md5,
92
    eServerPacketType_vFile_fstat,
93
    eServerPacketType_vFile_stat,
94
    eServerPacketType_vFile_symlink,
95
    eServerPacketType_vFile_unlink,
96
    // debug server packages
97
    eServerPacketType_QEnvironmentHexEncoded,
98
    eServerPacketType_QListThreadsInStopReply,
99
    eServerPacketType_QPassSignals,
100
    eServerPacketType_QRestoreRegisterState,
101
    eServerPacketType_QSaveRegisterState,
102
    eServerPacketType_QSetLogging,
103
    eServerPacketType_QSetMaxPacketSize,
104
    eServerPacketType_QSetMaxPayloadSize,
105
    eServerPacketType_QSetEnableAsyncProfiling,
106
    eServerPacketType_QSyncThreadState,
107
    eServerPacketType_QThreadSuffixSupported,
108
109
    eServerPacketType_jThreadsInfo,
110
    eServerPacketType_qsThreadInfo,
111
    eServerPacketType_qfThreadInfo,
112
    eServerPacketType_qGetPid,
113
    eServerPacketType_qGetProfileData,
114
    eServerPacketType_qGDBServerVersion,
115
    eServerPacketType_qMemoryRegionInfo,
116
    eServerPacketType_qMemoryRegionInfoSupported,
117
    eServerPacketType_qProcessInfo,
118
    eServerPacketType_qRcmd,
119
    eServerPacketType_qRegisterInfo,
120
    eServerPacketType_qShlibInfoAddr,
121
    eServerPacketType_qStepPacketSupported,
122
    eServerPacketType_qSupported,
123
    eServerPacketType_qSyncThreadStateSupported,
124
    eServerPacketType_qThreadExtraInfo,
125
    eServerPacketType_qThreadStopInfo,
126
    eServerPacketType_qVAttachOrWaitSupported,
127
    eServerPacketType_qWatchpointSupportInfo,
128
    eServerPacketType_qWatchpointSupportInfoSupported,
129
    eServerPacketType_qXfer,
130
131
    eServerPacketType_jSignalsInfo,
132
    eServerPacketType_jModulesInfo,
133
134
    eServerPacketType_vAttach,
135
    eServerPacketType_vAttachWait,
136
    eServerPacketType_vAttachOrWait,
137
    eServerPacketType_vAttachName,
138
    eServerPacketType_vCont,
139
    eServerPacketType_vCont_actions, // vCont?
140
    eServerPacketType_vKill,
141
    eServerPacketType_vRun,
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_jLLDBTraceSupported,
170
    eServerPacketType_jLLDBTraceStart,
171
    eServerPacketType_jLLDBTraceStop,
172
    eServerPacketType_jLLDBTraceGetState,
173
    eServerPacketType_jLLDBTraceGetBinaryData,
174
175
    eServerPacketType_qMemTags, // read memory tags
176
    eServerPacketType_QMemTags, // write memory tags
177
178
    eServerPacketType_qLLDBSaveCore,
179
    eServerPacketType_QSetIgnoredExceptions,
180
    eServerPacketType_QNonStop,
181
    eServerPacketType_vStopped,
182
    eServerPacketType_vCtrlC,
183
    eServerPacketType_vStdio,
184
  };
185
186
  ServerPacketType GetServerPacketType() const;
187
188
  enum ResponseType { eUnsupported = 0, eAck, eNack, eError, eOK, eResponse };
189
190
  ResponseType GetResponseType() const;
191
192
  bool IsOKResponse() const;
193
194
  bool IsUnsupportedResponse() const;
195
196
  bool IsNormalResponse() const;
197
198
  bool IsErrorResponse() const;
199
200
  // Returns zero if the packet isn't a EXX packet where XX are two hex digits.
201
  // Otherwise the error encoded in XX is returned.
202
  uint8_t GetError();
203
204
  lldb_private::Status GetStatus();
205
206
  size_t GetEscapedBinaryData(std::string &str);
207
208
  static constexpr lldb::pid_t AllProcesses = UINT64_MAX;
209
  static constexpr lldb::tid_t AllThreads = UINT64_MAX;
210
211
  // Read thread-id from the packet.  If the packet is valid, returns
212
  // the pair (PID, TID), otherwise returns std::nullopt.  If the packet
213
  // does not list a PID, default_pid is used.
214
  std::optional<std::pair<lldb::pid_t, lldb::tid_t>>
215
  GetPidTid(lldb::pid_t default_pid);
216
217
protected:
218
  ResponseValidatorCallback m_validator = nullptr;
219
  void *m_validator_baton = nullptr;
220
};
221
222
#endif // LLDB_UTILITY_STRINGEXTRACTORGDBREMOTE_H