]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm-project/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationHistory.h
Merge llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp
[FreeBSD/FreeBSD.git] / contrib / llvm-project / lldb / source / Plugins / Process / gdb-remote / GDBRemoteCommunicationHistory.h
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 liblldb_GDBRemoteCommunicationHistory_h_
10 #define liblldb_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;
46   bool DidDumpToLog() const { return m_dumped_to_log; }
47
48   void SetRecorder(repro::PacketRecorder *recorder) { m_recorder = recorder; }
49
50 private:
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
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
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
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 // liblldb_GDBRemoteCommunicationHistory_h_