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