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. 20namespace lldb_private { 21 22/// jLLDBTraceSupported gdb-remote packet 23/// \{ 24struct 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 35bool fromJSON(const llvm::json::Value &value, TraceSupportedResponse &info, 36 llvm::json::Path path); 37 38llvm::json::Value toJSON(const TraceSupportedResponse &packet); 39/// \} 40 41/// jLLDBTraceStart gdb-remote packet 42/// \{ 43struct 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 56bool fromJSON(const llvm::json::Value &value, TraceStartRequest &packet, 57 llvm::json::Path path); 58 59llvm::json::Value toJSON(const TraceStartRequest &packet); 60/// \} 61 62/// jLLDBTraceStop gdb-remote packet 63/// \{ 64struct 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 80bool fromJSON(const llvm::json::Value &value, TraceStopRequest &packet, 81 llvm::json::Path path); 82 83llvm::json::Value toJSON(const TraceStopRequest &packet); 84///} 85 86/// jLLDBTraceGetState gdb-remote packet 87/// \{ 88struct TraceGetStateRequest { 89 /// Tracing technology name, e.g. intel-pt, arm-coresight. 90 std::string type; 91}; 92 93bool fromJSON(const llvm::json::Value &value, TraceGetStateRequest &packet, 94 llvm::json::Path path); 95 96llvm::json::Value toJSON(const TraceGetStateRequest &packet); 97 98struct 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 105bool fromJSON(const llvm::json::Value &value, TraceBinaryData &packet, 106 llvm::json::Path path); 107 108llvm::json::Value toJSON(const TraceBinaryData &packet); 109 110struct TraceThreadState { 111 lldb::tid_t tid; 112 /// List of binary data objects for this thread. 113 std::vector<TraceBinaryData> binary_data; 114}; 115 116bool fromJSON(const llvm::json::Value &value, TraceThreadState &packet, 117 llvm::json::Path path); 118 119llvm::json::Value toJSON(const TraceThreadState &packet); 120 121struct TraceCpuState { 122 lldb::cpu_id_t id; 123 /// List of binary data objects for this core. 124 std::vector<TraceBinaryData> binary_data; 125}; 126 127bool fromJSON(const llvm::json::Value &value, TraceCpuState &packet, 128 llvm::json::Path path); 129 130llvm::json::Value toJSON(const TraceCpuState &packet); 131 132struct 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 141bool fromJSON(const llvm::json::Value &value, TraceGetStateResponse &packet, 142 llvm::json::Path path); 143 144llvm::json::Value toJSON(const TraceGetStateResponse &packet); 145/// \} 146 147/// jLLDBTraceGetBinaryData gdb-remote packet 148/// \{ 149struct 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 160bool fromJSON(const llvm::json::Value &value, 161 lldb_private::TraceGetBinaryDataRequest &packet, 162 llvm::json::Path path); 163 164llvm::json::Value toJSON(const lldb_private::TraceGetBinaryDataRequest &packet); 165/// \} 166 167} // namespace lldb_private 168 169#endif // LLDB_UTILITY_TRACEGDBREMOTEPACKETS_H 170