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/Core/StreamFile.h"
139e046f02SJonas Devlieghere #include "lldb/Utility/ConstString.h"
149e046f02SJonas Devlieghere #include "lldb/Utility/Log.h"
159e046f02SJonas Devlieghere 
169e046f02SJonas Devlieghere using namespace llvm;
179e046f02SJonas Devlieghere using namespace lldb;
189e046f02SJonas Devlieghere using namespace lldb_private;
199e046f02SJonas Devlieghere using namespace lldb_private::process_gdb_remote;
209e046f02SJonas Devlieghere 
GDBRemoteCommunicationHistory(uint32_t size)219e046f02SJonas Devlieghere GDBRemoteCommunicationHistory::GDBRemoteCommunicationHistory(uint32_t size)
229494c510SJonas Devlieghere     : m_packets() {
239e046f02SJonas Devlieghere   if (size)
249e046f02SJonas Devlieghere     m_packets.resize(size);
259e046f02SJonas Devlieghere }
269e046f02SJonas Devlieghere 
27*fd2433e1SJonas Devlieghere GDBRemoteCommunicationHistory::~GDBRemoteCommunicationHistory() = default;
289e046f02SJonas Devlieghere 
AddPacket(char packet_char,GDBRemotePacket::Type type,uint32_t bytes_transmitted)29ff5225bfSJonas Devlieghere void GDBRemoteCommunicationHistory::AddPacket(char packet_char,
30ff5225bfSJonas Devlieghere                                               GDBRemotePacket::Type type,
319e046f02SJonas Devlieghere                                               uint32_t bytes_transmitted) {
329e046f02SJonas Devlieghere   const size_t size = m_packets.size();
339e046f02SJonas Devlieghere   if (size == 0)
349e046f02SJonas Devlieghere     return;
359e046f02SJonas Devlieghere 
369e046f02SJonas Devlieghere   const uint32_t idx = GetNextIndex();
379e046f02SJonas Devlieghere   m_packets[idx].packet.data.assign(1, packet_char);
389e046f02SJonas Devlieghere   m_packets[idx].type = type;
399e046f02SJonas Devlieghere   m_packets[idx].bytes_transmitted = bytes_transmitted;
409e046f02SJonas Devlieghere   m_packets[idx].packet_idx = m_total_packet_count;
419e046f02SJonas Devlieghere   m_packets[idx].tid = llvm::get_threadid();
421d41d1bcSEric Christopher   if (m_recorder)
431d41d1bcSEric Christopher     m_recorder->Record(m_packets[idx]);
449e046f02SJonas Devlieghere }
459e046f02SJonas Devlieghere 
AddPacket(const std::string & src,uint32_t src_len,GDBRemotePacket::Type type,uint32_t bytes_transmitted)469e046f02SJonas Devlieghere void GDBRemoteCommunicationHistory::AddPacket(const std::string &src,
47ff5225bfSJonas Devlieghere                                               uint32_t src_len,
48ff5225bfSJonas Devlieghere                                               GDBRemotePacket::Type type,
499e046f02SJonas Devlieghere                                               uint32_t bytes_transmitted) {
509e046f02SJonas Devlieghere   const size_t size = m_packets.size();
519e046f02SJonas Devlieghere   if (size == 0)
529e046f02SJonas Devlieghere     return;
539e046f02SJonas Devlieghere 
549e046f02SJonas Devlieghere   const uint32_t idx = GetNextIndex();
559e046f02SJonas Devlieghere   m_packets[idx].packet.data.assign(src, 0, src_len);
569e046f02SJonas Devlieghere   m_packets[idx].type = type;
579e046f02SJonas Devlieghere   m_packets[idx].bytes_transmitted = bytes_transmitted;
589e046f02SJonas Devlieghere   m_packets[idx].packet_idx = m_total_packet_count;
599e046f02SJonas Devlieghere   m_packets[idx].tid = llvm::get_threadid();
601d41d1bcSEric Christopher   if (m_recorder)
611d41d1bcSEric Christopher     m_recorder->Record(m_packets[idx]);
629e046f02SJonas Devlieghere }
639e046f02SJonas Devlieghere 
Dump(Stream & strm) const649e046f02SJonas Devlieghere void GDBRemoteCommunicationHistory::Dump(Stream &strm) const {
659e046f02SJonas Devlieghere   const uint32_t size = GetNumPacketsInHistory();
669e046f02SJonas Devlieghere   const uint32_t first_idx = GetFirstSavedPacketIndex();
679e046f02SJonas Devlieghere   const uint32_t stop_idx = m_curr_idx + size;
689e046f02SJonas Devlieghere   for (uint32_t i = first_idx; i < stop_idx; ++i) {
699e046f02SJonas Devlieghere     const uint32_t idx = NormalizeIndex(i);
70ff5225bfSJonas Devlieghere     const GDBRemotePacket &entry = m_packets[idx];
71ff5225bfSJonas Devlieghere     if (entry.type == GDBRemotePacket::ePacketTypeInvalid ||
72ff5225bfSJonas Devlieghere         entry.packet.data.empty())
739e046f02SJonas Devlieghere       break;
744e053ff1SJonas Devlieghere     strm.Printf("history[%u] ", entry.packet_idx);
754e053ff1SJonas Devlieghere     entry.Dump(strm);
769e046f02SJonas Devlieghere   }
779e046f02SJonas Devlieghere }
789e046f02SJonas Devlieghere 
Dump(Log * log) const799e046f02SJonas Devlieghere void GDBRemoteCommunicationHistory::Dump(Log *log) const {
809e046f02SJonas Devlieghere   if (!log || m_dumped_to_log)
819e046f02SJonas Devlieghere     return;
829e046f02SJonas Devlieghere 
839e046f02SJonas Devlieghere   m_dumped_to_log = true;
849e046f02SJonas Devlieghere   const uint32_t size = GetNumPacketsInHistory();
859e046f02SJonas Devlieghere   const uint32_t first_idx = GetFirstSavedPacketIndex();
869e046f02SJonas Devlieghere   const uint32_t stop_idx = m_curr_idx + size;
879e046f02SJonas Devlieghere   for (uint32_t i = first_idx; i < stop_idx; ++i) {
889e046f02SJonas Devlieghere     const uint32_t idx = NormalizeIndex(i);
89ff5225bfSJonas Devlieghere     const GDBRemotePacket &entry = m_packets[idx];
90ff5225bfSJonas Devlieghere     if (entry.type == GDBRemotePacket::ePacketTypeInvalid ||
91ff5225bfSJonas Devlieghere         entry.packet.data.empty())
929e046f02SJonas Devlieghere       break;
9363e5fb76SJonas Devlieghere     LLDB_LOGF(log, "history[%u] tid=0x%4.4" PRIx64 " <%4u> %s packet: %s",
949e046f02SJonas Devlieghere               entry.packet_idx, entry.tid, entry.bytes_transmitted,
95ff5225bfSJonas Devlieghere               (entry.type == GDBRemotePacket::ePacketTypeSend) ? "send"
96ff5225bfSJonas Devlieghere                                                                : "read",
979e046f02SJonas Devlieghere               entry.packet.data.c_str());
989e046f02SJonas Devlieghere   }
999e046f02SJonas Devlieghere }
1009e046f02SJonas Devlieghere 
101