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 | |