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