1 //===-- TraceGDBRemotePackets.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_UTILITY_TRACEGDBREMOTEPACKETS_H
10 #define LLDB_UTILITY_TRACEGDBREMOTEPACKETS_H
11 
12 #include "llvm/Support/JSON.h"
13 
14 #include <chrono>
15 
16 #include "lldb/lldb-defines.h"
17 #include "lldb/lldb-enumerations.h"
18 
19 /// See docs/lldb-gdb-remote.txt for more information.
20 namespace lldb_private {
21 
22 /// jLLDBTraceSupported gdb-remote packet
23 /// \{
24 struct TraceSupportedResponse {
25   /// The name of the technology, e.g. intel-pt or arm-coresight.
26   ///
27   /// In order for a Trace plug-in (see \a lldb_private::Trace.h) to support the
28   /// trace technology given by this struct, it should match its name with this
29   /// field.
30   std::string name;
31   /// The description for the technology.
32   std::string description;
33 };
34 
35 bool fromJSON(const llvm::json::Value &value, TraceSupportedResponse &info,
36               llvm::json::Path path);
37 
38 llvm::json::Value toJSON(const TraceSupportedResponse &packet);
39 /// \}
40 
41 /// jLLDBTraceStart gdb-remote packet
42 /// \{
43 struct TraceStartRequest {
44   /// Tracing technology name, e.g. intel-pt, arm-coresight.
45   std::string type;
46 
47   /// If \a std::nullopt, then this starts tracing the whole process. Otherwise,
48   /// only tracing for the specified threads is enabled.
49   std::optional<std::vector<lldb::tid_t>> tids;
50 
51   /// \return
52   ///     \b true if \a tids is \a std::nullopt, i.e. whole process tracing.
53   bool IsProcessTracing() const;
54 };
55 
56 bool fromJSON(const llvm::json::Value &value, TraceStartRequest &packet,
57               llvm::json::Path path);
58 
59 llvm::json::Value toJSON(const TraceStartRequest &packet);
60 /// \}
61 
62 /// jLLDBTraceStop gdb-remote packet
63 /// \{
64 struct TraceStopRequest {
65   TraceStopRequest() = default;
66 
67   TraceStopRequest(llvm::StringRef type, const std::vector<lldb::tid_t> &tids);
68 
69   TraceStopRequest(llvm::StringRef type) : type(type){};
70 
71   bool IsProcessTracing() const;
72 
73   /// Tracing technology name, e.g. intel-pt, arm-coresight.
74   std::string type;
75   /// If \a std::nullopt, then this stops tracing the whole process. Otherwise,
76   /// only tracing for the specified threads is stopped.
77   std::optional<std::vector<lldb::tid_t>> tids;
78 };
79 
80 bool fromJSON(const llvm::json::Value &value, TraceStopRequest &packet,
81               llvm::json::Path path);
82 
83 llvm::json::Value toJSON(const TraceStopRequest &packet);
84 ///}
85 
86 /// jLLDBTraceGetState gdb-remote packet
87 /// \{
88 struct TraceGetStateRequest {
89   /// Tracing technology name, e.g. intel-pt, arm-coresight.
90   std::string type;
91 };
92 
93 bool fromJSON(const llvm::json::Value &value, TraceGetStateRequest &packet,
94               llvm::json::Path path);
95 
96 llvm::json::Value toJSON(const TraceGetStateRequest &packet);
97 
98 struct TraceBinaryData {
99   /// Identifier of data to fetch with jLLDBTraceGetBinaryData.
100   std::string kind;
101   /// Size in bytes for this data.
102   uint64_t size;
103 };
104 
105 bool fromJSON(const llvm::json::Value &value, TraceBinaryData &packet,
106               llvm::json::Path path);
107 
108 llvm::json::Value toJSON(const TraceBinaryData &packet);
109 
110 struct TraceThreadState {
111   lldb::tid_t tid;
112   /// List of binary data objects for this thread.
113   std::vector<TraceBinaryData> binary_data;
114 };
115 
116 bool fromJSON(const llvm::json::Value &value, TraceThreadState &packet,
117               llvm::json::Path path);
118 
119 llvm::json::Value toJSON(const TraceThreadState &packet);
120 
121 struct TraceCpuState {
122   lldb::cpu_id_t id;
123   /// List of binary data objects for this core.
124   std::vector<TraceBinaryData> binary_data;
125 };
126 
127 bool fromJSON(const llvm::json::Value &value, TraceCpuState &packet,
128               llvm::json::Path path);
129 
130 llvm::json::Value toJSON(const TraceCpuState &packet);
131 
132 struct TraceGetStateResponse {
133   std::vector<TraceThreadState> traced_threads;
134   std::vector<TraceBinaryData> process_binary_data;
135   std::optional<std::vector<TraceCpuState>> cpus;
136   std::optional<std::vector<std::string>> warnings;
137 
138   void AddWarning(llvm::StringRef warning);
139 };
140 
141 bool fromJSON(const llvm::json::Value &value, TraceGetStateResponse &packet,
142               llvm::json::Path path);
143 
144 llvm::json::Value toJSON(const TraceGetStateResponse &packet);
145 /// \}
146 
147 /// jLLDBTraceGetBinaryData gdb-remote packet
148 /// \{
149 struct TraceGetBinaryDataRequest {
150   /// Tracing technology name, e.g. intel-pt, arm-coresight.
151   std::string type;
152   /// Identifier for the data.
153   std::string kind;
154   /// Optional tid if the data is related to a thread.
155   std::optional<lldb::tid_t> tid;
156   /// Optional core id if the data is related to a cpu core.
157   std::optional<lldb::cpu_id_t> cpu_id;
158 };
159 
160 bool fromJSON(const llvm::json::Value &value,
161               lldb_private::TraceGetBinaryDataRequest &packet,
162               llvm::json::Path path);
163 
164 llvm::json::Value toJSON(const lldb_private::TraceGetBinaryDataRequest &packet);
165 /// \}
166 
167 } // namespace lldb_private
168 
169 #endif // LLDB_UTILITY_TRACEGDBREMOTEPACKETS_H
170