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