https://github.com/qcoelh0 created https://github.com/llvm/llvm-project/pull/203175
Replace the raw ptr/size and std::vector interface with llvm::ArrayRef, which bundles the pointer and length, makes iteration safer, and accepts many containers without copying. A small overload is retained for backward compatibility. Also fix the stale llvm::arrayRefFromStringRef doc comment, which described the inverse conversion. NFC to GDB-remote packet output. >From 318149ecc1477a1bf80b8592e46a2020cd76a327 Mon Sep 17 00:00:00 2001 From: Quentin Coelho <[email protected]> Date: Wed, 10 Jun 2026 20:53:51 -0700 Subject: [PATCH] [lldb] Update StreamGDBRemote to support llvm::ArrayRef Replace the raw ptr/size and std::vector interface with llvm::ArrayRef, which bundles the pointer and length, make iteration safer, and accepts any contiguous byte container without copying. A small overload is retained for backward compatibility. Also fix the stale llvm::arrayRefFromStringRef doc comment, which described the inverse conversion. NFC to GDB-remote packet output. --- lldb/include/lldb/Utility/GDBRemote.h | 26 ++++++++++--------- .../GDBRemoteCommunicationServerLLGS.cpp | 3 ++- .../Process/gdb-remote/ProcessGDBRemote.cpp | 3 ++- lldb/source/Utility/GDBRemote.cpp | 12 ++------- llvm/include/llvm/ADT/StringExtras.h | 2 +- 5 files changed, 21 insertions(+), 25 deletions(-) diff --git a/lldb/include/lldb/Utility/GDBRemote.h b/lldb/include/lldb/Utility/GDBRemote.h index e8d4f1220f56c..8027ee37e8831 100644 --- a/lldb/include/lldb/Utility/GDBRemote.h +++ b/lldb/include/lldb/Utility/GDBRemote.h @@ -13,6 +13,7 @@ #include "lldb/Utility/StreamString.h" #include "lldb/lldb-enumerations.h" #include "lldb/lldb-public.h" +#include "llvm/ADT/StringExtras.h" #include "llvm/Support/JSON.h" #include "llvm/Support/raw_ostream.h" @@ -33,19 +34,20 @@ class StreamGDBRemote : public StreamString { /// Output a block of data to the stream performing GDB-remote escaping. /// - /// \param[in] s + /// \param[in] bytes /// A block of data. /// - /// \param[in] src_len - /// The amount of data to write. - /// /// \return /// Number of bytes written. - // TODO: Convert this function to take ArrayRef<uint8_t> - int PutEscapedBytes(const void *s, size_t src_len); - - /// Equivalent to PutEscapedBytes(str.data(), str.size()); - int PutEscapedBytes(llvm::StringRef str); + int PutEscapedBytes(llvm::ArrayRef<uint8_t> bytes); + + /// \overload + /// This overload is provided for backward compatibility with the existing + /// code. The newer interface is to use the ArrayRef<uint8_t> overload. + int PutEscapedBytes(const void *src, size_t len) { + return PutEscapedBytes( + llvm::ArrayRef<uint8_t>(static_cast<const uint8_t *>(src), len)); + } template <class T> int PutAsJSON(const T &obj, bool hex_ascii) { std::string json_string; @@ -53,11 +55,11 @@ class StreamGDBRemote : public StreamString { os << llvm::json::Value(toJSON(obj)); if (hex_ascii) return PutStringAsRawHex8(json_string); - return PutEscapedBytes(json_string.c_str(), json_string.size()); + return PutEscapedBytes(llvm::arrayRefFromStringRef(json_string)); } template <class T> - int PutAsJSONArray(const std::vector<T> &array, bool hex_ascii) { + int PutAsJSONArray(llvm::ArrayRef<T> array, bool hex_ascii) { llvm::json::Array json_array; for (const auto &obj : array) json_array.push_back(toJSON(obj)); @@ -66,7 +68,7 @@ class StreamGDBRemote : public StreamString { os << llvm::json::Value(std::move(json_array)); if (hex_ascii) return PutStringAsRawHex8(json_string); - return PutEscapedBytes(json_string.data(), json_string.size()); + return PutEscapedBytes(llvm::arrayRefFromStringRef(json_string)); } }; diff --git a/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp b/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp index 0f14231cadbd5..5dc1639f303fc 100644 --- a/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp +++ b/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp @@ -4592,7 +4592,8 @@ GDBRemoteCommunicationServerLLGS::Handle_jAcceleratorPluginInitialize( accelerator_actions.push_back(std::move(*actions)); } StreamGDBRemote response; - response.PutAsJSONArray(accelerator_actions, /*hex_ascii=*/false); + response.PutAsJSONArray<AcceleratorActions>(accelerator_actions, + /*hex_ascii=*/false); return SendPacketNoLock(response.GetString()); } diff --git a/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp b/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp index 2fc6dbb546f79..496002239e95b 100644 --- a/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp +++ b/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp @@ -6784,7 +6784,8 @@ llvm::Error ProcessGDBRemote::UpdateBreakpointSites( packet_dict.Dump(stream, false); StreamGDBRemote escaped_stream; - escaped_stream.PutEscapedBytes(stream.GetString()); + escaped_stream.PutEscapedBytes( + llvm::arrayRefFromStringRef(stream.GetString())); llvm::Expected<StringExtractorGDBRemote> response = m_gdb_comm.SendPacketAndExpectResponse(escaped_stream.GetString(), GetInterruptTimeout()); diff --git a/lldb/source/Utility/GDBRemote.cpp b/lldb/source/Utility/GDBRemote.cpp index bd322a5e9e540..7d0bfaa61f872 100644 --- a/lldb/source/Utility/GDBRemote.cpp +++ b/lldb/source/Utility/GDBRemote.cpp @@ -24,19 +24,11 @@ StreamGDBRemote::StreamGDBRemote(uint32_t flags, ByteOrder byte_order) StreamGDBRemote::~StreamGDBRemote() = default; -int StreamGDBRemote::PutEscapedBytes(llvm::StringRef str) { - return PutEscapedBytes(str.data(), str.size()); -} - -int StreamGDBRemote::PutEscapedBytes(const void *s, size_t src_len) { +int StreamGDBRemote::PutEscapedBytes(llvm::ArrayRef<uint8_t> bytes) { int bytes_written = 0; - const uint8_t *src = static_cast<const uint8_t *>(s); bool binary_is_set = m_flags.Test(eBinary); m_flags.Clear(eBinary); - while (src_len) { - uint8_t byte = *src; - src++; - src_len--; + for (uint8_t byte : bytes) { if (byte == 0x23 || byte == 0x24 || byte == 0x7d || byte == 0x2a) { bytes_written += PutChar(0x7d); byte ^= 0x20; diff --git a/llvm/include/llvm/ADT/StringExtras.h b/llvm/include/llvm/ADT/StringExtras.h index 017859d3d8c3c..9ce22df32c54d 100644 --- a/llvm/include/llvm/ADT/StringExtras.h +++ b/llvm/include/llvm/ADT/StringExtras.h @@ -63,7 +63,7 @@ inline StringRef toStringRef(ArrayRef<char> Input) { return StringRef(Input.begin(), Input.size()); } -/// Construct a string ref from an array ref of unsigned chars. +/// Construct an array ref of unsigned bytes from a string ref. template <class CharT = uint8_t> inline ArrayRef<CharT> arrayRefFromStringRef(StringRef Input) { static_assert(std::is_same<CharT, char>::value || _______________________________________________ lldb-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
