1349cc55cSDimitry Andric //===-- TraceIntelPTJSONStructs.h -----------------------------*- C++ //-*-===// 2349cc55cSDimitry Andric // 3349cc55cSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4349cc55cSDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5349cc55cSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6349cc55cSDimitry Andric // 7349cc55cSDimitry Andric //===----------------------------------------------------------------------===// 8349cc55cSDimitry Andric 9349cc55cSDimitry Andric #ifndef LLDB_SOURCE_PLUGINS_TRACE_INTEL_PT_TRACEINTELPTJSONSTRUCTS_H 10349cc55cSDimitry Andric #define LLDB_SOURCE_PLUGINS_TRACE_INTEL_PT_TRACEINTELPTJSONSTRUCTS_H 11349cc55cSDimitry Andric 1281ad6265SDimitry Andric #include "lldb/Utility/TraceIntelPTGDBRemotePackets.h" 13*bdd1243dSDimitry Andric #include "lldb/lldb-types.h" 1481ad6265SDimitry Andric #include "llvm/Support/JSON.h" 15349cc55cSDimitry Andric #include <intel-pt.h> 16*bdd1243dSDimitry Andric #include <optional> 1781ad6265SDimitry Andric #include <vector> 18349cc55cSDimitry Andric 19349cc55cSDimitry Andric namespace lldb_private { 20349cc55cSDimitry Andric namespace trace_intel_pt { 21349cc55cSDimitry Andric 2281ad6265SDimitry Andric struct JSONModule { 2381ad6265SDimitry Andric std::string system_path; 24*bdd1243dSDimitry Andric std::optional<std::string> file; 2581ad6265SDimitry Andric JSONUINT64 load_address; 26*bdd1243dSDimitry Andric std::optional<std::string> uuid; 27349cc55cSDimitry Andric }; 28349cc55cSDimitry Andric 2981ad6265SDimitry Andric struct JSONThread { 3081ad6265SDimitry Andric uint64_t tid; 31*bdd1243dSDimitry Andric std::optional<std::string> ipt_trace; 3281ad6265SDimitry Andric }; 3381ad6265SDimitry Andric 3481ad6265SDimitry Andric struct JSONProcess { 3581ad6265SDimitry Andric uint64_t pid; 36*bdd1243dSDimitry Andric std::optional<std::string> triple; 3781ad6265SDimitry Andric std::vector<JSONThread> threads; 3881ad6265SDimitry Andric std::vector<JSONModule> modules; 3981ad6265SDimitry Andric }; 4081ad6265SDimitry Andric 4181ad6265SDimitry Andric struct JSONCpu { 4281ad6265SDimitry Andric lldb::cpu_id_t id; 4381ad6265SDimitry Andric std::string ipt_trace; 4481ad6265SDimitry Andric std::string context_switch_trace; 4581ad6265SDimitry Andric }; 4681ad6265SDimitry Andric 47*bdd1243dSDimitry Andric struct JSONKernel { 48*bdd1243dSDimitry Andric std::optional<JSONUINT64> load_address; 49*bdd1243dSDimitry Andric std::string file; 50*bdd1243dSDimitry Andric }; 51*bdd1243dSDimitry Andric 5281ad6265SDimitry Andric struct JSONTraceBundleDescription { 53349cc55cSDimitry Andric std::string type; 5481ad6265SDimitry Andric pt_cpu cpu_info; 55*bdd1243dSDimitry Andric std::optional<std::vector<JSONProcess>> processes; 56*bdd1243dSDimitry Andric std::optional<std::vector<JSONCpu>> cpus; 57*bdd1243dSDimitry Andric std::optional<LinuxPerfZeroTscConversion> tsc_perf_zero_conversion; 58*bdd1243dSDimitry Andric std::optional<JSONKernel> kernel; 5981ad6265SDimitry Andric 60*bdd1243dSDimitry Andric std::optional<std::vector<lldb::cpu_id_t>> GetCpuIds(); 61349cc55cSDimitry Andric }; 62349cc55cSDimitry Andric 6381ad6265SDimitry Andric llvm::json::Value toJSON(const JSONModule &module); 64349cc55cSDimitry Andric 6581ad6265SDimitry Andric llvm::json::Value toJSON(const JSONThread &thread); 66349cc55cSDimitry Andric 6781ad6265SDimitry Andric llvm::json::Value toJSON(const JSONProcess &process); 68349cc55cSDimitry Andric 6981ad6265SDimitry Andric llvm::json::Value toJSON(const JSONCpu &cpu); 70349cc55cSDimitry Andric 7181ad6265SDimitry Andric llvm::json::Value toJSON(const pt_cpu &cpu_info); 72349cc55cSDimitry Andric 73*bdd1243dSDimitry Andric llvm::json::Value toJSON(const JSONKernel &kernel); 74*bdd1243dSDimitry Andric 7581ad6265SDimitry Andric llvm::json::Value toJSON(const JSONTraceBundleDescription &bundle_description); 7681ad6265SDimitry Andric 7781ad6265SDimitry Andric bool fromJSON(const llvm::json::Value &value, JSONModule &module, 78349cc55cSDimitry Andric llvm::json::Path path); 79349cc55cSDimitry Andric 8081ad6265SDimitry Andric bool fromJSON(const llvm::json::Value &value, JSONThread &thread, 8181ad6265SDimitry Andric llvm::json::Path path); 82349cc55cSDimitry Andric 8381ad6265SDimitry Andric bool fromJSON(const llvm::json::Value &value, JSONProcess &process, 8481ad6265SDimitry Andric llvm::json::Path path); 85349cc55cSDimitry Andric 8681ad6265SDimitry Andric bool fromJSON(const llvm::json::Value &value, JSONCpu &cpu, 8781ad6265SDimitry Andric llvm::json::Path path); 88349cc55cSDimitry Andric 8981ad6265SDimitry Andric bool fromJSON(const llvm::json::Value &value, pt_cpu &cpu_info, 9081ad6265SDimitry Andric llvm::json::Path path); 9181ad6265SDimitry Andric 92*bdd1243dSDimitry Andric bool fromJSON(const llvm::json::Value &value, JSONModule &kernel, 93*bdd1243dSDimitry Andric llvm::json::Path path); 94*bdd1243dSDimitry Andric 95*bdd1243dSDimitry Andric bool fromJSON(const llvm::json::Value &value, 96*bdd1243dSDimitry Andric JSONTraceBundleDescription &bundle_description, 9781ad6265SDimitry Andric llvm::json::Path path); 9881ad6265SDimitry Andric } // namespace trace_intel_pt 9981ad6265SDimitry Andric } // namespace lldb_private 100349cc55cSDimitry Andric 101349cc55cSDimitry Andric #endif // LLDB_SOURCE_PLUGINS_TRACE_INTEL_PT_TRACEINTELPTJSONSTRUCTS_H 102