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 <regex>
12 #include <sstream>
13 
14 #include "llvm/Support/Format.h"
15 
16 #include "lldb/Core/PluginManager.h"
17 
18 using namespace lldb;
19 using namespace lldb_private;
20 using namespace llvm;
21 
22 llvm::Expected<lldb::TraceSP> Trace::FindPlugin(Debugger &debugger,
23                                                 const json::Value &settings,
24                                                 StringRef info_dir) {
25   llvm::Expected<const json::Object &> settings_obj =
26       json_helpers::ToObjectOrError(settings);
27   if (!settings_obj)
28     return settings_obj.takeError();
29 
30   llvm::Expected<const json::Object &> trace =
31       json_helpers::GetObjectOrError(*settings_obj, "trace");
32   if (!trace)
33     return trace.takeError();
34 
35   llvm::Expected<StringRef> type =
36       json_helpers::GetStringOrError(*trace, "type");
37   if (!type)
38     return type.takeError();
39 
40   ConstString plugin_name(*type);
41   auto create_callback = PluginManager::GetTraceCreateCallback(plugin_name);
42   if (create_callback) {
43     TraceSP instance = create_callback();
44     if (llvm::Error err =
45             instance->ParseSettings(debugger, *settings_obj, info_dir))
46       return std::move(err);
47     return instance;
48   }
49 
50   return createStringError(
51       std::errc::invalid_argument,
52       "no trace plug-in matches the specified type: \"%s\"",
53       plugin_name.AsCString());
54 }
55 
56 llvm::Expected<lldb::TraceSP> Trace::FindPlugin(StringRef name) {
57   ConstString plugin_name(name);
58   auto create_callback = PluginManager::GetTraceCreateCallback(plugin_name);
59   if (create_callback)
60     return create_callback();
61 
62   return createStringError(
63       std::errc::invalid_argument,
64       "no trace plug-in matches the specified type: \"%s\"",
65       plugin_name.AsCString());
66 }
67 
68 llvm::Error Trace::ParseSettings(Debugger &debugger,
69                                  const llvm::json::Object &settings,
70                                  llvm::StringRef settings_dir) {
71   if (llvm::Error err =
72           CreateParser()->ParseSettings(debugger, settings, settings_dir))
73     return err;
74 
75   return llvm::Error::success();
76 }
77 
78 llvm::StringRef Trace::GetSchema() { return CreateParser()->GetSchema(); }
79