xref: /llvm-project/lldb/source/Plugins/Trace/intel-pt/TraceIntelPTBundleLoader.h (revision 6fb744be76704f075a4edc753916e0e475d10f20)
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