//===-- TraceIntelPTSessionFileParser.cpp ---------------------------------===// // // 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 "TraceIntelPTSessionFileParser.h" #include "lldb/Core/Debugger.h" #include "lldb/Target/Process.h" #include "lldb/Target/Target.h" #include "lldb/Target/ThreadList.h" #include "lldb/Target/ThreadTrace.h" using namespace lldb; using namespace lldb_private; using namespace lldb_private::trace_intel_pt; using namespace llvm; StringRef TraceIntelPTSessionFileParser::GetSchema() { static std::string schema; if (schema.empty()) { schema = TraceSessionFileParser::BuildSchema(R"({ "type": "intel-pt", "pt_cpu": { "vendor": "intel" | "unknown", "family": integer, "model": integer, "stepping": integer } })"); } return schema; } pt_cpu TraceIntelPTSessionFileParser::ParsePTCPU(const JSONPTCPU &pt_cpu) { return {pt_cpu.vendor.compare("intel") == 0 ? pcv_intel : pcv_unknown, static_cast(pt_cpu.family), static_cast(pt_cpu.model), static_cast(pt_cpu.stepping)}; } TraceSP TraceIntelPTSessionFileParser::CreateTraceIntelPTInstance( const pt_cpu &pt_cpu, std::vector &parsed_processes) { std::vector threads; for (const ParsedProcess &parsed_process : parsed_processes) threads.insert(threads.end(), parsed_process.threads.begin(), parsed_process.threads.end()); TraceSP trace_instance(new TraceIntelPT(pt_cpu, threads)); for (const ParsedProcess &parsed_process : parsed_processes) parsed_process.target_sp->SetTrace(trace_instance); return trace_instance; } Expected TraceIntelPTSessionFileParser::Parse() { json::Path::Root root("traceSession"); TraceSessionFileParser::JSONTraceSession session; if (!json::fromJSON(m_trace_session_file, session, root)) return CreateJSONError(root, m_trace_session_file); if (Expected> parsed_processes = ParseCommonSessionFile(session)) return CreateTraceIntelPTInstance(ParsePTCPU(session.trace.pt_cpu), *parsed_processes); else return parsed_processes.takeError(); } namespace llvm { namespace json { bool fromJSON(const Value &value, TraceIntelPTSessionFileParser::JSONPTCPU &pt_cpu, Path path) { ObjectMapper o(value, path); return o && o.map("vendor", pt_cpu.vendor) && o.map("family", pt_cpu.family) && o.map("model", pt_cpu.model) && o.map("stepping", pt_cpu.stepping); } bool fromJSON( const Value &value, TraceIntelPTSessionFileParser::JSONTraceIntelPTSettings &plugin_settings, Path path) { ObjectMapper o(value, path); return o && o.map("pt_cpu", plugin_settings.pt_cpu) && fromJSON( value, (TraceSessionFileParser::JSONTracePluginSettings &)plugin_settings, path); } } // namespace json } // namespace llvm