xref: /freebsd-src/contrib/llvm-project/lldb/source/Utility/GDBRemote.cpp (revision bdd1243df58e60e85101c09001d9812a789b6bc4)
19dba64beSDimitry Andric //===-- GDBRemote.cpp -----------------------------------------------------===//
29dba64beSDimitry Andric //
39dba64beSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
49dba64beSDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
59dba64beSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
69dba64beSDimitry Andric //
79dba64beSDimitry Andric //===----------------------------------------------------------------------===//
89dba64beSDimitry Andric 
99dba64beSDimitry Andric #include "lldb/Utility/GDBRemote.h"
109dba64beSDimitry Andric 
119dba64beSDimitry Andric #include "lldb/Utility/Flags.h"
129dba64beSDimitry Andric #include "lldb/Utility/Stream.h"
139dba64beSDimitry Andric 
14*fe6060f1SDimitry Andric #include <cstdio>
159dba64beSDimitry Andric 
169dba64beSDimitry Andric using namespace lldb;
179dba64beSDimitry Andric using namespace lldb_private;
189dba64beSDimitry Andric using namespace llvm;
199dba64beSDimitry Andric 
StreamGDBRemote()209dba64beSDimitry Andric StreamGDBRemote::StreamGDBRemote() : StreamString() {}
219dba64beSDimitry Andric 
StreamGDBRemote(uint32_t flags,uint32_t addr_size,ByteOrder byte_order)229dba64beSDimitry Andric StreamGDBRemote::StreamGDBRemote(uint32_t flags, uint32_t addr_size,
239dba64beSDimitry Andric                                  ByteOrder byte_order)
249dba64beSDimitry Andric     : StreamString(flags, addr_size, byte_order) {}
259dba64beSDimitry Andric 
26*fe6060f1SDimitry Andric StreamGDBRemote::~StreamGDBRemote() = default;
279dba64beSDimitry Andric 
PutEscapedBytes(const void * s,size_t src_len)289dba64beSDimitry Andric int StreamGDBRemote::PutEscapedBytes(const void *s, size_t src_len) {
299dba64beSDimitry Andric   int bytes_written = 0;
309dba64beSDimitry Andric   const uint8_t *src = static_cast<const uint8_t *>(s);
319dba64beSDimitry Andric   bool binary_is_set = m_flags.Test(eBinary);
329dba64beSDimitry Andric   m_flags.Clear(eBinary);
339dba64beSDimitry Andric   while (src_len) {
349dba64beSDimitry Andric     uint8_t byte = *src;
359dba64beSDimitry Andric     src++;
369dba64beSDimitry Andric     src_len--;
379dba64beSDimitry Andric     if (byte == 0x23 || byte == 0x24 || byte == 0x7d || byte == 0x2a) {
389dba64beSDimitry Andric       bytes_written += PutChar(0x7d);
399dba64beSDimitry Andric       byte ^= 0x20;
409dba64beSDimitry Andric     }
419dba64beSDimitry Andric     bytes_written += PutChar(byte);
429dba64beSDimitry Andric   };
439dba64beSDimitry Andric   if (binary_is_set)
449dba64beSDimitry Andric     m_flags.Set(eBinary);
459dba64beSDimitry Andric   return bytes_written;
469dba64beSDimitry Andric }
479dba64beSDimitry Andric 
GetTypeStr() const489dba64beSDimitry Andric llvm::StringRef GDBRemotePacket::GetTypeStr() const {
499dba64beSDimitry Andric   switch (type) {
509dba64beSDimitry Andric   case GDBRemotePacket::ePacketTypeSend:
519dba64beSDimitry Andric     return "send";
529dba64beSDimitry Andric   case GDBRemotePacket::ePacketTypeRecv:
539dba64beSDimitry Andric     return "read";
549dba64beSDimitry Andric   case GDBRemotePacket::ePacketTypeInvalid:
559dba64beSDimitry Andric     return "invalid";
569dba64beSDimitry Andric   }
579dba64beSDimitry Andric   llvm_unreachable("All enum cases should be handled");
589dba64beSDimitry Andric }
599dba64beSDimitry Andric 
Dump(Stream & strm) const609dba64beSDimitry Andric void GDBRemotePacket::Dump(Stream &strm) const {
619dba64beSDimitry Andric   strm.Printf("tid=0x%4.4" PRIx64 " <%4u> %s packet: %s\n", tid,
629dba64beSDimitry Andric               bytes_transmitted, GetTypeStr().data(), packet.data.c_str());
639dba64beSDimitry Andric }
64