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 /// \{
fromJSON(const json::Value & value,TraceSupportedResponse & packet,Path path)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 
toJSON(const TraceSupportedResponse & packet)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 /// \{
IsProcessTracing() const32fe6060f1SDimitry Andric bool TraceStartRequest::IsProcessTracing() const { return !(bool)tids; }
33fe6060f1SDimitry Andric 
fromJSON(const json::Value & value,TraceStartRequest & packet,Path path)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 
toJSON(const TraceStartRequest & packet)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 /// \{
TraceStopRequest(llvm::StringRef type,const std::vector<lldb::tid_t> & tids_)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_)
5181ad6265SDimitry Andric     tids->push_back(tid);
52fe6060f1SDimitry Andric }
53fe6060f1SDimitry Andric 
IsProcessTracing() const54fe6060f1SDimitry Andric bool TraceStopRequest::IsProcessTracing() const { return !(bool)tids; }
55fe6060f1SDimitry Andric 
fromJSON(const json::Value & value,TraceStopRequest & packet,Path path)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 
toJSON(const TraceStopRequest & packet)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 /// \{
fromJSON(const json::Value & value,TraceGetStateRequest & packet,Path path)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 
toJSON(const TraceGetStateRequest & packet)74fe6060f1SDimitry Andric json::Value toJSON(const TraceGetStateRequest &packet) {
75fe6060f1SDimitry Andric   return json::Value(Object{{"type", packet.type}});
76fe6060f1SDimitry Andric }
77fe6060f1SDimitry Andric 
fromJSON(const json::Value & value,TraceBinaryData & packet,Path path)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 
toJSON(const TraceBinaryData & packet)83fe6060f1SDimitry Andric json::Value toJSON(const TraceBinaryData &packet) {
84fe6060f1SDimitry Andric   return json::Value(Object{{"kind", packet.kind}, {"size", packet.size}});
85fe6060f1SDimitry Andric }
86fe6060f1SDimitry Andric 
fromJSON(const json::Value & value,TraceThreadState & packet,Path path)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) &&
9081ad6265SDimitry Andric          o.map("binaryData", packet.binary_data);
91fe6060f1SDimitry Andric }
92fe6060f1SDimitry Andric 
toJSON(const TraceThreadState & packet)93fe6060f1SDimitry Andric json::Value toJSON(const TraceThreadState &packet) {
94fe6060f1SDimitry Andric   return json::Value(
9581ad6265SDimitry Andric       Object{{"tid", packet.tid}, {"binaryData", packet.binary_data}});
96fe6060f1SDimitry Andric }
97fe6060f1SDimitry Andric 
fromJSON(const json::Value & value,TraceGetStateResponse & packet,Path path)98fe6060f1SDimitry Andric bool fromJSON(const json::Value &value, TraceGetStateResponse &packet,
99fe6060f1SDimitry Andric               Path path) {
100fe6060f1SDimitry Andric   ObjectMapper o(value, path);
10181ad6265SDimitry Andric   return o && o.map("tracedThreads", packet.traced_threads) &&
10281ad6265SDimitry Andric          o.map("processBinaryData", packet.process_binary_data) &&
10381ad6265SDimitry Andric          o.map("cpus", packet.cpus) && o.map("warnings", packet.warnings);
104fe6060f1SDimitry Andric }
105fe6060f1SDimitry Andric 
toJSON(const TraceGetStateResponse & packet)106fe6060f1SDimitry Andric json::Value toJSON(const TraceGetStateResponse &packet) {
10781ad6265SDimitry Andric   return json::Value(Object{{"tracedThreads", packet.traced_threads},
10881ad6265SDimitry Andric                             {"processBinaryData", packet.process_binary_data},
10981ad6265SDimitry Andric                             {"cpus", packet.cpus},
11081ad6265SDimitry Andric                             {"warnings", packet.warnings}});
11181ad6265SDimitry Andric }
11281ad6265SDimitry Andric 
AddWarning(StringRef warning)11381ad6265SDimitry Andric void TraceGetStateResponse::AddWarning(StringRef warning) {
11481ad6265SDimitry Andric   if (!warnings)
11581ad6265SDimitry Andric     warnings.emplace();
11681ad6265SDimitry Andric   warnings->push_back(warning.data());
11781ad6265SDimitry Andric }
11881ad6265SDimitry Andric 
fromJSON(const json::Value & value,TraceCpuState & packet,json::Path path)11981ad6265SDimitry Andric bool fromJSON(const json::Value &value, TraceCpuState &packet,
12081ad6265SDimitry Andric               json::Path path) {
12181ad6265SDimitry Andric   ObjectMapper o(value, path);
12281ad6265SDimitry Andric   uint64_t cpu_id;
12381ad6265SDimitry Andric   if (!(o && o.map("id", cpu_id) && o.map("binaryData", packet.binary_data)))
12481ad6265SDimitry Andric     return false;
12581ad6265SDimitry Andric   packet.id = static_cast<lldb::cpu_id_t>(cpu_id);
12681ad6265SDimitry Andric   return true;
12781ad6265SDimitry Andric }
12881ad6265SDimitry Andric 
toJSON(const TraceCpuState & packet)12981ad6265SDimitry Andric json::Value toJSON(const TraceCpuState &packet) {
13081ad6265SDimitry Andric   return json::Value(
13181ad6265SDimitry Andric       Object{{"id", packet.id}, {"binaryData", packet.binary_data}});
132fe6060f1SDimitry Andric }
133fe6060f1SDimitry Andric /// \}
134fe6060f1SDimitry Andric 
135fe6060f1SDimitry Andric /// jLLDBTraceGetBinaryData
136fe6060f1SDimitry Andric /// \{
toJSON(const TraceGetBinaryDataRequest & packet)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},
14181ad6265SDimitry Andric                             {"cpuId", packet.cpu_id}});
142fe6060f1SDimitry Andric }
143fe6060f1SDimitry Andric 
fromJSON(const json::Value & value,TraceGetBinaryDataRequest & packet,Path path)144fe6060f1SDimitry Andric bool fromJSON(const json::Value &value, TraceGetBinaryDataRequest &packet,
145fe6060f1SDimitry Andric               Path path) {
146fe6060f1SDimitry Andric   ObjectMapper o(value, path);
147*bdd1243dSDimitry Andric   std::optional<uint64_t> cpu_id;
14881ad6265SDimitry Andric   if (!(o && o.map("type", packet.type) && o.map("kind", packet.kind) &&
14981ad6265SDimitry Andric         o.map("tid", packet.tid) && o.map("cpuId", cpu_id)))
15081ad6265SDimitry Andric     return false;
15181ad6265SDimitry Andric 
15281ad6265SDimitry Andric   if (cpu_id)
15381ad6265SDimitry Andric     packet.cpu_id = static_cast<lldb::cpu_id_t>(*cpu_id);
15481ad6265SDimitry Andric   return true;
155fe6060f1SDimitry Andric }
156fe6060f1SDimitry Andric /// \}
157fe6060f1SDimitry Andric 
158fe6060f1SDimitry Andric } // namespace lldb_private
159