xref: /openbsd-src/gnu/llvm/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationHistory.cpp (revision f6aab3d83b51b91c24247ad2c2573574de475a82)
1dda28197Spatrick //===-- GDBRemoteCommunicationHistory.cpp ---------------------------------===//
2061da546Spatrick //
3061da546Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4061da546Spatrick // See https://llvm.org/LICENSE.txt for license information.
5061da546Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6061da546Spatrick //
7061da546Spatrick //===----------------------------------------------------------------------===//
8061da546Spatrick 
9061da546Spatrick #include "GDBRemoteCommunicationHistory.h"
10061da546Spatrick 
11061da546Spatrick // Other libraries and framework includes
12061da546Spatrick #include "lldb/Core/StreamFile.h"
13061da546Spatrick #include "lldb/Utility/ConstString.h"
14061da546Spatrick #include "lldb/Utility/Log.h"
15061da546Spatrick 
16061da546Spatrick using namespace llvm;
17061da546Spatrick using namespace lldb;
18061da546Spatrick using namespace lldb_private;
19061da546Spatrick using namespace lldb_private::process_gdb_remote;
20061da546Spatrick 
GDBRemoteCommunicationHistory(uint32_t size)21061da546Spatrick GDBRemoteCommunicationHistory::GDBRemoteCommunicationHistory(uint32_t size)
22*be691f3bSpatrick     : m_packets() {
23061da546Spatrick   if (size)
24061da546Spatrick     m_packets.resize(size);
25061da546Spatrick }
26061da546Spatrick 
27*be691f3bSpatrick GDBRemoteCommunicationHistory::~GDBRemoteCommunicationHistory() = default;
28061da546Spatrick 
AddPacket(char packet_char,GDBRemotePacket::Type type,uint32_t bytes_transmitted)29061da546Spatrick void GDBRemoteCommunicationHistory::AddPacket(char packet_char,
30061da546Spatrick                                               GDBRemotePacket::Type type,
31061da546Spatrick                                               uint32_t bytes_transmitted) {
32061da546Spatrick   const size_t size = m_packets.size();
33061da546Spatrick   if (size == 0)
34061da546Spatrick     return;
35061da546Spatrick 
36061da546Spatrick   const uint32_t idx = GetNextIndex();
37061da546Spatrick   m_packets[idx].packet.data.assign(1, packet_char);
38061da546Spatrick   m_packets[idx].type = type;
39061da546Spatrick   m_packets[idx].bytes_transmitted = bytes_transmitted;
40061da546Spatrick   m_packets[idx].packet_idx = m_total_packet_count;
41061da546Spatrick   m_packets[idx].tid = llvm::get_threadid();
42061da546Spatrick }
43061da546Spatrick 
AddPacket(const std::string & src,uint32_t src_len,GDBRemotePacket::Type type,uint32_t bytes_transmitted)44061da546Spatrick void GDBRemoteCommunicationHistory::AddPacket(const std::string &src,
45061da546Spatrick                                               uint32_t src_len,
46061da546Spatrick                                               GDBRemotePacket::Type type,
47061da546Spatrick                                               uint32_t bytes_transmitted) {
48061da546Spatrick   const size_t size = m_packets.size();
49061da546Spatrick   if (size == 0)
50061da546Spatrick     return;
51061da546Spatrick 
52061da546Spatrick   const uint32_t idx = GetNextIndex();
53061da546Spatrick   m_packets[idx].packet.data.assign(src, 0, src_len);
54061da546Spatrick   m_packets[idx].type = type;
55061da546Spatrick   m_packets[idx].bytes_transmitted = bytes_transmitted;
56061da546Spatrick   m_packets[idx].packet_idx = m_total_packet_count;
57061da546Spatrick   m_packets[idx].tid = llvm::get_threadid();
58061da546Spatrick }
59061da546Spatrick 
Dump(Stream & strm) const60061da546Spatrick void GDBRemoteCommunicationHistory::Dump(Stream &strm) const {
61061da546Spatrick   const uint32_t size = GetNumPacketsInHistory();
62061da546Spatrick   const uint32_t first_idx = GetFirstSavedPacketIndex();
63061da546Spatrick   const uint32_t stop_idx = m_curr_idx + size;
64061da546Spatrick   for (uint32_t i = first_idx; i < stop_idx; ++i) {
65061da546Spatrick     const uint32_t idx = NormalizeIndex(i);
66061da546Spatrick     const GDBRemotePacket &entry = m_packets[idx];
67061da546Spatrick     if (entry.type == GDBRemotePacket::ePacketTypeInvalid ||
68061da546Spatrick         entry.packet.data.empty())
69061da546Spatrick       break;
70061da546Spatrick     strm.Printf("history[%u] ", entry.packet_idx);
71061da546Spatrick     entry.Dump(strm);
72061da546Spatrick   }
73061da546Spatrick }
74061da546Spatrick 
Dump(Log * log) const75061da546Spatrick void GDBRemoteCommunicationHistory::Dump(Log *log) const {
76061da546Spatrick   if (!log || m_dumped_to_log)
77061da546Spatrick     return;
78061da546Spatrick 
79061da546Spatrick   m_dumped_to_log = true;
80061da546Spatrick   const uint32_t size = GetNumPacketsInHistory();
81061da546Spatrick   const uint32_t first_idx = GetFirstSavedPacketIndex();
82061da546Spatrick   const uint32_t stop_idx = m_curr_idx + size;
83061da546Spatrick   for (uint32_t i = first_idx; i < stop_idx; ++i) {
84061da546Spatrick     const uint32_t idx = NormalizeIndex(i);
85061da546Spatrick     const GDBRemotePacket &entry = m_packets[idx];
86061da546Spatrick     if (entry.type == GDBRemotePacket::ePacketTypeInvalid ||
87061da546Spatrick         entry.packet.data.empty())
88061da546Spatrick       break;
89061da546Spatrick     LLDB_LOGF(log, "history[%u] tid=0x%4.4" PRIx64 " <%4u> %s packet: %s",
90061da546Spatrick               entry.packet_idx, entry.tid, entry.bytes_transmitted,
91061da546Spatrick               (entry.type == GDBRemotePacket::ePacketTypeSend) ? "send"
92061da546Spatrick                                                                : "read",
93061da546Spatrick               entry.packet.data.c_str());
94061da546Spatrick   }
95061da546Spatrick }
96061da546Spatrick 
97