xref: /llvm-project/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationHistory.cpp (revision f2d32ddcec82c20582c6aa32558b82ca7c3d3c50)
180814287SRaphael Isemann //===-- GDBRemoteCommunicationHistory.cpp ---------------------------------===//
29e046f02SJonas Devlieghere //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
69e046f02SJonas Devlieghere //
79e046f02SJonas Devlieghere //===----------------------------------------------------------------------===//
89e046f02SJonas Devlieghere 
99e046f02SJonas Devlieghere #include "GDBRemoteCommunicationHistory.h"
109e046f02SJonas Devlieghere 
119e046f02SJonas Devlieghere // Other libraries and framework includes
129e046f02SJonas Devlieghere #include "lldb/Utility/ConstString.h"
139e046f02SJonas Devlieghere #include "lldb/Utility/Log.h"
149e046f02SJonas Devlieghere 
159e046f02SJonas Devlieghere using namespace llvm;
169e046f02SJonas Devlieghere using namespace lldb;
179e046f02SJonas Devlieghere using namespace lldb_private;
189e046f02SJonas Devlieghere using namespace lldb_private::process_gdb_remote;
199e046f02SJonas Devlieghere 
GDBRemoteCommunicationHistory(uint32_t size)209e046f02SJonas Devlieghere GDBRemoteCommunicationHistory::GDBRemoteCommunicationHistory(uint32_t size)
219494c510SJonas Devlieghere     : m_packets() {
229e046f02SJonas Devlieghere   if (size)
239e046f02SJonas Devlieghere     m_packets.resize(size);
249e046f02SJonas Devlieghere }
259e046f02SJonas Devlieghere 
26*fd2433e1SJonas Devlieghere GDBRemoteCommunicationHistory::~GDBRemoteCommunicationHistory() = default;
279e046f02SJonas Devlieghere 
AddPacket(char packet_char,GDBRemotePacket::Type type,uint32_t bytes_transmitted)28ff5225bfSJonas Devlieghere void GDBRemoteCommunicationHistory::AddPacket(char packet_char,
29ff5225bfSJonas Devlieghere                                               GDBRemotePacket::Type type,
309e046f02SJonas Devlieghere                                               uint32_t bytes_transmitted) {
319e046f02SJonas Devlieghere   const size_t size = m_packets.size();
329e046f02SJonas Devlieghere   if (size == 0)
339e046f02SJonas Devlieghere     return;
349e046f02SJonas Devlieghere 
359e046f02SJonas Devlieghere   const uint32_t idx = GetNextIndex();
369e046f02SJonas Devlieghere   m_packets[idx].packet.data.assign(1, packet_char);
379e046f02SJonas Devlieghere   m_packets[idx].type = type;
389e046f02SJonas Devlieghere   m_packets[idx].bytes_transmitted = bytes_transmitted;
399e046f02SJonas Devlieghere   m_packets[idx].packet_idx = m_total_packet_count;
409e046f02SJonas Devlieghere   m_packets[idx].tid = llvm::get_threadid();
419e046f02SJonas Devlieghere }
429e046f02SJonas Devlieghere 
AddPacket(const std::string & src,uint32_t src_len,GDBRemotePacket::Type type,uint32_t bytes_transmitted)439e046f02SJonas Devlieghere void GDBRemoteCommunicationHistory::AddPacket(const std::string &src,
44ff5225bfSJonas Devlieghere                                               uint32_t src_len,
45ff5225bfSJonas Devlieghere                                               GDBRemotePacket::Type type,
469e046f02SJonas Devlieghere                                               uint32_t bytes_transmitted) {
479e046f02SJonas Devlieghere   const size_t size = m_packets.size();
489e046f02SJonas Devlieghere   if (size == 0)
499e046f02SJonas Devlieghere     return;
509e046f02SJonas Devlieghere 
519e046f02SJonas Devlieghere   const uint32_t idx = GetNextIndex();
529e046f02SJonas Devlieghere   m_packets[idx].packet.data.assign(src, 0, src_len);
539e046f02SJonas Devlieghere   m_packets[idx].type = type;
549e046f02SJonas Devlieghere   m_packets[idx].bytes_transmitted = bytes_transmitted;
559e046f02SJonas Devlieghere   m_packets[idx].packet_idx = m_total_packet_count;
569e046f02SJonas Devlieghere   m_packets[idx].tid = llvm::get_threadid();
579e046f02SJonas Devlieghere }
589e046f02SJonas Devlieghere 
Dump(Stream & strm) const599e046f02SJonas Devlieghere void GDBRemoteCommunicationHistory::Dump(Stream &strm) const {
609e046f02SJonas Devlieghere   const uint32_t size = GetNumPacketsInHistory();
619e046f02SJonas Devlieghere   const uint32_t first_idx = GetFirstSavedPacketIndex();
629e046f02SJonas Devlieghere   const uint32_t stop_idx = m_curr_idx + size;
639e046f02SJonas Devlieghere   for (uint32_t i = first_idx; i < stop_idx; ++i) {
649e046f02SJonas Devlieghere     const uint32_t idx = NormalizeIndex(i);
65ff5225bfSJonas Devlieghere     const GDBRemotePacket &entry = m_packets[idx];
66ff5225bfSJonas Devlieghere     if (entry.type == GDBRemotePacket::ePacketTypeInvalid ||
67ff5225bfSJonas Devlieghere         entry.packet.data.empty())
689e046f02SJonas Devlieghere       break;
694e053ff1SJonas Devlieghere     strm.Printf("history[%u] ", entry.packet_idx);
704e053ff1SJonas Devlieghere     entry.Dump(strm);
719e046f02SJonas Devlieghere   }
729e046f02SJonas Devlieghere }
739e046f02SJonas Devlieghere 
Dump(Log * log) const749e046f02SJonas Devlieghere void GDBRemoteCommunicationHistory::Dump(Log *log) const {
759e046f02SJonas Devlieghere   if (!log || m_dumped_to_log)
769e046f02SJonas Devlieghere     return;
779e046f02SJonas Devlieghere 
789e046f02SJonas Devlieghere   m_dumped_to_log = true;
799e046f02SJonas Devlieghere   const uint32_t size = GetNumPacketsInHistory();
809e046f02SJonas Devlieghere   const uint32_t first_idx = GetFirstSavedPacketIndex();
819e046f02SJonas Devlieghere   const uint32_t stop_idx = m_curr_idx + size;
829e046f02SJonas Devlieghere   for (uint32_t i = first_idx; i < stop_idx; ++i) {
839e046f02SJonas Devlieghere     const uint32_t idx = NormalizeIndex(i);
84ff5225bfSJonas Devlieghere     const GDBRemotePacket &entry = m_packets[idx];
85ff5225bfSJonas Devlieghere     if (entry.type == GDBRemotePacket::ePacketTypeInvalid ||
86ff5225bfSJonas Devlieghere         entry.packet.data.empty())
879e046f02SJonas Devlieghere       break;
8863e5fb76SJonas Devlieghere     LLDB_LOGF(log, "history[%u] tid=0x%4.4" PRIx64 " <%4u> %s packet: %s",
899e046f02SJonas Devlieghere               entry.packet_idx, entry.tid, entry.bytes_transmitted,
90ff5225bfSJonas Devlieghere               (entry.type == GDBRemotePacket::ePacketTypeSend) ? "send"
91ff5225bfSJonas Devlieghere                                                                : "read",
929e046f02SJonas Devlieghere               entry.packet.data.c_str());
939e046f02SJonas Devlieghere   }
949e046f02SJonas Devlieghere }
959e046f02SJonas Devlieghere 
96