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