forked from OSchip/llvm-project
180 lines
5.4 KiB
C++
180 lines
5.4 KiB
C++
//===-- TraceSessionFileParser.h --------------------------------*- 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
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLDB_TARGET_TRACESESSIONPARSER_H
|
|
#define LLDB_TARGET_TRACESESSIONPARSER_H
|
|
|
|
#include "llvm/Support/JSON.h"
|
|
|
|
#include "ThreadPostMortemTrace.h"
|
|
|
|
namespace lldb_private {
|
|
|
|
/// \class TraceSessionFileParser TraceSessionFileParser.h
|
|
///
|
|
/// Base class for parsing the common information of JSON trace session files.
|
|
/// Contains the basic C++ structs that represent the JSON data, which include
|
|
/// \a JSONTraceSession as the root object.
|
|
///
|
|
/// See \a Trace::FindPlugin for more information regarding these JSON files.
|
|
class TraceSessionFileParser {
|
|
public:
|
|
/// C++ structs representing the JSON trace session.
|
|
/// \{
|
|
struct JSONAddress {
|
|
lldb::addr_t value;
|
|
};
|
|
|
|
struct JSONModule {
|
|
std::string system_path;
|
|
llvm::Optional<std::string> file;
|
|
JSONAddress load_address;
|
|
llvm::Optional<std::string> uuid;
|
|
};
|
|
|
|
struct JSONThread {
|
|
int64_t tid;
|
|
std::string trace_file;
|
|
};
|
|
|
|
struct JSONProcess {
|
|
int64_t pid;
|
|
std::string triple;
|
|
std::vector<JSONThread> threads;
|
|
std::vector<JSONModule> modules;
|
|
};
|
|
|
|
struct JSONTracePluginSettings {
|
|
std::string type;
|
|
};
|
|
|
|
struct JSONTraceSessionBase {
|
|
std::vector<JSONProcess> processes;
|
|
};
|
|
|
|
/// The trace plug-in implementation should provide its own TPluginSettings,
|
|
/// which corresponds to the "trace" section of the schema.
|
|
template <class TPluginSettings>
|
|
struct JSONTraceSession : JSONTraceSessionBase {
|
|
TPluginSettings trace;
|
|
};
|
|
/// \}
|
|
|
|
/// Helper struct holding the objects created when parsing a process
|
|
struct ParsedProcess {
|
|
lldb::TargetSP target_sp;
|
|
std::vector<lldb::ThreadPostMortemTraceSP> threads;
|
|
};
|
|
|
|
TraceSessionFileParser(Debugger &debugger, llvm::StringRef session_file_dir,
|
|
llvm::StringRef schema)
|
|
: m_debugger(debugger), m_session_file_dir(session_file_dir),
|
|
m_schema(schema) {}
|
|
|
|
/// Build the full schema for a Trace plug-in.
|
|
///
|
|
/// \param[in] plugin_schema
|
|
/// The subschema that corresponds to the "trace" section of the schema.
|
|
///
|
|
/// \return
|
|
/// The full schema containing the common attributes and the plug-in
|
|
/// specific attributes.
|
|
static std::string BuildSchema(llvm::StringRef plugin_schema);
|
|
|
|
/// Parse the fields common to all trace session schemas.
|
|
///
|
|
/// \param[in] session
|
|
/// The session json objects already deserialized.
|
|
///
|
|
/// \return
|
|
/// A list of \a ParsedProcess containing all threads and targets created
|
|
/// during the parsing, or an error in case of failures. In case of
|
|
/// errors, no side effects are produced.
|
|
llvm::Expected<std::vector<ParsedProcess>>
|
|
ParseCommonSessionFile(const JSONTraceSessionBase &session);
|
|
|
|
protected:
|
|
/// Resolve non-absolute paths relative to the session file folder. It
|
|
/// modifies the given file_spec.
|
|
void NormalizePath(lldb_private::FileSpec &file_spec);
|
|
|
|
lldb::ThreadPostMortemTraceSP ParseThread(lldb::ProcessSP &process_sp,
|
|
const JSONThread &thread);
|
|
|
|
llvm::Expected<ParsedProcess> ParseProcess(const JSONProcess &process);
|
|
|
|
llvm::Error ParseModule(lldb::TargetSP &target_sp, const JSONModule &module);
|
|
|
|
/// Create a user-friendly error message upon a JSON-parsing failure using the
|
|
/// \a json::ObjectMapper functionality.
|
|
///
|
|
/// \param[in] root
|
|
/// The \a llvm::json::Path::Root used to parse the JSON \a value.
|
|
///
|
|
/// \param[in] value
|
|
/// The json value that failed to parse.
|
|
///
|
|
/// \return
|
|
/// An \a llvm::Error containing the user-friendly error message.
|
|
llvm::Error CreateJSONError(llvm::json::Path::Root &root,
|
|
const llvm::json::Value &value);
|
|
|
|
Debugger &m_debugger;
|
|
std::string m_session_file_dir;
|
|
llvm::StringRef m_schema;
|
|
};
|
|
} // namespace lldb_private
|
|
|
|
namespace llvm {
|
|
namespace json {
|
|
|
|
bool fromJSON(const Value &value,
|
|
lldb_private::TraceSessionFileParser::JSONAddress &address,
|
|
Path path);
|
|
|
|
bool fromJSON(const Value &value,
|
|
lldb_private::TraceSessionFileParser::JSONModule &module,
|
|
Path path);
|
|
|
|
bool fromJSON(const Value &value,
|
|
lldb_private::TraceSessionFileParser::JSONThread &thread,
|
|
Path path);
|
|
|
|
bool fromJSON(const Value &value,
|
|
lldb_private::TraceSessionFileParser::JSONProcess &process,
|
|
Path path);
|
|
|
|
bool fromJSON(const Value &value,
|
|
lldb_private::TraceSessionFileParser::JSONTracePluginSettings
|
|
&plugin_settings,
|
|
Path path);
|
|
|
|
bool fromJSON(
|
|
const Value &value,
|
|
lldb_private::TraceSessionFileParser::JSONTraceSessionBase &session,
|
|
Path path);
|
|
|
|
template <class TPluginSettings>
|
|
bool fromJSON(
|
|
const Value &value,
|
|
lldb_private::TraceSessionFileParser::JSONTraceSession<TPluginSettings>
|
|
&session,
|
|
Path path) {
|
|
ObjectMapper o(value, path);
|
|
return o && o.map("trace", session.trace) &&
|
|
fromJSON(value,
|
|
(lldb_private::TraceSessionFileParser::JSONTraceSessionBase &)
|
|
session,
|
|
path);
|
|
}
|
|
|
|
} // namespace json
|
|
} // namespace llvm
|
|
|
|
#endif // LLDB_TARGET_TRACESESSIONPARSER_H
|