1 //===-- Trace.cpp ---------------------------------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #include "lldb/Target/Trace.h"
10 
11 #include <sstream>
12 
13 #include "llvm/Support/Format.h"
14 
15 #include "lldb/Core/PluginManager.h"
16 
17 using namespace lldb;
18 using namespace lldb_private;
19 using namespace llvm;
20 
21 llvm::Expected<lldb::TraceSP> Trace::FindPlugin(Debugger &debugger,
22                                                 const json::Value &settings,
23                                                 StringRef info_dir) {
24   llvm::Expected<const json::Object &> settings_obj =
25       json_helpers::ToObjectOrError(settings);
26   if (!settings_obj)
27     return settings_obj.takeError();
28 
29   llvm::Expected<const json::Object &> trace =
30       json_helpers::GetObjectOrError(*settings_obj, "trace");
31   if (!trace)
32     return trace.takeError();
33 
34   llvm::Expected<StringRef> type =
35       json_helpers::GetStringOrError(*trace, "type");
36   if (!type)
37     return type.takeError();
38 
39   ConstString plugin_name(*type);
40   auto create_callback = PluginManager::GetTraceCreateCallback(plugin_name);
41   if (create_callback) {
42     TraceSP instance = create_callback();
43     if (llvm::Error err =
44             instance->ParseSettings(debugger, *settings_obj, info_dir))
45       return std::move(err);
46     return instance;
47   }
48 
49   return createStringError(
50       std::errc::invalid_argument,
51       "no trace plug-in matches the specified type: \"%s\"",
52       plugin_name.AsCString());
53 }
54 
55 llvm::Expected<lldb::TraceSP> Trace::FindPlugin(StringRef name) {
56   ConstString plugin_name(name);
57   auto create_callback = PluginManager::GetTraceCreateCallback(plugin_name);
58   if (create_callback)
59     return create_callback();
60 
61   return createStringError(
62       std::errc::invalid_argument,
63       "no trace plug-in matches the specified type: \"%s\"",
64       plugin_name.AsCString());
65 }
66 
67 llvm::Error Trace::ParseSettings(Debugger &debugger,
68                                  const llvm::json::Object &settings,
69                                  llvm::StringRef settings_dir) {
70   if (llvm::Error err =
71           CreateParser()->ParseSettings(debugger, settings, settings_dir))
72     return err;
73 
74   return llvm::Error::success();
75 }
76 
77 llvm::StringRef Trace::GetSchema() { return CreateParser()->GetSchema(); }
78