1 //===-- GDBRemoteCommunicationHistory.h--------------------------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #ifndef LLDB_SOURCE_PLUGINS_PROCESS_GDB_REMOTE_GDBREMOTECOMMUNICATIONHISTORY_H 10 #define LLDB_SOURCE_PLUGINS_PROCESS_GDB_REMOTE_GDBREMOTECOMMUNICATIONHISTORY_H 11 12 #include <string> 13 #include <vector> 14 15 #include "lldb/Utility/GDBRemote.h" 16 #include "lldb/Utility/Reproducer.h" 17 #include "lldb/lldb-public.h" 18 #include "llvm/Support/YAMLTraits.h" 19 #include "llvm/Support/raw_ostream.h" 20 21 namespace lldb_private { 22 namespace repro { 23 class PacketRecorder; 24 } 25 namespace process_gdb_remote { 26 27 /// The history keeps a circular buffer of GDB remote packets. The history is 28 /// used for logging and replaying GDB remote packets. 29 class GDBRemoteCommunicationHistory { 30 public: 31 friend llvm::yaml::MappingTraits<GDBRemoteCommunicationHistory>; 32 33 GDBRemoteCommunicationHistory(uint32_t size = 0); 34 35 ~GDBRemoteCommunicationHistory(); 36 37 // For single char packets for ack, nack and /x03 38 void AddPacket(char packet_char, GDBRemotePacket::Type type, 39 uint32_t bytes_transmitted); 40 41 void AddPacket(const std::string &src, uint32_t src_len, 42 GDBRemotePacket::Type type, uint32_t bytes_transmitted); 43 44 void Dump(Stream &strm) const; 45 void Dump(Log *log) const; DidDumpToLog()46 bool DidDumpToLog() const { return m_dumped_to_log; } 47 SetRecorder(repro::PacketRecorder * recorder)48 void SetRecorder(repro::PacketRecorder *recorder) { m_recorder = recorder; } 49 50 private: GetFirstSavedPacketIndex()51 uint32_t GetFirstSavedPacketIndex() const { 52 if (m_total_packet_count < m_packets.size()) 53 return 0; 54 else 55 return m_curr_idx + 1; 56 } 57 GetNumPacketsInHistory()58 uint32_t GetNumPacketsInHistory() const { 59 if (m_total_packet_count < m_packets.size()) 60 return m_total_packet_count; 61 else 62 return (uint32_t)m_packets.size(); 63 } 64 GetNextIndex()65 uint32_t GetNextIndex() { 66 ++m_total_packet_count; 67 const uint32_t idx = m_curr_idx; 68 m_curr_idx = NormalizeIndex(idx + 1); 69 return idx; 70 } 71 NormalizeIndex(uint32_t i)72 uint32_t NormalizeIndex(uint32_t i) const { 73 return m_packets.empty() ? 0 : i % m_packets.size(); 74 } 75 76 std::vector<GDBRemotePacket> m_packets; 77 uint32_t m_curr_idx; 78 uint32_t m_total_packet_count; 79 mutable bool m_dumped_to_log; 80 repro::PacketRecorder *m_recorder = nullptr; 81 }; 82 83 } // namespace process_gdb_remote 84 } // namespace lldb_private 85 86 #endif // LLDB_SOURCE_PLUGINS_PROCESS_GDB_REMOTE_GDBREMOTECOMMUNICATIONHISTORY_H 87