xref: /llvm-project/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp (revision 2f7cfaf4adc4f1ab1cd9cf039c795ff3422294a4)
1 //===-- GDBRemoteCommunicationClient.cpp ------------------------*- 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 #include "GDBRemoteCommunicationClient.h"
11 
12 // C Includes
13 #include <math.h>
14 #include <sys/stat.h>
15 
16 // C++ Includes
17 #include <numeric>
18 #include <sstream>
19 
20 // Other libraries and framework includes
21 #include "lldb/Core/DataBufferHeap.h"
22 #include "lldb/Core/Log.h"
23 #include "lldb/Core/ModuleSpec.h"
24 #include "lldb/Core/State.h"
25 #include "lldb/Core/StreamGDBRemote.h"
26 #include "lldb/Host/HostInfo.h"
27 #include "lldb/Host/StringConvert.h"
28 #include "lldb/Interpreter/Args.h"
29 #include "lldb/Symbol/Symbol.h"
30 #include "lldb/Target/MemoryRegionInfo.h"
31 #include "lldb/Target/Target.h"
32 #include "lldb/Target/UnixSignals.h"
33 #include "lldb/Utility/JSON.h"
34 #include "lldb/Utility/LLDBAssert.h"
35 #include "lldb/Utility/StreamString.h"
36 
37 // Project includes
38 #include "ProcessGDBRemote.h"
39 #include "ProcessGDBRemoteLog.h"
40 #include "Utility/StringExtractorGDBRemote.h"
41 #include "lldb/Host/Config.h"
42 
43 #include "llvm/ADT/StringSwitch.h"
44 
45 #if defined(HAVE_LIBCOMPRESSION)
46 #include <compression.h>
47 #endif
48 
49 using namespace lldb;
50 using namespace lldb_private;
51 using namespace lldb_private::process_gdb_remote;
52 using namespace std::chrono;
53 
54 //----------------------------------------------------------------------
55 // GDBRemoteCommunicationClient constructor
56 //----------------------------------------------------------------------
57 GDBRemoteCommunicationClient::GDBRemoteCommunicationClient()
58     : GDBRemoteClientBase("gdb-remote.client", "gdb-remote.client.rx_packet"),
59       m_supports_not_sending_acks(eLazyBoolCalculate),
60       m_supports_thread_suffix(eLazyBoolCalculate),
61       m_supports_threads_in_stop_reply(eLazyBoolCalculate),
62       m_supports_vCont_all(eLazyBoolCalculate),
63       m_supports_vCont_any(eLazyBoolCalculate),
64       m_supports_vCont_c(eLazyBoolCalculate),
65       m_supports_vCont_C(eLazyBoolCalculate),
66       m_supports_vCont_s(eLazyBoolCalculate),
67       m_supports_vCont_S(eLazyBoolCalculate),
68       m_qHostInfo_is_valid(eLazyBoolCalculate),
69       m_curr_pid_is_valid(eLazyBoolCalculate),
70       m_qProcessInfo_is_valid(eLazyBoolCalculate),
71       m_qGDBServerVersion_is_valid(eLazyBoolCalculate),
72       m_supports_alloc_dealloc_memory(eLazyBoolCalculate),
73       m_supports_memory_region_info(eLazyBoolCalculate),
74       m_supports_watchpoint_support_info(eLazyBoolCalculate),
75       m_supports_detach_stay_stopped(eLazyBoolCalculate),
76       m_watchpoints_trigger_after_instruction(eLazyBoolCalculate),
77       m_attach_or_wait_reply(eLazyBoolCalculate),
78       m_prepare_for_reg_writing_reply(eLazyBoolCalculate),
79       m_supports_p(eLazyBoolCalculate), m_supports_x(eLazyBoolCalculate),
80       m_avoid_g_packets(eLazyBoolCalculate),
81       m_supports_QSaveRegisterState(eLazyBoolCalculate),
82       m_supports_qXfer_auxv_read(eLazyBoolCalculate),
83       m_supports_qXfer_libraries_read(eLazyBoolCalculate),
84       m_supports_qXfer_libraries_svr4_read(eLazyBoolCalculate),
85       m_supports_qXfer_features_read(eLazyBoolCalculate),
86       m_supports_augmented_libraries_svr4_read(eLazyBoolCalculate),
87       m_supports_jThreadExtendedInfo(eLazyBoolCalculate),
88       m_supports_jLoadedDynamicLibrariesInfos(eLazyBoolCalculate),
89       m_supports_jGetSharedCacheInfo(eLazyBoolCalculate),
90       m_supports_qProcessInfoPID(true), m_supports_qfProcessInfo(true),
91       m_supports_qUserName(true), m_supports_qGroupName(true),
92       m_supports_qThreadStopInfo(true), m_supports_z0(true),
93       m_supports_z1(true), m_supports_z2(true), m_supports_z3(true),
94       m_supports_z4(true), m_supports_QEnvironment(true),
95       m_supports_QEnvironmentHexEncoded(true), m_supports_qSymbol(true),
96       m_qSymbol_requests_done(false), m_supports_qModuleInfo(true),
97       m_supports_jThreadsInfo(true), m_supports_jModulesInfo(true),
98       m_curr_pid(LLDB_INVALID_PROCESS_ID), m_curr_tid(LLDB_INVALID_THREAD_ID),
99       m_curr_tid_run(LLDB_INVALID_THREAD_ID),
100       m_num_supported_hardware_watchpoints(0), m_host_arch(), m_process_arch(),
101       m_os_version_major(UINT32_MAX), m_os_version_minor(UINT32_MAX),
102       m_os_version_update(UINT32_MAX), m_os_build(), m_os_kernel(),
103       m_hostname(), m_gdb_server_name(), m_gdb_server_version(UINT32_MAX),
104       m_default_packet_timeout(0), m_max_packet_size(0),
105       m_qSupported_response(), m_supported_async_json_packets_is_valid(false),
106       m_supported_async_json_packets_sp() {}
107 
108 //----------------------------------------------------------------------
109 // Destructor
110 //----------------------------------------------------------------------
111 GDBRemoteCommunicationClient::~GDBRemoteCommunicationClient() {
112   if (IsConnected())
113     Disconnect();
114 }
115 
116 bool GDBRemoteCommunicationClient::HandshakeWithServer(Error *error_ptr) {
117   ResetDiscoverableSettings(false);
118 
119   // Start the read thread after we send the handshake ack since if we
120   // fail to send the handshake ack, there is no reason to continue...
121   if (SendAck()) {
122     // Wait for any responses that might have been queued up in the remote
123     // GDB server and flush them all
124     StringExtractorGDBRemote response;
125     PacketResult packet_result = PacketResult::Success;
126     while (packet_result == PacketResult::Success)
127       packet_result = ReadPacket(response, milliseconds(10), false);
128 
129     // The return value from QueryNoAckModeSupported() is true if the packet
130     // was sent and _any_ response (including UNIMPLEMENTED) was received),
131     // or false if no response was received. This quickly tells us if we have
132     // a live connection to a remote GDB server...
133     if (QueryNoAckModeSupported()) {
134       return true;
135     } else {
136       if (error_ptr)
137         error_ptr->SetErrorString("failed to get reply to handshake packet");
138     }
139   } else {
140     if (error_ptr)
141       error_ptr->SetErrorString("failed to send the handshake ack");
142   }
143   return false;
144 }
145 
146 bool GDBRemoteCommunicationClient::GetEchoSupported() {
147   if (m_supports_qEcho == eLazyBoolCalculate) {
148     GetRemoteQSupported();
149   }
150   return m_supports_qEcho == eLazyBoolYes;
151 }
152 
153 bool GDBRemoteCommunicationClient::GetAugmentedLibrariesSVR4ReadSupported() {
154   if (m_supports_augmented_libraries_svr4_read == eLazyBoolCalculate) {
155     GetRemoteQSupported();
156   }
157   return m_supports_augmented_libraries_svr4_read == eLazyBoolYes;
158 }
159 
160 bool GDBRemoteCommunicationClient::GetQXferLibrariesSVR4ReadSupported() {
161   if (m_supports_qXfer_libraries_svr4_read == eLazyBoolCalculate) {
162     GetRemoteQSupported();
163   }
164   return m_supports_qXfer_libraries_svr4_read == eLazyBoolYes;
165 }
166 
167 bool GDBRemoteCommunicationClient::GetQXferLibrariesReadSupported() {
168   if (m_supports_qXfer_libraries_read == eLazyBoolCalculate) {
169     GetRemoteQSupported();
170   }
171   return m_supports_qXfer_libraries_read == eLazyBoolYes;
172 }
173 
174 bool GDBRemoteCommunicationClient::GetQXferAuxvReadSupported() {
175   if (m_supports_qXfer_auxv_read == eLazyBoolCalculate) {
176     GetRemoteQSupported();
177   }
178   return m_supports_qXfer_auxv_read == eLazyBoolYes;
179 }
180 
181 bool GDBRemoteCommunicationClient::GetQXferFeaturesReadSupported() {
182   if (m_supports_qXfer_features_read == eLazyBoolCalculate) {
183     GetRemoteQSupported();
184   }
185   return m_supports_qXfer_features_read == eLazyBoolYes;
186 }
187 
188 uint64_t GDBRemoteCommunicationClient::GetRemoteMaxPacketSize() {
189   if (m_max_packet_size == 0) {
190     GetRemoteQSupported();
191   }
192   return m_max_packet_size;
193 }
194 
195 bool GDBRemoteCommunicationClient::QueryNoAckModeSupported() {
196   if (m_supports_not_sending_acks == eLazyBoolCalculate) {
197     m_send_acks = true;
198     m_supports_not_sending_acks = eLazyBoolNo;
199 
200     // This is the first real packet that we'll send in a debug session and it
201     // may take a little
202     // longer than normal to receive a reply.  Wait at least 6 seconds for a
203     // reply to this packet.
204 
205     ScopedTimeout timeout(*this, std::max(GetPacketTimeout(), seconds(6)));
206 
207     StringExtractorGDBRemote response;
208     if (SendPacketAndWaitForResponse("QStartNoAckMode", response, false) ==
209         PacketResult::Success) {
210       if (response.IsOKResponse()) {
211         m_send_acks = false;
212         m_supports_not_sending_acks = eLazyBoolYes;
213       }
214       return true;
215     }
216   }
217   return false;
218 }
219 
220 void GDBRemoteCommunicationClient::GetListThreadsInStopReplySupported() {
221   if (m_supports_threads_in_stop_reply == eLazyBoolCalculate) {
222     m_supports_threads_in_stop_reply = eLazyBoolNo;
223 
224     StringExtractorGDBRemote response;
225     if (SendPacketAndWaitForResponse("QListThreadsInStopReply", response,
226                                      false) == PacketResult::Success) {
227       if (response.IsOKResponse())
228         m_supports_threads_in_stop_reply = eLazyBoolYes;
229     }
230   }
231 }
232 
233 bool GDBRemoteCommunicationClient::GetVAttachOrWaitSupported() {
234   if (m_attach_or_wait_reply == eLazyBoolCalculate) {
235     m_attach_or_wait_reply = eLazyBoolNo;
236 
237     StringExtractorGDBRemote response;
238     if (SendPacketAndWaitForResponse("qVAttachOrWaitSupported", response,
239                                      false) == PacketResult::Success) {
240       if (response.IsOKResponse())
241         m_attach_or_wait_reply = eLazyBoolYes;
242     }
243   }
244   if (m_attach_or_wait_reply == eLazyBoolYes)
245     return true;
246   else
247     return false;
248 }
249 
250 bool GDBRemoteCommunicationClient::GetSyncThreadStateSupported() {
251   if (m_prepare_for_reg_writing_reply == eLazyBoolCalculate) {
252     m_prepare_for_reg_writing_reply = eLazyBoolNo;
253 
254     StringExtractorGDBRemote response;
255     if (SendPacketAndWaitForResponse("qSyncThreadStateSupported", response,
256                                      false) == PacketResult::Success) {
257       if (response.IsOKResponse())
258         m_prepare_for_reg_writing_reply = eLazyBoolYes;
259     }
260   }
261   if (m_prepare_for_reg_writing_reply == eLazyBoolYes)
262     return true;
263   else
264     return false;
265 }
266 
267 void GDBRemoteCommunicationClient::ResetDiscoverableSettings(bool did_exec) {
268   if (did_exec == false) {
269     // Hard reset everything, this is when we first connect to a GDB server
270     m_supports_not_sending_acks = eLazyBoolCalculate;
271     m_supports_thread_suffix = eLazyBoolCalculate;
272     m_supports_threads_in_stop_reply = eLazyBoolCalculate;
273     m_supports_vCont_c = eLazyBoolCalculate;
274     m_supports_vCont_C = eLazyBoolCalculate;
275     m_supports_vCont_s = eLazyBoolCalculate;
276     m_supports_vCont_S = eLazyBoolCalculate;
277     m_supports_p = eLazyBoolCalculate;
278     m_supports_x = eLazyBoolCalculate;
279     m_supports_QSaveRegisterState = eLazyBoolCalculate;
280     m_qHostInfo_is_valid = eLazyBoolCalculate;
281     m_curr_pid_is_valid = eLazyBoolCalculate;
282     m_qGDBServerVersion_is_valid = eLazyBoolCalculate;
283     m_supports_alloc_dealloc_memory = eLazyBoolCalculate;
284     m_supports_memory_region_info = eLazyBoolCalculate;
285     m_prepare_for_reg_writing_reply = eLazyBoolCalculate;
286     m_attach_or_wait_reply = eLazyBoolCalculate;
287     m_avoid_g_packets = eLazyBoolCalculate;
288     m_supports_qXfer_auxv_read = eLazyBoolCalculate;
289     m_supports_qXfer_libraries_read = eLazyBoolCalculate;
290     m_supports_qXfer_libraries_svr4_read = eLazyBoolCalculate;
291     m_supports_qXfer_features_read = eLazyBoolCalculate;
292     m_supports_augmented_libraries_svr4_read = eLazyBoolCalculate;
293     m_supports_qProcessInfoPID = true;
294     m_supports_qfProcessInfo = true;
295     m_supports_qUserName = true;
296     m_supports_qGroupName = true;
297     m_supports_qThreadStopInfo = true;
298     m_supports_z0 = true;
299     m_supports_z1 = true;
300     m_supports_z2 = true;
301     m_supports_z3 = true;
302     m_supports_z4 = true;
303     m_supports_QEnvironment = true;
304     m_supports_QEnvironmentHexEncoded = true;
305     m_supports_qSymbol = true;
306     m_qSymbol_requests_done = false;
307     m_supports_qModuleInfo = true;
308     m_host_arch.Clear();
309     m_os_version_major = UINT32_MAX;
310     m_os_version_minor = UINT32_MAX;
311     m_os_version_update = UINT32_MAX;
312     m_os_build.clear();
313     m_os_kernel.clear();
314     m_hostname.clear();
315     m_gdb_server_name.clear();
316     m_gdb_server_version = UINT32_MAX;
317     m_default_packet_timeout = seconds(0);
318     m_max_packet_size = 0;
319     m_qSupported_response.clear();
320     m_supported_async_json_packets_is_valid = false;
321     m_supported_async_json_packets_sp.reset();
322     m_supports_jModulesInfo = true;
323   }
324 
325   // These flags should be reset when we first connect to a GDB server
326   // and when our inferior process execs
327   m_qProcessInfo_is_valid = eLazyBoolCalculate;
328   m_process_arch.Clear();
329 }
330 
331 void GDBRemoteCommunicationClient::GetRemoteQSupported() {
332   // Clear out any capabilities we expect to see in the qSupported response
333   m_supports_qXfer_auxv_read = eLazyBoolNo;
334   m_supports_qXfer_libraries_read = eLazyBoolNo;
335   m_supports_qXfer_libraries_svr4_read = eLazyBoolNo;
336   m_supports_augmented_libraries_svr4_read = eLazyBoolNo;
337   m_supports_qXfer_features_read = eLazyBoolNo;
338   m_max_packet_size = UINT64_MAX; // It's supposed to always be there, but if
339                                   // not, we assume no limit
340 
341   // build the qSupported packet
342   std::vector<std::string> features = {"xmlRegisters=i386,arm,mips"};
343   StreamString packet;
344   packet.PutCString("qSupported");
345   for (uint32_t i = 0; i < features.size(); ++i) {
346     packet.PutCString(i == 0 ? ":" : ";");
347     packet.PutCString(features[i]);
348   }
349 
350   StringExtractorGDBRemote response;
351   if (SendPacketAndWaitForResponse(packet.GetString(), response,
352                                    /*send_async=*/false) ==
353       PacketResult::Success) {
354     const char *response_cstr = response.GetStringRef().c_str();
355 
356     // Hang on to the qSupported packet, so that platforms can do custom
357     // configuration of the transport before attaching/launching the
358     // process.
359     m_qSupported_response = response_cstr;
360 
361     if (::strstr(response_cstr, "qXfer:auxv:read+"))
362       m_supports_qXfer_auxv_read = eLazyBoolYes;
363     if (::strstr(response_cstr, "qXfer:libraries-svr4:read+"))
364       m_supports_qXfer_libraries_svr4_read = eLazyBoolYes;
365     if (::strstr(response_cstr, "augmented-libraries-svr4-read")) {
366       m_supports_qXfer_libraries_svr4_read = eLazyBoolYes; // implied
367       m_supports_augmented_libraries_svr4_read = eLazyBoolYes;
368     }
369     if (::strstr(response_cstr, "qXfer:libraries:read+"))
370       m_supports_qXfer_libraries_read = eLazyBoolYes;
371     if (::strstr(response_cstr, "qXfer:features:read+"))
372       m_supports_qXfer_features_read = eLazyBoolYes;
373 
374     // Look for a list of compressions in the features list e.g.
375     // qXfer:features:read+;PacketSize=20000;qEcho+;SupportedCompressions=zlib-deflate,lzma
376     const char *features_list = ::strstr(response_cstr, "qXfer:features:");
377     if (features_list) {
378       const char *compressions =
379           ::strstr(features_list, "SupportedCompressions=");
380       if (compressions) {
381         std::vector<std::string> supported_compressions;
382         compressions += sizeof("SupportedCompressions=") - 1;
383         const char *end_of_compressions = strchr(compressions, ';');
384         if (end_of_compressions == NULL) {
385           end_of_compressions = strchr(compressions, '\0');
386         }
387         const char *current_compression = compressions;
388         while (current_compression < end_of_compressions) {
389           const char *next_compression_name = strchr(current_compression, ',');
390           const char *end_of_this_word = next_compression_name;
391           if (next_compression_name == NULL ||
392               end_of_compressions < next_compression_name) {
393             end_of_this_word = end_of_compressions;
394           }
395 
396           if (end_of_this_word) {
397             if (end_of_this_word == current_compression) {
398               current_compression++;
399             } else {
400               std::string this_compression(
401                   current_compression, end_of_this_word - current_compression);
402               supported_compressions.push_back(this_compression);
403               current_compression = end_of_this_word + 1;
404             }
405           } else {
406             supported_compressions.push_back(current_compression);
407             current_compression = end_of_compressions;
408           }
409         }
410 
411         if (supported_compressions.size() > 0) {
412           MaybeEnableCompression(supported_compressions);
413         }
414       }
415     }
416 
417     if (::strstr(response_cstr, "qEcho"))
418       m_supports_qEcho = eLazyBoolYes;
419     else
420       m_supports_qEcho = eLazyBoolNo;
421 
422     const char *packet_size_str = ::strstr(response_cstr, "PacketSize=");
423     if (packet_size_str) {
424       StringExtractorGDBRemote packet_response(packet_size_str +
425                                                strlen("PacketSize="));
426       m_max_packet_size =
427           packet_response.GetHexMaxU64(/*little_endian=*/false, UINT64_MAX);
428       if (m_max_packet_size == 0) {
429         m_max_packet_size = UINT64_MAX; // Must have been a garbled response
430         Log *log(
431             ProcessGDBRemoteLog::GetLogIfAllCategoriesSet(GDBR_LOG_PROCESS));
432         if (log)
433           log->Printf("Garbled PacketSize spec in qSupported response");
434       }
435     }
436   }
437 }
438 
439 bool GDBRemoteCommunicationClient::GetThreadSuffixSupported() {
440   if (m_supports_thread_suffix == eLazyBoolCalculate) {
441     StringExtractorGDBRemote response;
442     m_supports_thread_suffix = eLazyBoolNo;
443     if (SendPacketAndWaitForResponse("QThreadSuffixSupported", response,
444                                      false) == PacketResult::Success) {
445       if (response.IsOKResponse())
446         m_supports_thread_suffix = eLazyBoolYes;
447     }
448   }
449   return m_supports_thread_suffix;
450 }
451 bool GDBRemoteCommunicationClient::GetVContSupported(char flavor) {
452   if (m_supports_vCont_c == eLazyBoolCalculate) {
453     StringExtractorGDBRemote response;
454     m_supports_vCont_any = eLazyBoolNo;
455     m_supports_vCont_all = eLazyBoolNo;
456     m_supports_vCont_c = eLazyBoolNo;
457     m_supports_vCont_C = eLazyBoolNo;
458     m_supports_vCont_s = eLazyBoolNo;
459     m_supports_vCont_S = eLazyBoolNo;
460     if (SendPacketAndWaitForResponse("vCont?", response, false) ==
461         PacketResult::Success) {
462       const char *response_cstr = response.GetStringRef().c_str();
463       if (::strstr(response_cstr, ";c"))
464         m_supports_vCont_c = eLazyBoolYes;
465 
466       if (::strstr(response_cstr, ";C"))
467         m_supports_vCont_C = eLazyBoolYes;
468 
469       if (::strstr(response_cstr, ";s"))
470         m_supports_vCont_s = eLazyBoolYes;
471 
472       if (::strstr(response_cstr, ";S"))
473         m_supports_vCont_S = eLazyBoolYes;
474 
475       if (m_supports_vCont_c == eLazyBoolYes &&
476           m_supports_vCont_C == eLazyBoolYes &&
477           m_supports_vCont_s == eLazyBoolYes &&
478           m_supports_vCont_S == eLazyBoolYes) {
479         m_supports_vCont_all = eLazyBoolYes;
480       }
481 
482       if (m_supports_vCont_c == eLazyBoolYes ||
483           m_supports_vCont_C == eLazyBoolYes ||
484           m_supports_vCont_s == eLazyBoolYes ||
485           m_supports_vCont_S == eLazyBoolYes) {
486         m_supports_vCont_any = eLazyBoolYes;
487       }
488     }
489   }
490 
491   switch (flavor) {
492   case 'a':
493     return m_supports_vCont_any;
494   case 'A':
495     return m_supports_vCont_all;
496   case 'c':
497     return m_supports_vCont_c;
498   case 'C':
499     return m_supports_vCont_C;
500   case 's':
501     return m_supports_vCont_s;
502   case 'S':
503     return m_supports_vCont_S;
504   default:
505     break;
506   }
507   return false;
508 }
509 
510 GDBRemoteCommunication::PacketResult
511 GDBRemoteCommunicationClient::SendThreadSpecificPacketAndWaitForResponse(
512     lldb::tid_t tid, StreamString &&payload, StringExtractorGDBRemote &response,
513     bool send_async) {
514   Lock lock(*this, send_async);
515   if (!lock) {
516     if (Log *log = ProcessGDBRemoteLog::GetLogIfAnyCategoryIsSet(
517             GDBR_LOG_PROCESS | GDBR_LOG_PACKETS))
518       log->Printf("GDBRemoteCommunicationClient::%s: Didn't get sequence mutex "
519                   "for %s packet.",
520                   __FUNCTION__, payload.GetData());
521     return PacketResult::ErrorNoSequenceLock;
522   }
523 
524   if (GetThreadSuffixSupported())
525     payload.Printf(";thread:%4.4" PRIx64 ";", tid);
526   else {
527     if (!SetCurrentThread(tid))
528       return PacketResult::ErrorSendFailed;
529   }
530 
531   return SendPacketAndWaitForResponseNoLock(payload.GetString(), response);
532 }
533 
534 // Check if the target supports 'p' packet. It sends out a 'p'
535 // packet and checks the response. A normal packet will tell us
536 // that support is available.
537 //
538 // Takes a valid thread ID because p needs to apply to a thread.
539 bool GDBRemoteCommunicationClient::GetpPacketSupported(lldb::tid_t tid) {
540   if (m_supports_p == eLazyBoolCalculate) {
541     m_supports_p = eLazyBoolNo;
542     StreamString payload;
543     payload.PutCString("p0");
544     StringExtractorGDBRemote response;
545     if (SendThreadSpecificPacketAndWaitForResponse(tid, std::move(payload),
546                                                    response, false) ==
547             PacketResult::Success &&
548         response.IsNormalResponse()) {
549       m_supports_p = eLazyBoolYes;
550     }
551   }
552   return m_supports_p;
553 }
554 
555 StructuredData::ObjectSP GDBRemoteCommunicationClient::GetThreadsInfo() {
556   // Get information on all threads at one using the "jThreadsInfo" packet
557   StructuredData::ObjectSP object_sp;
558 
559   if (m_supports_jThreadsInfo) {
560     StringExtractorGDBRemote response;
561     response.SetResponseValidatorToJSON();
562     if (SendPacketAndWaitForResponse("jThreadsInfo", response, false) ==
563         PacketResult::Success) {
564       if (response.IsUnsupportedResponse()) {
565         m_supports_jThreadsInfo = false;
566       } else if (!response.Empty()) {
567         object_sp = StructuredData::ParseJSON(response.GetStringRef());
568       }
569     }
570   }
571   return object_sp;
572 }
573 
574 bool GDBRemoteCommunicationClient::GetThreadExtendedInfoSupported() {
575   if (m_supports_jThreadExtendedInfo == eLazyBoolCalculate) {
576     StringExtractorGDBRemote response;
577     m_supports_jThreadExtendedInfo = eLazyBoolNo;
578     if (SendPacketAndWaitForResponse("jThreadExtendedInfo:", response, false) ==
579         PacketResult::Success) {
580       if (response.IsOKResponse()) {
581         m_supports_jThreadExtendedInfo = eLazyBoolYes;
582       }
583     }
584   }
585   return m_supports_jThreadExtendedInfo;
586 }
587 
588 bool GDBRemoteCommunicationClient::GetLoadedDynamicLibrariesInfosSupported() {
589   if (m_supports_jLoadedDynamicLibrariesInfos == eLazyBoolCalculate) {
590     StringExtractorGDBRemote response;
591     m_supports_jLoadedDynamicLibrariesInfos = eLazyBoolNo;
592     if (SendPacketAndWaitForResponse("jGetLoadedDynamicLibrariesInfos:",
593                                      response,
594                                      false) == PacketResult::Success) {
595       if (response.IsOKResponse()) {
596         m_supports_jLoadedDynamicLibrariesInfos = eLazyBoolYes;
597       }
598     }
599   }
600   return m_supports_jLoadedDynamicLibrariesInfos;
601 }
602 
603 bool GDBRemoteCommunicationClient::GetSharedCacheInfoSupported() {
604   if (m_supports_jGetSharedCacheInfo == eLazyBoolCalculate) {
605     StringExtractorGDBRemote response;
606     m_supports_jGetSharedCacheInfo = eLazyBoolNo;
607     if (SendPacketAndWaitForResponse("jGetSharedCacheInfo:", response, false) ==
608         PacketResult::Success) {
609       if (response.IsOKResponse()) {
610         m_supports_jGetSharedCacheInfo = eLazyBoolYes;
611       }
612     }
613   }
614   return m_supports_jGetSharedCacheInfo;
615 }
616 
617 bool GDBRemoteCommunicationClient::GetxPacketSupported() {
618   if (m_supports_x == eLazyBoolCalculate) {
619     StringExtractorGDBRemote response;
620     m_supports_x = eLazyBoolNo;
621     char packet[256];
622     snprintf(packet, sizeof(packet), "x0,0");
623     if (SendPacketAndWaitForResponse(packet, response, false) ==
624         PacketResult::Success) {
625       if (response.IsOKResponse())
626         m_supports_x = eLazyBoolYes;
627     }
628   }
629   return m_supports_x;
630 }
631 
632 GDBRemoteCommunicationClient::PacketResult
633 GDBRemoteCommunicationClient::SendPacketsAndConcatenateResponses(
634     const char *payload_prefix, std::string &response_string) {
635   Lock lock(*this, false);
636   if (!lock) {
637     Log *log(ProcessGDBRemoteLog::GetLogIfAnyCategoryIsSet(GDBR_LOG_PROCESS |
638                                                            GDBR_LOG_PACKETS));
639     if (log)
640       log->Printf("error: failed to get packet sequence mutex, not sending "
641                   "packets with prefix '%s'",
642                   payload_prefix);
643     return PacketResult::ErrorNoSequenceLock;
644   }
645 
646   response_string = "";
647   std::string payload_prefix_str(payload_prefix);
648   unsigned int response_size = 0x1000;
649   if (response_size > GetRemoteMaxPacketSize()) { // May send qSupported packet
650     response_size = GetRemoteMaxPacketSize();
651   }
652 
653   for (unsigned int offset = 0; true; offset += response_size) {
654     StringExtractorGDBRemote this_response;
655     // Construct payload
656     char sizeDescriptor[128];
657     snprintf(sizeDescriptor, sizeof(sizeDescriptor), "%x,%x", offset,
658              response_size);
659     PacketResult result = SendPacketAndWaitForResponseNoLock(
660         payload_prefix_str + sizeDescriptor, this_response);
661     if (result != PacketResult::Success)
662       return result;
663 
664     const std::string &this_string = this_response.GetStringRef();
665 
666     // Check for m or l as first character; l seems to mean this is the last
667     // chunk
668     char first_char = *this_string.c_str();
669     if (first_char != 'm' && first_char != 'l') {
670       return PacketResult::ErrorReplyInvalid;
671     }
672     // Concatenate the result so far (skipping 'm' or 'l')
673     response_string.append(this_string, 1, std::string::npos);
674     if (first_char == 'l')
675       // We're done
676       return PacketResult::Success;
677   }
678 }
679 
680 lldb::pid_t GDBRemoteCommunicationClient::GetCurrentProcessID(bool allow_lazy) {
681   if (allow_lazy && m_curr_pid_is_valid == eLazyBoolYes)
682     return m_curr_pid;
683 
684   // First try to retrieve the pid via the qProcessInfo request.
685   GetCurrentProcessInfo(allow_lazy);
686   if (m_curr_pid_is_valid == eLazyBoolYes) {
687     // We really got it.
688     return m_curr_pid;
689   } else {
690     // If we don't get a response for qProcessInfo, check if $qC gives us a
691     // result.
692     // $qC only returns a real process id on older debugserver and lldb-platform
693     // stubs.
694     // The gdb remote protocol documents $qC as returning the thread id, which
695     // newer
696     // debugserver and lldb-gdbserver stubs return correctly.
697     StringExtractorGDBRemote response;
698     if (SendPacketAndWaitForResponse("qC", response, false) ==
699         PacketResult::Success) {
700       if (response.GetChar() == 'Q') {
701         if (response.GetChar() == 'C') {
702           m_curr_pid = response.GetHexMaxU32(false, LLDB_INVALID_PROCESS_ID);
703           if (m_curr_pid != LLDB_INVALID_PROCESS_ID) {
704             m_curr_pid_is_valid = eLazyBoolYes;
705             return m_curr_pid;
706           }
707         }
708       }
709     }
710 
711     // If we don't get a response for $qC, check if $qfThreadID gives us a
712     // result.
713     if (m_curr_pid == LLDB_INVALID_PROCESS_ID) {
714       std::vector<lldb::tid_t> thread_ids;
715       bool sequence_mutex_unavailable;
716       size_t size;
717       size = GetCurrentThreadIDs(thread_ids, sequence_mutex_unavailable);
718       if (size && sequence_mutex_unavailable == false) {
719         m_curr_pid = thread_ids.front();
720         m_curr_pid_is_valid = eLazyBoolYes;
721         return m_curr_pid;
722       }
723     }
724   }
725 
726   return LLDB_INVALID_PROCESS_ID;
727 }
728 
729 bool GDBRemoteCommunicationClient::GetLaunchSuccess(std::string &error_str) {
730   error_str.clear();
731   StringExtractorGDBRemote response;
732   if (SendPacketAndWaitForResponse("qLaunchSuccess", response, false) ==
733       PacketResult::Success) {
734     if (response.IsOKResponse())
735       return true;
736     if (response.GetChar() == 'E') {
737       // A string the describes what failed when launching...
738       error_str = response.GetStringRef().substr(1);
739     } else {
740       error_str.assign("unknown error occurred launching process");
741     }
742   } else {
743     error_str.assign("timed out waiting for app to launch");
744   }
745   return false;
746 }
747 
748 int GDBRemoteCommunicationClient::SendArgumentsPacket(
749     const ProcessLaunchInfo &launch_info) {
750   // Since we don't get the send argv0 separate from the executable path, we
751   // need to
752   // make sure to use the actual executable path found in the launch_info...
753   std::vector<const char *> argv;
754   FileSpec exe_file = launch_info.GetExecutableFile();
755   std::string exe_path;
756   const char *arg = NULL;
757   const Args &launch_args = launch_info.GetArguments();
758   if (exe_file)
759     exe_path = exe_file.GetPath(false);
760   else {
761     arg = launch_args.GetArgumentAtIndex(0);
762     if (arg)
763       exe_path = arg;
764   }
765   if (!exe_path.empty()) {
766     argv.push_back(exe_path.c_str());
767     for (uint32_t i = 1; (arg = launch_args.GetArgumentAtIndex(i)) != NULL;
768          ++i) {
769       if (arg)
770         argv.push_back(arg);
771     }
772   }
773   if (!argv.empty()) {
774     StreamString packet;
775     packet.PutChar('A');
776     for (size_t i = 0, n = argv.size(); i < n; ++i) {
777       arg = argv[i];
778       const int arg_len = strlen(arg);
779       if (i > 0)
780         packet.PutChar(',');
781       packet.Printf("%i,%i,", arg_len * 2, (int)i);
782       packet.PutBytesAsRawHex8(arg, arg_len);
783     }
784 
785     StringExtractorGDBRemote response;
786     if (SendPacketAndWaitForResponse(packet.GetString(), response, false) ==
787         PacketResult::Success) {
788       if (response.IsOKResponse())
789         return 0;
790       uint8_t error = response.GetError();
791       if (error)
792         return error;
793     }
794   }
795   return -1;
796 }
797 
798 int GDBRemoteCommunicationClient::SendEnvironmentPacket(
799     char const *name_equal_value) {
800   if (name_equal_value && name_equal_value[0]) {
801     StreamString packet;
802     bool send_hex_encoding = false;
803     for (const char *p = name_equal_value;
804          *p != '\0' && send_hex_encoding == false; ++p) {
805       if (isprint(*p)) {
806         switch (*p) {
807         case '$':
808         case '#':
809         case '*':
810         case '}':
811           send_hex_encoding = true;
812           break;
813         default:
814           break;
815         }
816       } else {
817         // We have non printable characters, lets hex encode this...
818         send_hex_encoding = true;
819       }
820     }
821 
822     StringExtractorGDBRemote response;
823     if (send_hex_encoding) {
824       if (m_supports_QEnvironmentHexEncoded) {
825         packet.PutCString("QEnvironmentHexEncoded:");
826         packet.PutBytesAsRawHex8(name_equal_value, strlen(name_equal_value));
827         if (SendPacketAndWaitForResponse(packet.GetString(), response, false) ==
828             PacketResult::Success) {
829           if (response.IsOKResponse())
830             return 0;
831           uint8_t error = response.GetError();
832           if (error)
833             return error;
834           if (response.IsUnsupportedResponse())
835             m_supports_QEnvironmentHexEncoded = false;
836         }
837       }
838 
839     } else if (m_supports_QEnvironment) {
840       packet.Printf("QEnvironment:%s", name_equal_value);
841       if (SendPacketAndWaitForResponse(packet.GetString(), response, false) ==
842           PacketResult::Success) {
843         if (response.IsOKResponse())
844           return 0;
845         uint8_t error = response.GetError();
846         if (error)
847           return error;
848         if (response.IsUnsupportedResponse())
849           m_supports_QEnvironment = false;
850       }
851     }
852   }
853   return -1;
854 }
855 
856 int GDBRemoteCommunicationClient::SendLaunchArchPacket(char const *arch) {
857   if (arch && arch[0]) {
858     StreamString packet;
859     packet.Printf("QLaunchArch:%s", arch);
860     StringExtractorGDBRemote response;
861     if (SendPacketAndWaitForResponse(packet.GetString(), response, false) ==
862         PacketResult::Success) {
863       if (response.IsOKResponse())
864         return 0;
865       uint8_t error = response.GetError();
866       if (error)
867         return error;
868     }
869   }
870   return -1;
871 }
872 
873 int GDBRemoteCommunicationClient::SendLaunchEventDataPacket(
874     char const *data, bool *was_supported) {
875   if (data && *data != '\0') {
876     StreamString packet;
877     packet.Printf("QSetProcessEvent:%s", data);
878     StringExtractorGDBRemote response;
879     if (SendPacketAndWaitForResponse(packet.GetString(), response, false) ==
880         PacketResult::Success) {
881       if (response.IsOKResponse()) {
882         if (was_supported)
883           *was_supported = true;
884         return 0;
885       } else if (response.IsUnsupportedResponse()) {
886         if (was_supported)
887           *was_supported = false;
888         return -1;
889       } else {
890         uint8_t error = response.GetError();
891         if (was_supported)
892           *was_supported = true;
893         if (error)
894           return error;
895       }
896     }
897   }
898   return -1;
899 }
900 
901 bool GDBRemoteCommunicationClient::GetOSVersion(uint32_t &major,
902                                                 uint32_t &minor,
903                                                 uint32_t &update) {
904   if (GetHostInfo()) {
905     if (m_os_version_major != UINT32_MAX) {
906       major = m_os_version_major;
907       minor = m_os_version_minor;
908       update = m_os_version_update;
909       return true;
910     }
911   }
912   return false;
913 }
914 
915 bool GDBRemoteCommunicationClient::GetOSBuildString(std::string &s) {
916   if (GetHostInfo()) {
917     if (!m_os_build.empty()) {
918       s = m_os_build;
919       return true;
920     }
921   }
922   s.clear();
923   return false;
924 }
925 
926 bool GDBRemoteCommunicationClient::GetOSKernelDescription(std::string &s) {
927   if (GetHostInfo()) {
928     if (!m_os_kernel.empty()) {
929       s = m_os_kernel;
930       return true;
931     }
932   }
933   s.clear();
934   return false;
935 }
936 
937 bool GDBRemoteCommunicationClient::GetHostname(std::string &s) {
938   if (GetHostInfo()) {
939     if (!m_hostname.empty()) {
940       s = m_hostname;
941       return true;
942     }
943   }
944   s.clear();
945   return false;
946 }
947 
948 ArchSpec GDBRemoteCommunicationClient::GetSystemArchitecture() {
949   if (GetHostInfo())
950     return m_host_arch;
951   return ArchSpec();
952 }
953 
954 const lldb_private::ArchSpec &
955 GDBRemoteCommunicationClient::GetProcessArchitecture() {
956   if (m_qProcessInfo_is_valid == eLazyBoolCalculate)
957     GetCurrentProcessInfo();
958   return m_process_arch;
959 }
960 
961 bool GDBRemoteCommunicationClient::GetGDBServerVersion() {
962   if (m_qGDBServerVersion_is_valid == eLazyBoolCalculate) {
963     m_gdb_server_name.clear();
964     m_gdb_server_version = 0;
965     m_qGDBServerVersion_is_valid = eLazyBoolNo;
966 
967     StringExtractorGDBRemote response;
968     if (SendPacketAndWaitForResponse("qGDBServerVersion", response, false) ==
969         PacketResult::Success) {
970       if (response.IsNormalResponse()) {
971         llvm::StringRef name, value;
972         bool success = false;
973         while (response.GetNameColonValue(name, value)) {
974           if (name.equals("name")) {
975             success = true;
976             m_gdb_server_name = value;
977           } else if (name.equals("version")) {
978             llvm::StringRef major, minor;
979             std::tie(major, minor) = value.split('.');
980             if (!major.getAsInteger(0, m_gdb_server_version))
981               success = true;
982           }
983         }
984         if (success)
985           m_qGDBServerVersion_is_valid = eLazyBoolYes;
986       }
987     }
988   }
989   return m_qGDBServerVersion_is_valid == eLazyBoolYes;
990 }
991 
992 void GDBRemoteCommunicationClient::MaybeEnableCompression(
993     std::vector<std::string> supported_compressions) {
994   CompressionType avail_type = CompressionType::None;
995   std::string avail_name;
996 
997 #if defined(HAVE_LIBCOMPRESSION)
998   // libcompression is weak linked so test if compression_decode_buffer() is
999   // available
1000   if (compression_decode_buffer != NULL &&
1001       avail_type == CompressionType::None) {
1002     for (auto compression : supported_compressions) {
1003       if (compression == "lzfse") {
1004         avail_type = CompressionType::LZFSE;
1005         avail_name = compression;
1006         break;
1007       }
1008     }
1009   }
1010 #endif
1011 
1012 #if defined(HAVE_LIBCOMPRESSION)
1013   // libcompression is weak linked so test if compression_decode_buffer() is
1014   // available
1015   if (compression_decode_buffer != NULL &&
1016       avail_type == CompressionType::None) {
1017     for (auto compression : supported_compressions) {
1018       if (compression == "zlib-deflate") {
1019         avail_type = CompressionType::ZlibDeflate;
1020         avail_name = compression;
1021         break;
1022       }
1023     }
1024   }
1025 #endif
1026 
1027 #if defined(HAVE_LIBZ)
1028   if (avail_type == CompressionType::None) {
1029     for (auto compression : supported_compressions) {
1030       if (compression == "zlib-deflate") {
1031         avail_type = CompressionType::ZlibDeflate;
1032         avail_name = compression;
1033         break;
1034       }
1035     }
1036   }
1037 #endif
1038 
1039 #if defined(HAVE_LIBCOMPRESSION)
1040   // libcompression is weak linked so test if compression_decode_buffer() is
1041   // available
1042   if (compression_decode_buffer != NULL &&
1043       avail_type == CompressionType::None) {
1044     for (auto compression : supported_compressions) {
1045       if (compression == "lz4") {
1046         avail_type = CompressionType::LZ4;
1047         avail_name = compression;
1048         break;
1049       }
1050     }
1051   }
1052 #endif
1053 
1054 #if defined(HAVE_LIBCOMPRESSION)
1055   // libcompression is weak linked so test if compression_decode_buffer() is
1056   // available
1057   if (compression_decode_buffer != NULL &&
1058       avail_type == CompressionType::None) {
1059     for (auto compression : supported_compressions) {
1060       if (compression == "lzma") {
1061         avail_type = CompressionType::LZMA;
1062         avail_name = compression;
1063         break;
1064       }
1065     }
1066   }
1067 #endif
1068 
1069   if (avail_type != CompressionType::None) {
1070     StringExtractorGDBRemote response;
1071     std::string packet = "QEnableCompression:type:" + avail_name + ";";
1072     if (SendPacketAndWaitForResponse(packet, response, false) !=
1073         PacketResult::Success)
1074       return;
1075 
1076     if (response.IsOKResponse()) {
1077       m_compression_type = avail_type;
1078     }
1079   }
1080 }
1081 
1082 const char *GDBRemoteCommunicationClient::GetGDBServerProgramName() {
1083   if (GetGDBServerVersion()) {
1084     if (!m_gdb_server_name.empty())
1085       return m_gdb_server_name.c_str();
1086   }
1087   return NULL;
1088 }
1089 
1090 uint32_t GDBRemoteCommunicationClient::GetGDBServerProgramVersion() {
1091   if (GetGDBServerVersion())
1092     return m_gdb_server_version;
1093   return 0;
1094 }
1095 
1096 bool GDBRemoteCommunicationClient::GetDefaultThreadId(lldb::tid_t &tid) {
1097   StringExtractorGDBRemote response;
1098   if (SendPacketAndWaitForResponse("qC", response, false) !=
1099       PacketResult::Success)
1100     return false;
1101 
1102   if (!response.IsNormalResponse())
1103     return false;
1104 
1105   if (response.GetChar() == 'Q' && response.GetChar() == 'C')
1106     tid = response.GetHexMaxU32(true, -1);
1107 
1108   return true;
1109 }
1110 
1111 bool GDBRemoteCommunicationClient::GetHostInfo(bool force) {
1112   Log *log(ProcessGDBRemoteLog::GetLogIfAnyCategoryIsSet(GDBR_LOG_PROCESS));
1113 
1114   if (force || m_qHostInfo_is_valid == eLazyBoolCalculate) {
1115     m_qHostInfo_is_valid = eLazyBoolNo;
1116     StringExtractorGDBRemote response;
1117     if (SendPacketAndWaitForResponse("qHostInfo", response, false) ==
1118         PacketResult::Success) {
1119       if (response.IsNormalResponse()) {
1120         llvm::StringRef name;
1121         llvm::StringRef value;
1122         uint32_t cpu = LLDB_INVALID_CPUTYPE;
1123         uint32_t sub = 0;
1124         std::string arch_name;
1125         std::string os_name;
1126         std::string vendor_name;
1127         std::string triple;
1128         std::string distribution_id;
1129         uint32_t pointer_byte_size = 0;
1130         ByteOrder byte_order = eByteOrderInvalid;
1131         uint32_t num_keys_decoded = 0;
1132         while (response.GetNameColonValue(name, value)) {
1133           if (name.equals("cputype")) {
1134             // exception type in big endian hex
1135             if (!value.getAsInteger(0, cpu))
1136               ++num_keys_decoded;
1137           } else if (name.equals("cpusubtype")) {
1138             // exception count in big endian hex
1139             if (!value.getAsInteger(0, sub))
1140               ++num_keys_decoded;
1141           } else if (name.equals("arch")) {
1142             arch_name = value;
1143             ++num_keys_decoded;
1144           } else if (name.equals("triple")) {
1145             StringExtractor extractor(value);
1146             extractor.GetHexByteString(triple);
1147             ++num_keys_decoded;
1148           } else if (name.equals("distribution_id")) {
1149             StringExtractor extractor(value);
1150             extractor.GetHexByteString(distribution_id);
1151             ++num_keys_decoded;
1152           } else if (name.equals("os_build")) {
1153             StringExtractor extractor(value);
1154             extractor.GetHexByteString(m_os_build);
1155             ++num_keys_decoded;
1156           } else if (name.equals("hostname")) {
1157             StringExtractor extractor(value);
1158             extractor.GetHexByteString(m_hostname);
1159             ++num_keys_decoded;
1160           } else if (name.equals("os_kernel")) {
1161             StringExtractor extractor(value);
1162             extractor.GetHexByteString(m_os_kernel);
1163             ++num_keys_decoded;
1164           } else if (name.equals("ostype")) {
1165             os_name = value;
1166             ++num_keys_decoded;
1167           } else if (name.equals("vendor")) {
1168             vendor_name = value;
1169             ++num_keys_decoded;
1170           } else if (name.equals("endian")) {
1171             byte_order = llvm::StringSwitch<lldb::ByteOrder>(value)
1172                              .Case("little", eByteOrderLittle)
1173                              .Case("big", eByteOrderBig)
1174                              .Case("pdp", eByteOrderPDP)
1175                              .Default(eByteOrderInvalid);
1176             if (byte_order != eByteOrderInvalid)
1177               ++num_keys_decoded;
1178           } else if (name.equals("ptrsize")) {
1179             if (!value.getAsInteger(0, pointer_byte_size))
1180               ++num_keys_decoded;
1181           } else if (name.equals("os_version") ||
1182                      name.equals(
1183                          "version")) // Older debugserver binaries used the
1184                                      // "version" key instead of
1185                                      // "os_version"...
1186           {
1187             Args::StringToVersion(value, m_os_version_major, m_os_version_minor,
1188                                   m_os_version_update);
1189             if (m_os_version_major != UINT32_MAX)
1190               ++num_keys_decoded;
1191           } else if (name.equals("watchpoint_exceptions_received")) {
1192             m_watchpoints_trigger_after_instruction =
1193                 llvm::StringSwitch<LazyBool>(value)
1194                     .Case("before", eLazyBoolNo)
1195                     .Case("after", eLazyBoolYes)
1196                     .Default(eLazyBoolCalculate);
1197             if (m_watchpoints_trigger_after_instruction != eLazyBoolCalculate)
1198               ++num_keys_decoded;
1199           } else if (name.equals("default_packet_timeout")) {
1200             uint32_t timeout_seconds;
1201             if (!value.getAsInteger(0, timeout_seconds)) {
1202               m_default_packet_timeout = seconds(timeout_seconds);
1203               SetPacketTimeout(m_default_packet_timeout);
1204               ++num_keys_decoded;
1205             }
1206           }
1207         }
1208 
1209         if (num_keys_decoded > 0)
1210           m_qHostInfo_is_valid = eLazyBoolYes;
1211 
1212         if (triple.empty()) {
1213           if (arch_name.empty()) {
1214             if (cpu != LLDB_INVALID_CPUTYPE) {
1215               m_host_arch.SetArchitecture(eArchTypeMachO, cpu, sub);
1216               if (pointer_byte_size) {
1217                 assert(pointer_byte_size == m_host_arch.GetAddressByteSize());
1218               }
1219               if (byte_order != eByteOrderInvalid) {
1220                 assert(byte_order == m_host_arch.GetByteOrder());
1221               }
1222 
1223               if (!vendor_name.empty())
1224                 m_host_arch.GetTriple().setVendorName(
1225                     llvm::StringRef(vendor_name));
1226               if (!os_name.empty())
1227                 m_host_arch.GetTriple().setOSName(llvm::StringRef(os_name));
1228             }
1229           } else {
1230             std::string triple;
1231             triple += arch_name;
1232             if (!vendor_name.empty() || !os_name.empty()) {
1233               triple += '-';
1234               if (vendor_name.empty())
1235                 triple += "unknown";
1236               else
1237                 triple += vendor_name;
1238               triple += '-';
1239               if (os_name.empty())
1240                 triple += "unknown";
1241               else
1242                 triple += os_name;
1243             }
1244             m_host_arch.SetTriple(triple.c_str());
1245 
1246             llvm::Triple &host_triple = m_host_arch.GetTriple();
1247             if (host_triple.getVendor() == llvm::Triple::Apple &&
1248                 host_triple.getOS() == llvm::Triple::Darwin) {
1249               switch (m_host_arch.GetMachine()) {
1250               case llvm::Triple::aarch64:
1251               case llvm::Triple::arm:
1252               case llvm::Triple::thumb:
1253                 host_triple.setOS(llvm::Triple::IOS);
1254                 break;
1255               default:
1256                 host_triple.setOS(llvm::Triple::MacOSX);
1257                 break;
1258               }
1259             }
1260             if (pointer_byte_size) {
1261               assert(pointer_byte_size == m_host_arch.GetAddressByteSize());
1262             }
1263             if (byte_order != eByteOrderInvalid) {
1264               assert(byte_order == m_host_arch.GetByteOrder());
1265             }
1266           }
1267         } else {
1268           m_host_arch.SetTriple(triple.c_str());
1269           if (pointer_byte_size) {
1270             assert(pointer_byte_size == m_host_arch.GetAddressByteSize());
1271           }
1272           if (byte_order != eByteOrderInvalid) {
1273             assert(byte_order == m_host_arch.GetByteOrder());
1274           }
1275 
1276           if (log)
1277             log->Printf("GDBRemoteCommunicationClient::%s parsed host "
1278                         "architecture as %s, triple as %s from triple text %s",
1279                         __FUNCTION__, m_host_arch.GetArchitectureName()
1280                                           ? m_host_arch.GetArchitectureName()
1281                                           : "<null-arch-name>",
1282                         m_host_arch.GetTriple().getTriple().c_str(),
1283                         triple.c_str());
1284         }
1285         if (!distribution_id.empty())
1286           m_host_arch.SetDistributionId(distribution_id.c_str());
1287       }
1288     }
1289   }
1290   return m_qHostInfo_is_valid == eLazyBoolYes;
1291 }
1292 
1293 int GDBRemoteCommunicationClient::SendAttach(
1294     lldb::pid_t pid, StringExtractorGDBRemote &response) {
1295   if (pid != LLDB_INVALID_PROCESS_ID) {
1296     char packet[64];
1297     const int packet_len =
1298         ::snprintf(packet, sizeof(packet), "vAttach;%" PRIx64, pid);
1299     UNUSED_IF_ASSERT_DISABLED(packet_len);
1300     assert(packet_len < (int)sizeof(packet));
1301     if (SendPacketAndWaitForResponse(packet, response, false) ==
1302         PacketResult::Success) {
1303       if (response.IsErrorResponse())
1304         return response.GetError();
1305       return 0;
1306     }
1307   }
1308   return -1;
1309 }
1310 
1311 int GDBRemoteCommunicationClient::SendStdinNotification(const char *data,
1312                                                         size_t data_len) {
1313   StreamString packet;
1314   packet.PutCString("I");
1315   packet.PutBytesAsRawHex8(data, data_len);
1316   StringExtractorGDBRemote response;
1317   if (SendPacketAndWaitForResponse(packet.GetString(), response, false) ==
1318       PacketResult::Success) {
1319     return 0;
1320   }
1321   return response.GetError();
1322 }
1323 
1324 const lldb_private::ArchSpec &
1325 GDBRemoteCommunicationClient::GetHostArchitecture() {
1326   if (m_qHostInfo_is_valid == eLazyBoolCalculate)
1327     GetHostInfo();
1328   return m_host_arch;
1329 }
1330 
1331 seconds GDBRemoteCommunicationClient::GetHostDefaultPacketTimeout() {
1332   if (m_qHostInfo_is_valid == eLazyBoolCalculate)
1333     GetHostInfo();
1334   return m_default_packet_timeout;
1335 }
1336 
1337 addr_t GDBRemoteCommunicationClient::AllocateMemory(size_t size,
1338                                                     uint32_t permissions) {
1339   if (m_supports_alloc_dealloc_memory != eLazyBoolNo) {
1340     m_supports_alloc_dealloc_memory = eLazyBoolYes;
1341     char packet[64];
1342     const int packet_len = ::snprintf(
1343         packet, sizeof(packet), "_M%" PRIx64 ",%s%s%s", (uint64_t)size,
1344         permissions & lldb::ePermissionsReadable ? "r" : "",
1345         permissions & lldb::ePermissionsWritable ? "w" : "",
1346         permissions & lldb::ePermissionsExecutable ? "x" : "");
1347     assert(packet_len < (int)sizeof(packet));
1348     UNUSED_IF_ASSERT_DISABLED(packet_len);
1349     StringExtractorGDBRemote response;
1350     if (SendPacketAndWaitForResponse(packet, response, false) ==
1351         PacketResult::Success) {
1352       if (response.IsUnsupportedResponse())
1353         m_supports_alloc_dealloc_memory = eLazyBoolNo;
1354       else if (!response.IsErrorResponse())
1355         return response.GetHexMaxU64(false, LLDB_INVALID_ADDRESS);
1356     } else {
1357       m_supports_alloc_dealloc_memory = eLazyBoolNo;
1358     }
1359   }
1360   return LLDB_INVALID_ADDRESS;
1361 }
1362 
1363 bool GDBRemoteCommunicationClient::DeallocateMemory(addr_t addr) {
1364   if (m_supports_alloc_dealloc_memory != eLazyBoolNo) {
1365     m_supports_alloc_dealloc_memory = eLazyBoolYes;
1366     char packet[64];
1367     const int packet_len =
1368         ::snprintf(packet, sizeof(packet), "_m%" PRIx64, (uint64_t)addr);
1369     assert(packet_len < (int)sizeof(packet));
1370     UNUSED_IF_ASSERT_DISABLED(packet_len);
1371     StringExtractorGDBRemote response;
1372     if (SendPacketAndWaitForResponse(packet, response, false) ==
1373         PacketResult::Success) {
1374       if (response.IsUnsupportedResponse())
1375         m_supports_alloc_dealloc_memory = eLazyBoolNo;
1376       else if (response.IsOKResponse())
1377         return true;
1378     } else {
1379       m_supports_alloc_dealloc_memory = eLazyBoolNo;
1380     }
1381   }
1382   return false;
1383 }
1384 
1385 Error GDBRemoteCommunicationClient::Detach(bool keep_stopped) {
1386   Error error;
1387 
1388   if (keep_stopped) {
1389     if (m_supports_detach_stay_stopped == eLazyBoolCalculate) {
1390       char packet[64];
1391       const int packet_len =
1392           ::snprintf(packet, sizeof(packet), "qSupportsDetachAndStayStopped:");
1393       assert(packet_len < (int)sizeof(packet));
1394       UNUSED_IF_ASSERT_DISABLED(packet_len);
1395       StringExtractorGDBRemote response;
1396       if (SendPacketAndWaitForResponse(packet, response, false) ==
1397               PacketResult::Success &&
1398           response.IsOKResponse()) {
1399         m_supports_detach_stay_stopped = eLazyBoolYes;
1400       } else {
1401         m_supports_detach_stay_stopped = eLazyBoolNo;
1402       }
1403     }
1404 
1405     if (m_supports_detach_stay_stopped == eLazyBoolNo) {
1406       error.SetErrorString("Stays stopped not supported by this target.");
1407       return error;
1408     } else {
1409       StringExtractorGDBRemote response;
1410       PacketResult packet_result =
1411           SendPacketAndWaitForResponse("D1", response, false);
1412       if (packet_result != PacketResult::Success)
1413         error.SetErrorString("Sending extended disconnect packet failed.");
1414     }
1415   } else {
1416     StringExtractorGDBRemote response;
1417     PacketResult packet_result =
1418         SendPacketAndWaitForResponse("D", response, false);
1419     if (packet_result != PacketResult::Success)
1420       error.SetErrorString("Sending disconnect packet failed.");
1421   }
1422   return error;
1423 }
1424 
1425 Error GDBRemoteCommunicationClient::GetMemoryRegionInfo(
1426     lldb::addr_t addr, lldb_private::MemoryRegionInfo &region_info) {
1427   Error error;
1428   region_info.Clear();
1429 
1430   if (m_supports_memory_region_info != eLazyBoolNo) {
1431     m_supports_memory_region_info = eLazyBoolYes;
1432     char packet[64];
1433     const int packet_len = ::snprintf(
1434         packet, sizeof(packet), "qMemoryRegionInfo:%" PRIx64, (uint64_t)addr);
1435     assert(packet_len < (int)sizeof(packet));
1436     UNUSED_IF_ASSERT_DISABLED(packet_len);
1437     StringExtractorGDBRemote response;
1438     if (SendPacketAndWaitForResponse(packet, response, false) ==
1439         PacketResult::Success) {
1440       llvm::StringRef name;
1441       llvm::StringRef value;
1442       addr_t addr_value = LLDB_INVALID_ADDRESS;
1443       bool success = true;
1444       bool saw_permissions = false;
1445       while (success && response.GetNameColonValue(name, value)) {
1446         if (name.equals("start")) {
1447           if (!value.getAsInteger(16, addr_value))
1448             region_info.GetRange().SetRangeBase(addr_value);
1449         } else if (name.equals("size")) {
1450           if (!value.getAsInteger(16, addr_value))
1451             region_info.GetRange().SetByteSize(addr_value);
1452         } else if (name.equals("permissions") &&
1453                    region_info.GetRange().IsValid()) {
1454           saw_permissions = true;
1455           if (region_info.GetRange().Contains(addr)) {
1456             if (value.find('r') != llvm::StringRef::npos)
1457               region_info.SetReadable(MemoryRegionInfo::eYes);
1458             else
1459               region_info.SetReadable(MemoryRegionInfo::eNo);
1460 
1461             if (value.find('w') != llvm::StringRef::npos)
1462               region_info.SetWritable(MemoryRegionInfo::eYes);
1463             else
1464               region_info.SetWritable(MemoryRegionInfo::eNo);
1465 
1466             if (value.find('x') != llvm::StringRef::npos)
1467               region_info.SetExecutable(MemoryRegionInfo::eYes);
1468             else
1469               region_info.SetExecutable(MemoryRegionInfo::eNo);
1470 
1471             region_info.SetMapped(MemoryRegionInfo::eYes);
1472           } else {
1473             // The reported region does not contain this address -- we're
1474             // looking at an unmapped page
1475             region_info.SetReadable(MemoryRegionInfo::eNo);
1476             region_info.SetWritable(MemoryRegionInfo::eNo);
1477             region_info.SetExecutable(MemoryRegionInfo::eNo);
1478             region_info.SetMapped(MemoryRegionInfo::eNo);
1479           }
1480         } else if (name.equals("name")) {
1481           StringExtractorGDBRemote name_extractor(value);
1482           std::string name;
1483           name_extractor.GetHexByteString(name);
1484           region_info.SetName(name.c_str());
1485         } else if (name.equals("error")) {
1486           StringExtractorGDBRemote error_extractor(value);
1487           std::string error_string;
1488           // Now convert the HEX bytes into a string value
1489           error_extractor.GetHexByteString(error_string);
1490           error.SetErrorString(error_string.c_str());
1491         }
1492       }
1493 
1494       // We got a valid address range back but no permissions -- which means
1495       // this is an unmapped page
1496       if (region_info.GetRange().IsValid() && saw_permissions == false) {
1497         region_info.SetReadable(MemoryRegionInfo::eNo);
1498         region_info.SetWritable(MemoryRegionInfo::eNo);
1499         region_info.SetExecutable(MemoryRegionInfo::eNo);
1500         region_info.SetMapped(MemoryRegionInfo::eNo);
1501       }
1502     } else {
1503       m_supports_memory_region_info = eLazyBoolNo;
1504     }
1505   }
1506 
1507   if (m_supports_memory_region_info == eLazyBoolNo) {
1508     error.SetErrorString("qMemoryRegionInfo is not supported");
1509   }
1510   if (error.Fail())
1511     region_info.Clear();
1512   return error;
1513 }
1514 
1515 Error GDBRemoteCommunicationClient::GetWatchpointSupportInfo(uint32_t &num) {
1516   Error error;
1517 
1518   if (m_supports_watchpoint_support_info == eLazyBoolYes) {
1519     num = m_num_supported_hardware_watchpoints;
1520     return error;
1521   }
1522 
1523   // Set num to 0 first.
1524   num = 0;
1525   if (m_supports_watchpoint_support_info != eLazyBoolNo) {
1526     char packet[64];
1527     const int packet_len =
1528         ::snprintf(packet, sizeof(packet), "qWatchpointSupportInfo:");
1529     assert(packet_len < (int)sizeof(packet));
1530     UNUSED_IF_ASSERT_DISABLED(packet_len);
1531     StringExtractorGDBRemote response;
1532     if (SendPacketAndWaitForResponse(packet, response, false) ==
1533         PacketResult::Success) {
1534       m_supports_watchpoint_support_info = eLazyBoolYes;
1535       llvm::StringRef name;
1536       llvm::StringRef value;
1537       while (response.GetNameColonValue(name, value)) {
1538         if (name.equals("num")) {
1539           value.getAsInteger(0, m_num_supported_hardware_watchpoints);
1540           num = m_num_supported_hardware_watchpoints;
1541         }
1542       }
1543     } else {
1544       m_supports_watchpoint_support_info = eLazyBoolNo;
1545     }
1546   }
1547 
1548   if (m_supports_watchpoint_support_info == eLazyBoolNo) {
1549     error.SetErrorString("qWatchpointSupportInfo is not supported");
1550   }
1551   return error;
1552 }
1553 
1554 lldb_private::Error GDBRemoteCommunicationClient::GetWatchpointSupportInfo(
1555     uint32_t &num, bool &after, const ArchSpec &arch) {
1556   Error error(GetWatchpointSupportInfo(num));
1557   if (error.Success())
1558     error = GetWatchpointsTriggerAfterInstruction(after, arch);
1559   return error;
1560 }
1561 
1562 lldb_private::Error
1563 GDBRemoteCommunicationClient::GetWatchpointsTriggerAfterInstruction(
1564     bool &after, const ArchSpec &arch) {
1565   Error error;
1566   llvm::Triple::ArchType atype = arch.GetMachine();
1567 
1568   // we assume watchpoints will happen after running the relevant opcode
1569   // and we only want to override this behavior if we have explicitly
1570   // received a qHostInfo telling us otherwise
1571   if (m_qHostInfo_is_valid != eLazyBoolYes) {
1572     // On targets like MIPS, watchpoint exceptions are always generated
1573     // before the instruction is executed. The connected target may not
1574     // support qHostInfo or qWatchpointSupportInfo packets.
1575     if (atype == llvm::Triple::mips || atype == llvm::Triple::mipsel ||
1576         atype == llvm::Triple::mips64 || atype == llvm::Triple::mips64el)
1577       after = false;
1578     else
1579       after = true;
1580   } else {
1581     // For MIPS, set m_watchpoints_trigger_after_instruction to eLazyBoolNo
1582     // if it is not calculated before.
1583     if (m_watchpoints_trigger_after_instruction == eLazyBoolCalculate &&
1584         (atype == llvm::Triple::mips || atype == llvm::Triple::mipsel ||
1585          atype == llvm::Triple::mips64 || atype == llvm::Triple::mips64el))
1586       m_watchpoints_trigger_after_instruction = eLazyBoolNo;
1587 
1588     after = (m_watchpoints_trigger_after_instruction != eLazyBoolNo);
1589   }
1590   return error;
1591 }
1592 
1593 int GDBRemoteCommunicationClient::SetSTDIN(const FileSpec &file_spec) {
1594   if (file_spec) {
1595     std::string path{file_spec.GetPath(false)};
1596     StreamString packet;
1597     packet.PutCString("QSetSTDIN:");
1598     packet.PutCStringAsRawHex8(path.c_str());
1599 
1600     StringExtractorGDBRemote response;
1601     if (SendPacketAndWaitForResponse(packet.GetString(), response, false) ==
1602         PacketResult::Success) {
1603       if (response.IsOKResponse())
1604         return 0;
1605       uint8_t error = response.GetError();
1606       if (error)
1607         return error;
1608     }
1609   }
1610   return -1;
1611 }
1612 
1613 int GDBRemoteCommunicationClient::SetSTDOUT(const FileSpec &file_spec) {
1614   if (file_spec) {
1615     std::string path{file_spec.GetPath(false)};
1616     StreamString packet;
1617     packet.PutCString("QSetSTDOUT:");
1618     packet.PutCStringAsRawHex8(path.c_str());
1619 
1620     StringExtractorGDBRemote response;
1621     if (SendPacketAndWaitForResponse(packet.GetString(), response, false) ==
1622         PacketResult::Success) {
1623       if (response.IsOKResponse())
1624         return 0;
1625       uint8_t error = response.GetError();
1626       if (error)
1627         return error;
1628     }
1629   }
1630   return -1;
1631 }
1632 
1633 int GDBRemoteCommunicationClient::SetSTDERR(const FileSpec &file_spec) {
1634   if (file_spec) {
1635     std::string path{file_spec.GetPath(false)};
1636     StreamString packet;
1637     packet.PutCString("QSetSTDERR:");
1638     packet.PutCStringAsRawHex8(path.c_str());
1639 
1640     StringExtractorGDBRemote response;
1641     if (SendPacketAndWaitForResponse(packet.GetString(), response, false) ==
1642         PacketResult::Success) {
1643       if (response.IsOKResponse())
1644         return 0;
1645       uint8_t error = response.GetError();
1646       if (error)
1647         return error;
1648     }
1649   }
1650   return -1;
1651 }
1652 
1653 bool GDBRemoteCommunicationClient::GetWorkingDir(FileSpec &working_dir) {
1654   StringExtractorGDBRemote response;
1655   if (SendPacketAndWaitForResponse("qGetWorkingDir", response, false) ==
1656       PacketResult::Success) {
1657     if (response.IsUnsupportedResponse())
1658       return false;
1659     if (response.IsErrorResponse())
1660       return false;
1661     std::string cwd;
1662     response.GetHexByteString(cwd);
1663     working_dir.SetFile(cwd, false, GetHostArchitecture());
1664     return !cwd.empty();
1665   }
1666   return false;
1667 }
1668 
1669 int GDBRemoteCommunicationClient::SetWorkingDir(const FileSpec &working_dir) {
1670   if (working_dir) {
1671     std::string path{working_dir.GetPath(false)};
1672     StreamString packet;
1673     packet.PutCString("QSetWorkingDir:");
1674     packet.PutCStringAsRawHex8(path.c_str());
1675 
1676     StringExtractorGDBRemote response;
1677     if (SendPacketAndWaitForResponse(packet.GetString(), response, false) ==
1678         PacketResult::Success) {
1679       if (response.IsOKResponse())
1680         return 0;
1681       uint8_t error = response.GetError();
1682       if (error)
1683         return error;
1684     }
1685   }
1686   return -1;
1687 }
1688 
1689 int GDBRemoteCommunicationClient::SetDisableASLR(bool enable) {
1690   char packet[32];
1691   const int packet_len =
1692       ::snprintf(packet, sizeof(packet), "QSetDisableASLR:%i", enable ? 1 : 0);
1693   assert(packet_len < (int)sizeof(packet));
1694   UNUSED_IF_ASSERT_DISABLED(packet_len);
1695   StringExtractorGDBRemote response;
1696   if (SendPacketAndWaitForResponse(packet, response, false) ==
1697       PacketResult::Success) {
1698     if (response.IsOKResponse())
1699       return 0;
1700     uint8_t error = response.GetError();
1701     if (error)
1702       return error;
1703   }
1704   return -1;
1705 }
1706 
1707 int GDBRemoteCommunicationClient::SetDetachOnError(bool enable) {
1708   char packet[32];
1709   const int packet_len = ::snprintf(packet, sizeof(packet),
1710                                     "QSetDetachOnError:%i", enable ? 1 : 0);
1711   assert(packet_len < (int)sizeof(packet));
1712   UNUSED_IF_ASSERT_DISABLED(packet_len);
1713   StringExtractorGDBRemote response;
1714   if (SendPacketAndWaitForResponse(packet, response, false) ==
1715       PacketResult::Success) {
1716     if (response.IsOKResponse())
1717       return 0;
1718     uint8_t error = response.GetError();
1719     if (error)
1720       return error;
1721   }
1722   return -1;
1723 }
1724 
1725 bool GDBRemoteCommunicationClient::DecodeProcessInfoResponse(
1726     StringExtractorGDBRemote &response, ProcessInstanceInfo &process_info) {
1727   if (response.IsNormalResponse()) {
1728     llvm::StringRef name;
1729     llvm::StringRef value;
1730     StringExtractor extractor;
1731 
1732     uint32_t cpu = LLDB_INVALID_CPUTYPE;
1733     uint32_t sub = 0;
1734     std::string vendor;
1735     std::string os_type;
1736 
1737     while (response.GetNameColonValue(name, value)) {
1738       if (name.equals("pid")) {
1739         lldb::pid_t pid = LLDB_INVALID_PROCESS_ID;
1740         value.getAsInteger(0, pid);
1741         process_info.SetProcessID(pid);
1742       } else if (name.equals("ppid")) {
1743         lldb::pid_t pid = LLDB_INVALID_PROCESS_ID;
1744         value.getAsInteger(0, pid);
1745         process_info.SetParentProcessID(pid);
1746       } else if (name.equals("uid")) {
1747         uint32_t uid = UINT32_MAX;
1748         value.getAsInteger(0, uid);
1749         process_info.SetUserID(uid);
1750       } else if (name.equals("euid")) {
1751         uint32_t uid = UINT32_MAX;
1752         value.getAsInteger(0, uid);
1753         process_info.SetEffectiveGroupID(uid);
1754       } else if (name.equals("gid")) {
1755         uint32_t gid = UINT32_MAX;
1756         value.getAsInteger(0, gid);
1757         process_info.SetGroupID(gid);
1758       } else if (name.equals("egid")) {
1759         uint32_t gid = UINT32_MAX;
1760         value.getAsInteger(0, gid);
1761         process_info.SetEffectiveGroupID(gid);
1762       } else if (name.equals("triple")) {
1763         StringExtractor extractor(value);
1764         std::string triple;
1765         extractor.GetHexByteString(triple);
1766         process_info.GetArchitecture().SetTriple(triple.c_str());
1767       } else if (name.equals("name")) {
1768         StringExtractor extractor(value);
1769         // The process name from ASCII hex bytes since we can't
1770         // control the characters in a process name
1771         std::string name;
1772         extractor.GetHexByteString(name);
1773         process_info.GetExecutableFile().SetFile(name, false);
1774       } else if (name.equals("cputype")) {
1775         value.getAsInteger(0, cpu);
1776       } else if (name.equals("cpusubtype")) {
1777         value.getAsInteger(0, sub);
1778       } else if (name.equals("vendor")) {
1779         vendor = value;
1780       } else if (name.equals("ostype")) {
1781         os_type = value;
1782       }
1783     }
1784 
1785     if (cpu != LLDB_INVALID_CPUTYPE && !vendor.empty() && !os_type.empty()) {
1786       if (vendor == "apple") {
1787         process_info.GetArchitecture().SetArchitecture(eArchTypeMachO, cpu,
1788                                                        sub);
1789         process_info.GetArchitecture().GetTriple().setVendorName(
1790             llvm::StringRef(vendor));
1791         process_info.GetArchitecture().GetTriple().setOSName(
1792             llvm::StringRef(os_type));
1793       }
1794     }
1795 
1796     if (process_info.GetProcessID() != LLDB_INVALID_PROCESS_ID)
1797       return true;
1798   }
1799   return false;
1800 }
1801 
1802 bool GDBRemoteCommunicationClient::GetProcessInfo(
1803     lldb::pid_t pid, ProcessInstanceInfo &process_info) {
1804   process_info.Clear();
1805 
1806   if (m_supports_qProcessInfoPID) {
1807     char packet[32];
1808     const int packet_len =
1809         ::snprintf(packet, sizeof(packet), "qProcessInfoPID:%" PRIu64, pid);
1810     assert(packet_len < (int)sizeof(packet));
1811     UNUSED_IF_ASSERT_DISABLED(packet_len);
1812     StringExtractorGDBRemote response;
1813     if (SendPacketAndWaitForResponse(packet, response, false) ==
1814         PacketResult::Success) {
1815       return DecodeProcessInfoResponse(response, process_info);
1816     } else {
1817       m_supports_qProcessInfoPID = false;
1818       return false;
1819     }
1820   }
1821   return false;
1822 }
1823 
1824 bool GDBRemoteCommunicationClient::GetCurrentProcessInfo(bool allow_lazy) {
1825   Log *log(ProcessGDBRemoteLog::GetLogIfAnyCategoryIsSet(GDBR_LOG_PROCESS |
1826                                                          GDBR_LOG_PACKETS));
1827 
1828   if (allow_lazy) {
1829     if (m_qProcessInfo_is_valid == eLazyBoolYes)
1830       return true;
1831     if (m_qProcessInfo_is_valid == eLazyBoolNo)
1832       return false;
1833   }
1834 
1835   GetHostInfo();
1836 
1837   StringExtractorGDBRemote response;
1838   if (SendPacketAndWaitForResponse("qProcessInfo", response, false) ==
1839       PacketResult::Success) {
1840     if (response.IsNormalResponse()) {
1841       llvm::StringRef name;
1842       llvm::StringRef value;
1843       uint32_t cpu = LLDB_INVALID_CPUTYPE;
1844       uint32_t sub = 0;
1845       std::string arch_name;
1846       std::string os_name;
1847       std::string vendor_name;
1848       std::string triple;
1849       std::string elf_abi;
1850       uint32_t pointer_byte_size = 0;
1851       StringExtractor extractor;
1852       ByteOrder byte_order = eByteOrderInvalid;
1853       uint32_t num_keys_decoded = 0;
1854       lldb::pid_t pid = LLDB_INVALID_PROCESS_ID;
1855       while (response.GetNameColonValue(name, value)) {
1856         if (name.equals("cputype")) {
1857           if (!value.getAsInteger(16, cpu))
1858             ++num_keys_decoded;
1859         } else if (name.equals("cpusubtype")) {
1860           if (!value.getAsInteger(16, sub))
1861             ++num_keys_decoded;
1862         } else if (name.equals("triple")) {
1863           StringExtractor extractor(value);
1864           extractor.GetHexByteString(triple);
1865           ++num_keys_decoded;
1866         } else if (name.equals("ostype")) {
1867           os_name = value;
1868           ++num_keys_decoded;
1869         } else if (name.equals("vendor")) {
1870           vendor_name = value;
1871           ++num_keys_decoded;
1872         } else if (name.equals("endian")) {
1873           byte_order = llvm::StringSwitch<lldb::ByteOrder>(value)
1874                            .Case("little", eByteOrderLittle)
1875                            .Case("big", eByteOrderBig)
1876                            .Case("pdp", eByteOrderPDP)
1877                            .Default(eByteOrderInvalid);
1878           if (byte_order != eByteOrderInvalid)
1879             ++num_keys_decoded;
1880         } else if (name.equals("ptrsize")) {
1881           if (!value.getAsInteger(16, pointer_byte_size))
1882             ++num_keys_decoded;
1883         } else if (name.equals("pid")) {
1884           if (!value.getAsInteger(16, pid))
1885             ++num_keys_decoded;
1886         } else if (name.equals("elf_abi")) {
1887           elf_abi = value;
1888           ++num_keys_decoded;
1889         }
1890       }
1891       if (num_keys_decoded > 0)
1892         m_qProcessInfo_is_valid = eLazyBoolYes;
1893       if (pid != LLDB_INVALID_PROCESS_ID) {
1894         m_curr_pid_is_valid = eLazyBoolYes;
1895         m_curr_pid = pid;
1896       }
1897 
1898       // Set the ArchSpec from the triple if we have it.
1899       if (!triple.empty()) {
1900         m_process_arch.SetTriple(triple.c_str());
1901         m_process_arch.SetFlags(elf_abi);
1902         if (pointer_byte_size) {
1903           assert(pointer_byte_size == m_process_arch.GetAddressByteSize());
1904         }
1905       } else if (cpu != LLDB_INVALID_CPUTYPE && !os_name.empty() &&
1906                  !vendor_name.empty()) {
1907         llvm::Triple triple(llvm::Twine("-") + vendor_name + "-" + os_name);
1908 
1909         assert(triple.getObjectFormat() != llvm::Triple::UnknownObjectFormat);
1910         switch (triple.getObjectFormat()) {
1911         case llvm::Triple::MachO:
1912           m_process_arch.SetArchitecture(eArchTypeMachO, cpu, sub);
1913           break;
1914         case llvm::Triple::ELF:
1915           m_process_arch.SetArchitecture(eArchTypeELF, cpu, sub);
1916           break;
1917         case llvm::Triple::COFF:
1918           m_process_arch.SetArchitecture(eArchTypeCOFF, cpu, sub);
1919           break;
1920         case llvm::Triple::UnknownObjectFormat:
1921           if (log)
1922             log->Printf("error: failed to determine target architecture");
1923           return false;
1924         }
1925 
1926         if (pointer_byte_size) {
1927           assert(pointer_byte_size == m_process_arch.GetAddressByteSize());
1928         }
1929         if (byte_order != eByteOrderInvalid) {
1930           assert(byte_order == m_process_arch.GetByteOrder());
1931         }
1932         m_process_arch.GetTriple().setVendorName(llvm::StringRef(vendor_name));
1933         m_process_arch.GetTriple().setOSName(llvm::StringRef(os_name));
1934         m_host_arch.GetTriple().setVendorName(llvm::StringRef(vendor_name));
1935         m_host_arch.GetTriple().setOSName(llvm::StringRef(os_name));
1936       }
1937       return true;
1938     }
1939   } else {
1940     m_qProcessInfo_is_valid = eLazyBoolNo;
1941   }
1942 
1943   return false;
1944 }
1945 
1946 uint32_t GDBRemoteCommunicationClient::FindProcesses(
1947     const ProcessInstanceInfoMatch &match_info,
1948     ProcessInstanceInfoList &process_infos) {
1949   process_infos.Clear();
1950 
1951   if (m_supports_qfProcessInfo) {
1952     StreamString packet;
1953     packet.PutCString("qfProcessInfo");
1954     if (!match_info.MatchAllProcesses()) {
1955       packet.PutChar(':');
1956       const char *name = match_info.GetProcessInfo().GetName();
1957       bool has_name_match = false;
1958       if (name && name[0]) {
1959         has_name_match = true;
1960         NameMatchType name_match_type = match_info.GetNameMatchType();
1961         switch (name_match_type) {
1962         case eNameMatchIgnore:
1963           has_name_match = false;
1964           break;
1965 
1966         case eNameMatchEquals:
1967           packet.PutCString("name_match:equals;");
1968           break;
1969 
1970         case eNameMatchContains:
1971           packet.PutCString("name_match:contains;");
1972           break;
1973 
1974         case eNameMatchStartsWith:
1975           packet.PutCString("name_match:starts_with;");
1976           break;
1977 
1978         case eNameMatchEndsWith:
1979           packet.PutCString("name_match:ends_with;");
1980           break;
1981 
1982         case eNameMatchRegularExpression:
1983           packet.PutCString("name_match:regex;");
1984           break;
1985         }
1986         if (has_name_match) {
1987           packet.PutCString("name:");
1988           packet.PutBytesAsRawHex8(name, ::strlen(name));
1989           packet.PutChar(';');
1990         }
1991       }
1992 
1993       if (match_info.GetProcessInfo().ProcessIDIsValid())
1994         packet.Printf("pid:%" PRIu64 ";",
1995                       match_info.GetProcessInfo().GetProcessID());
1996       if (match_info.GetProcessInfo().ParentProcessIDIsValid())
1997         packet.Printf("parent_pid:%" PRIu64 ";",
1998                       match_info.GetProcessInfo().GetParentProcessID());
1999       if (match_info.GetProcessInfo().UserIDIsValid())
2000         packet.Printf("uid:%u;", match_info.GetProcessInfo().GetUserID());
2001       if (match_info.GetProcessInfo().GroupIDIsValid())
2002         packet.Printf("gid:%u;", match_info.GetProcessInfo().GetGroupID());
2003       if (match_info.GetProcessInfo().EffectiveUserIDIsValid())
2004         packet.Printf("euid:%u;",
2005                       match_info.GetProcessInfo().GetEffectiveUserID());
2006       if (match_info.GetProcessInfo().EffectiveGroupIDIsValid())
2007         packet.Printf("egid:%u;",
2008                       match_info.GetProcessInfo().GetEffectiveGroupID());
2009       if (match_info.GetProcessInfo().EffectiveGroupIDIsValid())
2010         packet.Printf("all_users:%u;", match_info.GetMatchAllUsers() ? 1 : 0);
2011       if (match_info.GetProcessInfo().GetArchitecture().IsValid()) {
2012         const ArchSpec &match_arch =
2013             match_info.GetProcessInfo().GetArchitecture();
2014         const llvm::Triple &triple = match_arch.GetTriple();
2015         packet.PutCString("triple:");
2016         packet.PutCString(triple.getTriple());
2017         packet.PutChar(';');
2018       }
2019     }
2020     StringExtractorGDBRemote response;
2021     // Increase timeout as the first qfProcessInfo packet takes a long time
2022     // on Android. The value of 1min was arrived at empirically.
2023     ScopedTimeout timeout(*this, minutes(1));
2024     if (SendPacketAndWaitForResponse(packet.GetString(), response, false) ==
2025         PacketResult::Success) {
2026       do {
2027         ProcessInstanceInfo process_info;
2028         if (!DecodeProcessInfoResponse(response, process_info))
2029           break;
2030         process_infos.Append(process_info);
2031         response.GetStringRef().clear();
2032         response.SetFilePos(0);
2033       } while (SendPacketAndWaitForResponse("qsProcessInfo", response, false) ==
2034                PacketResult::Success);
2035     } else {
2036       m_supports_qfProcessInfo = false;
2037       return 0;
2038     }
2039   }
2040   return process_infos.GetSize();
2041 }
2042 
2043 bool GDBRemoteCommunicationClient::GetUserName(uint32_t uid,
2044                                                std::string &name) {
2045   if (m_supports_qUserName) {
2046     char packet[32];
2047     const int packet_len =
2048         ::snprintf(packet, sizeof(packet), "qUserName:%i", uid);
2049     assert(packet_len < (int)sizeof(packet));
2050     UNUSED_IF_ASSERT_DISABLED(packet_len);
2051     StringExtractorGDBRemote response;
2052     if (SendPacketAndWaitForResponse(packet, response, false) ==
2053         PacketResult::Success) {
2054       if (response.IsNormalResponse()) {
2055         // Make sure we parsed the right number of characters. The response is
2056         // the hex encoded user name and should make up the entire packet.
2057         // If there are any non-hex ASCII bytes, the length won't match below..
2058         if (response.GetHexByteString(name) * 2 ==
2059             response.GetStringRef().size())
2060           return true;
2061       }
2062     } else {
2063       m_supports_qUserName = false;
2064       return false;
2065     }
2066   }
2067   return false;
2068 }
2069 
2070 bool GDBRemoteCommunicationClient::GetGroupName(uint32_t gid,
2071                                                 std::string &name) {
2072   if (m_supports_qGroupName) {
2073     char packet[32];
2074     const int packet_len =
2075         ::snprintf(packet, sizeof(packet), "qGroupName:%i", gid);
2076     assert(packet_len < (int)sizeof(packet));
2077     UNUSED_IF_ASSERT_DISABLED(packet_len);
2078     StringExtractorGDBRemote response;
2079     if (SendPacketAndWaitForResponse(packet, response, false) ==
2080         PacketResult::Success) {
2081       if (response.IsNormalResponse()) {
2082         // Make sure we parsed the right number of characters. The response is
2083         // the hex encoded group name and should make up the entire packet.
2084         // If there are any non-hex ASCII bytes, the length won't match below..
2085         if (response.GetHexByteString(name) * 2 ==
2086             response.GetStringRef().size())
2087           return true;
2088       }
2089     } else {
2090       m_supports_qGroupName = false;
2091       return false;
2092     }
2093   }
2094   return false;
2095 }
2096 
2097 bool GDBRemoteCommunicationClient::SetNonStopMode(const bool enable) {
2098   // Form non-stop packet request
2099   char packet[32];
2100   const int packet_len =
2101       ::snprintf(packet, sizeof(packet), "QNonStop:%1d", (int)enable);
2102   assert(packet_len < (int)sizeof(packet));
2103   UNUSED_IF_ASSERT_DISABLED(packet_len);
2104 
2105   StringExtractorGDBRemote response;
2106   // Send to target
2107   if (SendPacketAndWaitForResponse(packet, response, false) ==
2108       PacketResult::Success)
2109     if (response.IsOKResponse())
2110       return true;
2111 
2112   // Failed or not supported
2113   return false;
2114 }
2115 
2116 static void MakeSpeedTestPacket(StreamString &packet, uint32_t send_size,
2117                                 uint32_t recv_size) {
2118   packet.Clear();
2119   packet.Printf("qSpeedTest:response_size:%i;data:", recv_size);
2120   uint32_t bytes_left = send_size;
2121   while (bytes_left > 0) {
2122     if (bytes_left >= 26) {
2123       packet.PutCString("abcdefghijklmnopqrstuvwxyz");
2124       bytes_left -= 26;
2125     } else {
2126       packet.Printf("%*.*s;", bytes_left, bytes_left,
2127                     "abcdefghijklmnopqrstuvwxyz");
2128       bytes_left = 0;
2129     }
2130   }
2131 }
2132 
2133 duration<float>
2134 calculate_standard_deviation(const std::vector<duration<float>> &v) {
2135   using Dur = duration<float>;
2136   Dur sum = std::accumulate(std::begin(v), std::end(v), Dur());
2137   Dur mean = sum / v.size();
2138   float accum = 0;
2139   for (auto d : v) {
2140     float delta = (d - mean).count();
2141     accum += delta * delta;
2142   };
2143 
2144   return Dur(sqrtf(accum / (v.size() - 1)));
2145 }
2146 
2147 void GDBRemoteCommunicationClient::TestPacketSpeed(const uint32_t num_packets,
2148                                                    uint32_t max_send,
2149                                                    uint32_t max_recv,
2150                                                    uint64_t recv_amount,
2151                                                    bool json, Stream &strm) {
2152   uint32_t i;
2153   if (SendSpeedTestPacket(0, 0)) {
2154     StreamString packet;
2155     if (json)
2156       strm.Printf("{ \"packet_speeds\" : {\n    \"num_packets\" : %u,\n    "
2157                   "\"results\" : [",
2158                   num_packets);
2159     else
2160       strm.Printf("Testing sending %u packets of various sizes:\n",
2161                   num_packets);
2162     strm.Flush();
2163 
2164     uint32_t result_idx = 0;
2165     uint32_t send_size;
2166     std::vector<duration<float>> packet_times;
2167 
2168     for (send_size = 0; send_size <= max_send;
2169          send_size ? send_size *= 2 : send_size = 4) {
2170       for (uint32_t recv_size = 0; recv_size <= max_recv;
2171            recv_size ? recv_size *= 2 : recv_size = 4) {
2172         MakeSpeedTestPacket(packet, send_size, recv_size);
2173 
2174         packet_times.clear();
2175         // Test how long it takes to send 'num_packets' packets
2176         const auto start_time = steady_clock::now();
2177         for (i = 0; i < num_packets; ++i) {
2178           const auto packet_start_time = steady_clock::now();
2179           StringExtractorGDBRemote response;
2180           SendPacketAndWaitForResponse(packet.GetString(), response, false);
2181           const auto packet_end_time = steady_clock::now();
2182           packet_times.push_back(packet_end_time - packet_start_time);
2183         }
2184         const auto end_time = steady_clock::now();
2185         const auto total_time = end_time - start_time;
2186 
2187         float packets_per_second =
2188             ((float)num_packets) / duration<float>(total_time).count();
2189         auto average_per_packet = total_time / num_packets;
2190         const duration<float> standard_deviation =
2191             calculate_standard_deviation(packet_times);
2192         if (json) {
2193           strm.Format("{0}\n     {{\"send_size\" : {1,6}, \"recv_size\" : "
2194                       "{2,6}, \"total_time_nsec\" : {3,12:ns-}, "
2195                       "\"standard_deviation_nsec\" : {4,9:ns-f0}}",
2196                       result_idx > 0 ? "," : "", send_size, recv_size,
2197                       total_time, standard_deviation);
2198           ++result_idx;
2199         } else {
2200           strm.Format("qSpeedTest(send={0,7}, recv={1,7}) in {2:s+f9} for "
2201                       "{3,9:f2} packets/s ({4,10:ms+f6} per packet) with "
2202                       "standard deviation of {5,10:ms+f6}\n",
2203                       send_size, recv_size, duration<float>(total_time),
2204                       packets_per_second, duration<float>(average_per_packet),
2205                       standard_deviation);
2206         }
2207         strm.Flush();
2208       }
2209     }
2210 
2211     const float k_recv_amount_mb = (float)recv_amount / (1024.0f * 1024.0f);
2212     if (json)
2213       strm.Printf("\n    ]\n  },\n  \"download_speed\" : {\n    \"byte_size\" "
2214                   ": %" PRIu64 ",\n    \"results\" : [",
2215                   recv_amount);
2216     else
2217       strm.Printf("Testing receiving %2.1fMB of data using varying receive "
2218                   "packet sizes:\n",
2219                   k_recv_amount_mb);
2220     strm.Flush();
2221     send_size = 0;
2222     result_idx = 0;
2223     for (uint32_t recv_size = 32; recv_size <= max_recv; recv_size *= 2) {
2224       MakeSpeedTestPacket(packet, send_size, recv_size);
2225 
2226       // If we have a receive size, test how long it takes to receive 4MB of
2227       // data
2228       if (recv_size > 0) {
2229         const auto start_time = steady_clock::now();
2230         uint32_t bytes_read = 0;
2231         uint32_t packet_count = 0;
2232         while (bytes_read < recv_amount) {
2233           StringExtractorGDBRemote response;
2234           SendPacketAndWaitForResponse(packet.GetString(), response, false);
2235           bytes_read += recv_size;
2236           ++packet_count;
2237         }
2238         const auto end_time = steady_clock::now();
2239         const auto total_time = end_time - start_time;
2240         float mb_second = ((float)recv_amount) /
2241                           duration<float>(total_time).count() /
2242                           (1024.0 * 1024.0);
2243         float packets_per_second =
2244             ((float)packet_count) / duration<float>(total_time).count();
2245         const auto average_per_packet = total_time / packet_count;
2246 
2247         if (json) {
2248           strm.Format("{0}\n     {{\"send_size\" : {1,6}, \"recv_size\" : "
2249                       "{2,6}, \"total_time_nsec\" : {3,12:ns-}}",
2250                       result_idx > 0 ? "," : "", send_size, recv_size,
2251                       total_time);
2252           ++result_idx;
2253         } else {
2254           strm.Format("qSpeedTest(send={0,7}, recv={1,7}) {2,6} packets needed "
2255                       "to receive {3:f1}MB in {4:s+f9} for {5} MB/sec for "
2256                       "{6,9:f2} packets/sec ({7,10:ms+f6} per packet)\n",
2257                       send_size, recv_size, packet_count, k_recv_amount_mb,
2258                       duration<float>(total_time), mb_second,
2259                       packets_per_second, duration<float>(average_per_packet));
2260         }
2261         strm.Flush();
2262       }
2263     }
2264     if (json)
2265       strm.Printf("\n    ]\n  }\n}\n");
2266     else
2267       strm.EOL();
2268   }
2269 }
2270 
2271 bool GDBRemoteCommunicationClient::SendSpeedTestPacket(uint32_t send_size,
2272                                                        uint32_t recv_size) {
2273   StreamString packet;
2274   packet.Printf("qSpeedTest:response_size:%i;data:", recv_size);
2275   uint32_t bytes_left = send_size;
2276   while (bytes_left > 0) {
2277     if (bytes_left >= 26) {
2278       packet.PutCString("abcdefghijklmnopqrstuvwxyz");
2279       bytes_left -= 26;
2280     } else {
2281       packet.Printf("%*.*s;", bytes_left, bytes_left,
2282                     "abcdefghijklmnopqrstuvwxyz");
2283       bytes_left = 0;
2284     }
2285   }
2286 
2287   StringExtractorGDBRemote response;
2288   return SendPacketAndWaitForResponse(packet.GetString(), response, false) ==
2289          PacketResult::Success;
2290 }
2291 
2292 bool GDBRemoteCommunicationClient::LaunchGDBServer(
2293     const char *remote_accept_hostname, lldb::pid_t &pid, uint16_t &port,
2294     std::string &socket_name) {
2295   pid = LLDB_INVALID_PROCESS_ID;
2296   port = 0;
2297   socket_name.clear();
2298 
2299   StringExtractorGDBRemote response;
2300   StreamString stream;
2301   stream.PutCString("qLaunchGDBServer;");
2302   std::string hostname;
2303   if (remote_accept_hostname && remote_accept_hostname[0])
2304     hostname = remote_accept_hostname;
2305   else {
2306     if (HostInfo::GetHostname(hostname)) {
2307       // Make the GDB server we launch only accept connections from this host
2308       stream.Printf("host:%s;", hostname.c_str());
2309     } else {
2310       // Make the GDB server we launch accept connections from any host since we
2311       // can't figure out the hostname
2312       stream.Printf("host:*;");
2313     }
2314   }
2315   // give the process a few seconds to startup
2316   ScopedTimeout timeout(*this, seconds(10));
2317 
2318   if (SendPacketAndWaitForResponse(stream.GetString(), response, false) ==
2319       PacketResult::Success) {
2320     llvm::StringRef name;
2321     llvm::StringRef value;
2322     while (response.GetNameColonValue(name, value)) {
2323       if (name.equals("port"))
2324         value.getAsInteger(0, port);
2325       else if (name.equals("pid"))
2326         value.getAsInteger(0, pid);
2327       else if (name.compare("socket_name") == 0) {
2328         StringExtractor extractor(value);
2329         extractor.GetHexByteString(socket_name);
2330       }
2331     }
2332     return true;
2333   }
2334   return false;
2335 }
2336 
2337 size_t GDBRemoteCommunicationClient::QueryGDBServer(
2338     std::vector<std::pair<uint16_t, std::string>> &connection_urls) {
2339   connection_urls.clear();
2340 
2341   StringExtractorGDBRemote response;
2342   if (SendPacketAndWaitForResponse("qQueryGDBServer", response, false) !=
2343       PacketResult::Success)
2344     return 0;
2345 
2346   StructuredData::ObjectSP data =
2347       StructuredData::ParseJSON(response.GetStringRef());
2348   if (!data)
2349     return 0;
2350 
2351   StructuredData::Array *array = data->GetAsArray();
2352   if (!array)
2353     return 0;
2354 
2355   for (size_t i = 0, count = array->GetSize(); i < count; ++i) {
2356     StructuredData::Dictionary *element = nullptr;
2357     if (!array->GetItemAtIndexAsDictionary(i, element))
2358       continue;
2359 
2360     uint16_t port = 0;
2361     if (StructuredData::ObjectSP port_osp =
2362             element->GetValueForKey(llvm::StringRef("port")))
2363       port = port_osp->GetIntegerValue(0);
2364 
2365     std::string socket_name;
2366     if (StructuredData::ObjectSP socket_name_osp =
2367             element->GetValueForKey(llvm::StringRef("socket_name")))
2368       socket_name = socket_name_osp->GetStringValue();
2369 
2370     if (port != 0 || !socket_name.empty())
2371       connection_urls.emplace_back(port, socket_name);
2372   }
2373   return connection_urls.size();
2374 }
2375 
2376 bool GDBRemoteCommunicationClient::KillSpawnedProcess(lldb::pid_t pid) {
2377   StreamString stream;
2378   stream.Printf("qKillSpawnedProcess:%" PRId64, pid);
2379 
2380   StringExtractorGDBRemote response;
2381   if (SendPacketAndWaitForResponse(stream.GetString(), response, false) ==
2382       PacketResult::Success) {
2383     if (response.IsOKResponse())
2384       return true;
2385   }
2386   return false;
2387 }
2388 
2389 bool GDBRemoteCommunicationClient::SetCurrentThread(uint64_t tid) {
2390   if (m_curr_tid == tid)
2391     return true;
2392 
2393   char packet[32];
2394   int packet_len;
2395   if (tid == UINT64_MAX)
2396     packet_len = ::snprintf(packet, sizeof(packet), "Hg-1");
2397   else
2398     packet_len = ::snprintf(packet, sizeof(packet), "Hg%" PRIx64, tid);
2399   assert(packet_len + 1 < (int)sizeof(packet));
2400   UNUSED_IF_ASSERT_DISABLED(packet_len);
2401   StringExtractorGDBRemote response;
2402   if (SendPacketAndWaitForResponse(packet, response, false) ==
2403       PacketResult::Success) {
2404     if (response.IsOKResponse()) {
2405       m_curr_tid = tid;
2406       return true;
2407     }
2408 
2409     /*
2410      * Connected bare-iron target (like YAMON gdb-stub) may not have support for
2411      * Hg packet.
2412      * The reply from '?' packet could be as simple as 'S05'. There is no packet
2413      * which can
2414      * give us pid and/or tid. Assume pid=tid=1 in such cases.
2415     */
2416     if (response.IsUnsupportedResponse() && IsConnected()) {
2417       m_curr_tid = 1;
2418       return true;
2419     }
2420   }
2421   return false;
2422 }
2423 
2424 bool GDBRemoteCommunicationClient::SetCurrentThreadForRun(uint64_t tid) {
2425   if (m_curr_tid_run == tid)
2426     return true;
2427 
2428   char packet[32];
2429   int packet_len;
2430   if (tid == UINT64_MAX)
2431     packet_len = ::snprintf(packet, sizeof(packet), "Hc-1");
2432   else
2433     packet_len = ::snprintf(packet, sizeof(packet), "Hc%" PRIx64, tid);
2434 
2435   assert(packet_len + 1 < (int)sizeof(packet));
2436   UNUSED_IF_ASSERT_DISABLED(packet_len);
2437   StringExtractorGDBRemote response;
2438   if (SendPacketAndWaitForResponse(packet, response, false) ==
2439       PacketResult::Success) {
2440     if (response.IsOKResponse()) {
2441       m_curr_tid_run = tid;
2442       return true;
2443     }
2444 
2445     /*
2446      * Connected bare-iron target (like YAMON gdb-stub) may not have support for
2447      * Hc packet.
2448      * The reply from '?' packet could be as simple as 'S05'. There is no packet
2449      * which can
2450      * give us pid and/or tid. Assume pid=tid=1 in such cases.
2451     */
2452     if (response.IsUnsupportedResponse() && IsConnected()) {
2453       m_curr_tid_run = 1;
2454       return true;
2455     }
2456   }
2457   return false;
2458 }
2459 
2460 bool GDBRemoteCommunicationClient::GetStopReply(
2461     StringExtractorGDBRemote &response) {
2462   if (SendPacketAndWaitForResponse("?", response, false) ==
2463       PacketResult::Success)
2464     return response.IsNormalResponse();
2465   return false;
2466 }
2467 
2468 bool GDBRemoteCommunicationClient::GetThreadStopInfo(
2469     lldb::tid_t tid, StringExtractorGDBRemote &response) {
2470   if (m_supports_qThreadStopInfo) {
2471     char packet[256];
2472     int packet_len =
2473         ::snprintf(packet, sizeof(packet), "qThreadStopInfo%" PRIx64, tid);
2474     assert(packet_len < (int)sizeof(packet));
2475     UNUSED_IF_ASSERT_DISABLED(packet_len);
2476     if (SendPacketAndWaitForResponse(packet, response, false) ==
2477         PacketResult::Success) {
2478       if (response.IsUnsupportedResponse())
2479         m_supports_qThreadStopInfo = false;
2480       else if (response.IsNormalResponse())
2481         return true;
2482       else
2483         return false;
2484     } else {
2485       m_supports_qThreadStopInfo = false;
2486     }
2487   }
2488   return false;
2489 }
2490 
2491 uint8_t GDBRemoteCommunicationClient::SendGDBStoppointTypePacket(
2492     GDBStoppointType type, bool insert, addr_t addr, uint32_t length) {
2493   Log *log(GetLogIfAnyCategoriesSet(LIBLLDB_LOG_BREAKPOINTS));
2494   if (log)
2495     log->Printf("GDBRemoteCommunicationClient::%s() %s at addr = 0x%" PRIx64,
2496                 __FUNCTION__, insert ? "add" : "remove", addr);
2497 
2498   // Check if the stub is known not to support this breakpoint type
2499   if (!SupportsGDBStoppointPacket(type))
2500     return UINT8_MAX;
2501   // Construct the breakpoint packet
2502   char packet[64];
2503   const int packet_len =
2504       ::snprintf(packet, sizeof(packet), "%c%i,%" PRIx64 ",%x",
2505                  insert ? 'Z' : 'z', type, addr, length);
2506   // Check we haven't overwritten the end of the packet buffer
2507   assert(packet_len + 1 < (int)sizeof(packet));
2508   UNUSED_IF_ASSERT_DISABLED(packet_len);
2509   StringExtractorGDBRemote response;
2510   // Make sure the response is either "OK", "EXX" where XX are two hex digits,
2511   // or "" (unsupported)
2512   response.SetResponseValidatorToOKErrorNotSupported();
2513   // Try to send the breakpoint packet, and check that it was correctly sent
2514   if (SendPacketAndWaitForResponse(packet, response, true) ==
2515       PacketResult::Success) {
2516     // Receive and OK packet when the breakpoint successfully placed
2517     if (response.IsOKResponse())
2518       return 0;
2519 
2520     // Error while setting breakpoint, send back specific error
2521     if (response.IsErrorResponse())
2522       return response.GetError();
2523 
2524     // Empty packet informs us that breakpoint is not supported
2525     if (response.IsUnsupportedResponse()) {
2526       // Disable this breakpoint type since it is unsupported
2527       switch (type) {
2528       case eBreakpointSoftware:
2529         m_supports_z0 = false;
2530         break;
2531       case eBreakpointHardware:
2532         m_supports_z1 = false;
2533         break;
2534       case eWatchpointWrite:
2535         m_supports_z2 = false;
2536         break;
2537       case eWatchpointRead:
2538         m_supports_z3 = false;
2539         break;
2540       case eWatchpointReadWrite:
2541         m_supports_z4 = false;
2542         break;
2543       case eStoppointInvalid:
2544         return UINT8_MAX;
2545       }
2546     }
2547   }
2548   // Signal generic failure
2549   return UINT8_MAX;
2550 }
2551 
2552 size_t GDBRemoteCommunicationClient::GetCurrentThreadIDs(
2553     std::vector<lldb::tid_t> &thread_ids, bool &sequence_mutex_unavailable) {
2554   thread_ids.clear();
2555 
2556   Lock lock(*this, false);
2557   if (lock) {
2558     sequence_mutex_unavailable = false;
2559     StringExtractorGDBRemote response;
2560 
2561     PacketResult packet_result;
2562     for (packet_result =
2563              SendPacketAndWaitForResponseNoLock("qfThreadInfo", response);
2564          packet_result == PacketResult::Success && response.IsNormalResponse();
2565          packet_result =
2566              SendPacketAndWaitForResponseNoLock("qsThreadInfo", response)) {
2567       char ch = response.GetChar();
2568       if (ch == 'l')
2569         break;
2570       if (ch == 'm') {
2571         do {
2572           tid_t tid = response.GetHexMaxU64(false, LLDB_INVALID_THREAD_ID);
2573 
2574           if (tid != LLDB_INVALID_THREAD_ID) {
2575             thread_ids.push_back(tid);
2576           }
2577           ch = response.GetChar(); // Skip the command separator
2578         } while (ch == ',');       // Make sure we got a comma separator
2579       }
2580     }
2581 
2582     /*
2583      * Connected bare-iron target (like YAMON gdb-stub) may not have support for
2584      * qProcessInfo, qC and qfThreadInfo packets. The reply from '?' packet
2585      * could
2586      * be as simple as 'S05'. There is no packet which can give us pid and/or
2587      * tid.
2588      * Assume pid=tid=1 in such cases.
2589     */
2590     if (response.IsUnsupportedResponse() && thread_ids.size() == 0 &&
2591         IsConnected()) {
2592       thread_ids.push_back(1);
2593     }
2594   } else {
2595 #if !defined(LLDB_CONFIGURATION_DEBUG)
2596     Log *log(ProcessGDBRemoteLog::GetLogIfAnyCategoryIsSet(GDBR_LOG_PROCESS |
2597                                                            GDBR_LOG_PACKETS));
2598     if (log)
2599       log->Printf("error: failed to get packet sequence mutex, not sending "
2600                   "packet 'qfThreadInfo'");
2601 #endif
2602     sequence_mutex_unavailable = true;
2603   }
2604   return thread_ids.size();
2605 }
2606 
2607 lldb::addr_t GDBRemoteCommunicationClient::GetShlibInfoAddr() {
2608   StringExtractorGDBRemote response;
2609   if (SendPacketAndWaitForResponse("qShlibInfoAddr", response, false) !=
2610           PacketResult::Success ||
2611       !response.IsNormalResponse())
2612     return LLDB_INVALID_ADDRESS;
2613   return response.GetHexMaxU64(false, LLDB_INVALID_ADDRESS);
2614 }
2615 
2616 lldb_private::Error GDBRemoteCommunicationClient::RunShellCommand(
2617     const char *command, // Shouldn't be NULL
2618     const FileSpec &
2619         working_dir, // Pass empty FileSpec to use the current working directory
2620     int *status_ptr, // Pass NULL if you don't want the process exit status
2621     int *signo_ptr,  // Pass NULL if you don't want the signal that caused the
2622                      // process to exit
2623     std::string
2624         *command_output, // Pass NULL if you don't want the command output
2625     uint32_t
2626         timeout_sec) // Timeout in seconds to wait for shell program to finish
2627 {
2628   lldb_private::StreamString stream;
2629   stream.PutCString("qPlatform_shell:");
2630   stream.PutBytesAsRawHex8(command, strlen(command));
2631   stream.PutChar(',');
2632   stream.PutHex32(timeout_sec);
2633   if (working_dir) {
2634     std::string path{working_dir.GetPath(false)};
2635     stream.PutChar(',');
2636     stream.PutCStringAsRawHex8(path.c_str());
2637   }
2638   StringExtractorGDBRemote response;
2639   if (SendPacketAndWaitForResponse(stream.GetString(), response, false) ==
2640       PacketResult::Success) {
2641     if (response.GetChar() != 'F')
2642       return Error("malformed reply");
2643     if (response.GetChar() != ',')
2644       return Error("malformed reply");
2645     uint32_t exitcode = response.GetHexMaxU32(false, UINT32_MAX);
2646     if (exitcode == UINT32_MAX)
2647       return Error("unable to run remote process");
2648     else if (status_ptr)
2649       *status_ptr = exitcode;
2650     if (response.GetChar() != ',')
2651       return Error("malformed reply");
2652     uint32_t signo = response.GetHexMaxU32(false, UINT32_MAX);
2653     if (signo_ptr)
2654       *signo_ptr = signo;
2655     if (response.GetChar() != ',')
2656       return Error("malformed reply");
2657     std::string output;
2658     response.GetEscapedBinaryData(output);
2659     if (command_output)
2660       command_output->assign(output);
2661     return Error();
2662   }
2663   return Error("unable to send packet");
2664 }
2665 
2666 Error GDBRemoteCommunicationClient::MakeDirectory(const FileSpec &file_spec,
2667                                                   uint32_t file_permissions) {
2668   std::string path{file_spec.GetPath(false)};
2669   lldb_private::StreamString stream;
2670   stream.PutCString("qPlatform_mkdir:");
2671   stream.PutHex32(file_permissions);
2672   stream.PutChar(',');
2673   stream.PutCStringAsRawHex8(path.c_str());
2674   llvm::StringRef packet = stream.GetString();
2675   StringExtractorGDBRemote response;
2676 
2677   if (SendPacketAndWaitForResponse(packet, response, false) !=
2678       PacketResult::Success)
2679     return Error("failed to send '%s' packet", packet.str().c_str());
2680 
2681   if (response.GetChar() != 'F')
2682     return Error("invalid response to '%s' packet", packet.str().c_str());
2683 
2684   return Error(response.GetU32(UINT32_MAX), eErrorTypePOSIX);
2685 }
2686 
2687 Error GDBRemoteCommunicationClient::SetFilePermissions(
2688     const FileSpec &file_spec, uint32_t file_permissions) {
2689   std::string path{file_spec.GetPath(false)};
2690   lldb_private::StreamString stream;
2691   stream.PutCString("qPlatform_chmod:");
2692   stream.PutHex32(file_permissions);
2693   stream.PutChar(',');
2694   stream.PutCStringAsRawHex8(path.c_str());
2695   llvm::StringRef packet = stream.GetString();
2696   StringExtractorGDBRemote response;
2697 
2698   if (SendPacketAndWaitForResponse(packet, response, false) !=
2699       PacketResult::Success)
2700     return Error("failed to send '%s' packet", stream.GetData());
2701 
2702   if (response.GetChar() != 'F')
2703     return Error("invalid response to '%s' packet", stream.GetData());
2704 
2705   return Error(response.GetU32(UINT32_MAX), eErrorTypePOSIX);
2706 }
2707 
2708 static uint64_t ParseHostIOPacketResponse(StringExtractorGDBRemote &response,
2709                                           uint64_t fail_result, Error &error) {
2710   response.SetFilePos(0);
2711   if (response.GetChar() != 'F')
2712     return fail_result;
2713   int32_t result = response.GetS32(-2);
2714   if (result == -2)
2715     return fail_result;
2716   if (response.GetChar() == ',') {
2717     int result_errno = response.GetS32(-2);
2718     if (result_errno != -2)
2719       error.SetError(result_errno, eErrorTypePOSIX);
2720     else
2721       error.SetError(-1, eErrorTypeGeneric);
2722   } else
2723     error.Clear();
2724   return result;
2725 }
2726 lldb::user_id_t
2727 GDBRemoteCommunicationClient::OpenFile(const lldb_private::FileSpec &file_spec,
2728                                        uint32_t flags, mode_t mode,
2729                                        Error &error) {
2730   std::string path(file_spec.GetPath(false));
2731   lldb_private::StreamString stream;
2732   stream.PutCString("vFile:open:");
2733   if (path.empty())
2734     return UINT64_MAX;
2735   stream.PutCStringAsRawHex8(path.c_str());
2736   stream.PutChar(',');
2737   stream.PutHex32(flags);
2738   stream.PutChar(',');
2739   stream.PutHex32(mode);
2740   StringExtractorGDBRemote response;
2741   if (SendPacketAndWaitForResponse(stream.GetString(), response, false) ==
2742       PacketResult::Success) {
2743     return ParseHostIOPacketResponse(response, UINT64_MAX, error);
2744   }
2745   return UINT64_MAX;
2746 }
2747 
2748 bool GDBRemoteCommunicationClient::CloseFile(lldb::user_id_t fd, Error &error) {
2749   lldb_private::StreamString stream;
2750   stream.Printf("vFile:close:%i", (int)fd);
2751   StringExtractorGDBRemote response;
2752   if (SendPacketAndWaitForResponse(stream.GetString(), response, false) ==
2753       PacketResult::Success) {
2754     return ParseHostIOPacketResponse(response, -1, error) == 0;
2755   }
2756   return false;
2757 }
2758 
2759 // Extension of host I/O packets to get the file size.
2760 lldb::user_id_t GDBRemoteCommunicationClient::GetFileSize(
2761     const lldb_private::FileSpec &file_spec) {
2762   std::string path(file_spec.GetPath(false));
2763   lldb_private::StreamString stream;
2764   stream.PutCString("vFile:size:");
2765   stream.PutCStringAsRawHex8(path.c_str());
2766   StringExtractorGDBRemote response;
2767   if (SendPacketAndWaitForResponse(stream.GetString(), response, false) ==
2768       PacketResult::Success) {
2769     if (response.GetChar() != 'F')
2770       return UINT64_MAX;
2771     uint32_t retcode = response.GetHexMaxU64(false, UINT64_MAX);
2772     return retcode;
2773   }
2774   return UINT64_MAX;
2775 }
2776 
2777 Error GDBRemoteCommunicationClient::GetFilePermissions(
2778     const FileSpec &file_spec, uint32_t &file_permissions) {
2779   std::string path{file_spec.GetPath(false)};
2780   Error error;
2781   lldb_private::StreamString stream;
2782   stream.PutCString("vFile:mode:");
2783   stream.PutCStringAsRawHex8(path.c_str());
2784   StringExtractorGDBRemote response;
2785   if (SendPacketAndWaitForResponse(stream.GetString(), response, false) ==
2786       PacketResult::Success) {
2787     if (response.GetChar() != 'F') {
2788       error.SetErrorStringWithFormat("invalid response to '%s' packet",
2789                                      stream.GetData());
2790     } else {
2791       const uint32_t mode = response.GetS32(-1);
2792       if (static_cast<int32_t>(mode) == -1) {
2793         if (response.GetChar() == ',') {
2794           int response_errno = response.GetS32(-1);
2795           if (response_errno > 0)
2796             error.SetError(response_errno, lldb::eErrorTypePOSIX);
2797           else
2798             error.SetErrorToGenericError();
2799         } else
2800           error.SetErrorToGenericError();
2801       } else {
2802         file_permissions = mode & (S_IRWXU | S_IRWXG | S_IRWXO);
2803       }
2804     }
2805   } else {
2806     error.SetErrorStringWithFormat("failed to send '%s' packet",
2807                                    stream.GetData());
2808   }
2809   return error;
2810 }
2811 
2812 uint64_t GDBRemoteCommunicationClient::ReadFile(lldb::user_id_t fd,
2813                                                 uint64_t offset, void *dst,
2814                                                 uint64_t dst_len,
2815                                                 Error &error) {
2816   lldb_private::StreamString stream;
2817   stream.Printf("vFile:pread:%i,%" PRId64 ",%" PRId64, (int)fd, dst_len,
2818                 offset);
2819   StringExtractorGDBRemote response;
2820   if (SendPacketAndWaitForResponse(stream.GetString(), response, false) ==
2821       PacketResult::Success) {
2822     if (response.GetChar() != 'F')
2823       return 0;
2824     uint32_t retcode = response.GetHexMaxU32(false, UINT32_MAX);
2825     if (retcode == UINT32_MAX)
2826       return retcode;
2827     const char next = (response.Peek() ? *response.Peek() : 0);
2828     if (next == ',')
2829       return 0;
2830     if (next == ';') {
2831       response.GetChar(); // skip the semicolon
2832       std::string buffer;
2833       if (response.GetEscapedBinaryData(buffer)) {
2834         const uint64_t data_to_write =
2835             std::min<uint64_t>(dst_len, buffer.size());
2836         if (data_to_write > 0)
2837           memcpy(dst, &buffer[0], data_to_write);
2838         return data_to_write;
2839       }
2840     }
2841   }
2842   return 0;
2843 }
2844 
2845 uint64_t GDBRemoteCommunicationClient::WriteFile(lldb::user_id_t fd,
2846                                                  uint64_t offset,
2847                                                  const void *src,
2848                                                  uint64_t src_len,
2849                                                  Error &error) {
2850   lldb_private::StreamGDBRemote stream;
2851   stream.Printf("vFile:pwrite:%i,%" PRId64 ",", (int)fd, offset);
2852   stream.PutEscapedBytes(src, src_len);
2853   StringExtractorGDBRemote response;
2854   if (SendPacketAndWaitForResponse(stream.GetString(), response, false) ==
2855       PacketResult::Success) {
2856     if (response.GetChar() != 'F') {
2857       error.SetErrorStringWithFormat("write file failed");
2858       return 0;
2859     }
2860     uint64_t bytes_written = response.GetU64(UINT64_MAX);
2861     if (bytes_written == UINT64_MAX) {
2862       error.SetErrorToGenericError();
2863       if (response.GetChar() == ',') {
2864         int response_errno = response.GetS32(-1);
2865         if (response_errno > 0)
2866           error.SetError(response_errno, lldb::eErrorTypePOSIX);
2867       }
2868       return 0;
2869     }
2870     return bytes_written;
2871   } else {
2872     error.SetErrorString("failed to send vFile:pwrite packet");
2873   }
2874   return 0;
2875 }
2876 
2877 Error GDBRemoteCommunicationClient::CreateSymlink(const FileSpec &src,
2878                                                   const FileSpec &dst) {
2879   std::string src_path{src.GetPath(false)}, dst_path{dst.GetPath(false)};
2880   Error error;
2881   lldb_private::StreamGDBRemote stream;
2882   stream.PutCString("vFile:symlink:");
2883   // the unix symlink() command reverses its parameters where the dst if first,
2884   // so we follow suit here
2885   stream.PutCStringAsRawHex8(dst_path.c_str());
2886   stream.PutChar(',');
2887   stream.PutCStringAsRawHex8(src_path.c_str());
2888   StringExtractorGDBRemote response;
2889   if (SendPacketAndWaitForResponse(stream.GetString(), response, false) ==
2890       PacketResult::Success) {
2891     if (response.GetChar() == 'F') {
2892       uint32_t result = response.GetU32(UINT32_MAX);
2893       if (result != 0) {
2894         error.SetErrorToGenericError();
2895         if (response.GetChar() == ',') {
2896           int response_errno = response.GetS32(-1);
2897           if (response_errno > 0)
2898             error.SetError(response_errno, lldb::eErrorTypePOSIX);
2899         }
2900       }
2901     } else {
2902       // Should have returned with 'F<result>[,<errno>]'
2903       error.SetErrorStringWithFormat("symlink failed");
2904     }
2905   } else {
2906     error.SetErrorString("failed to send vFile:symlink packet");
2907   }
2908   return error;
2909 }
2910 
2911 Error GDBRemoteCommunicationClient::Unlink(const FileSpec &file_spec) {
2912   std::string path{file_spec.GetPath(false)};
2913   Error error;
2914   lldb_private::StreamGDBRemote stream;
2915   stream.PutCString("vFile:unlink:");
2916   // the unix symlink() command reverses its parameters where the dst if first,
2917   // so we follow suit here
2918   stream.PutCStringAsRawHex8(path.c_str());
2919   StringExtractorGDBRemote response;
2920   if (SendPacketAndWaitForResponse(stream.GetString(), response, false) ==
2921       PacketResult::Success) {
2922     if (response.GetChar() == 'F') {
2923       uint32_t result = response.GetU32(UINT32_MAX);
2924       if (result != 0) {
2925         error.SetErrorToGenericError();
2926         if (response.GetChar() == ',') {
2927           int response_errno = response.GetS32(-1);
2928           if (response_errno > 0)
2929             error.SetError(response_errno, lldb::eErrorTypePOSIX);
2930         }
2931       }
2932     } else {
2933       // Should have returned with 'F<result>[,<errno>]'
2934       error.SetErrorStringWithFormat("unlink failed");
2935     }
2936   } else {
2937     error.SetErrorString("failed to send vFile:unlink packet");
2938   }
2939   return error;
2940 }
2941 
2942 // Extension of host I/O packets to get whether a file exists.
2943 bool GDBRemoteCommunicationClient::GetFileExists(
2944     const lldb_private::FileSpec &file_spec) {
2945   std::string path(file_spec.GetPath(false));
2946   lldb_private::StreamString stream;
2947   stream.PutCString("vFile:exists:");
2948   stream.PutCStringAsRawHex8(path.c_str());
2949   StringExtractorGDBRemote response;
2950   if (SendPacketAndWaitForResponse(stream.GetString(), response, false) ==
2951       PacketResult::Success) {
2952     if (response.GetChar() != 'F')
2953       return false;
2954     if (response.GetChar() != ',')
2955       return false;
2956     bool retcode = (response.GetChar() != '0');
2957     return retcode;
2958   }
2959   return false;
2960 }
2961 
2962 bool GDBRemoteCommunicationClient::CalculateMD5(
2963     const lldb_private::FileSpec &file_spec, uint64_t &high, uint64_t &low) {
2964   std::string path(file_spec.GetPath(false));
2965   lldb_private::StreamString stream;
2966   stream.PutCString("vFile:MD5:");
2967   stream.PutCStringAsRawHex8(path.c_str());
2968   StringExtractorGDBRemote response;
2969   if (SendPacketAndWaitForResponse(stream.GetString(), response, false) ==
2970       PacketResult::Success) {
2971     if (response.GetChar() != 'F')
2972       return false;
2973     if (response.GetChar() != ',')
2974       return false;
2975     if (response.Peek() && *response.Peek() == 'x')
2976       return false;
2977     low = response.GetHexMaxU64(false, UINT64_MAX);
2978     high = response.GetHexMaxU64(false, UINT64_MAX);
2979     return true;
2980   }
2981   return false;
2982 }
2983 
2984 bool GDBRemoteCommunicationClient::AvoidGPackets(ProcessGDBRemote *process) {
2985   // Some targets have issues with g/G packets and we need to avoid using them
2986   if (m_avoid_g_packets == eLazyBoolCalculate) {
2987     if (process) {
2988       m_avoid_g_packets = eLazyBoolNo;
2989       const ArchSpec &arch = process->GetTarget().GetArchitecture();
2990       if (arch.IsValid() &&
2991           arch.GetTriple().getVendor() == llvm::Triple::Apple &&
2992           arch.GetTriple().getOS() == llvm::Triple::IOS &&
2993           arch.GetTriple().getArch() == llvm::Triple::aarch64) {
2994         m_avoid_g_packets = eLazyBoolYes;
2995         uint32_t gdb_server_version = GetGDBServerProgramVersion();
2996         if (gdb_server_version != 0) {
2997           const char *gdb_server_name = GetGDBServerProgramName();
2998           if (gdb_server_name && strcmp(gdb_server_name, "debugserver") == 0) {
2999             if (gdb_server_version >= 310)
3000               m_avoid_g_packets = eLazyBoolNo;
3001           }
3002         }
3003       }
3004     }
3005   }
3006   return m_avoid_g_packets == eLazyBoolYes;
3007 }
3008 
3009 DataBufferSP GDBRemoteCommunicationClient::ReadRegister(lldb::tid_t tid,
3010                                                         uint32_t reg) {
3011   StreamString payload;
3012   payload.Printf("p%x", reg);
3013   StringExtractorGDBRemote response;
3014   if (SendThreadSpecificPacketAndWaitForResponse(
3015           tid, std::move(payload), response, false) != PacketResult::Success ||
3016       !response.IsNormalResponse())
3017     return nullptr;
3018 
3019   DataBufferSP buffer_sp(
3020       new DataBufferHeap(response.GetStringRef().size() / 2, 0));
3021   response.GetHexBytes(buffer_sp->GetData(), '\xcc');
3022   return buffer_sp;
3023 }
3024 
3025 DataBufferSP GDBRemoteCommunicationClient::ReadAllRegisters(lldb::tid_t tid) {
3026   StreamString payload;
3027   payload.PutChar('g');
3028   StringExtractorGDBRemote response;
3029   if (SendThreadSpecificPacketAndWaitForResponse(
3030           tid, std::move(payload), response, false) != PacketResult::Success ||
3031       !response.IsNormalResponse())
3032     return nullptr;
3033 
3034   DataBufferSP buffer_sp(
3035       new DataBufferHeap(response.GetStringRef().size() / 2, 0));
3036   response.GetHexBytes(buffer_sp->GetData(), '\xcc');
3037   return buffer_sp;
3038 }
3039 
3040 bool GDBRemoteCommunicationClient::WriteRegister(lldb::tid_t tid,
3041                                                  uint32_t reg_num,
3042                                                  llvm::ArrayRef<uint8_t> data) {
3043   StreamString payload;
3044   payload.Printf("P%x=", reg_num);
3045   payload.PutBytesAsRawHex8(data.data(), data.size(),
3046                             endian::InlHostByteOrder(),
3047                             endian::InlHostByteOrder());
3048   StringExtractorGDBRemote response;
3049   return SendThreadSpecificPacketAndWaitForResponse(tid, std::move(payload),
3050                                                     response, false) ==
3051              PacketResult::Success &&
3052          response.IsOKResponse();
3053 }
3054 
3055 bool GDBRemoteCommunicationClient::WriteAllRegisters(
3056     lldb::tid_t tid, llvm::ArrayRef<uint8_t> data) {
3057   StreamString payload;
3058   payload.PutChar('G');
3059   payload.PutBytesAsRawHex8(data.data(), data.size(),
3060                             endian::InlHostByteOrder(),
3061                             endian::InlHostByteOrder());
3062   StringExtractorGDBRemote response;
3063   return SendThreadSpecificPacketAndWaitForResponse(tid, std::move(payload),
3064                                                     response, false) ==
3065              PacketResult::Success &&
3066          response.IsOKResponse();
3067 }
3068 
3069 bool GDBRemoteCommunicationClient::SaveRegisterState(lldb::tid_t tid,
3070                                                      uint32_t &save_id) {
3071   save_id = 0; // Set to invalid save ID
3072   if (m_supports_QSaveRegisterState == eLazyBoolNo)
3073     return false;
3074 
3075   m_supports_QSaveRegisterState = eLazyBoolYes;
3076   StreamString payload;
3077   payload.PutCString("QSaveRegisterState");
3078   StringExtractorGDBRemote response;
3079   if (SendThreadSpecificPacketAndWaitForResponse(
3080           tid, std::move(payload), response, false) != PacketResult::Success)
3081     return false;
3082 
3083   if (response.IsUnsupportedResponse())
3084     m_supports_QSaveRegisterState = eLazyBoolNo;
3085 
3086   const uint32_t response_save_id = response.GetU32(0);
3087   if (response_save_id == 0)
3088     return false;
3089 
3090   save_id = response_save_id;
3091   return true;
3092 }
3093 
3094 bool GDBRemoteCommunicationClient::RestoreRegisterState(lldb::tid_t tid,
3095                                                         uint32_t save_id) {
3096   // We use the "m_supports_QSaveRegisterState" variable here because the
3097   // QSaveRegisterState and QRestoreRegisterState packets must both be supported
3098   // in
3099   // order to be useful
3100   if (m_supports_QSaveRegisterState == eLazyBoolNo)
3101     return false;
3102 
3103   StreamString payload;
3104   payload.Printf("QRestoreRegisterState:%u", save_id);
3105   StringExtractorGDBRemote response;
3106   if (SendThreadSpecificPacketAndWaitForResponse(
3107           tid, std::move(payload), response, false) != PacketResult::Success)
3108     return false;
3109 
3110   if (response.IsOKResponse())
3111     return true;
3112 
3113   if (response.IsUnsupportedResponse())
3114     m_supports_QSaveRegisterState = eLazyBoolNo;
3115   return false;
3116 }
3117 
3118 bool GDBRemoteCommunicationClient::SyncThreadState(lldb::tid_t tid) {
3119   if (!GetSyncThreadStateSupported())
3120     return false;
3121 
3122   StreamString packet;
3123   StringExtractorGDBRemote response;
3124   packet.Printf("QSyncThreadState:%4.4" PRIx64 ";", tid);
3125   return SendPacketAndWaitForResponse(packet.GetString(), response, false) ==
3126              GDBRemoteCommunication::PacketResult::Success &&
3127          response.IsOKResponse();
3128 }
3129 
3130 bool GDBRemoteCommunicationClient::GetModuleInfo(
3131     const FileSpec &module_file_spec, const lldb_private::ArchSpec &arch_spec,
3132     ModuleSpec &module_spec) {
3133   if (!m_supports_qModuleInfo)
3134     return false;
3135 
3136   std::string module_path = module_file_spec.GetPath(false);
3137   if (module_path.empty())
3138     return false;
3139 
3140   StreamString packet;
3141   packet.PutCString("qModuleInfo:");
3142   packet.PutCStringAsRawHex8(module_path.c_str());
3143   packet.PutCString(";");
3144   const auto &triple = arch_spec.GetTriple().getTriple();
3145   packet.PutCStringAsRawHex8(triple.c_str());
3146 
3147   StringExtractorGDBRemote response;
3148   if (SendPacketAndWaitForResponse(packet.GetString(), response, false) !=
3149       PacketResult::Success)
3150     return false;
3151 
3152   if (response.IsErrorResponse())
3153     return false;
3154 
3155   if (response.IsUnsupportedResponse()) {
3156     m_supports_qModuleInfo = false;
3157     return false;
3158   }
3159 
3160   llvm::StringRef name;
3161   llvm::StringRef value;
3162 
3163   module_spec.Clear();
3164   module_spec.GetFileSpec() = module_file_spec;
3165 
3166   while (response.GetNameColonValue(name, value)) {
3167     if (name == "uuid" || name == "md5") {
3168       StringExtractor extractor(value);
3169       std::string uuid;
3170       extractor.GetHexByteString(uuid);
3171       module_spec.GetUUID().SetFromCString(uuid.c_str(), uuid.size() / 2);
3172     } else if (name == "triple") {
3173       StringExtractor extractor(value);
3174       std::string triple;
3175       extractor.GetHexByteString(triple);
3176       module_spec.GetArchitecture().SetTriple(triple.c_str());
3177     } else if (name == "file_offset") {
3178       uint64_t ival = 0;
3179       if (!value.getAsInteger(16, ival))
3180         module_spec.SetObjectOffset(ival);
3181     } else if (name == "file_size") {
3182       uint64_t ival = 0;
3183       if (!value.getAsInteger(16, ival))
3184         module_spec.SetObjectSize(ival);
3185     } else if (name == "file_path") {
3186       StringExtractor extractor(value);
3187       std::string path;
3188       extractor.GetHexByteString(path);
3189       module_spec.GetFileSpec() = FileSpec(path, false, arch_spec);
3190     }
3191   }
3192 
3193   return true;
3194 }
3195 
3196 static llvm::Optional<ModuleSpec>
3197 ParseModuleSpec(StructuredData::Dictionary *dict) {
3198   ModuleSpec result;
3199   if (!dict)
3200     return llvm::None;
3201 
3202   std::string string;
3203   uint64_t integer;
3204 
3205   if (!dict->GetValueForKeyAsString("uuid", string))
3206     return llvm::None;
3207   result.GetUUID().SetFromCString(string.c_str(), string.size());
3208 
3209   if (!dict->GetValueForKeyAsInteger("file_offset", integer))
3210     return llvm::None;
3211   result.SetObjectOffset(integer);
3212 
3213   if (!dict->GetValueForKeyAsInteger("file_size", integer))
3214     return llvm::None;
3215   result.SetObjectSize(integer);
3216 
3217   if (!dict->GetValueForKeyAsString("triple", string))
3218     return llvm::None;
3219   result.GetArchitecture().SetTriple(string.c_str());
3220 
3221   if (!dict->GetValueForKeyAsString("file_path", string))
3222     return llvm::None;
3223   result.GetFileSpec() = FileSpec(string, false, result.GetArchitecture());
3224 
3225   return result;
3226 }
3227 
3228 llvm::Optional<std::vector<ModuleSpec>>
3229 GDBRemoteCommunicationClient::GetModulesInfo(
3230     llvm::ArrayRef<FileSpec> module_file_specs, const llvm::Triple &triple) {
3231   if (!m_supports_jModulesInfo)
3232     return llvm::None;
3233 
3234   JSONArray::SP module_array_sp = std::make_shared<JSONArray>();
3235   for (const FileSpec &module_file_spec : module_file_specs) {
3236     JSONObject::SP module_sp = std::make_shared<JSONObject>();
3237     module_array_sp->AppendObject(module_sp);
3238     module_sp->SetObject(
3239         "file", std::make_shared<JSONString>(module_file_spec.GetPath(false)));
3240     module_sp->SetObject("triple",
3241                          std::make_shared<JSONString>(triple.getTriple()));
3242   }
3243   StreamString unescaped_payload;
3244   unescaped_payload.PutCString("jModulesInfo:");
3245   module_array_sp->Write(unescaped_payload);
3246   StreamGDBRemote payload;
3247   payload.PutEscapedBytes(unescaped_payload.GetString().data(),
3248                           unescaped_payload.GetSize());
3249 
3250   StringExtractorGDBRemote response;
3251   if (SendPacketAndWaitForResponse(payload.GetString(), response, false) !=
3252           PacketResult::Success ||
3253       response.IsErrorResponse())
3254     return llvm::None;
3255 
3256   if (response.IsUnsupportedResponse()) {
3257     m_supports_jModulesInfo = false;
3258     return llvm::None;
3259   }
3260 
3261   StructuredData::ObjectSP response_object_sp =
3262       StructuredData::ParseJSON(response.GetStringRef());
3263   if (!response_object_sp)
3264     return llvm::None;
3265 
3266   StructuredData::Array *response_array = response_object_sp->GetAsArray();
3267   if (!response_array)
3268     return llvm::None;
3269 
3270   std::vector<ModuleSpec> result;
3271   for (size_t i = 0; i < response_array->GetSize(); ++i) {
3272     if (llvm::Optional<ModuleSpec> module_spec = ParseModuleSpec(
3273             response_array->GetItemAtIndex(i)->GetAsDictionary()))
3274       result.push_back(*module_spec);
3275   }
3276 
3277   return result;
3278 }
3279 
3280 // query the target remote for extended information using the qXfer packet
3281 //
3282 // example: object='features', annex='target.xml', out=<xml output>
3283 // return:  'true'  on success
3284 //          'false' on failure (err set)
3285 bool GDBRemoteCommunicationClient::ReadExtFeature(
3286     const lldb_private::ConstString object,
3287     const lldb_private::ConstString annex, std::string &out,
3288     lldb_private::Error &err) {
3289 
3290   std::stringstream output;
3291   StringExtractorGDBRemote chunk;
3292 
3293   uint64_t size = GetRemoteMaxPacketSize();
3294   if (size == 0)
3295     size = 0x1000;
3296   size = size - 1; // Leave space for the 'm' or 'l' character in the response
3297   int offset = 0;
3298   bool active = true;
3299 
3300   // loop until all data has been read
3301   while (active) {
3302 
3303     // send query extended feature packet
3304     std::stringstream packet;
3305     packet << "qXfer:" << object.AsCString("")
3306            << ":read:" << annex.AsCString("") << ":" << std::hex << offset
3307            << "," << std::hex << size;
3308 
3309     GDBRemoteCommunication::PacketResult res =
3310         SendPacketAndWaitForResponse(packet.str(), chunk, false);
3311 
3312     if (res != GDBRemoteCommunication::PacketResult::Success) {
3313       err.SetErrorString("Error sending $qXfer packet");
3314       return false;
3315     }
3316 
3317     const std::string &str = chunk.GetStringRef();
3318     if (str.length() == 0) {
3319       // should have some data in chunk
3320       err.SetErrorString("Empty response from $qXfer packet");
3321       return false;
3322     }
3323 
3324     // check packet code
3325     switch (str[0]) {
3326     // last chunk
3327     case ('l'):
3328       active = false;
3329       LLVM_FALLTHROUGH;
3330 
3331     // more chunks
3332     case ('m'):
3333       if (str.length() > 1)
3334         output << &str[1];
3335       offset += size;
3336       break;
3337 
3338     // unknown chunk
3339     default:
3340       err.SetErrorString("Invalid continuation code from $qXfer packet");
3341       return false;
3342     }
3343   }
3344 
3345   out = output.str();
3346   err.Success();
3347   return true;
3348 }
3349 
3350 // Notify the target that gdb is prepared to serve symbol lookup requests.
3351 //  packet: "qSymbol::"
3352 //  reply:
3353 //  OK                  The target does not need to look up any (more) symbols.
3354 //  qSymbol:<sym_name>  The target requests the value of symbol sym_name (hex
3355 //  encoded).
3356 //                      LLDB may provide the value by sending another qSymbol
3357 //                      packet
3358 //                      in the form of"qSymbol:<sym_value>:<sym_name>".
3359 //
3360 //  Three examples:
3361 //
3362 //  lldb sends:    qSymbol::
3363 //  lldb receives: OK
3364 //     Remote gdb stub does not need to know the addresses of any symbols, lldb
3365 //     does not
3366 //     need to ask again in this session.
3367 //
3368 //  lldb sends:    qSymbol::
3369 //  lldb receives: qSymbol:64697370617463685f71756575655f6f666673657473
3370 //  lldb sends:    qSymbol::64697370617463685f71756575655f6f666673657473
3371 //  lldb receives: OK
3372 //     Remote gdb stub asks for address of 'dispatch_queue_offsets'.  lldb does
3373 //     not know
3374 //     the address at this time.  lldb needs to send qSymbol:: again when it has
3375 //     more
3376 //     solibs loaded.
3377 //
3378 //  lldb sends:    qSymbol::
3379 //  lldb receives: qSymbol:64697370617463685f71756575655f6f666673657473
3380 //  lldb sends:    qSymbol:2bc97554:64697370617463685f71756575655f6f666673657473
3381 //  lldb receives: OK
3382 //     Remote gdb stub asks for address of 'dispatch_queue_offsets'.  lldb says
3383 //     that it
3384 //     is at address 0x2bc97554.  Remote gdb stub sends 'OK' indicating that it
3385 //     does not
3386 //     need any more symbols.  lldb does not need to ask again in this session.
3387 
3388 void GDBRemoteCommunicationClient::ServeSymbolLookups(
3389     lldb_private::Process *process) {
3390   // Set to true once we've resolved a symbol to an address for the remote stub.
3391   // If we get an 'OK' response after this, the remote stub doesn't need any
3392   // more
3393   // symbols and we can stop asking.
3394   bool symbol_response_provided = false;
3395 
3396   // Is this the initial qSymbol:: packet?
3397   bool first_qsymbol_query = true;
3398 
3399   if (m_supports_qSymbol && m_qSymbol_requests_done == false) {
3400     Lock lock(*this, false);
3401     if (lock) {
3402       StreamString packet;
3403       packet.PutCString("qSymbol::");
3404       StringExtractorGDBRemote response;
3405       while (SendPacketAndWaitForResponseNoLock(packet.GetString(), response) ==
3406              PacketResult::Success) {
3407         if (response.IsOKResponse()) {
3408           if (symbol_response_provided || first_qsymbol_query) {
3409             m_qSymbol_requests_done = true;
3410           }
3411 
3412           // We are done serving symbols requests
3413           return;
3414         }
3415         first_qsymbol_query = false;
3416 
3417         if (response.IsUnsupportedResponse()) {
3418           // qSymbol is not supported by the current GDB server we are connected
3419           // to
3420           m_supports_qSymbol = false;
3421           return;
3422         } else {
3423           llvm::StringRef response_str(response.GetStringRef());
3424           if (response_str.startswith("qSymbol:")) {
3425             response.SetFilePos(strlen("qSymbol:"));
3426             std::string symbol_name;
3427             if (response.GetHexByteString(symbol_name)) {
3428               if (symbol_name.empty())
3429                 return;
3430 
3431               addr_t symbol_load_addr = LLDB_INVALID_ADDRESS;
3432               lldb_private::SymbolContextList sc_list;
3433               if (process->GetTarget().GetImages().FindSymbolsWithNameAndType(
3434                       ConstString(symbol_name), eSymbolTypeAny, sc_list)) {
3435                 const size_t num_scs = sc_list.GetSize();
3436                 for (size_t sc_idx = 0;
3437                      sc_idx < num_scs &&
3438                      symbol_load_addr == LLDB_INVALID_ADDRESS;
3439                      ++sc_idx) {
3440                   SymbolContext sc;
3441                   if (sc_list.GetContextAtIndex(sc_idx, sc)) {
3442                     if (sc.symbol) {
3443                       switch (sc.symbol->GetType()) {
3444                       case eSymbolTypeInvalid:
3445                       case eSymbolTypeAbsolute:
3446                       case eSymbolTypeUndefined:
3447                       case eSymbolTypeSourceFile:
3448                       case eSymbolTypeHeaderFile:
3449                       case eSymbolTypeObjectFile:
3450                       case eSymbolTypeCommonBlock:
3451                       case eSymbolTypeBlock:
3452                       case eSymbolTypeLocal:
3453                       case eSymbolTypeParam:
3454                       case eSymbolTypeVariable:
3455                       case eSymbolTypeVariableType:
3456                       case eSymbolTypeLineEntry:
3457                       case eSymbolTypeLineHeader:
3458                       case eSymbolTypeScopeBegin:
3459                       case eSymbolTypeScopeEnd:
3460                       case eSymbolTypeAdditional:
3461                       case eSymbolTypeCompiler:
3462                       case eSymbolTypeInstrumentation:
3463                       case eSymbolTypeTrampoline:
3464                         break;
3465 
3466                       case eSymbolTypeCode:
3467                       case eSymbolTypeResolver:
3468                       case eSymbolTypeData:
3469                       case eSymbolTypeRuntime:
3470                       case eSymbolTypeException:
3471                       case eSymbolTypeObjCClass:
3472                       case eSymbolTypeObjCMetaClass:
3473                       case eSymbolTypeObjCIVar:
3474                       case eSymbolTypeReExported:
3475                         symbol_load_addr =
3476                             sc.symbol->GetLoadAddress(&process->GetTarget());
3477                         break;
3478                       }
3479                     }
3480                   }
3481                 }
3482               }
3483               // This is the normal path where our symbol lookup was successful
3484               // and we want
3485               // to send a packet with the new symbol value and see if another
3486               // lookup needs to be
3487               // done.
3488 
3489               // Change "packet" to contain the requested symbol value and name
3490               packet.Clear();
3491               packet.PutCString("qSymbol:");
3492               if (symbol_load_addr != LLDB_INVALID_ADDRESS) {
3493                 packet.Printf("%" PRIx64, symbol_load_addr);
3494                 symbol_response_provided = true;
3495               } else {
3496                 symbol_response_provided = false;
3497               }
3498               packet.PutCString(":");
3499               packet.PutBytesAsRawHex8(symbol_name.data(), symbol_name.size());
3500               continue; // go back to the while loop and send "packet" and wait
3501                         // for another response
3502             }
3503           }
3504         }
3505       }
3506       // If we make it here, the symbol request packet response wasn't valid or
3507       // our symbol lookup failed so we must abort
3508       return;
3509 
3510     } else if (Log *log = ProcessGDBRemoteLog::GetLogIfAnyCategoryIsSet(
3511                    GDBR_LOG_PROCESS | GDBR_LOG_PACKETS)) {
3512       log->Printf(
3513           "GDBRemoteCommunicationClient::%s: Didn't get sequence mutex.",
3514           __FUNCTION__);
3515     }
3516   }
3517 }
3518 
3519 StructuredData::Array *
3520 GDBRemoteCommunicationClient::GetSupportedStructuredDataPlugins() {
3521   if (!m_supported_async_json_packets_is_valid) {
3522     // Query the server for the array of supported asynchronous JSON
3523     // packets.
3524     m_supported_async_json_packets_is_valid = true;
3525 
3526     Log *log(ProcessGDBRemoteLog::GetLogIfAllCategoriesSet(GDBR_LOG_PROCESS));
3527 
3528     // Poll it now.
3529     StringExtractorGDBRemote response;
3530     const bool send_async = false;
3531     if (SendPacketAndWaitForResponse("qStructuredDataPlugins", response,
3532                                      send_async) == PacketResult::Success) {
3533       m_supported_async_json_packets_sp =
3534           StructuredData::ParseJSON(response.GetStringRef());
3535       if (m_supported_async_json_packets_sp &&
3536           !m_supported_async_json_packets_sp->GetAsArray()) {
3537         // We were returned something other than a JSON array.  This
3538         // is invalid.  Clear it out.
3539         if (log)
3540           log->Printf("GDBRemoteCommunicationClient::%s(): "
3541                       "QSupportedAsyncJSONPackets returned invalid "
3542                       "result: %s",
3543                       __FUNCTION__, response.GetStringRef().c_str());
3544         m_supported_async_json_packets_sp.reset();
3545       }
3546     } else {
3547       if (log)
3548         log->Printf("GDBRemoteCommunicationClient::%s(): "
3549                     "QSupportedAsyncJSONPackets unsupported",
3550                     __FUNCTION__);
3551     }
3552 
3553     if (log && m_supported_async_json_packets_sp) {
3554       StreamString stream;
3555       m_supported_async_json_packets_sp->Dump(stream);
3556       log->Printf("GDBRemoteCommunicationClient::%s(): supported async "
3557                   "JSON packets: %s",
3558                   __FUNCTION__, stream.GetData());
3559     }
3560   }
3561 
3562   return m_supported_async_json_packets_sp
3563              ? m_supported_async_json_packets_sp->GetAsArray()
3564              : nullptr;
3565 }
3566 
3567 Error GDBRemoteCommunicationClient::ConfigureRemoteStructuredData(
3568     const ConstString &type_name, const StructuredData::ObjectSP &config_sp) {
3569   Error error;
3570 
3571   if (type_name.GetLength() == 0) {
3572     error.SetErrorString("invalid type_name argument");
3573     return error;
3574   }
3575 
3576   // Build command: Configure{type_name}: serialized config
3577   // data.
3578   StreamGDBRemote stream;
3579   stream.PutCString("QConfigure");
3580   stream.PutCString(type_name.AsCString());
3581   stream.PutChar(':');
3582   if (config_sp) {
3583     // Gather the plain-text version of the configuration data.
3584     StreamString unescaped_stream;
3585     config_sp->Dump(unescaped_stream);
3586     unescaped_stream.Flush();
3587 
3588     // Add it to the stream in escaped fashion.
3589     stream.PutEscapedBytes(unescaped_stream.GetString().data(),
3590                            unescaped_stream.GetSize());
3591   }
3592   stream.Flush();
3593 
3594   // Send the packet.
3595   const bool send_async = false;
3596   StringExtractorGDBRemote response;
3597   auto result =
3598       SendPacketAndWaitForResponse(stream.GetString(), response, send_async);
3599   if (result == PacketResult::Success) {
3600     // We failed if the config result comes back other than OK.
3601     if (strcmp(response.GetStringRef().c_str(), "OK") == 0) {
3602       // Okay!
3603       error.Clear();
3604     } else {
3605       error.SetErrorStringWithFormat("configuring StructuredData feature "
3606                                      "%s failed with error %s",
3607                                      type_name.AsCString(),
3608                                      response.GetStringRef().c_str());
3609     }
3610   } else {
3611     // Can we get more data here on the failure?
3612     error.SetErrorStringWithFormat("configuring StructuredData feature %s "
3613                                    "failed when sending packet: "
3614                                    "PacketResult=%d",
3615                                    type_name.AsCString(), (int)result);
3616   }
3617   return error;
3618 }
3619 
3620 void GDBRemoteCommunicationClient::OnRunPacketSent(bool first) {
3621   GDBRemoteClientBase::OnRunPacketSent(first);
3622   m_curr_tid = LLDB_INVALID_THREAD_ID;
3623 }
3624