diff options
Diffstat (limited to 'contrib/llvm-project/lldb/source/Utility/TraceGDBRemotePackets.cpp')
-rw-r--r-- | contrib/llvm-project/lldb/source/Utility/TraceGDBRemotePackets.cpp | 158 |
1 files changed, 158 insertions, 0 deletions
diff --git a/contrib/llvm-project/lldb/source/Utility/TraceGDBRemotePackets.cpp b/contrib/llvm-project/lldb/source/Utility/TraceGDBRemotePackets.cpp new file mode 100644 index 000000000000..387c7ef9f876 --- /dev/null +++ b/contrib/llvm-project/lldb/source/Utility/TraceGDBRemotePackets.cpp @@ -0,0 +1,158 @@ +//===-- TraceGDBRemotePackets.cpp -------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "lldb/Utility/TraceGDBRemotePackets.h" + +using namespace llvm; +using namespace llvm::json; + +namespace lldb_private { +/// jLLDBTraceSupported +/// \{ +bool fromJSON(const json::Value &value, TraceSupportedResponse &packet, + Path path) { + ObjectMapper o(value, path); + return o && o.map("description", packet.description) && + o.map("name", packet.name); +} + +json::Value toJSON(const TraceSupportedResponse &packet) { + return json::Value( + Object{{"description", packet.description}, {"name", packet.name}}); +} +/// \} + +/// jLLDBTraceStart +/// \{ +bool TraceStartRequest::IsProcessTracing() const { return !(bool)tids; } + +bool fromJSON(const json::Value &value, TraceStartRequest &packet, Path path) { + ObjectMapper o(value, path); + return o && o.map("type", packet.type) && o.map("tids", packet.tids); +} + +json::Value toJSON(const TraceStartRequest &packet) { + return json::Value(Object{{"tids", packet.tids}, {"type", packet.type}}); +} +/// \} + +/// jLLDBTraceStop +/// \{ +TraceStopRequest::TraceStopRequest(llvm::StringRef type, + const std::vector<lldb::tid_t> &tids_) + : type(type) { + tids.emplace(); + for (lldb::tid_t tid : tids_) + tids->push_back(tid); +} + +bool TraceStopRequest::IsProcessTracing() const { return !(bool)tids; } + +bool fromJSON(const json::Value &value, TraceStopRequest &packet, Path path) { + ObjectMapper o(value, path); + return o && o.map("type", packet.type) && o.map("tids", packet.tids); +} + +json::Value toJSON(const TraceStopRequest &packet) { + return json::Value(Object{{"type", packet.type}, {"tids", packet.tids}}); +} +/// \} + +/// jLLDBTraceGetState +/// \{ +bool fromJSON(const json::Value &value, TraceGetStateRequest &packet, + Path path) { + ObjectMapper o(value, path); + return o && o.map("type", packet.type); +} + +json::Value toJSON(const TraceGetStateRequest &packet) { + return json::Value(Object{{"type", packet.type}}); +} + +bool fromJSON(const json::Value &value, TraceBinaryData &packet, Path path) { + ObjectMapper o(value, path); + return o && o.map("kind", packet.kind) && o.map("size", packet.size); +} + +json::Value toJSON(const TraceBinaryData &packet) { + return json::Value(Object{{"kind", packet.kind}, {"size", packet.size}}); +} + +bool fromJSON(const json::Value &value, TraceThreadState &packet, Path path) { + ObjectMapper o(value, path); + return o && o.map("tid", packet.tid) && + o.map("binaryData", packet.binary_data); +} + +json::Value toJSON(const TraceThreadState &packet) { + return json::Value( + Object{{"tid", packet.tid}, {"binaryData", packet.binary_data}}); +} + +bool fromJSON(const json::Value &value, TraceGetStateResponse &packet, + Path path) { + ObjectMapper o(value, path); + return o && o.map("tracedThreads", packet.traced_threads) && + o.map("processBinaryData", packet.process_binary_data) && + o.map("cpus", packet.cpus) && o.map("warnings", packet.warnings); +} + +json::Value toJSON(const TraceGetStateResponse &packet) { + return json::Value(Object{{"tracedThreads", packet.traced_threads}, + {"processBinaryData", packet.process_binary_data}, + {"cpus", packet.cpus}, + {"warnings", packet.warnings}}); +} + +void TraceGetStateResponse::AddWarning(StringRef warning) { + if (!warnings) + warnings.emplace(); + warnings->push_back(warning.data()); +} + +bool fromJSON(const json::Value &value, TraceCpuState &packet, + json::Path path) { + ObjectMapper o(value, path); + uint64_t cpu_id; + if (!(o && o.map("id", cpu_id) && o.map("binaryData", packet.binary_data))) + return false; + packet.id = static_cast<lldb::cpu_id_t>(cpu_id); + return true; +} + +json::Value toJSON(const TraceCpuState &packet) { + return json::Value( + Object{{"id", packet.id}, {"binaryData", packet.binary_data}}); +} +/// \} + +/// jLLDBTraceGetBinaryData +/// \{ +json::Value toJSON(const TraceGetBinaryDataRequest &packet) { + return json::Value(Object{{"type", packet.type}, + {"kind", packet.kind}, + {"tid", packet.tid}, + {"cpuId", packet.cpu_id}}); +} + +bool fromJSON(const json::Value &value, TraceGetBinaryDataRequest &packet, + Path path) { + ObjectMapper o(value, path); + std::optional<uint64_t> cpu_id; + if (!(o && o.map("type", packet.type) && o.map("kind", packet.kind) && + o.map("tid", packet.tid) && o.map("cpuId", cpu_id))) + return false; + + if (cpu_id) + packet.cpu_id = static_cast<lldb::cpu_id_t>(*cpu_id); + return true; +} +/// \} + +} // namespace lldb_private |