1fe6060f1SDimitry Andric //===-- TraceGDBRemotePackets.cpp -------------------------------*- C++ -*-===// 2fe6060f1SDimitry Andric // 3fe6060f1SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4fe6060f1SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5fe6060f1SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6fe6060f1SDimitry Andric // 7fe6060f1SDimitry Andric //===----------------------------------------------------------------------===// 8fe6060f1SDimitry Andric 9fe6060f1SDimitry Andric #include "lldb/Utility/TraceGDBRemotePackets.h" 10fe6060f1SDimitry Andric 11fe6060f1SDimitry Andric using namespace llvm; 12fe6060f1SDimitry Andric using namespace llvm::json; 13fe6060f1SDimitry Andric 14fe6060f1SDimitry Andric namespace lldb_private { 15fe6060f1SDimitry Andric /// jLLDBTraceSupported 16fe6060f1SDimitry Andric /// \{ 17fe6060f1SDimitry Andric bool fromJSON(const json::Value &value, TraceSupportedResponse &packet, 18fe6060f1SDimitry Andric Path path) { 19fe6060f1SDimitry Andric ObjectMapper o(value, path); 20fe6060f1SDimitry Andric return o && o.map("description", packet.description) && 21fe6060f1SDimitry Andric o.map("name", packet.name); 22fe6060f1SDimitry Andric } 23fe6060f1SDimitry Andric 24fe6060f1SDimitry Andric json::Value toJSON(const TraceSupportedResponse &packet) { 25fe6060f1SDimitry Andric return json::Value( 26fe6060f1SDimitry Andric Object{{"description", packet.description}, {"name", packet.name}}); 27fe6060f1SDimitry Andric } 28fe6060f1SDimitry Andric /// \} 29fe6060f1SDimitry Andric 30fe6060f1SDimitry Andric /// jLLDBTraceStart 31fe6060f1SDimitry Andric /// \{ 32fe6060f1SDimitry Andric bool TraceStartRequest::IsProcessTracing() const { return !(bool)tids; } 33fe6060f1SDimitry Andric 34fe6060f1SDimitry Andric bool fromJSON(const json::Value &value, TraceStartRequest &packet, Path path) { 35fe6060f1SDimitry Andric ObjectMapper o(value, path); 36fe6060f1SDimitry Andric return o && o.map("type", packet.type) && o.map("tids", packet.tids); 37fe6060f1SDimitry Andric } 38fe6060f1SDimitry Andric 39fe6060f1SDimitry Andric json::Value toJSON(const TraceStartRequest &packet) { 40fe6060f1SDimitry Andric return json::Value(Object{{"tids", packet.tids}, {"type", packet.type}}); 41fe6060f1SDimitry Andric } 42fe6060f1SDimitry Andric /// \} 43fe6060f1SDimitry Andric 44fe6060f1SDimitry Andric /// jLLDBTraceStop 45fe6060f1SDimitry Andric /// \{ 46fe6060f1SDimitry Andric TraceStopRequest::TraceStopRequest(llvm::StringRef type, 47fe6060f1SDimitry Andric const std::vector<lldb::tid_t> &tids_) 48fe6060f1SDimitry Andric : type(type) { 49fe6060f1SDimitry Andric tids.emplace(); 50fe6060f1SDimitry Andric for (lldb::tid_t tid : tids_) 51*81ad6265SDimitry Andric tids->push_back(tid); 52fe6060f1SDimitry Andric } 53fe6060f1SDimitry Andric 54fe6060f1SDimitry Andric bool TraceStopRequest::IsProcessTracing() const { return !(bool)tids; } 55fe6060f1SDimitry Andric 56fe6060f1SDimitry Andric bool fromJSON(const json::Value &value, TraceStopRequest &packet, Path path) { 57fe6060f1SDimitry Andric ObjectMapper o(value, path); 58fe6060f1SDimitry Andric return o && o.map("type", packet.type) && o.map("tids", packet.tids); 59fe6060f1SDimitry Andric } 60fe6060f1SDimitry Andric 61fe6060f1SDimitry Andric json::Value toJSON(const TraceStopRequest &packet) { 62fe6060f1SDimitry Andric return json::Value(Object{{"type", packet.type}, {"tids", packet.tids}}); 63fe6060f1SDimitry Andric } 64fe6060f1SDimitry Andric /// \} 65fe6060f1SDimitry Andric 66fe6060f1SDimitry Andric /// jLLDBTraceGetState 67fe6060f1SDimitry Andric /// \{ 68fe6060f1SDimitry Andric bool fromJSON(const json::Value &value, TraceGetStateRequest &packet, 69fe6060f1SDimitry Andric Path path) { 70fe6060f1SDimitry Andric ObjectMapper o(value, path); 71fe6060f1SDimitry Andric return o && o.map("type", packet.type); 72fe6060f1SDimitry Andric } 73fe6060f1SDimitry Andric 74fe6060f1SDimitry Andric json::Value toJSON(const TraceGetStateRequest &packet) { 75fe6060f1SDimitry Andric return json::Value(Object{{"type", packet.type}}); 76fe6060f1SDimitry Andric } 77fe6060f1SDimitry Andric 78fe6060f1SDimitry Andric bool fromJSON(const json::Value &value, TraceBinaryData &packet, Path path) { 79fe6060f1SDimitry Andric ObjectMapper o(value, path); 80fe6060f1SDimitry Andric return o && o.map("kind", packet.kind) && o.map("size", packet.size); 81fe6060f1SDimitry Andric } 82fe6060f1SDimitry Andric 83fe6060f1SDimitry Andric json::Value toJSON(const TraceBinaryData &packet) { 84fe6060f1SDimitry Andric return json::Value(Object{{"kind", packet.kind}, {"size", packet.size}}); 85fe6060f1SDimitry Andric } 86fe6060f1SDimitry Andric 87fe6060f1SDimitry Andric bool fromJSON(const json::Value &value, TraceThreadState &packet, Path path) { 88fe6060f1SDimitry Andric ObjectMapper o(value, path); 89fe6060f1SDimitry Andric return o && o.map("tid", packet.tid) && 90*81ad6265SDimitry Andric o.map("binaryData", packet.binary_data); 91fe6060f1SDimitry Andric } 92fe6060f1SDimitry Andric 93fe6060f1SDimitry Andric json::Value toJSON(const TraceThreadState &packet) { 94fe6060f1SDimitry Andric return json::Value( 95*81ad6265SDimitry Andric Object{{"tid", packet.tid}, {"binaryData", packet.binary_data}}); 96fe6060f1SDimitry Andric } 97fe6060f1SDimitry Andric 98fe6060f1SDimitry Andric bool fromJSON(const json::Value &value, TraceGetStateResponse &packet, 99fe6060f1SDimitry Andric Path path) { 100fe6060f1SDimitry Andric ObjectMapper o(value, path); 101*81ad6265SDimitry Andric return o && o.map("tracedThreads", packet.traced_threads) && 102*81ad6265SDimitry Andric o.map("processBinaryData", packet.process_binary_data) && 103*81ad6265SDimitry Andric o.map("cpus", packet.cpus) && o.map("warnings", packet.warnings); 104fe6060f1SDimitry Andric } 105fe6060f1SDimitry Andric 106fe6060f1SDimitry Andric json::Value toJSON(const TraceGetStateResponse &packet) { 107*81ad6265SDimitry Andric return json::Value(Object{{"tracedThreads", packet.traced_threads}, 108*81ad6265SDimitry Andric {"processBinaryData", packet.process_binary_data}, 109*81ad6265SDimitry Andric {"cpus", packet.cpus}, 110*81ad6265SDimitry Andric {"warnings", packet.warnings}}); 111*81ad6265SDimitry Andric } 112*81ad6265SDimitry Andric 113*81ad6265SDimitry Andric void TraceGetStateResponse::AddWarning(StringRef warning) { 114*81ad6265SDimitry Andric if (!warnings) 115*81ad6265SDimitry Andric warnings.emplace(); 116*81ad6265SDimitry Andric warnings->push_back(warning.data()); 117*81ad6265SDimitry Andric } 118*81ad6265SDimitry Andric 119*81ad6265SDimitry Andric bool fromJSON(const json::Value &value, TraceCpuState &packet, 120*81ad6265SDimitry Andric json::Path path) { 121*81ad6265SDimitry Andric ObjectMapper o(value, path); 122*81ad6265SDimitry Andric uint64_t cpu_id; 123*81ad6265SDimitry Andric if (!(o && o.map("id", cpu_id) && o.map("binaryData", packet.binary_data))) 124*81ad6265SDimitry Andric return false; 125*81ad6265SDimitry Andric packet.id = static_cast<lldb::cpu_id_t>(cpu_id); 126*81ad6265SDimitry Andric return true; 127*81ad6265SDimitry Andric } 128*81ad6265SDimitry Andric 129*81ad6265SDimitry Andric json::Value toJSON(const TraceCpuState &packet) { 130*81ad6265SDimitry Andric return json::Value( 131*81ad6265SDimitry Andric Object{{"id", packet.id}, {"binaryData", packet.binary_data}}); 132fe6060f1SDimitry Andric } 133fe6060f1SDimitry Andric /// \} 134fe6060f1SDimitry Andric 135fe6060f1SDimitry Andric /// jLLDBTraceGetBinaryData 136fe6060f1SDimitry Andric /// \{ 137fe6060f1SDimitry Andric json::Value toJSON(const TraceGetBinaryDataRequest &packet) { 138fe6060f1SDimitry Andric return json::Value(Object{{"type", packet.type}, 139fe6060f1SDimitry Andric {"kind", packet.kind}, 140fe6060f1SDimitry Andric {"tid", packet.tid}, 141*81ad6265SDimitry Andric {"cpuId", packet.cpu_id}}); 142fe6060f1SDimitry Andric } 143fe6060f1SDimitry Andric 144fe6060f1SDimitry Andric bool fromJSON(const json::Value &value, TraceGetBinaryDataRequest &packet, 145fe6060f1SDimitry Andric Path path) { 146fe6060f1SDimitry Andric ObjectMapper o(value, path); 147*81ad6265SDimitry Andric Optional<uint64_t> cpu_id; 148*81ad6265SDimitry Andric if (!(o && o.map("type", packet.type) && o.map("kind", packet.kind) && 149*81ad6265SDimitry Andric o.map("tid", packet.tid) && o.map("cpuId", cpu_id))) 150*81ad6265SDimitry Andric return false; 151*81ad6265SDimitry Andric 152*81ad6265SDimitry Andric if (cpu_id) 153*81ad6265SDimitry Andric packet.cpu_id = static_cast<lldb::cpu_id_t>(*cpu_id); 154*81ad6265SDimitry Andric return true; 155fe6060f1SDimitry Andric } 156fe6060f1SDimitry Andric /// \} 157fe6060f1SDimitry Andric 158fe6060f1SDimitry Andric } // namespace lldb_private 159