1b8dcd0baSWalter Erquinigo //===-- TraceIntelPTBundleLoader.h ----------------------------*- C++ //-*-===// 2b8dcd0baSWalter Erquinigo // 3b8dcd0baSWalter Erquinigo // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4b8dcd0baSWalter Erquinigo // See https://llvm.org/LICENSE.txt for license information. 5b8dcd0baSWalter Erquinigo // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6b8dcd0baSWalter Erquinigo // 7b8dcd0baSWalter Erquinigo //===----------------------------------------------------------------------===// 8b8dcd0baSWalter Erquinigo 9b8dcd0baSWalter Erquinigo #ifndef LLDB_SOURCE_PLUGINS_TRACE_INTEL_PT_TRACEINTELPTBUNDLELOADER_H 10b8dcd0baSWalter Erquinigo #define LLDB_SOURCE_PLUGINS_TRACE_INTEL_PT_TRACEINTELPTBUNDLELOADER_H 11b8dcd0baSWalter Erquinigo 12b8dcd0baSWalter Erquinigo #include "../common/ThreadPostMortemTrace.h" 13b8dcd0baSWalter Erquinigo #include "TraceIntelPTJSONStructs.h" 14b8dcd0baSWalter Erquinigo 15b8dcd0baSWalter Erquinigo namespace lldb_private { 16b8dcd0baSWalter Erquinigo namespace trace_intel_pt { 17b8dcd0baSWalter Erquinigo 18b8dcd0baSWalter Erquinigo class TraceIntelPT; 19b8dcd0baSWalter Erquinigo 20b8dcd0baSWalter Erquinigo class TraceIntelPTBundleLoader { 21b8dcd0baSWalter Erquinigo public: 22b8dcd0baSWalter Erquinigo /// Helper struct holding the objects created when parsing a process 23b8dcd0baSWalter Erquinigo struct ParsedProcess { 24b8dcd0baSWalter Erquinigo lldb::TargetSP target_sp; 25b8dcd0baSWalter Erquinigo std::vector<lldb::ThreadPostMortemTraceSP> threads; 26b8dcd0baSWalter Erquinigo }; 27b8dcd0baSWalter Erquinigo 28b8dcd0baSWalter Erquinigo /// \param[in] debugger 29b8dcd0baSWalter Erquinigo /// The debugger that will own the targets to create. 30b8dcd0baSWalter Erquinigo /// 31b8dcd0baSWalter Erquinigo /// \param[in] bundle_description 32d179ea12SWalter Erquinigo /// The JSON description of a trace bundle that follows the schema of the 33d179ea12SWalter Erquinigo /// intel pt trace plug-in. 34b8dcd0baSWalter Erquinigo /// 35b8dcd0baSWalter Erquinigo /// \param[in] bundle_dir 36b8dcd0baSWalter Erquinigo /// The folder where the trace bundle is located. TraceIntelPTBundleLoader(Debugger & debugger,const llvm::json::Value & bundle_description,llvm::StringRef bundle_dir)37b8dcd0baSWalter Erquinigo TraceIntelPTBundleLoader(Debugger &debugger, 38b8dcd0baSWalter Erquinigo const llvm::json::Value &bundle_description, 39b8dcd0baSWalter Erquinigo llvm::StringRef bundle_dir) 40b8dcd0baSWalter Erquinigo : m_debugger(debugger), m_bundle_description(bundle_description), 41b8dcd0baSWalter Erquinigo m_bundle_dir(bundle_dir) {} 42b8dcd0baSWalter Erquinigo 43b8dcd0baSWalter Erquinigo /// \return 44b8dcd0baSWalter Erquinigo /// The JSON schema for the bundle description. 45b8dcd0baSWalter Erquinigo static llvm::StringRef GetSchema(); 46b8dcd0baSWalter Erquinigo 47b8dcd0baSWalter Erquinigo /// Parse the trace bundle description and create the corresponding \a 48b8dcd0baSWalter Erquinigo /// Target objects. In case of an error, no targets are created. 49b8dcd0baSWalter Erquinigo /// 50b8dcd0baSWalter Erquinigo /// \return 51d179ea12SWalter Erquinigo /// A \a lldb::TraceSP instance created according to the trace bundle 52d179ea12SWalter Erquinigo /// information. In case of errors, return a null pointer. 53b8dcd0baSWalter Erquinigo llvm::Expected<lldb::TraceSP> Load(); 54b8dcd0baSWalter Erquinigo 55b8dcd0baSWalter Erquinigo private: 56b8dcd0baSWalter Erquinigo /// Resolve non-absolute paths relative to the bundle folder. 57b8dcd0baSWalter Erquinigo FileSpec NormalizePath(const std::string &path); 58b8dcd0baSWalter Erquinigo 59b8dcd0baSWalter Erquinigo /// Create a post-mortem thread associated with the given \p process 60b8dcd0baSWalter Erquinigo /// using the definition from \p thread. 61b8dcd0baSWalter Erquinigo lldb::ThreadPostMortemTraceSP ParseThread(Process &process, 62b8dcd0baSWalter Erquinigo const JSONThread &thread); 63b8dcd0baSWalter Erquinigo 64b8dcd0baSWalter Erquinigo /// Given a bundle description and a list of fully parsed processes, 65b8dcd0baSWalter Erquinigo /// create an actual Trace instance that "traces" these processes. 66b8dcd0baSWalter Erquinigo llvm::Expected<lldb::TraceSP> 67b8dcd0baSWalter Erquinigo CreateTraceIntelPTInstance(JSONTraceBundleDescription &bundle_description, 68b8dcd0baSWalter Erquinigo std::vector<ParsedProcess> &parsed_processes); 69b8dcd0baSWalter Erquinigo 70*6fb744beSWalter Erquinigo /// Create an empty Process object with given pid and target. 71*6fb744beSWalter Erquinigo llvm::Expected<ParsedProcess> CreateEmptyProcess(lldb::pid_t pid, 72*6fb744beSWalter Erquinigo llvm::StringRef triple); 73*6fb744beSWalter Erquinigo 74b8dcd0baSWalter Erquinigo /// Create the corresponding Threads and Process objects given the JSON 75b8dcd0baSWalter Erquinigo /// process definition. 76b8dcd0baSWalter Erquinigo /// 77b8dcd0baSWalter Erquinigo /// \param[in] process 78b8dcd0baSWalter Erquinigo /// The JSON process definition 79b8dcd0baSWalter Erquinigo llvm::Expected<ParsedProcess> ParseProcess(const JSONProcess &process); 80b8dcd0baSWalter Erquinigo 81d179ea12SWalter Erquinigo /// Create a module associated with the given \p target using the definition 82d179ea12SWalter Erquinigo /// from \p module. 83b8dcd0baSWalter Erquinigo llvm::Error ParseModule(Target &target, const JSONModule &module); 84b8dcd0baSWalter Erquinigo 85*6fb744beSWalter Erquinigo /// Create a kernel process and cpu threads given the JSON kernel definition. 86*6fb744beSWalter Erquinigo llvm::Expected<ParsedProcess> 87*6fb744beSWalter Erquinigo ParseKernel(const JSONTraceBundleDescription &bundle_description); 88*6fb744beSWalter Erquinigo 89b8dcd0baSWalter Erquinigo /// Create a user-friendly error message upon a JSON-parsing failure using the 90b8dcd0baSWalter Erquinigo /// \a json::ObjectMapper functionality. 91b8dcd0baSWalter Erquinigo /// 92b8dcd0baSWalter Erquinigo /// \param[in] root 93b8dcd0baSWalter Erquinigo /// The \a llvm::json::Path::Root used to parse the JSON \a value. 94b8dcd0baSWalter Erquinigo /// 95b8dcd0baSWalter Erquinigo /// \param[in] value 96b8dcd0baSWalter Erquinigo /// The json value that failed to parse. 97b8dcd0baSWalter Erquinigo /// 98b8dcd0baSWalter Erquinigo /// \return 99b8dcd0baSWalter Erquinigo /// An \a llvm::Error containing the user-friendly error message. 100b8dcd0baSWalter Erquinigo llvm::Error CreateJSONError(llvm::json::Path::Root &root, 101b8dcd0baSWalter Erquinigo const llvm::json::Value &value); 102b8dcd0baSWalter Erquinigo 103b8dcd0baSWalter Erquinigo /// Create the corresponding Process, Thread and Module objects given this 104b8dcd0baSWalter Erquinigo /// bundle description. 105b8dcd0baSWalter Erquinigo llvm::Expected<std::vector<ParsedProcess>> 106b8dcd0baSWalter Erquinigo LoadBundle(const JSONTraceBundleDescription &bundle_description); 107b8dcd0baSWalter Erquinigo 108b8dcd0baSWalter Erquinigo /// When applicable, augment the list of threads in the trace bundle by 109b8dcd0baSWalter Erquinigo /// inspecting the context switch trace. This only applies for threads of 110b8dcd0baSWalter Erquinigo /// processes already specified in this bundle description. 111b8dcd0baSWalter Erquinigo /// 112b8dcd0baSWalter Erquinigo /// \return 113b8dcd0baSWalter Erquinigo /// An \a llvm::Error in case if failures, or \a llvm::Error::success 114b8dcd0baSWalter Erquinigo /// otherwise. 115d179ea12SWalter Erquinigo llvm::Error AugmentThreadsFromContextSwitches( 116d179ea12SWalter Erquinigo JSONTraceBundleDescription &bundle_description); 117b8dcd0baSWalter Erquinigo 118d179ea12SWalter Erquinigo /// Modifiy the bundle description by normalizing all the paths relative to 119d179ea12SWalter Erquinigo /// the session file directory. 120b8dcd0baSWalter Erquinigo void NormalizeAllPaths(JSONTraceBundleDescription &bundle_description); 121b8dcd0baSWalter Erquinigo 122b8dcd0baSWalter Erquinigo Debugger &m_debugger; 123b8dcd0baSWalter Erquinigo const llvm::json::Value &m_bundle_description; 124b8dcd0baSWalter Erquinigo const std::string m_bundle_dir; 125b8dcd0baSWalter Erquinigo }; 126b8dcd0baSWalter Erquinigo 127b8dcd0baSWalter Erquinigo } // namespace trace_intel_pt 128b8dcd0baSWalter Erquinigo } // namespace lldb_private 129b8dcd0baSWalter Erquinigo 130b8dcd0baSWalter Erquinigo #endif // LLDB_SOURCE_PLUGINS_TRACE_INTEL_PT_TRACEINTELPTBUNDLELOADER_H 131