1 //===-- PluginManager.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/Core/PluginManager.h"
10
11 #include "lldb/Core/Debugger.h"
12 #include "lldb/Host/FileSystem.h"
13 #include "lldb/Host/HostInfo.h"
14 #include "lldb/Interpreter/OptionValueProperties.h"
15 #include "lldb/Symbol/SaveCoreOptions.h"
16 #include "lldb/Target/Process.h"
17 #include "lldb/Utility/FileSpec.h"
18 #include "lldb/Utility/Status.h"
19 #include "lldb/Utility/StringList.h"
20 #include "llvm/ADT/StringRef.h"
21 #include "llvm/Support/DynamicLibrary.h"
22 #include "llvm/Support/FileSystem.h"
23 #include "llvm/Support/raw_ostream.h"
24 #include <cassert>
25 #include <map>
26 #include <memory>
27 #include <mutex>
28 #include <string>
29 #include <utility>
30 #include <vector>
31 #if defined(_WIN32)
32 #include "lldb/Host/windows/PosixApi.h"
33 #endif
34
35 using namespace lldb;
36 using namespace lldb_private;
37
38 typedef bool (*PluginInitCallback)();
39 typedef void (*PluginTermCallback)();
40
41 struct PluginInfo {
42 PluginInfo() = default;
43
44 llvm::sys::DynamicLibrary library;
45 PluginInitCallback plugin_init_callback = nullptr;
46 PluginTermCallback plugin_term_callback = nullptr;
47 };
48
49 typedef std::map<FileSpec, PluginInfo> PluginTerminateMap;
50
GetPluginMapMutex()51 static std::recursive_mutex &GetPluginMapMutex() {
52 static std::recursive_mutex g_plugin_map_mutex;
53 return g_plugin_map_mutex;
54 }
55
GetPluginMap()56 static PluginTerminateMap &GetPluginMap() {
57 static PluginTerminateMap g_plugin_map;
58 return g_plugin_map;
59 }
60
PluginIsLoaded(const FileSpec & plugin_file_spec)61 static bool PluginIsLoaded(const FileSpec &plugin_file_spec) {
62 std::lock_guard<std::recursive_mutex> guard(GetPluginMapMutex());
63 PluginTerminateMap &plugin_map = GetPluginMap();
64 return plugin_map.find(plugin_file_spec) != plugin_map.end();
65 }
66
SetPluginInfo(const FileSpec & plugin_file_spec,const PluginInfo & plugin_info)67 static void SetPluginInfo(const FileSpec &plugin_file_spec,
68 const PluginInfo &plugin_info) {
69 std::lock_guard<std::recursive_mutex> guard(GetPluginMapMutex());
70 PluginTerminateMap &plugin_map = GetPluginMap();
71 assert(plugin_map.find(plugin_file_spec) == plugin_map.end());
72 plugin_map[plugin_file_spec] = plugin_info;
73 }
74
CastToFPtr(void * VPtr)75 template <typename FPtrTy> static FPtrTy CastToFPtr(void *VPtr) {
76 return reinterpret_cast<FPtrTy>(VPtr);
77 }
78
79 static FileSystem::EnumerateDirectoryResult
LoadPluginCallback(void * baton,llvm::sys::fs::file_type ft,llvm::StringRef path)80 LoadPluginCallback(void *baton, llvm::sys::fs::file_type ft,
81 llvm::StringRef path) {
82 Status error;
83
84 namespace fs = llvm::sys::fs;
85 // If we have a regular file, a symbolic link or unknown file type, try and
86 // process the file. We must handle unknown as sometimes the directory
87 // enumeration might be enumerating a file system that doesn't have correct
88 // file type information.
89 if (ft == fs::file_type::regular_file || ft == fs::file_type::symlink_file ||
90 ft == fs::file_type::type_unknown) {
91 FileSpec plugin_file_spec(path);
92 FileSystem::Instance().Resolve(plugin_file_spec);
93
94 if (PluginIsLoaded(plugin_file_spec))
95 return FileSystem::eEnumerateDirectoryResultNext;
96 else {
97 PluginInfo plugin_info;
98
99 std::string pluginLoadError;
100 plugin_info.library = llvm::sys::DynamicLibrary::getPermanentLibrary(
101 plugin_file_spec.GetPath().c_str(), &pluginLoadError);
102 if (plugin_info.library.isValid()) {
103 bool success = false;
104 plugin_info.plugin_init_callback = CastToFPtr<PluginInitCallback>(
105 plugin_info.library.getAddressOfSymbol("LLDBPluginInitialize"));
106 if (plugin_info.plugin_init_callback) {
107 // Call the plug-in "bool LLDBPluginInitialize(void)" function
108 success = plugin_info.plugin_init_callback();
109 }
110
111 if (success) {
112 // It is ok for the "LLDBPluginTerminate" symbol to be nullptr
113 plugin_info.plugin_term_callback = CastToFPtr<PluginTermCallback>(
114 plugin_info.library.getAddressOfSymbol("LLDBPluginTerminate"));
115 } else {
116 // The initialize function returned FALSE which means the plug-in
117 // might not be compatible, or might be too new or too old, or might
118 // not want to run on this machine. Set it to a default-constructed
119 // instance to invalidate it.
120 plugin_info = PluginInfo();
121 }
122
123 // Regardless of success or failure, cache the plug-in load in our
124 // plug-in info so we don't try to load it again and again.
125 SetPluginInfo(plugin_file_spec, plugin_info);
126
127 return FileSystem::eEnumerateDirectoryResultNext;
128 }
129 }
130 }
131
132 if (ft == fs::file_type::directory_file ||
133 ft == fs::file_type::symlink_file || ft == fs::file_type::type_unknown) {
134 // Try and recurse into anything that a directory or symbolic link. We must
135 // also do this for unknown as sometimes the directory enumeration might be
136 // enumerating a file system that doesn't have correct file type
137 // information.
138 return FileSystem::eEnumerateDirectoryResultEnter;
139 }
140
141 return FileSystem::eEnumerateDirectoryResultNext;
142 }
143
Initialize()144 void PluginManager::Initialize() {
145 const bool find_directories = true;
146 const bool find_files = true;
147 const bool find_other = true;
148 char dir_path[PATH_MAX];
149 if (FileSpec dir_spec = HostInfo::GetSystemPluginDir()) {
150 if (FileSystem::Instance().Exists(dir_spec) &&
151 dir_spec.GetPath(dir_path, sizeof(dir_path))) {
152 FileSystem::Instance().EnumerateDirectory(dir_path, find_directories,
153 find_files, find_other,
154 LoadPluginCallback, nullptr);
155 }
156 }
157
158 if (FileSpec dir_spec = HostInfo::GetUserPluginDir()) {
159 if (FileSystem::Instance().Exists(dir_spec) &&
160 dir_spec.GetPath(dir_path, sizeof(dir_path))) {
161 FileSystem::Instance().EnumerateDirectory(dir_path, find_directories,
162 find_files, find_other,
163 LoadPluginCallback, nullptr);
164 }
165 }
166 }
167
Terminate()168 void PluginManager::Terminate() {
169 std::lock_guard<std::recursive_mutex> guard(GetPluginMapMutex());
170 PluginTerminateMap &plugin_map = GetPluginMap();
171
172 PluginTerminateMap::const_iterator pos, end = plugin_map.end();
173 for (pos = plugin_map.begin(); pos != end; ++pos) {
174 // Call the plug-in "void LLDBPluginTerminate (void)" function if there is
175 // one (if the symbol was not nullptr).
176 if (pos->second.library.isValid()) {
177 if (pos->second.plugin_term_callback)
178 pos->second.plugin_term_callback();
179 }
180 }
181 plugin_map.clear();
182 }
183
GetPluginNamespaces()184 llvm::ArrayRef<PluginNamespace> PluginManager::GetPluginNamespaces() {
185 static PluginNamespace PluginNamespaces[] = {
186
187 {
188 "abi",
189 PluginManager::GetABIPluginInfo,
190 PluginManager::SetABIPluginEnabled,
191 },
192
193 {
194 "architecture",
195 PluginManager::GetArchitecturePluginInfo,
196 PluginManager::SetArchitecturePluginEnabled,
197 },
198
199 {
200 "disassembler",
201 PluginManager::GetDisassemblerPluginInfo,
202 PluginManager::SetDisassemblerPluginEnabled,
203 },
204
205 {
206 "dynamic-loader",
207 PluginManager::GetDynamicLoaderPluginInfo,
208 PluginManager::SetDynamicLoaderPluginEnabled,
209 },
210
211 {
212 "emulate-instruction",
213 PluginManager::GetEmulateInstructionPluginInfo,
214 PluginManager::SetEmulateInstructionPluginEnabled,
215 },
216
217 {
218 "instrumentation-runtime",
219 PluginManager::GetInstrumentationRuntimePluginInfo,
220 PluginManager::SetInstrumentationRuntimePluginEnabled,
221 },
222
223 {
224 "jit-loader",
225 PluginManager::GetJITLoaderPluginInfo,
226 PluginManager::SetJITLoaderPluginEnabled,
227 },
228
229 {
230 "language",
231 PluginManager::GetLanguagePluginInfo,
232 PluginManager::SetLanguagePluginEnabled,
233 },
234
235 {
236 "language-runtime",
237 PluginManager::GetLanguageRuntimePluginInfo,
238 PluginManager::SetLanguageRuntimePluginEnabled,
239 },
240
241 {
242 "memory-history",
243 PluginManager::GetMemoryHistoryPluginInfo,
244 PluginManager::SetMemoryHistoryPluginEnabled,
245 },
246
247 {
248 "object-container",
249 PluginManager::GetObjectContainerPluginInfo,
250 PluginManager::SetObjectContainerPluginEnabled,
251 },
252
253 {
254 "object-file",
255 PluginManager::GetObjectFilePluginInfo,
256 PluginManager::SetObjectFilePluginEnabled,
257 },
258
259 {
260 "operating-system",
261 PluginManager::GetOperatingSystemPluginInfo,
262 PluginManager::SetOperatingSystemPluginEnabled,
263 },
264
265 {
266 "platform",
267 PluginManager::GetPlatformPluginInfo,
268 PluginManager::SetPlatformPluginEnabled,
269 },
270
271 {
272 "process",
273 PluginManager::GetProcessPluginInfo,
274 PluginManager::SetProcessPluginEnabled,
275 },
276
277 {
278 "repl",
279 PluginManager::GetREPLPluginInfo,
280 PluginManager::SetREPLPluginEnabled,
281 },
282
283 {
284 "register-type-builder",
285 PluginManager::GetRegisterTypeBuilderPluginInfo,
286 PluginManager::SetRegisterTypeBuilderPluginEnabled,
287 },
288
289 {
290 "script-interpreter",
291 PluginManager::GetScriptInterpreterPluginInfo,
292 PluginManager::SetScriptInterpreterPluginEnabled,
293 },
294
295 {
296 "scripted-interface",
297 PluginManager::GetScriptedInterfacePluginInfo,
298 PluginManager::SetScriptedInterfacePluginEnabled,
299 },
300
301 {
302 "structured-data",
303 PluginManager::GetStructuredDataPluginInfo,
304 PluginManager::SetStructuredDataPluginEnabled,
305 },
306
307 {
308 "symbol-file",
309 PluginManager::GetSymbolFilePluginInfo,
310 PluginManager::SetSymbolFilePluginEnabled,
311 },
312
313 {
314 "symbol-locator",
315 PluginManager::GetSymbolLocatorPluginInfo,
316 PluginManager::SetSymbolLocatorPluginEnabled,
317 },
318
319 {
320 "symbol-vendor",
321 PluginManager::GetSymbolVendorPluginInfo,
322 PluginManager::SetSymbolVendorPluginEnabled,
323 },
324
325 {
326 "system-runtime",
327 PluginManager::GetSystemRuntimePluginInfo,
328 PluginManager::SetSystemRuntimePluginEnabled,
329 },
330
331 {
332 "trace",
333 PluginManager::GetTracePluginInfo,
334 PluginManager::SetTracePluginEnabled,
335 },
336
337 {
338 "trace-exporter",
339 PluginManager::GetTraceExporterPluginInfo,
340 PluginManager::SetTraceExporterPluginEnabled,
341 },
342
343 {
344 "type-system",
345 PluginManager::GetTypeSystemPluginInfo,
346 PluginManager::SetTypeSystemPluginEnabled,
347 },
348
349 {
350 "unwind-assembly",
351 PluginManager::GetUnwindAssemblyPluginInfo,
352 PluginManager::SetUnwindAssemblyPluginEnabled,
353 },
354 };
355
356 return PluginNamespaces;
357 }
358
GetJSON(llvm::StringRef pattern)359 llvm::json::Object PluginManager::GetJSON(llvm::StringRef pattern) {
360 llvm::json::Object plugin_stats;
361
362 for (const PluginNamespace &plugin_ns : GetPluginNamespaces()) {
363 llvm::json::Array namespace_stats;
364
365 for (const RegisteredPluginInfo &plugin : plugin_ns.get_info()) {
366 if (MatchPluginName(pattern, plugin_ns, plugin)) {
367 llvm::json::Object plugin_json;
368 plugin_json.try_emplace("name", plugin.name);
369 plugin_json.try_emplace("enabled", plugin.enabled);
370 namespace_stats.emplace_back(std::move(plugin_json));
371 }
372 }
373 if (!namespace_stats.empty())
374 plugin_stats.try_emplace(plugin_ns.name, std::move(namespace_stats));
375 }
376
377 return plugin_stats;
378 }
379
MatchPluginName(llvm::StringRef pattern,const PluginNamespace & plugin_ns,const RegisteredPluginInfo & plugin_info)380 bool PluginManager::MatchPluginName(llvm::StringRef pattern,
381 const PluginNamespace &plugin_ns,
382 const RegisteredPluginInfo &plugin_info) {
383 // The empty pattern matches all plugins.
384 if (pattern.empty())
385 return true;
386
387 // Check if the pattern matches the namespace.
388 if (pattern == plugin_ns.name)
389 return true;
390
391 // Check if the pattern matches the qualified name.
392 std::string qualified_name = (plugin_ns.name + "." + plugin_info.name).str();
393 return pattern == qualified_name;
394 }
395
396 template <typename Callback> struct PluginInstance {
397 typedef Callback CallbackType;
398
399 PluginInstance() = default;
PluginInstancePluginInstance400 PluginInstance(llvm::StringRef name, llvm::StringRef description,
401 Callback create_callback,
402 DebuggerInitializeCallback debugger_init_callback = nullptr)
403 : name(name), description(description), enabled(true),
404 create_callback(create_callback),
405 debugger_init_callback(debugger_init_callback) {}
406
407 llvm::StringRef name;
408 llvm::StringRef description;
409 bool enabled;
410 Callback create_callback;
411 DebuggerInitializeCallback debugger_init_callback;
412 };
413
414 template <typename Instance> class PluginInstances {
415 public:
416 template <typename... Args>
RegisterPlugin(llvm::StringRef name,llvm::StringRef description,typename Instance::CallbackType callback,Args &&...args)417 bool RegisterPlugin(llvm::StringRef name, llvm::StringRef description,
418 typename Instance::CallbackType callback,
419 Args &&...args) {
420 if (!callback)
421 return false;
422 assert(!name.empty());
423 m_instances.emplace_back(name, description, callback,
424 std::forward<Args>(args)...);
425 return true;
426 }
427
UnregisterPlugin(typename Instance::CallbackType callback)428 bool UnregisterPlugin(typename Instance::CallbackType callback) {
429 if (!callback)
430 return false;
431 auto pos = m_instances.begin();
432 auto end = m_instances.end();
433 for (; pos != end; ++pos) {
434 if (pos->create_callback == callback) {
435 m_instances.erase(pos);
436 return true;
437 }
438 }
439 return false;
440 }
441
GetCallbackAtIndex(uint32_t idx)442 typename Instance::CallbackType GetCallbackAtIndex(uint32_t idx) {
443 if (const Instance *instance = GetInstanceAtIndex(idx))
444 return instance->create_callback;
445 return nullptr;
446 }
447
GetDescriptionAtIndex(uint32_t idx)448 llvm::StringRef GetDescriptionAtIndex(uint32_t idx) {
449 if (const Instance *instance = GetInstanceAtIndex(idx))
450 return instance->description;
451 return "";
452 }
453
GetNameAtIndex(uint32_t idx)454 llvm::StringRef GetNameAtIndex(uint32_t idx) {
455 if (const Instance *instance = GetInstanceAtIndex(idx))
456 return instance->name;
457 return "";
458 }
459
GetCallbackForName(llvm::StringRef name)460 typename Instance::CallbackType GetCallbackForName(llvm::StringRef name) {
461 if (const Instance *instance = GetInstanceForName(name))
462 return instance->create_callback;
463 return nullptr;
464 }
465
PerformDebuggerCallback(Debugger & debugger)466 void PerformDebuggerCallback(Debugger &debugger) {
467 for (const auto &instance : m_instances) {
468 if (!instance.enabled)
469 continue;
470 if (instance.debugger_init_callback)
471 instance.debugger_init_callback(debugger);
472 }
473 }
474
475 // Return a copy of all the enabled instances.
476 // Note that this is a copy of the internal state so modifications
477 // to the returned instances will not be reflected back to instances
478 // stored by the PluginInstances object.
GetSnapshot()479 std::vector<Instance> GetSnapshot() {
480 std::vector<Instance> enabled_instances;
481 for (const auto &instance : m_instances) {
482 if (instance.enabled)
483 enabled_instances.push_back(instance);
484 }
485 return enabled_instances;
486 }
487
GetInstanceAtIndex(uint32_t idx)488 const Instance *GetInstanceAtIndex(uint32_t idx) {
489 uint32_t count = 0;
490
491 return FindEnabledInstance(
492 [&](const Instance &instance) { return count++ == idx; });
493 }
494
GetInstanceForName(llvm::StringRef name)495 const Instance *GetInstanceForName(llvm::StringRef name) {
496 if (name.empty())
497 return nullptr;
498
499 return FindEnabledInstance(
500 [&](const Instance &instance) { return instance.name == name; });
501 }
502
503 const Instance *
FindEnabledInstance(std::function<bool (const Instance &)> predicate) const504 FindEnabledInstance(std::function<bool(const Instance &)> predicate) const {
505 for (const auto &instance : m_instances) {
506 if (!instance.enabled)
507 continue;
508 if (predicate(instance))
509 return &instance;
510 }
511 return nullptr;
512 }
513
514 // Return a list of all the registered plugin instances. This includes both
515 // enabled and disabled instances. The instances are listed in the order they
516 // were registered which is the order they would be queried if they were all
517 // enabled.
GetPluginInfoForAllInstances()518 std::vector<RegisteredPluginInfo> GetPluginInfoForAllInstances() {
519 // Lookup the plugin info for each instance in the sorted order.
520 std::vector<RegisteredPluginInfo> plugin_infos;
521 plugin_infos.reserve(m_instances.size());
522 for (const Instance &instance : m_instances)
523 plugin_infos.push_back(
524 {instance.name, instance.description, instance.enabled});
525
526 return plugin_infos;
527 }
528
SetInstanceEnabled(llvm::StringRef name,bool enable)529 bool SetInstanceEnabled(llvm::StringRef name, bool enable) {
530 auto it = llvm::find_if(m_instances, [&](const Instance &instance) {
531 return instance.name == name;
532 });
533
534 if (it == m_instances.end())
535 return false;
536
537 it->enabled = enable;
538 return true;
539 }
540
541 private:
542 std::vector<Instance> m_instances;
543 };
544
545 #pragma mark ABI
546
547 typedef PluginInstance<ABICreateInstance> ABIInstance;
548 typedef PluginInstances<ABIInstance> ABIInstances;
549
GetABIInstances()550 static ABIInstances &GetABIInstances() {
551 static ABIInstances g_instances;
552 return g_instances;
553 }
554
RegisterPlugin(llvm::StringRef name,llvm::StringRef description,ABICreateInstance create_callback)555 bool PluginManager::RegisterPlugin(llvm::StringRef name,
556 llvm::StringRef description,
557 ABICreateInstance create_callback) {
558 return GetABIInstances().RegisterPlugin(name, description, create_callback);
559 }
560
UnregisterPlugin(ABICreateInstance create_callback)561 bool PluginManager::UnregisterPlugin(ABICreateInstance create_callback) {
562 return GetABIInstances().UnregisterPlugin(create_callback);
563 }
564
GetABICreateCallbackAtIndex(uint32_t idx)565 ABICreateInstance PluginManager::GetABICreateCallbackAtIndex(uint32_t idx) {
566 return GetABIInstances().GetCallbackAtIndex(idx);
567 }
568
569 #pragma mark Architecture
570
571 typedef PluginInstance<ArchitectureCreateInstance> ArchitectureInstance;
572 typedef PluginInstances<ArchitectureInstance> ArchitectureInstances;
573
GetArchitectureInstances()574 static ArchitectureInstances &GetArchitectureInstances() {
575 static ArchitectureInstances g_instances;
576 return g_instances;
577 }
578
RegisterPlugin(llvm::StringRef name,llvm::StringRef description,ArchitectureCreateInstance create_callback)579 void PluginManager::RegisterPlugin(llvm::StringRef name,
580 llvm::StringRef description,
581 ArchitectureCreateInstance create_callback) {
582 GetArchitectureInstances().RegisterPlugin(name, description, create_callback);
583 }
584
UnregisterPlugin(ArchitectureCreateInstance create_callback)585 void PluginManager::UnregisterPlugin(
586 ArchitectureCreateInstance create_callback) {
587 auto &instances = GetArchitectureInstances();
588 instances.UnregisterPlugin(create_callback);
589 }
590
591 std::unique_ptr<Architecture>
CreateArchitectureInstance(const ArchSpec & arch)592 PluginManager::CreateArchitectureInstance(const ArchSpec &arch) {
593 for (const auto &instances : GetArchitectureInstances().GetSnapshot()) {
594 if (auto plugin_up = instances.create_callback(arch))
595 return plugin_up;
596 }
597 return nullptr;
598 }
599
600 #pragma mark Disassembler
601
602 typedef PluginInstance<DisassemblerCreateInstance> DisassemblerInstance;
603 typedef PluginInstances<DisassemblerInstance> DisassemblerInstances;
604
GetDisassemblerInstances()605 static DisassemblerInstances &GetDisassemblerInstances() {
606 static DisassemblerInstances g_instances;
607 return g_instances;
608 }
609
RegisterPlugin(llvm::StringRef name,llvm::StringRef description,DisassemblerCreateInstance create_callback)610 bool PluginManager::RegisterPlugin(llvm::StringRef name,
611 llvm::StringRef description,
612 DisassemblerCreateInstance create_callback) {
613 return GetDisassemblerInstances().RegisterPlugin(name, description,
614 create_callback);
615 }
616
UnregisterPlugin(DisassemblerCreateInstance create_callback)617 bool PluginManager::UnregisterPlugin(
618 DisassemblerCreateInstance create_callback) {
619 return GetDisassemblerInstances().UnregisterPlugin(create_callback);
620 }
621
622 DisassemblerCreateInstance
GetDisassemblerCreateCallbackAtIndex(uint32_t idx)623 PluginManager::GetDisassemblerCreateCallbackAtIndex(uint32_t idx) {
624 return GetDisassemblerInstances().GetCallbackAtIndex(idx);
625 }
626
627 DisassemblerCreateInstance
GetDisassemblerCreateCallbackForPluginName(llvm::StringRef name)628 PluginManager::GetDisassemblerCreateCallbackForPluginName(
629 llvm::StringRef name) {
630 return GetDisassemblerInstances().GetCallbackForName(name);
631 }
632
633 #pragma mark DynamicLoader
634
635 typedef PluginInstance<DynamicLoaderCreateInstance> DynamicLoaderInstance;
636 typedef PluginInstances<DynamicLoaderInstance> DynamicLoaderInstances;
637
GetDynamicLoaderInstances()638 static DynamicLoaderInstances &GetDynamicLoaderInstances() {
639 static DynamicLoaderInstances g_instances;
640 return g_instances;
641 }
642
RegisterPlugin(llvm::StringRef name,llvm::StringRef description,DynamicLoaderCreateInstance create_callback,DebuggerInitializeCallback debugger_init_callback)643 bool PluginManager::RegisterPlugin(
644 llvm::StringRef name, llvm::StringRef description,
645 DynamicLoaderCreateInstance create_callback,
646 DebuggerInitializeCallback debugger_init_callback) {
647 return GetDynamicLoaderInstances().RegisterPlugin(
648 name, description, create_callback, debugger_init_callback);
649 }
650
UnregisterPlugin(DynamicLoaderCreateInstance create_callback)651 bool PluginManager::UnregisterPlugin(
652 DynamicLoaderCreateInstance create_callback) {
653 return GetDynamicLoaderInstances().UnregisterPlugin(create_callback);
654 }
655
656 DynamicLoaderCreateInstance
GetDynamicLoaderCreateCallbackAtIndex(uint32_t idx)657 PluginManager::GetDynamicLoaderCreateCallbackAtIndex(uint32_t idx) {
658 return GetDynamicLoaderInstances().GetCallbackAtIndex(idx);
659 }
660
661 DynamicLoaderCreateInstance
GetDynamicLoaderCreateCallbackForPluginName(llvm::StringRef name)662 PluginManager::GetDynamicLoaderCreateCallbackForPluginName(
663 llvm::StringRef name) {
664 return GetDynamicLoaderInstances().GetCallbackForName(name);
665 }
666
667 #pragma mark JITLoader
668
669 typedef PluginInstance<JITLoaderCreateInstance> JITLoaderInstance;
670 typedef PluginInstances<JITLoaderInstance> JITLoaderInstances;
671
GetJITLoaderInstances()672 static JITLoaderInstances &GetJITLoaderInstances() {
673 static JITLoaderInstances g_instances;
674 return g_instances;
675 }
676
RegisterPlugin(llvm::StringRef name,llvm::StringRef description,JITLoaderCreateInstance create_callback,DebuggerInitializeCallback debugger_init_callback)677 bool PluginManager::RegisterPlugin(
678 llvm::StringRef name, llvm::StringRef description,
679 JITLoaderCreateInstance create_callback,
680 DebuggerInitializeCallback debugger_init_callback) {
681 return GetJITLoaderInstances().RegisterPlugin(
682 name, description, create_callback, debugger_init_callback);
683 }
684
UnregisterPlugin(JITLoaderCreateInstance create_callback)685 bool PluginManager::UnregisterPlugin(JITLoaderCreateInstance create_callback) {
686 return GetJITLoaderInstances().UnregisterPlugin(create_callback);
687 }
688
689 JITLoaderCreateInstance
GetJITLoaderCreateCallbackAtIndex(uint32_t idx)690 PluginManager::GetJITLoaderCreateCallbackAtIndex(uint32_t idx) {
691 return GetJITLoaderInstances().GetCallbackAtIndex(idx);
692 }
693
694 #pragma mark EmulateInstruction
695
696 typedef PluginInstance<EmulateInstructionCreateInstance>
697 EmulateInstructionInstance;
698 typedef PluginInstances<EmulateInstructionInstance> EmulateInstructionInstances;
699
GetEmulateInstructionInstances()700 static EmulateInstructionInstances &GetEmulateInstructionInstances() {
701 static EmulateInstructionInstances g_instances;
702 return g_instances;
703 }
704
RegisterPlugin(llvm::StringRef name,llvm::StringRef description,EmulateInstructionCreateInstance create_callback)705 bool PluginManager::RegisterPlugin(
706 llvm::StringRef name, llvm::StringRef description,
707 EmulateInstructionCreateInstance create_callback) {
708 return GetEmulateInstructionInstances().RegisterPlugin(name, description,
709 create_callback);
710 }
711
UnregisterPlugin(EmulateInstructionCreateInstance create_callback)712 bool PluginManager::UnregisterPlugin(
713 EmulateInstructionCreateInstance create_callback) {
714 return GetEmulateInstructionInstances().UnregisterPlugin(create_callback);
715 }
716
717 EmulateInstructionCreateInstance
GetEmulateInstructionCreateCallbackAtIndex(uint32_t idx)718 PluginManager::GetEmulateInstructionCreateCallbackAtIndex(uint32_t idx) {
719 return GetEmulateInstructionInstances().GetCallbackAtIndex(idx);
720 }
721
722 EmulateInstructionCreateInstance
GetEmulateInstructionCreateCallbackForPluginName(llvm::StringRef name)723 PluginManager::GetEmulateInstructionCreateCallbackForPluginName(
724 llvm::StringRef name) {
725 return GetEmulateInstructionInstances().GetCallbackForName(name);
726 }
727
728 #pragma mark OperatingSystem
729
730 typedef PluginInstance<OperatingSystemCreateInstance> OperatingSystemInstance;
731 typedef PluginInstances<OperatingSystemInstance> OperatingSystemInstances;
732
GetOperatingSystemInstances()733 static OperatingSystemInstances &GetOperatingSystemInstances() {
734 static OperatingSystemInstances g_instances;
735 return g_instances;
736 }
737
RegisterPlugin(llvm::StringRef name,llvm::StringRef description,OperatingSystemCreateInstance create_callback,DebuggerInitializeCallback debugger_init_callback)738 bool PluginManager::RegisterPlugin(
739 llvm::StringRef name, llvm::StringRef description,
740 OperatingSystemCreateInstance create_callback,
741 DebuggerInitializeCallback debugger_init_callback) {
742 return GetOperatingSystemInstances().RegisterPlugin(
743 name, description, create_callback, debugger_init_callback);
744 }
745
UnregisterPlugin(OperatingSystemCreateInstance create_callback)746 bool PluginManager::UnregisterPlugin(
747 OperatingSystemCreateInstance create_callback) {
748 return GetOperatingSystemInstances().UnregisterPlugin(create_callback);
749 }
750
751 OperatingSystemCreateInstance
GetOperatingSystemCreateCallbackAtIndex(uint32_t idx)752 PluginManager::GetOperatingSystemCreateCallbackAtIndex(uint32_t idx) {
753 return GetOperatingSystemInstances().GetCallbackAtIndex(idx);
754 }
755
756 OperatingSystemCreateInstance
GetOperatingSystemCreateCallbackForPluginName(llvm::StringRef name)757 PluginManager::GetOperatingSystemCreateCallbackForPluginName(
758 llvm::StringRef name) {
759 return GetOperatingSystemInstances().GetCallbackForName(name);
760 }
761
762 #pragma mark Language
763
764 typedef PluginInstance<LanguageCreateInstance> LanguageInstance;
765 typedef PluginInstances<LanguageInstance> LanguageInstances;
766
GetLanguageInstances()767 static LanguageInstances &GetLanguageInstances() {
768 static LanguageInstances g_instances;
769 return g_instances;
770 }
771
RegisterPlugin(llvm::StringRef name,llvm::StringRef description,LanguageCreateInstance create_callback,DebuggerInitializeCallback debugger_init_callback)772 bool PluginManager::RegisterPlugin(
773 llvm::StringRef name, llvm::StringRef description,
774 LanguageCreateInstance create_callback,
775 DebuggerInitializeCallback debugger_init_callback) {
776 return GetLanguageInstances().RegisterPlugin(
777 name, description, create_callback, debugger_init_callback);
778 }
779
UnregisterPlugin(LanguageCreateInstance create_callback)780 bool PluginManager::UnregisterPlugin(LanguageCreateInstance create_callback) {
781 return GetLanguageInstances().UnregisterPlugin(create_callback);
782 }
783
784 LanguageCreateInstance
GetLanguageCreateCallbackAtIndex(uint32_t idx)785 PluginManager::GetLanguageCreateCallbackAtIndex(uint32_t idx) {
786 return GetLanguageInstances().GetCallbackAtIndex(idx);
787 }
788
789 #pragma mark LanguageRuntime
790
791 struct LanguageRuntimeInstance
792 : public PluginInstance<LanguageRuntimeCreateInstance> {
LanguageRuntimeInstanceLanguageRuntimeInstance793 LanguageRuntimeInstance(
794 llvm::StringRef name, llvm::StringRef description,
795 CallbackType create_callback,
796 DebuggerInitializeCallback debugger_init_callback,
797 LanguageRuntimeGetCommandObject command_callback,
798 LanguageRuntimeGetExceptionPrecondition precondition_callback)
799 : PluginInstance<LanguageRuntimeCreateInstance>(
800 name, description, create_callback, debugger_init_callback),
801 command_callback(command_callback),
802 precondition_callback(precondition_callback) {}
803
804 LanguageRuntimeGetCommandObject command_callback;
805 LanguageRuntimeGetExceptionPrecondition precondition_callback;
806 };
807
808 typedef PluginInstances<LanguageRuntimeInstance> LanguageRuntimeInstances;
809
GetLanguageRuntimeInstances()810 static LanguageRuntimeInstances &GetLanguageRuntimeInstances() {
811 static LanguageRuntimeInstances g_instances;
812 return g_instances;
813 }
814
RegisterPlugin(llvm::StringRef name,llvm::StringRef description,LanguageRuntimeCreateInstance create_callback,LanguageRuntimeGetCommandObject command_callback,LanguageRuntimeGetExceptionPrecondition precondition_callback)815 bool PluginManager::RegisterPlugin(
816 llvm::StringRef name, llvm::StringRef description,
817 LanguageRuntimeCreateInstance create_callback,
818 LanguageRuntimeGetCommandObject command_callback,
819 LanguageRuntimeGetExceptionPrecondition precondition_callback) {
820 return GetLanguageRuntimeInstances().RegisterPlugin(
821 name, description, create_callback, nullptr, command_callback,
822 precondition_callback);
823 }
824
UnregisterPlugin(LanguageRuntimeCreateInstance create_callback)825 bool PluginManager::UnregisterPlugin(
826 LanguageRuntimeCreateInstance create_callback) {
827 return GetLanguageRuntimeInstances().UnregisterPlugin(create_callback);
828 }
829
830 LanguageRuntimeCreateInstance
GetLanguageRuntimeCreateCallbackAtIndex(uint32_t idx)831 PluginManager::GetLanguageRuntimeCreateCallbackAtIndex(uint32_t idx) {
832 return GetLanguageRuntimeInstances().GetCallbackAtIndex(idx);
833 }
834
835 LanguageRuntimeGetCommandObject
GetLanguageRuntimeGetCommandObjectAtIndex(uint32_t idx)836 PluginManager::GetLanguageRuntimeGetCommandObjectAtIndex(uint32_t idx) {
837 if (auto instance = GetLanguageRuntimeInstances().GetInstanceAtIndex(idx))
838 return instance->command_callback;
839 return nullptr;
840 }
841
842 LanguageRuntimeGetExceptionPrecondition
GetLanguageRuntimeGetExceptionPreconditionAtIndex(uint32_t idx)843 PluginManager::GetLanguageRuntimeGetExceptionPreconditionAtIndex(uint32_t idx) {
844 if (auto instance = GetLanguageRuntimeInstances().GetInstanceAtIndex(idx))
845 return instance->precondition_callback;
846 return nullptr;
847 }
848
849 #pragma mark SystemRuntime
850
851 typedef PluginInstance<SystemRuntimeCreateInstance> SystemRuntimeInstance;
852 typedef PluginInstances<SystemRuntimeInstance> SystemRuntimeInstances;
853
GetSystemRuntimeInstances()854 static SystemRuntimeInstances &GetSystemRuntimeInstances() {
855 static SystemRuntimeInstances g_instances;
856 return g_instances;
857 }
858
RegisterPlugin(llvm::StringRef name,llvm::StringRef description,SystemRuntimeCreateInstance create_callback)859 bool PluginManager::RegisterPlugin(
860 llvm::StringRef name, llvm::StringRef description,
861 SystemRuntimeCreateInstance create_callback) {
862 return GetSystemRuntimeInstances().RegisterPlugin(name, description,
863 create_callback);
864 }
865
UnregisterPlugin(SystemRuntimeCreateInstance create_callback)866 bool PluginManager::UnregisterPlugin(
867 SystemRuntimeCreateInstance create_callback) {
868 return GetSystemRuntimeInstances().UnregisterPlugin(create_callback);
869 }
870
871 SystemRuntimeCreateInstance
GetSystemRuntimeCreateCallbackAtIndex(uint32_t idx)872 PluginManager::GetSystemRuntimeCreateCallbackAtIndex(uint32_t idx) {
873 return GetSystemRuntimeInstances().GetCallbackAtIndex(idx);
874 }
875
876 #pragma mark ObjectFile
877
878 struct ObjectFileInstance : public PluginInstance<ObjectFileCreateInstance> {
ObjectFileInstanceObjectFileInstance879 ObjectFileInstance(
880 llvm::StringRef name, llvm::StringRef description,
881 CallbackType create_callback,
882 ObjectFileCreateMemoryInstance create_memory_callback,
883 ObjectFileGetModuleSpecifications get_module_specifications,
884 ObjectFileSaveCore save_core,
885 DebuggerInitializeCallback debugger_init_callback)
886 : PluginInstance<ObjectFileCreateInstance>(
887 name, description, create_callback, debugger_init_callback),
888 create_memory_callback(create_memory_callback),
889 get_module_specifications(get_module_specifications),
890 save_core(save_core) {}
891
892 ObjectFileCreateMemoryInstance create_memory_callback;
893 ObjectFileGetModuleSpecifications get_module_specifications;
894 ObjectFileSaveCore save_core;
895 };
896 typedef PluginInstances<ObjectFileInstance> ObjectFileInstances;
897
GetObjectFileInstances()898 static ObjectFileInstances &GetObjectFileInstances() {
899 static ObjectFileInstances g_instances;
900 return g_instances;
901 }
902
IsRegisteredObjectFilePluginName(llvm::StringRef name)903 bool PluginManager::IsRegisteredObjectFilePluginName(llvm::StringRef name) {
904 if (name.empty())
905 return false;
906
907 return GetObjectFileInstances().GetInstanceForName(name) != nullptr;
908 }
909
RegisterPlugin(llvm::StringRef name,llvm::StringRef description,ObjectFileCreateInstance create_callback,ObjectFileCreateMemoryInstance create_memory_callback,ObjectFileGetModuleSpecifications get_module_specifications,ObjectFileSaveCore save_core,DebuggerInitializeCallback debugger_init_callback)910 bool PluginManager::RegisterPlugin(
911 llvm::StringRef name, llvm::StringRef description,
912 ObjectFileCreateInstance create_callback,
913 ObjectFileCreateMemoryInstance create_memory_callback,
914 ObjectFileGetModuleSpecifications get_module_specifications,
915 ObjectFileSaveCore save_core,
916 DebuggerInitializeCallback debugger_init_callback) {
917 return GetObjectFileInstances().RegisterPlugin(
918 name, description, create_callback, create_memory_callback,
919 get_module_specifications, save_core, debugger_init_callback);
920 }
921
UnregisterPlugin(ObjectFileCreateInstance create_callback)922 bool PluginManager::UnregisterPlugin(ObjectFileCreateInstance create_callback) {
923 return GetObjectFileInstances().UnregisterPlugin(create_callback);
924 }
925
926 ObjectFileCreateInstance
GetObjectFileCreateCallbackAtIndex(uint32_t idx)927 PluginManager::GetObjectFileCreateCallbackAtIndex(uint32_t idx) {
928 return GetObjectFileInstances().GetCallbackAtIndex(idx);
929 }
930
931 ObjectFileCreateMemoryInstance
GetObjectFileCreateMemoryCallbackAtIndex(uint32_t idx)932 PluginManager::GetObjectFileCreateMemoryCallbackAtIndex(uint32_t idx) {
933 if (auto instance = GetObjectFileInstances().GetInstanceAtIndex(idx))
934 return instance->create_memory_callback;
935 return nullptr;
936 }
937
938 ObjectFileGetModuleSpecifications
GetObjectFileGetModuleSpecificationsCallbackAtIndex(uint32_t idx)939 PluginManager::GetObjectFileGetModuleSpecificationsCallbackAtIndex(
940 uint32_t idx) {
941 if (auto instance = GetObjectFileInstances().GetInstanceAtIndex(idx))
942 return instance->get_module_specifications;
943 return nullptr;
944 }
945
946 ObjectFileCreateMemoryInstance
GetObjectFileCreateMemoryCallbackForPluginName(llvm::StringRef name)947 PluginManager::GetObjectFileCreateMemoryCallbackForPluginName(
948 llvm::StringRef name) {
949 if (auto instance = GetObjectFileInstances().GetInstanceForName(name))
950 return instance->create_memory_callback;
951 return nullptr;
952 }
953
SaveCore(const lldb::ProcessSP & process_sp,lldb_private::SaveCoreOptions & options)954 Status PluginManager::SaveCore(const lldb::ProcessSP &process_sp,
955 lldb_private::SaveCoreOptions &options) {
956 Status error;
957 if (!options.GetOutputFile()) {
958 error = Status::FromErrorString("No output file specified");
959 return error;
960 }
961
962 if (!process_sp) {
963 error = Status::FromErrorString("Invalid process");
964 return error;
965 }
966
967 error = options.EnsureValidConfiguration(process_sp);
968 if (error.Fail())
969 return error;
970
971 if (!options.GetPluginName().has_value()) {
972 // Try saving core directly from the process plugin first.
973 llvm::Expected<bool> ret =
974 process_sp->SaveCore(options.GetOutputFile()->GetPath());
975 if (!ret)
976 return Status::FromError(ret.takeError());
977 if (ret.get())
978 return Status();
979 }
980
981 // Fall back to object plugins.
982 const auto &plugin_name = options.GetPluginName().value_or("");
983 auto instances = GetObjectFileInstances().GetSnapshot();
984 for (auto &instance : instances) {
985 if (plugin_name.empty() || instance.name == plugin_name) {
986 if (instance.save_core && instance.save_core(process_sp, options, error))
987 return error;
988 }
989 }
990
991 // Check to see if any of the object file plugins tried and failed to save.
992 // if any failure, return the error message.
993 if (error.Fail())
994 return error;
995
996 // Report only for the plugin that was specified.
997 if (!plugin_name.empty())
998 return Status::FromErrorStringWithFormatv(
999 "The \"{}\" plugin is not able to save a core for this process.",
1000 plugin_name);
1001
1002 return Status::FromErrorString(
1003 "no ObjectFile plugins were able to save a core for this process");
1004 }
1005
GetSaveCorePluginNames()1006 std::vector<llvm::StringRef> PluginManager::GetSaveCorePluginNames() {
1007 std::vector<llvm::StringRef> plugin_names;
1008 auto instances = GetObjectFileInstances().GetSnapshot();
1009 for (auto &instance : instances) {
1010 if (instance.save_core)
1011 plugin_names.emplace_back(instance.name);
1012 }
1013 return plugin_names;
1014 }
1015
1016 #pragma mark ObjectContainer
1017
1018 struct ObjectContainerInstance
1019 : public PluginInstance<ObjectContainerCreateInstance> {
ObjectContainerInstanceObjectContainerInstance1020 ObjectContainerInstance(
1021 llvm::StringRef name, llvm::StringRef description,
1022 CallbackType create_callback,
1023 ObjectContainerCreateMemoryInstance create_memory_callback,
1024 ObjectFileGetModuleSpecifications get_module_specifications)
1025 : PluginInstance<ObjectContainerCreateInstance>(name, description,
1026 create_callback),
1027 create_memory_callback(create_memory_callback),
1028 get_module_specifications(get_module_specifications) {}
1029
1030 ObjectContainerCreateMemoryInstance create_memory_callback;
1031 ObjectFileGetModuleSpecifications get_module_specifications;
1032 };
1033 typedef PluginInstances<ObjectContainerInstance> ObjectContainerInstances;
1034
GetObjectContainerInstances()1035 static ObjectContainerInstances &GetObjectContainerInstances() {
1036 static ObjectContainerInstances g_instances;
1037 return g_instances;
1038 }
1039
RegisterPlugin(llvm::StringRef name,llvm::StringRef description,ObjectContainerCreateInstance create_callback,ObjectFileGetModuleSpecifications get_module_specifications,ObjectContainerCreateMemoryInstance create_memory_callback)1040 bool PluginManager::RegisterPlugin(
1041 llvm::StringRef name, llvm::StringRef description,
1042 ObjectContainerCreateInstance create_callback,
1043 ObjectFileGetModuleSpecifications get_module_specifications,
1044 ObjectContainerCreateMemoryInstance create_memory_callback) {
1045 return GetObjectContainerInstances().RegisterPlugin(
1046 name, description, create_callback, create_memory_callback,
1047 get_module_specifications);
1048 }
1049
UnregisterPlugin(ObjectContainerCreateInstance create_callback)1050 bool PluginManager::UnregisterPlugin(
1051 ObjectContainerCreateInstance create_callback) {
1052 return GetObjectContainerInstances().UnregisterPlugin(create_callback);
1053 }
1054
1055 ObjectContainerCreateInstance
GetObjectContainerCreateCallbackAtIndex(uint32_t idx)1056 PluginManager::GetObjectContainerCreateCallbackAtIndex(uint32_t idx) {
1057 return GetObjectContainerInstances().GetCallbackAtIndex(idx);
1058 }
1059
1060 ObjectContainerCreateMemoryInstance
GetObjectContainerCreateMemoryCallbackAtIndex(uint32_t idx)1061 PluginManager::GetObjectContainerCreateMemoryCallbackAtIndex(uint32_t idx) {
1062 if (auto instance = GetObjectContainerInstances().GetInstanceAtIndex(idx))
1063 return instance->create_memory_callback;
1064 return nullptr;
1065 }
1066
1067 ObjectFileGetModuleSpecifications
GetObjectContainerGetModuleSpecificationsCallbackAtIndex(uint32_t idx)1068 PluginManager::GetObjectContainerGetModuleSpecificationsCallbackAtIndex(
1069 uint32_t idx) {
1070 if (auto instance = GetObjectContainerInstances().GetInstanceAtIndex(idx))
1071 return instance->get_module_specifications;
1072 return nullptr;
1073 }
1074
1075 #pragma mark Platform
1076
1077 typedef PluginInstance<PlatformCreateInstance> PlatformInstance;
1078 typedef PluginInstances<PlatformInstance> PlatformInstances;
1079
GetPlatformInstances()1080 static PlatformInstances &GetPlatformInstances() {
1081 static PlatformInstances g_platform_instances;
1082 return g_platform_instances;
1083 }
1084
RegisterPlugin(llvm::StringRef name,llvm::StringRef description,PlatformCreateInstance create_callback,DebuggerInitializeCallback debugger_init_callback)1085 bool PluginManager::RegisterPlugin(
1086 llvm::StringRef name, llvm::StringRef description,
1087 PlatformCreateInstance create_callback,
1088 DebuggerInitializeCallback debugger_init_callback) {
1089 return GetPlatformInstances().RegisterPlugin(
1090 name, description, create_callback, debugger_init_callback);
1091 }
1092
UnregisterPlugin(PlatformCreateInstance create_callback)1093 bool PluginManager::UnregisterPlugin(PlatformCreateInstance create_callback) {
1094 return GetPlatformInstances().UnregisterPlugin(create_callback);
1095 }
1096
GetPlatformPluginNameAtIndex(uint32_t idx)1097 llvm::StringRef PluginManager::GetPlatformPluginNameAtIndex(uint32_t idx) {
1098 return GetPlatformInstances().GetNameAtIndex(idx);
1099 }
1100
1101 llvm::StringRef
GetPlatformPluginDescriptionAtIndex(uint32_t idx)1102 PluginManager::GetPlatformPluginDescriptionAtIndex(uint32_t idx) {
1103 return GetPlatformInstances().GetDescriptionAtIndex(idx);
1104 }
1105
1106 PlatformCreateInstance
GetPlatformCreateCallbackAtIndex(uint32_t idx)1107 PluginManager::GetPlatformCreateCallbackAtIndex(uint32_t idx) {
1108 return GetPlatformInstances().GetCallbackAtIndex(idx);
1109 }
1110
1111 PlatformCreateInstance
GetPlatformCreateCallbackForPluginName(llvm::StringRef name)1112 PluginManager::GetPlatformCreateCallbackForPluginName(llvm::StringRef name) {
1113 return GetPlatformInstances().GetCallbackForName(name);
1114 }
1115
AutoCompletePlatformName(llvm::StringRef name,CompletionRequest & request)1116 void PluginManager::AutoCompletePlatformName(llvm::StringRef name,
1117 CompletionRequest &request) {
1118 for (const auto &instance : GetPlatformInstances().GetSnapshot()) {
1119 if (instance.name.starts_with(name))
1120 request.AddCompletion(instance.name);
1121 }
1122 }
1123
1124 #pragma mark Process
1125
1126 typedef PluginInstance<ProcessCreateInstance> ProcessInstance;
1127 typedef PluginInstances<ProcessInstance> ProcessInstances;
1128
GetProcessInstances()1129 static ProcessInstances &GetProcessInstances() {
1130 static ProcessInstances g_instances;
1131 return g_instances;
1132 }
1133
RegisterPlugin(llvm::StringRef name,llvm::StringRef description,ProcessCreateInstance create_callback,DebuggerInitializeCallback debugger_init_callback)1134 bool PluginManager::RegisterPlugin(
1135 llvm::StringRef name, llvm::StringRef description,
1136 ProcessCreateInstance create_callback,
1137 DebuggerInitializeCallback debugger_init_callback) {
1138 return GetProcessInstances().RegisterPlugin(
1139 name, description, create_callback, debugger_init_callback);
1140 }
1141
UnregisterPlugin(ProcessCreateInstance create_callback)1142 bool PluginManager::UnregisterPlugin(ProcessCreateInstance create_callback) {
1143 return GetProcessInstances().UnregisterPlugin(create_callback);
1144 }
1145
GetProcessPluginNameAtIndex(uint32_t idx)1146 llvm::StringRef PluginManager::GetProcessPluginNameAtIndex(uint32_t idx) {
1147 return GetProcessInstances().GetNameAtIndex(idx);
1148 }
1149
GetProcessPluginDescriptionAtIndex(uint32_t idx)1150 llvm::StringRef PluginManager::GetProcessPluginDescriptionAtIndex(uint32_t idx) {
1151 return GetProcessInstances().GetDescriptionAtIndex(idx);
1152 }
1153
1154 ProcessCreateInstance
GetProcessCreateCallbackAtIndex(uint32_t idx)1155 PluginManager::GetProcessCreateCallbackAtIndex(uint32_t idx) {
1156 return GetProcessInstances().GetCallbackAtIndex(idx);
1157 }
1158
1159 ProcessCreateInstance
GetProcessCreateCallbackForPluginName(llvm::StringRef name)1160 PluginManager::GetProcessCreateCallbackForPluginName(llvm::StringRef name) {
1161 return GetProcessInstances().GetCallbackForName(name);
1162 }
1163
AutoCompleteProcessName(llvm::StringRef name,CompletionRequest & request)1164 void PluginManager::AutoCompleteProcessName(llvm::StringRef name,
1165 CompletionRequest &request) {
1166 for (const auto &instance : GetProcessInstances().GetSnapshot()) {
1167 if (instance.name.starts_with(name))
1168 request.AddCompletion(instance.name, instance.description);
1169 }
1170 }
1171
1172 #pragma mark ProtocolServer
1173
1174 typedef PluginInstance<ProtocolServerCreateInstance> ProtocolServerInstance;
1175 typedef PluginInstances<ProtocolServerInstance> ProtocolServerInstances;
1176
GetProtocolServerInstances()1177 static ProtocolServerInstances &GetProtocolServerInstances() {
1178 static ProtocolServerInstances g_instances;
1179 return g_instances;
1180 }
1181
RegisterPlugin(llvm::StringRef name,llvm::StringRef description,ProtocolServerCreateInstance create_callback)1182 bool PluginManager::RegisterPlugin(
1183 llvm::StringRef name, llvm::StringRef description,
1184 ProtocolServerCreateInstance create_callback) {
1185 return GetProtocolServerInstances().RegisterPlugin(name, description,
1186 create_callback);
1187 }
1188
UnregisterPlugin(ProtocolServerCreateInstance create_callback)1189 bool PluginManager::UnregisterPlugin(
1190 ProtocolServerCreateInstance create_callback) {
1191 return GetProtocolServerInstances().UnregisterPlugin(create_callback);
1192 }
1193
1194 llvm::StringRef
GetProtocolServerPluginNameAtIndex(uint32_t idx)1195 PluginManager::GetProtocolServerPluginNameAtIndex(uint32_t idx) {
1196 return GetProtocolServerInstances().GetNameAtIndex(idx);
1197 }
1198
1199 ProtocolServerCreateInstance
GetProtocolCreateCallbackForPluginName(llvm::StringRef name)1200 PluginManager::GetProtocolCreateCallbackForPluginName(llvm::StringRef name) {
1201 return GetProtocolServerInstances().GetCallbackForName(name);
1202 }
1203
1204 #pragma mark RegisterTypeBuilder
1205
1206 struct RegisterTypeBuilderInstance
1207 : public PluginInstance<RegisterTypeBuilderCreateInstance> {
RegisterTypeBuilderInstanceRegisterTypeBuilderInstance1208 RegisterTypeBuilderInstance(llvm::StringRef name, llvm::StringRef description,
1209 CallbackType create_callback)
1210 : PluginInstance<RegisterTypeBuilderCreateInstance>(name, description,
1211 create_callback) {}
1212 };
1213
1214 typedef PluginInstances<RegisterTypeBuilderInstance>
1215 RegisterTypeBuilderInstances;
1216
GetRegisterTypeBuilderInstances()1217 static RegisterTypeBuilderInstances &GetRegisterTypeBuilderInstances() {
1218 static RegisterTypeBuilderInstances g_instances;
1219 return g_instances;
1220 }
1221
RegisterPlugin(llvm::StringRef name,llvm::StringRef description,RegisterTypeBuilderCreateInstance create_callback)1222 bool PluginManager::RegisterPlugin(
1223 llvm::StringRef name, llvm::StringRef description,
1224 RegisterTypeBuilderCreateInstance create_callback) {
1225 return GetRegisterTypeBuilderInstances().RegisterPlugin(name, description,
1226 create_callback);
1227 }
1228
UnregisterPlugin(RegisterTypeBuilderCreateInstance create_callback)1229 bool PluginManager::UnregisterPlugin(
1230 RegisterTypeBuilderCreateInstance create_callback) {
1231 return GetRegisterTypeBuilderInstances().UnregisterPlugin(create_callback);
1232 }
1233
1234 lldb::RegisterTypeBuilderSP
GetRegisterTypeBuilder(Target & target)1235 PluginManager::GetRegisterTypeBuilder(Target &target) {
1236 // We assume that RegisterTypeBuilderClang is the only instance of this plugin
1237 // type and is always present.
1238 auto instance = GetRegisterTypeBuilderInstances().GetInstanceAtIndex(0);
1239 assert(instance);
1240 return instance->create_callback(target);
1241 }
1242
1243 #pragma mark ScriptInterpreter
1244
1245 struct ScriptInterpreterInstance
1246 : public PluginInstance<ScriptInterpreterCreateInstance> {
ScriptInterpreterInstanceScriptInterpreterInstance1247 ScriptInterpreterInstance(llvm::StringRef name, llvm::StringRef description,
1248 CallbackType create_callback,
1249 lldb::ScriptLanguage language)
1250 : PluginInstance<ScriptInterpreterCreateInstance>(name, description,
1251 create_callback),
1252 language(language) {}
1253
1254 lldb::ScriptLanguage language = lldb::eScriptLanguageNone;
1255 };
1256
1257 typedef PluginInstances<ScriptInterpreterInstance> ScriptInterpreterInstances;
1258
GetScriptInterpreterInstances()1259 static ScriptInterpreterInstances &GetScriptInterpreterInstances() {
1260 static ScriptInterpreterInstances g_instances;
1261 return g_instances;
1262 }
1263
RegisterPlugin(llvm::StringRef name,llvm::StringRef description,lldb::ScriptLanguage script_language,ScriptInterpreterCreateInstance create_callback)1264 bool PluginManager::RegisterPlugin(
1265 llvm::StringRef name, llvm::StringRef description,
1266 lldb::ScriptLanguage script_language,
1267 ScriptInterpreterCreateInstance create_callback) {
1268 return GetScriptInterpreterInstances().RegisterPlugin(
1269 name, description, create_callback, script_language);
1270 }
1271
UnregisterPlugin(ScriptInterpreterCreateInstance create_callback)1272 bool PluginManager::UnregisterPlugin(
1273 ScriptInterpreterCreateInstance create_callback) {
1274 return GetScriptInterpreterInstances().UnregisterPlugin(create_callback);
1275 }
1276
1277 ScriptInterpreterCreateInstance
GetScriptInterpreterCreateCallbackAtIndex(uint32_t idx)1278 PluginManager::GetScriptInterpreterCreateCallbackAtIndex(uint32_t idx) {
1279 return GetScriptInterpreterInstances().GetCallbackAtIndex(idx);
1280 }
1281
1282 lldb::ScriptInterpreterSP
GetScriptInterpreterForLanguage(lldb::ScriptLanguage script_lang,Debugger & debugger)1283 PluginManager::GetScriptInterpreterForLanguage(lldb::ScriptLanguage script_lang,
1284 Debugger &debugger) {
1285 const auto instances = GetScriptInterpreterInstances().GetSnapshot();
1286 ScriptInterpreterCreateInstance none_instance = nullptr;
1287 for (const auto &instance : instances) {
1288 if (instance.language == lldb::eScriptLanguageNone)
1289 none_instance = instance.create_callback;
1290
1291 if (script_lang == instance.language)
1292 return instance.create_callback(debugger);
1293 }
1294
1295 // If we didn't find one, return the ScriptInterpreter for the null language.
1296 assert(none_instance != nullptr);
1297 return none_instance(debugger);
1298 }
1299
1300 #pragma mark StructuredDataPlugin
1301
1302 struct StructuredDataPluginInstance
1303 : public PluginInstance<StructuredDataPluginCreateInstance> {
StructuredDataPluginInstanceStructuredDataPluginInstance1304 StructuredDataPluginInstance(
1305 llvm::StringRef name, llvm::StringRef description,
1306 CallbackType create_callback,
1307 DebuggerInitializeCallback debugger_init_callback,
1308 StructuredDataFilterLaunchInfo filter_callback)
1309 : PluginInstance<StructuredDataPluginCreateInstance>(
1310 name, description, create_callback, debugger_init_callback),
1311 filter_callback(filter_callback) {}
1312
1313 StructuredDataFilterLaunchInfo filter_callback = nullptr;
1314 };
1315
1316 typedef PluginInstances<StructuredDataPluginInstance>
1317 StructuredDataPluginInstances;
1318
GetStructuredDataPluginInstances()1319 static StructuredDataPluginInstances &GetStructuredDataPluginInstances() {
1320 static StructuredDataPluginInstances g_instances;
1321 return g_instances;
1322 }
1323
RegisterPlugin(llvm::StringRef name,llvm::StringRef description,StructuredDataPluginCreateInstance create_callback,DebuggerInitializeCallback debugger_init_callback,StructuredDataFilterLaunchInfo filter_callback)1324 bool PluginManager::RegisterPlugin(
1325 llvm::StringRef name, llvm::StringRef description,
1326 StructuredDataPluginCreateInstance create_callback,
1327 DebuggerInitializeCallback debugger_init_callback,
1328 StructuredDataFilterLaunchInfo filter_callback) {
1329 return GetStructuredDataPluginInstances().RegisterPlugin(
1330 name, description, create_callback, debugger_init_callback,
1331 filter_callback);
1332 }
1333
UnregisterPlugin(StructuredDataPluginCreateInstance create_callback)1334 bool PluginManager::UnregisterPlugin(
1335 StructuredDataPluginCreateInstance create_callback) {
1336 return GetStructuredDataPluginInstances().UnregisterPlugin(create_callback);
1337 }
1338
1339 StructuredDataPluginCreateInstance
GetStructuredDataPluginCreateCallbackAtIndex(uint32_t idx)1340 PluginManager::GetStructuredDataPluginCreateCallbackAtIndex(uint32_t idx) {
1341 return GetStructuredDataPluginInstances().GetCallbackAtIndex(idx);
1342 }
1343
1344 StructuredDataFilterLaunchInfo
GetStructuredDataFilterCallbackAtIndex(uint32_t idx,bool & iteration_complete)1345 PluginManager::GetStructuredDataFilterCallbackAtIndex(
1346 uint32_t idx, bool &iteration_complete) {
1347 if (auto instance =
1348 GetStructuredDataPluginInstances().GetInstanceAtIndex(idx)) {
1349 iteration_complete = false;
1350 return instance->filter_callback;
1351 }
1352 iteration_complete = true;
1353 return nullptr;
1354 }
1355
1356 #pragma mark SymbolFile
1357
1358 typedef PluginInstance<SymbolFileCreateInstance> SymbolFileInstance;
1359 typedef PluginInstances<SymbolFileInstance> SymbolFileInstances;
1360
GetSymbolFileInstances()1361 static SymbolFileInstances &GetSymbolFileInstances() {
1362 static SymbolFileInstances g_instances;
1363 return g_instances;
1364 }
1365
RegisterPlugin(llvm::StringRef name,llvm::StringRef description,SymbolFileCreateInstance create_callback,DebuggerInitializeCallback debugger_init_callback)1366 bool PluginManager::RegisterPlugin(
1367 llvm::StringRef name, llvm::StringRef description,
1368 SymbolFileCreateInstance create_callback,
1369 DebuggerInitializeCallback debugger_init_callback) {
1370 return GetSymbolFileInstances().RegisterPlugin(
1371 name, description, create_callback, debugger_init_callback);
1372 }
1373
UnregisterPlugin(SymbolFileCreateInstance create_callback)1374 bool PluginManager::UnregisterPlugin(SymbolFileCreateInstance create_callback) {
1375 return GetSymbolFileInstances().UnregisterPlugin(create_callback);
1376 }
1377
1378 SymbolFileCreateInstance
GetSymbolFileCreateCallbackAtIndex(uint32_t idx)1379 PluginManager::GetSymbolFileCreateCallbackAtIndex(uint32_t idx) {
1380 return GetSymbolFileInstances().GetCallbackAtIndex(idx);
1381 }
1382
1383 #pragma mark SymbolVendor
1384
1385 typedef PluginInstance<SymbolVendorCreateInstance> SymbolVendorInstance;
1386 typedef PluginInstances<SymbolVendorInstance> SymbolVendorInstances;
1387
GetSymbolVendorInstances()1388 static SymbolVendorInstances &GetSymbolVendorInstances() {
1389 static SymbolVendorInstances g_instances;
1390 return g_instances;
1391 }
1392
RegisterPlugin(llvm::StringRef name,llvm::StringRef description,SymbolVendorCreateInstance create_callback)1393 bool PluginManager::RegisterPlugin(llvm::StringRef name,
1394 llvm::StringRef description,
1395 SymbolVendorCreateInstance create_callback) {
1396 return GetSymbolVendorInstances().RegisterPlugin(name, description,
1397 create_callback);
1398 }
1399
UnregisterPlugin(SymbolVendorCreateInstance create_callback)1400 bool PluginManager::UnregisterPlugin(
1401 SymbolVendorCreateInstance create_callback) {
1402 return GetSymbolVendorInstances().UnregisterPlugin(create_callback);
1403 }
1404
1405 SymbolVendorCreateInstance
GetSymbolVendorCreateCallbackAtIndex(uint32_t idx)1406 PluginManager::GetSymbolVendorCreateCallbackAtIndex(uint32_t idx) {
1407 return GetSymbolVendorInstances().GetCallbackAtIndex(idx);
1408 }
1409
1410 #pragma mark SymbolLocator
1411
1412 struct SymbolLocatorInstance
1413 : public PluginInstance<SymbolLocatorCreateInstance> {
SymbolLocatorInstanceSymbolLocatorInstance1414 SymbolLocatorInstance(
1415 llvm::StringRef name, llvm::StringRef description,
1416 CallbackType create_callback,
1417 SymbolLocatorLocateExecutableObjectFile locate_executable_object_file,
1418 SymbolLocatorLocateExecutableSymbolFile locate_executable_symbol_file,
1419 SymbolLocatorDownloadObjectAndSymbolFile download_object_symbol_file,
1420 SymbolLocatorFindSymbolFileInBundle find_symbol_file_in_bundle,
1421 DebuggerInitializeCallback debugger_init_callback)
1422 : PluginInstance<SymbolLocatorCreateInstance>(
1423 name, description, create_callback, debugger_init_callback),
1424 locate_executable_object_file(locate_executable_object_file),
1425 locate_executable_symbol_file(locate_executable_symbol_file),
1426 download_object_symbol_file(download_object_symbol_file),
1427 find_symbol_file_in_bundle(find_symbol_file_in_bundle) {}
1428
1429 SymbolLocatorLocateExecutableObjectFile locate_executable_object_file;
1430 SymbolLocatorLocateExecutableSymbolFile locate_executable_symbol_file;
1431 SymbolLocatorDownloadObjectAndSymbolFile download_object_symbol_file;
1432 SymbolLocatorFindSymbolFileInBundle find_symbol_file_in_bundle;
1433 };
1434 typedef PluginInstances<SymbolLocatorInstance> SymbolLocatorInstances;
1435
GetSymbolLocatorInstances()1436 static SymbolLocatorInstances &GetSymbolLocatorInstances() {
1437 static SymbolLocatorInstances g_instances;
1438 return g_instances;
1439 }
1440
RegisterPlugin(llvm::StringRef name,llvm::StringRef description,SymbolLocatorCreateInstance create_callback,SymbolLocatorLocateExecutableObjectFile locate_executable_object_file,SymbolLocatorLocateExecutableSymbolFile locate_executable_symbol_file,SymbolLocatorDownloadObjectAndSymbolFile download_object_symbol_file,SymbolLocatorFindSymbolFileInBundle find_symbol_file_in_bundle,DebuggerInitializeCallback debugger_init_callback)1441 bool PluginManager::RegisterPlugin(
1442 llvm::StringRef name, llvm::StringRef description,
1443 SymbolLocatorCreateInstance create_callback,
1444 SymbolLocatorLocateExecutableObjectFile locate_executable_object_file,
1445 SymbolLocatorLocateExecutableSymbolFile locate_executable_symbol_file,
1446 SymbolLocatorDownloadObjectAndSymbolFile download_object_symbol_file,
1447 SymbolLocatorFindSymbolFileInBundle find_symbol_file_in_bundle,
1448 DebuggerInitializeCallback debugger_init_callback) {
1449 return GetSymbolLocatorInstances().RegisterPlugin(
1450 name, description, create_callback, locate_executable_object_file,
1451 locate_executable_symbol_file, download_object_symbol_file,
1452 find_symbol_file_in_bundle, debugger_init_callback);
1453 }
1454
UnregisterPlugin(SymbolLocatorCreateInstance create_callback)1455 bool PluginManager::UnregisterPlugin(
1456 SymbolLocatorCreateInstance create_callback) {
1457 return GetSymbolLocatorInstances().UnregisterPlugin(create_callback);
1458 }
1459
1460 SymbolLocatorCreateInstance
GetSymbolLocatorCreateCallbackAtIndex(uint32_t idx)1461 PluginManager::GetSymbolLocatorCreateCallbackAtIndex(uint32_t idx) {
1462 return GetSymbolLocatorInstances().GetCallbackAtIndex(idx);
1463 }
1464
1465 ModuleSpec
LocateExecutableObjectFile(const ModuleSpec & module_spec,StatisticsMap & map)1466 PluginManager::LocateExecutableObjectFile(const ModuleSpec &module_spec,
1467 StatisticsMap &map) {
1468 auto instances = GetSymbolLocatorInstances().GetSnapshot();
1469 for (auto &instance : instances) {
1470 if (instance.locate_executable_object_file) {
1471 StatsDuration time;
1472 std::optional<ModuleSpec> result;
1473 {
1474 ElapsedTime elapsed(time);
1475 result = instance.locate_executable_object_file(module_spec);
1476 }
1477 map.add(instance.name, time.get().count());
1478 if (result)
1479 return *result;
1480 }
1481 }
1482 return {};
1483 }
1484
LocateExecutableSymbolFile(const ModuleSpec & module_spec,const FileSpecList & default_search_paths,StatisticsMap & map)1485 FileSpec PluginManager::LocateExecutableSymbolFile(
1486 const ModuleSpec &module_spec, const FileSpecList &default_search_paths,
1487 StatisticsMap &map) {
1488 auto instances = GetSymbolLocatorInstances().GetSnapshot();
1489 for (auto &instance : instances) {
1490 if (instance.locate_executable_symbol_file) {
1491 StatsDuration time;
1492 std::optional<FileSpec> result;
1493 {
1494 ElapsedTime elapsed(time);
1495 result = instance.locate_executable_symbol_file(module_spec,
1496 default_search_paths);
1497 }
1498 map.add(instance.name, time.get().count());
1499 if (result)
1500 return *result;
1501 }
1502 }
1503 return {};
1504 }
1505
DownloadObjectAndSymbolFile(ModuleSpec & module_spec,Status & error,bool force_lookup,bool copy_executable)1506 bool PluginManager::DownloadObjectAndSymbolFile(ModuleSpec &module_spec,
1507 Status &error,
1508 bool force_lookup,
1509 bool copy_executable) {
1510 auto instances = GetSymbolLocatorInstances().GetSnapshot();
1511 for (auto &instance : instances) {
1512 if (instance.download_object_symbol_file) {
1513 if (instance.download_object_symbol_file(module_spec, error, force_lookup,
1514 copy_executable))
1515 return true;
1516 }
1517 }
1518 return false;
1519 }
1520
FindSymbolFileInBundle(const FileSpec & symfile_bundle,const UUID * uuid,const ArchSpec * arch)1521 FileSpec PluginManager::FindSymbolFileInBundle(const FileSpec &symfile_bundle,
1522 const UUID *uuid,
1523 const ArchSpec *arch) {
1524 auto instances = GetSymbolLocatorInstances().GetSnapshot();
1525 for (auto &instance : instances) {
1526 if (instance.find_symbol_file_in_bundle) {
1527 std::optional<FileSpec> result =
1528 instance.find_symbol_file_in_bundle(symfile_bundle, uuid, arch);
1529 if (result)
1530 return *result;
1531 }
1532 }
1533 return {};
1534 }
1535
1536 #pragma mark Trace
1537
1538 struct TraceInstance
1539 : public PluginInstance<TraceCreateInstanceFromBundle> {
TraceInstanceTraceInstance1540 TraceInstance(
1541 llvm::StringRef name, llvm::StringRef description,
1542 CallbackType create_callback_from_bundle,
1543 TraceCreateInstanceForLiveProcess create_callback_for_live_process,
1544 llvm::StringRef schema, DebuggerInitializeCallback debugger_init_callback)
1545 : PluginInstance<TraceCreateInstanceFromBundle>(
1546 name, description, create_callback_from_bundle,
1547 debugger_init_callback),
1548 schema(schema),
1549 create_callback_for_live_process(create_callback_for_live_process) {}
1550
1551 llvm::StringRef schema;
1552 TraceCreateInstanceForLiveProcess create_callback_for_live_process;
1553 };
1554
1555 typedef PluginInstances<TraceInstance> TraceInstances;
1556
GetTracePluginInstances()1557 static TraceInstances &GetTracePluginInstances() {
1558 static TraceInstances g_instances;
1559 return g_instances;
1560 }
1561
RegisterPlugin(llvm::StringRef name,llvm::StringRef description,TraceCreateInstanceFromBundle create_callback_from_bundle,TraceCreateInstanceForLiveProcess create_callback_for_live_process,llvm::StringRef schema,DebuggerInitializeCallback debugger_init_callback)1562 bool PluginManager::RegisterPlugin(
1563 llvm::StringRef name, llvm::StringRef description,
1564 TraceCreateInstanceFromBundle create_callback_from_bundle,
1565 TraceCreateInstanceForLiveProcess create_callback_for_live_process,
1566 llvm::StringRef schema, DebuggerInitializeCallback debugger_init_callback) {
1567 return GetTracePluginInstances().RegisterPlugin(
1568 name, description, create_callback_from_bundle,
1569 create_callback_for_live_process, schema, debugger_init_callback);
1570 }
1571
UnregisterPlugin(TraceCreateInstanceFromBundle create_callback_from_bundle)1572 bool PluginManager::UnregisterPlugin(
1573 TraceCreateInstanceFromBundle create_callback_from_bundle) {
1574 return GetTracePluginInstances().UnregisterPlugin(
1575 create_callback_from_bundle);
1576 }
1577
1578 TraceCreateInstanceFromBundle
GetTraceCreateCallback(llvm::StringRef plugin_name)1579 PluginManager::GetTraceCreateCallback(llvm::StringRef plugin_name) {
1580 return GetTracePluginInstances().GetCallbackForName(plugin_name);
1581 }
1582
1583 TraceCreateInstanceForLiveProcess
GetTraceCreateCallbackForLiveProcess(llvm::StringRef plugin_name)1584 PluginManager::GetTraceCreateCallbackForLiveProcess(llvm::StringRef plugin_name) {
1585 if (auto instance = GetTracePluginInstances().GetInstanceForName(plugin_name))
1586 return instance->create_callback_for_live_process;
1587
1588 return nullptr;
1589 }
1590
GetTraceSchema(llvm::StringRef plugin_name)1591 llvm::StringRef PluginManager::GetTraceSchema(llvm::StringRef plugin_name) {
1592 if (auto instance = GetTracePluginInstances().GetInstanceForName(plugin_name))
1593 return instance->schema;
1594 return llvm::StringRef();
1595 }
1596
GetTraceSchema(size_t index)1597 llvm::StringRef PluginManager::GetTraceSchema(size_t index) {
1598 if (const TraceInstance *instance =
1599 GetTracePluginInstances().GetInstanceAtIndex(index))
1600 return instance->schema;
1601 return llvm::StringRef();
1602 }
1603
1604 #pragma mark TraceExporter
1605
1606 struct TraceExporterInstance
1607 : public PluginInstance<TraceExporterCreateInstance> {
TraceExporterInstanceTraceExporterInstance1608 TraceExporterInstance(
1609 llvm::StringRef name, llvm::StringRef description,
1610 TraceExporterCreateInstance create_instance,
1611 ThreadTraceExportCommandCreator create_thread_trace_export_command)
1612 : PluginInstance<TraceExporterCreateInstance>(name, description,
1613 create_instance),
1614 create_thread_trace_export_command(create_thread_trace_export_command) {
1615 }
1616
1617 ThreadTraceExportCommandCreator create_thread_trace_export_command;
1618 };
1619
1620 typedef PluginInstances<TraceExporterInstance> TraceExporterInstances;
1621
GetTraceExporterInstances()1622 static TraceExporterInstances &GetTraceExporterInstances() {
1623 static TraceExporterInstances g_instances;
1624 return g_instances;
1625 }
1626
RegisterPlugin(llvm::StringRef name,llvm::StringRef description,TraceExporterCreateInstance create_callback,ThreadTraceExportCommandCreator create_thread_trace_export_command)1627 bool PluginManager::RegisterPlugin(
1628 llvm::StringRef name, llvm::StringRef description,
1629 TraceExporterCreateInstance create_callback,
1630 ThreadTraceExportCommandCreator create_thread_trace_export_command) {
1631 return GetTraceExporterInstances().RegisterPlugin(
1632 name, description, create_callback, create_thread_trace_export_command);
1633 }
1634
1635 TraceExporterCreateInstance
GetTraceExporterCreateCallback(llvm::StringRef plugin_name)1636 PluginManager::GetTraceExporterCreateCallback(llvm::StringRef plugin_name) {
1637 return GetTraceExporterInstances().GetCallbackForName(plugin_name);
1638 }
1639
UnregisterPlugin(TraceExporterCreateInstance create_callback)1640 bool PluginManager::UnregisterPlugin(
1641 TraceExporterCreateInstance create_callback) {
1642 return GetTraceExporterInstances().UnregisterPlugin(create_callback);
1643 }
1644
1645 ThreadTraceExportCommandCreator
GetThreadTraceExportCommandCreatorAtIndex(uint32_t index)1646 PluginManager::GetThreadTraceExportCommandCreatorAtIndex(uint32_t index) {
1647 if (const TraceExporterInstance *instance =
1648 GetTraceExporterInstances().GetInstanceAtIndex(index))
1649 return instance->create_thread_trace_export_command;
1650 return nullptr;
1651 }
1652
1653 llvm::StringRef
GetTraceExporterPluginNameAtIndex(uint32_t index)1654 PluginManager::GetTraceExporterPluginNameAtIndex(uint32_t index) {
1655 return GetTraceExporterInstances().GetNameAtIndex(index);
1656 }
1657
1658 #pragma mark UnwindAssembly
1659
1660 typedef PluginInstance<UnwindAssemblyCreateInstance> UnwindAssemblyInstance;
1661 typedef PluginInstances<UnwindAssemblyInstance> UnwindAssemblyInstances;
1662
GetUnwindAssemblyInstances()1663 static UnwindAssemblyInstances &GetUnwindAssemblyInstances() {
1664 static UnwindAssemblyInstances g_instances;
1665 return g_instances;
1666 }
1667
RegisterPlugin(llvm::StringRef name,llvm::StringRef description,UnwindAssemblyCreateInstance create_callback)1668 bool PluginManager::RegisterPlugin(
1669 llvm::StringRef name, llvm::StringRef description,
1670 UnwindAssemblyCreateInstance create_callback) {
1671 return GetUnwindAssemblyInstances().RegisterPlugin(name, description,
1672 create_callback);
1673 }
1674
UnregisterPlugin(UnwindAssemblyCreateInstance create_callback)1675 bool PluginManager::UnregisterPlugin(
1676 UnwindAssemblyCreateInstance create_callback) {
1677 return GetUnwindAssemblyInstances().UnregisterPlugin(create_callback);
1678 }
1679
1680 UnwindAssemblyCreateInstance
GetUnwindAssemblyCreateCallbackAtIndex(uint32_t idx)1681 PluginManager::GetUnwindAssemblyCreateCallbackAtIndex(uint32_t idx) {
1682 return GetUnwindAssemblyInstances().GetCallbackAtIndex(idx);
1683 }
1684
1685 #pragma mark MemoryHistory
1686
1687 typedef PluginInstance<MemoryHistoryCreateInstance> MemoryHistoryInstance;
1688 typedef PluginInstances<MemoryHistoryInstance> MemoryHistoryInstances;
1689
GetMemoryHistoryInstances()1690 static MemoryHistoryInstances &GetMemoryHistoryInstances() {
1691 static MemoryHistoryInstances g_instances;
1692 return g_instances;
1693 }
1694
RegisterPlugin(llvm::StringRef name,llvm::StringRef description,MemoryHistoryCreateInstance create_callback)1695 bool PluginManager::RegisterPlugin(
1696 llvm::StringRef name, llvm::StringRef description,
1697 MemoryHistoryCreateInstance create_callback) {
1698 return GetMemoryHistoryInstances().RegisterPlugin(name, description,
1699 create_callback);
1700 }
1701
UnregisterPlugin(MemoryHistoryCreateInstance create_callback)1702 bool PluginManager::UnregisterPlugin(
1703 MemoryHistoryCreateInstance create_callback) {
1704 return GetMemoryHistoryInstances().UnregisterPlugin(create_callback);
1705 }
1706
1707 MemoryHistoryCreateInstance
GetMemoryHistoryCreateCallbackAtIndex(uint32_t idx)1708 PluginManager::GetMemoryHistoryCreateCallbackAtIndex(uint32_t idx) {
1709 return GetMemoryHistoryInstances().GetCallbackAtIndex(idx);
1710 }
1711
1712 #pragma mark InstrumentationRuntime
1713
1714 struct InstrumentationRuntimeInstance
1715 : public PluginInstance<InstrumentationRuntimeCreateInstance> {
InstrumentationRuntimeInstanceInstrumentationRuntimeInstance1716 InstrumentationRuntimeInstance(
1717 llvm::StringRef name, llvm::StringRef description,
1718 CallbackType create_callback,
1719 InstrumentationRuntimeGetType get_type_callback)
1720 : PluginInstance<InstrumentationRuntimeCreateInstance>(name, description,
1721 create_callback),
1722 get_type_callback(get_type_callback) {}
1723
1724 InstrumentationRuntimeGetType get_type_callback = nullptr;
1725 };
1726
1727 typedef PluginInstances<InstrumentationRuntimeInstance>
1728 InstrumentationRuntimeInstances;
1729
GetInstrumentationRuntimeInstances()1730 static InstrumentationRuntimeInstances &GetInstrumentationRuntimeInstances() {
1731 static InstrumentationRuntimeInstances g_instances;
1732 return g_instances;
1733 }
1734
RegisterPlugin(llvm::StringRef name,llvm::StringRef description,InstrumentationRuntimeCreateInstance create_callback,InstrumentationRuntimeGetType get_type_callback)1735 bool PluginManager::RegisterPlugin(
1736 llvm::StringRef name, llvm::StringRef description,
1737 InstrumentationRuntimeCreateInstance create_callback,
1738 InstrumentationRuntimeGetType get_type_callback) {
1739 return GetInstrumentationRuntimeInstances().RegisterPlugin(
1740 name, description, create_callback, get_type_callback);
1741 }
1742
UnregisterPlugin(InstrumentationRuntimeCreateInstance create_callback)1743 bool PluginManager::UnregisterPlugin(
1744 InstrumentationRuntimeCreateInstance create_callback) {
1745 return GetInstrumentationRuntimeInstances().UnregisterPlugin(create_callback);
1746 }
1747
1748 InstrumentationRuntimeGetType
GetInstrumentationRuntimeGetTypeCallbackAtIndex(uint32_t idx)1749 PluginManager::GetInstrumentationRuntimeGetTypeCallbackAtIndex(uint32_t idx) {
1750 if (auto instance =
1751 GetInstrumentationRuntimeInstances().GetInstanceAtIndex(idx))
1752 return instance->get_type_callback;
1753 return nullptr;
1754 }
1755
1756 InstrumentationRuntimeCreateInstance
GetInstrumentationRuntimeCreateCallbackAtIndex(uint32_t idx)1757 PluginManager::GetInstrumentationRuntimeCreateCallbackAtIndex(uint32_t idx) {
1758 return GetInstrumentationRuntimeInstances().GetCallbackAtIndex(idx);
1759 }
1760
1761 #pragma mark TypeSystem
1762
1763 struct TypeSystemInstance : public PluginInstance<TypeSystemCreateInstance> {
TypeSystemInstanceTypeSystemInstance1764 TypeSystemInstance(llvm::StringRef name, llvm::StringRef description,
1765 CallbackType create_callback,
1766 LanguageSet supported_languages_for_types,
1767 LanguageSet supported_languages_for_expressions)
1768 : PluginInstance<TypeSystemCreateInstance>(name, description,
1769 create_callback),
1770 supported_languages_for_types(supported_languages_for_types),
1771 supported_languages_for_expressions(
1772 supported_languages_for_expressions) {}
1773
1774 LanguageSet supported_languages_for_types;
1775 LanguageSet supported_languages_for_expressions;
1776 };
1777
1778 typedef PluginInstances<TypeSystemInstance> TypeSystemInstances;
1779
GetTypeSystemInstances()1780 static TypeSystemInstances &GetTypeSystemInstances() {
1781 static TypeSystemInstances g_instances;
1782 return g_instances;
1783 }
1784
RegisterPlugin(llvm::StringRef name,llvm::StringRef description,TypeSystemCreateInstance create_callback,LanguageSet supported_languages_for_types,LanguageSet supported_languages_for_expressions)1785 bool PluginManager::RegisterPlugin(
1786 llvm::StringRef name, llvm::StringRef description,
1787 TypeSystemCreateInstance create_callback,
1788 LanguageSet supported_languages_for_types,
1789 LanguageSet supported_languages_for_expressions) {
1790 return GetTypeSystemInstances().RegisterPlugin(
1791 name, description, create_callback, supported_languages_for_types,
1792 supported_languages_for_expressions);
1793 }
1794
UnregisterPlugin(TypeSystemCreateInstance create_callback)1795 bool PluginManager::UnregisterPlugin(TypeSystemCreateInstance create_callback) {
1796 return GetTypeSystemInstances().UnregisterPlugin(create_callback);
1797 }
1798
1799 TypeSystemCreateInstance
GetTypeSystemCreateCallbackAtIndex(uint32_t idx)1800 PluginManager::GetTypeSystemCreateCallbackAtIndex(uint32_t idx) {
1801 return GetTypeSystemInstances().GetCallbackAtIndex(idx);
1802 }
1803
GetAllTypeSystemSupportedLanguagesForTypes()1804 LanguageSet PluginManager::GetAllTypeSystemSupportedLanguagesForTypes() {
1805 const auto instances = GetTypeSystemInstances().GetSnapshot();
1806 LanguageSet all;
1807 for (unsigned i = 0; i < instances.size(); ++i)
1808 all.bitvector |= instances[i].supported_languages_for_types.bitvector;
1809 return all;
1810 }
1811
GetAllTypeSystemSupportedLanguagesForExpressions()1812 LanguageSet PluginManager::GetAllTypeSystemSupportedLanguagesForExpressions() {
1813 const auto instances = GetTypeSystemInstances().GetSnapshot();
1814 LanguageSet all;
1815 for (unsigned i = 0; i < instances.size(); ++i)
1816 all.bitvector |= instances[i].supported_languages_for_expressions.bitvector;
1817 return all;
1818 }
1819
1820 #pragma mark ScriptedInterfaces
1821
1822 struct ScriptedInterfaceInstance
1823 : public PluginInstance<ScriptedInterfaceCreateInstance> {
ScriptedInterfaceInstanceScriptedInterfaceInstance1824 ScriptedInterfaceInstance(llvm::StringRef name, llvm::StringRef description,
1825 ScriptedInterfaceCreateInstance create_callback,
1826 lldb::ScriptLanguage language,
1827 ScriptedInterfaceUsages usages)
1828 : PluginInstance<ScriptedInterfaceCreateInstance>(name, description,
1829 create_callback),
1830 language(language), usages(usages) {}
1831
1832 lldb::ScriptLanguage language;
1833 ScriptedInterfaceUsages usages;
1834 };
1835
1836 typedef PluginInstances<ScriptedInterfaceInstance> ScriptedInterfaceInstances;
1837
GetScriptedInterfaceInstances()1838 static ScriptedInterfaceInstances &GetScriptedInterfaceInstances() {
1839 static ScriptedInterfaceInstances g_instances;
1840 return g_instances;
1841 }
1842
RegisterPlugin(llvm::StringRef name,llvm::StringRef description,ScriptedInterfaceCreateInstance create_callback,lldb::ScriptLanguage language,ScriptedInterfaceUsages usages)1843 bool PluginManager::RegisterPlugin(
1844 llvm::StringRef name, llvm::StringRef description,
1845 ScriptedInterfaceCreateInstance create_callback,
1846 lldb::ScriptLanguage language, ScriptedInterfaceUsages usages) {
1847 return GetScriptedInterfaceInstances().RegisterPlugin(
1848 name, description, create_callback, language, usages);
1849 }
1850
UnregisterPlugin(ScriptedInterfaceCreateInstance create_callback)1851 bool PluginManager::UnregisterPlugin(
1852 ScriptedInterfaceCreateInstance create_callback) {
1853 return GetScriptedInterfaceInstances().UnregisterPlugin(create_callback);
1854 }
1855
GetNumScriptedInterfaces()1856 uint32_t PluginManager::GetNumScriptedInterfaces() {
1857 return GetScriptedInterfaceInstances().GetSnapshot().size();
1858 }
1859
GetScriptedInterfaceNameAtIndex(uint32_t index)1860 llvm::StringRef PluginManager::GetScriptedInterfaceNameAtIndex(uint32_t index) {
1861 return GetScriptedInterfaceInstances().GetNameAtIndex(index);
1862 }
1863
1864 llvm::StringRef
GetScriptedInterfaceDescriptionAtIndex(uint32_t index)1865 PluginManager::GetScriptedInterfaceDescriptionAtIndex(uint32_t index) {
1866 return GetScriptedInterfaceInstances().GetDescriptionAtIndex(index);
1867 }
1868
1869 lldb::ScriptLanguage
GetScriptedInterfaceLanguageAtIndex(uint32_t idx)1870 PluginManager::GetScriptedInterfaceLanguageAtIndex(uint32_t idx) {
1871 if (auto instance = GetScriptedInterfaceInstances().GetInstanceAtIndex(idx))
1872 return instance->language;
1873 return ScriptLanguage::eScriptLanguageNone;
1874 }
1875
1876 ScriptedInterfaceUsages
GetScriptedInterfaceUsagesAtIndex(uint32_t idx)1877 PluginManager::GetScriptedInterfaceUsagesAtIndex(uint32_t idx) {
1878 if (auto instance = GetScriptedInterfaceInstances().GetInstanceAtIndex(idx))
1879 return instance->usages;
1880 return {};
1881 }
1882
1883 #pragma mark REPL
1884
1885 struct REPLInstance : public PluginInstance<REPLCreateInstance> {
REPLInstanceREPLInstance1886 REPLInstance(llvm::StringRef name, llvm::StringRef description,
1887 CallbackType create_callback, LanguageSet supported_languages)
1888 : PluginInstance<REPLCreateInstance>(name, description, create_callback),
1889 supported_languages(supported_languages) {}
1890
1891 LanguageSet supported_languages;
1892 };
1893
1894 typedef PluginInstances<REPLInstance> REPLInstances;
1895
GetREPLInstances()1896 static REPLInstances &GetREPLInstances() {
1897 static REPLInstances g_instances;
1898 return g_instances;
1899 }
1900
RegisterPlugin(llvm::StringRef name,llvm::StringRef description,REPLCreateInstance create_callback,LanguageSet supported_languages)1901 bool PluginManager::RegisterPlugin(llvm::StringRef name, llvm::StringRef description,
1902 REPLCreateInstance create_callback,
1903 LanguageSet supported_languages) {
1904 return GetREPLInstances().RegisterPlugin(name, description, create_callback,
1905 supported_languages);
1906 }
1907
UnregisterPlugin(REPLCreateInstance create_callback)1908 bool PluginManager::UnregisterPlugin(REPLCreateInstance create_callback) {
1909 return GetREPLInstances().UnregisterPlugin(create_callback);
1910 }
1911
GetREPLCreateCallbackAtIndex(uint32_t idx)1912 REPLCreateInstance PluginManager::GetREPLCreateCallbackAtIndex(uint32_t idx) {
1913 return GetREPLInstances().GetCallbackAtIndex(idx);
1914 }
1915
GetREPLSupportedLanguagesAtIndex(uint32_t idx)1916 LanguageSet PluginManager::GetREPLSupportedLanguagesAtIndex(uint32_t idx) {
1917 if (auto instance = GetREPLInstances().GetInstanceAtIndex(idx))
1918 return instance->supported_languages;
1919 return LanguageSet();
1920 }
1921
GetREPLAllTypeSystemSupportedLanguages()1922 LanguageSet PluginManager::GetREPLAllTypeSystemSupportedLanguages() {
1923 const auto instances = GetREPLInstances().GetSnapshot();
1924 LanguageSet all;
1925 for (unsigned i = 0; i < instances.size(); ++i)
1926 all.bitvector |= instances[i].supported_languages.bitvector;
1927 return all;
1928 }
1929
1930 #pragma mark PluginManager
1931
DebuggerInitialize(Debugger & debugger)1932 void PluginManager::DebuggerInitialize(Debugger &debugger) {
1933 GetDynamicLoaderInstances().PerformDebuggerCallback(debugger);
1934 GetJITLoaderInstances().PerformDebuggerCallback(debugger);
1935 GetObjectFileInstances().PerformDebuggerCallback(debugger);
1936 GetPlatformInstances().PerformDebuggerCallback(debugger);
1937 GetProcessInstances().PerformDebuggerCallback(debugger);
1938 GetSymbolFileInstances().PerformDebuggerCallback(debugger);
1939 GetSymbolLocatorInstances().PerformDebuggerCallback(debugger);
1940 GetOperatingSystemInstances().PerformDebuggerCallback(debugger);
1941 GetStructuredDataPluginInstances().PerformDebuggerCallback(debugger);
1942 GetTracePluginInstances().PerformDebuggerCallback(debugger);
1943 GetScriptedInterfaceInstances().PerformDebuggerCallback(debugger);
1944 GetLanguageInstances().PerformDebuggerCallback(debugger);
1945 }
1946
1947 // This is the preferred new way to register plugin specific settings. e.g.
1948 // This will put a plugin's settings under e.g.
1949 // "plugin.<plugin_type_name>.<plugin_type_desc>.SETTINGNAME".
1950 static lldb::OptionValuePropertiesSP
GetDebuggerPropertyForPlugins(Debugger & debugger,llvm::StringRef plugin_type_name,llvm::StringRef plugin_type_desc,bool can_create)1951 GetDebuggerPropertyForPlugins(Debugger &debugger, llvm::StringRef plugin_type_name,
1952 llvm::StringRef plugin_type_desc,
1953 bool can_create) {
1954 lldb::OptionValuePropertiesSP parent_properties_sp(
1955 debugger.GetValueProperties());
1956 if (parent_properties_sp) {
1957 static constexpr llvm::StringLiteral g_property_name("plugin");
1958
1959 OptionValuePropertiesSP plugin_properties_sp =
1960 parent_properties_sp->GetSubProperty(nullptr, g_property_name);
1961 if (!plugin_properties_sp && can_create) {
1962 plugin_properties_sp =
1963 std::make_shared<OptionValueProperties>(g_property_name);
1964 parent_properties_sp->AppendProperty(g_property_name,
1965 "Settings specify to plugins.", true,
1966 plugin_properties_sp);
1967 }
1968
1969 if (plugin_properties_sp) {
1970 lldb::OptionValuePropertiesSP plugin_type_properties_sp =
1971 plugin_properties_sp->GetSubProperty(nullptr, plugin_type_name);
1972 if (!plugin_type_properties_sp && can_create) {
1973 plugin_type_properties_sp =
1974 std::make_shared<OptionValueProperties>(plugin_type_name);
1975 plugin_properties_sp->AppendProperty(plugin_type_name, plugin_type_desc,
1976 true, plugin_type_properties_sp);
1977 }
1978 return plugin_type_properties_sp;
1979 }
1980 }
1981 return lldb::OptionValuePropertiesSP();
1982 }
1983
1984 // This is deprecated way to register plugin specific settings. e.g.
1985 // "<plugin_type_name>.plugin.<plugin_type_desc>.SETTINGNAME" and Platform
1986 // generic settings would be under "platform.SETTINGNAME".
GetDebuggerPropertyForPluginsOldStyle(Debugger & debugger,llvm::StringRef plugin_type_name,llvm::StringRef plugin_type_desc,bool can_create)1987 static lldb::OptionValuePropertiesSP GetDebuggerPropertyForPluginsOldStyle(
1988 Debugger &debugger, llvm::StringRef plugin_type_name,
1989 llvm::StringRef plugin_type_desc, bool can_create) {
1990 static constexpr llvm::StringLiteral g_property_name("plugin");
1991 lldb::OptionValuePropertiesSP parent_properties_sp(
1992 debugger.GetValueProperties());
1993 if (parent_properties_sp) {
1994 OptionValuePropertiesSP plugin_properties_sp =
1995 parent_properties_sp->GetSubProperty(nullptr, plugin_type_name);
1996 if (!plugin_properties_sp && can_create) {
1997 plugin_properties_sp =
1998 std::make_shared<OptionValueProperties>(plugin_type_name);
1999 parent_properties_sp->AppendProperty(plugin_type_name, plugin_type_desc,
2000 true, plugin_properties_sp);
2001 }
2002
2003 if (plugin_properties_sp) {
2004 lldb::OptionValuePropertiesSP plugin_type_properties_sp =
2005 plugin_properties_sp->GetSubProperty(nullptr, g_property_name);
2006 if (!plugin_type_properties_sp && can_create) {
2007 plugin_type_properties_sp =
2008 std::make_shared<OptionValueProperties>(g_property_name);
2009 plugin_properties_sp->AppendProperty(g_property_name,
2010 "Settings specific to plugins",
2011 true, plugin_type_properties_sp);
2012 }
2013 return plugin_type_properties_sp;
2014 }
2015 }
2016 return lldb::OptionValuePropertiesSP();
2017 }
2018
2019 namespace {
2020
2021 typedef lldb::OptionValuePropertiesSP
2022 GetDebuggerPropertyForPluginsPtr(Debugger &, llvm::StringRef, llvm::StringRef,
2023 bool can_create);
2024 }
2025
2026 static lldb::OptionValuePropertiesSP
GetSettingForPlugin(Debugger & debugger,llvm::StringRef setting_name,llvm::StringRef plugin_type_name,GetDebuggerPropertyForPluginsPtr get_debugger_property=GetDebuggerPropertyForPlugins)2027 GetSettingForPlugin(Debugger &debugger, llvm::StringRef setting_name,
2028 llvm::StringRef plugin_type_name,
2029 GetDebuggerPropertyForPluginsPtr get_debugger_property =
2030 GetDebuggerPropertyForPlugins) {
2031 lldb::OptionValuePropertiesSP properties_sp;
2032 lldb::OptionValuePropertiesSP plugin_type_properties_sp(get_debugger_property(
2033 debugger, plugin_type_name,
2034 "", // not creating to so we don't need the description
2035 false));
2036 if (plugin_type_properties_sp)
2037 properties_sp =
2038 plugin_type_properties_sp->GetSubProperty(nullptr, setting_name);
2039 return properties_sp;
2040 }
2041
2042 static bool
CreateSettingForPlugin(Debugger & debugger,llvm::StringRef plugin_type_name,llvm::StringRef plugin_type_desc,const lldb::OptionValuePropertiesSP & properties_sp,llvm::StringRef description,bool is_global_property,GetDebuggerPropertyForPluginsPtr get_debugger_property=GetDebuggerPropertyForPlugins)2043 CreateSettingForPlugin(Debugger &debugger, llvm::StringRef plugin_type_name,
2044 llvm::StringRef plugin_type_desc,
2045 const lldb::OptionValuePropertiesSP &properties_sp,
2046 llvm::StringRef description, bool is_global_property,
2047 GetDebuggerPropertyForPluginsPtr get_debugger_property =
2048 GetDebuggerPropertyForPlugins) {
2049 if (properties_sp) {
2050 lldb::OptionValuePropertiesSP plugin_type_properties_sp(
2051 get_debugger_property(debugger, plugin_type_name, plugin_type_desc,
2052 true));
2053 if (plugin_type_properties_sp) {
2054 plugin_type_properties_sp->AppendProperty(properties_sp->GetName(),
2055 description, is_global_property,
2056 properties_sp);
2057 return true;
2058 }
2059 }
2060 return false;
2061 }
2062
2063 static constexpr llvm::StringLiteral kDynamicLoaderPluginName("dynamic-loader");
2064 static constexpr llvm::StringLiteral kPlatformPluginName("platform");
2065 static constexpr llvm::StringLiteral kProcessPluginName("process");
2066 static constexpr llvm::StringLiteral kTracePluginName("trace");
2067 static constexpr llvm::StringLiteral kObjectFilePluginName("object-file");
2068 static constexpr llvm::StringLiteral kSymbolFilePluginName("symbol-file");
2069 static constexpr llvm::StringLiteral kSymbolLocatorPluginName("symbol-locator");
2070 static constexpr llvm::StringLiteral kJITLoaderPluginName("jit-loader");
2071 static constexpr llvm::StringLiteral
2072 kStructuredDataPluginName("structured-data");
2073 static constexpr llvm::StringLiteral kCPlusPlusLanguagePlugin("cplusplus");
2074
2075 lldb::OptionValuePropertiesSP
GetSettingForDynamicLoaderPlugin(Debugger & debugger,llvm::StringRef setting_name)2076 PluginManager::GetSettingForDynamicLoaderPlugin(Debugger &debugger,
2077 llvm::StringRef setting_name) {
2078 return GetSettingForPlugin(debugger, setting_name, kDynamicLoaderPluginName);
2079 }
2080
CreateSettingForDynamicLoaderPlugin(Debugger & debugger,const lldb::OptionValuePropertiesSP & properties_sp,llvm::StringRef description,bool is_global_property)2081 bool PluginManager::CreateSettingForDynamicLoaderPlugin(
2082 Debugger &debugger, const lldb::OptionValuePropertiesSP &properties_sp,
2083 llvm::StringRef description, bool is_global_property) {
2084 return CreateSettingForPlugin(debugger, kDynamicLoaderPluginName,
2085 "Settings for dynamic loader plug-ins",
2086 properties_sp, description, is_global_property);
2087 }
2088
2089 lldb::OptionValuePropertiesSP
GetSettingForPlatformPlugin(Debugger & debugger,llvm::StringRef setting_name)2090 PluginManager::GetSettingForPlatformPlugin(Debugger &debugger,
2091 llvm::StringRef setting_name) {
2092 return GetSettingForPlugin(debugger, setting_name, kPlatformPluginName,
2093 GetDebuggerPropertyForPluginsOldStyle);
2094 }
2095
CreateSettingForPlatformPlugin(Debugger & debugger,const lldb::OptionValuePropertiesSP & properties_sp,llvm::StringRef description,bool is_global_property)2096 bool PluginManager::CreateSettingForPlatformPlugin(
2097 Debugger &debugger, const lldb::OptionValuePropertiesSP &properties_sp,
2098 llvm::StringRef description, bool is_global_property) {
2099 return CreateSettingForPlugin(debugger, kPlatformPluginName,
2100 "Settings for platform plug-ins", properties_sp,
2101 description, is_global_property,
2102 GetDebuggerPropertyForPluginsOldStyle);
2103 }
2104
2105 lldb::OptionValuePropertiesSP
GetSettingForProcessPlugin(Debugger & debugger,llvm::StringRef setting_name)2106 PluginManager::GetSettingForProcessPlugin(Debugger &debugger,
2107 llvm::StringRef setting_name) {
2108 return GetSettingForPlugin(debugger, setting_name, kProcessPluginName);
2109 }
2110
CreateSettingForProcessPlugin(Debugger & debugger,const lldb::OptionValuePropertiesSP & properties_sp,llvm::StringRef description,bool is_global_property)2111 bool PluginManager::CreateSettingForProcessPlugin(
2112 Debugger &debugger, const lldb::OptionValuePropertiesSP &properties_sp,
2113 llvm::StringRef description, bool is_global_property) {
2114 return CreateSettingForPlugin(debugger, kProcessPluginName,
2115 "Settings for process plug-ins", properties_sp,
2116 description, is_global_property);
2117 }
2118
2119 lldb::OptionValuePropertiesSP
GetSettingForSymbolLocatorPlugin(Debugger & debugger,llvm::StringRef setting_name)2120 PluginManager::GetSettingForSymbolLocatorPlugin(Debugger &debugger,
2121 llvm::StringRef setting_name) {
2122 return GetSettingForPlugin(debugger, setting_name, kSymbolLocatorPluginName);
2123 }
2124
CreateSettingForSymbolLocatorPlugin(Debugger & debugger,const lldb::OptionValuePropertiesSP & properties_sp,llvm::StringRef description,bool is_global_property)2125 bool PluginManager::CreateSettingForSymbolLocatorPlugin(
2126 Debugger &debugger, const lldb::OptionValuePropertiesSP &properties_sp,
2127 llvm::StringRef description, bool is_global_property) {
2128 return CreateSettingForPlugin(debugger, kSymbolLocatorPluginName,
2129 "Settings for symbol locator plug-ins",
2130 properties_sp, description, is_global_property);
2131 }
2132
CreateSettingForTracePlugin(Debugger & debugger,const lldb::OptionValuePropertiesSP & properties_sp,llvm::StringRef description,bool is_global_property)2133 bool PluginManager::CreateSettingForTracePlugin(
2134 Debugger &debugger, const lldb::OptionValuePropertiesSP &properties_sp,
2135 llvm::StringRef description, bool is_global_property) {
2136 return CreateSettingForPlugin(debugger, kTracePluginName,
2137 "Settings for trace plug-ins", properties_sp,
2138 description, is_global_property);
2139 }
2140
2141 lldb::OptionValuePropertiesSP
GetSettingForObjectFilePlugin(Debugger & debugger,llvm::StringRef setting_name)2142 PluginManager::GetSettingForObjectFilePlugin(Debugger &debugger,
2143 llvm::StringRef setting_name) {
2144 return GetSettingForPlugin(debugger, setting_name, kObjectFilePluginName);
2145 }
2146
CreateSettingForObjectFilePlugin(Debugger & debugger,const lldb::OptionValuePropertiesSP & properties_sp,llvm::StringRef description,bool is_global_property)2147 bool PluginManager::CreateSettingForObjectFilePlugin(
2148 Debugger &debugger, const lldb::OptionValuePropertiesSP &properties_sp,
2149 llvm::StringRef description, bool is_global_property) {
2150 return CreateSettingForPlugin(debugger, kObjectFilePluginName,
2151 "Settings for object file plug-ins",
2152 properties_sp, description, is_global_property);
2153 }
2154
2155 lldb::OptionValuePropertiesSP
GetSettingForSymbolFilePlugin(Debugger & debugger,llvm::StringRef setting_name)2156 PluginManager::GetSettingForSymbolFilePlugin(Debugger &debugger,
2157 llvm::StringRef setting_name) {
2158 return GetSettingForPlugin(debugger, setting_name, kSymbolFilePluginName);
2159 }
2160
CreateSettingForSymbolFilePlugin(Debugger & debugger,const lldb::OptionValuePropertiesSP & properties_sp,llvm::StringRef description,bool is_global_property)2161 bool PluginManager::CreateSettingForSymbolFilePlugin(
2162 Debugger &debugger, const lldb::OptionValuePropertiesSP &properties_sp,
2163 llvm::StringRef description, bool is_global_property) {
2164 return CreateSettingForPlugin(debugger, kSymbolFilePluginName,
2165 "Settings for symbol file plug-ins",
2166 properties_sp, description, is_global_property);
2167 }
2168
2169 lldb::OptionValuePropertiesSP
GetSettingForJITLoaderPlugin(Debugger & debugger,llvm::StringRef setting_name)2170 PluginManager::GetSettingForJITLoaderPlugin(Debugger &debugger,
2171 llvm::StringRef setting_name) {
2172 return GetSettingForPlugin(debugger, setting_name, kJITLoaderPluginName);
2173 }
2174
CreateSettingForJITLoaderPlugin(Debugger & debugger,const lldb::OptionValuePropertiesSP & properties_sp,llvm::StringRef description,bool is_global_property)2175 bool PluginManager::CreateSettingForJITLoaderPlugin(
2176 Debugger &debugger, const lldb::OptionValuePropertiesSP &properties_sp,
2177 llvm::StringRef description, bool is_global_property) {
2178 return CreateSettingForPlugin(debugger, kJITLoaderPluginName,
2179 "Settings for JIT loader plug-ins",
2180 properties_sp, description, is_global_property);
2181 }
2182
2183 static const char *kOperatingSystemPluginName("os");
2184
2185 lldb::OptionValuePropertiesSP
GetSettingForOperatingSystemPlugin(Debugger & debugger,llvm::StringRef setting_name)2186 PluginManager::GetSettingForOperatingSystemPlugin(Debugger &debugger,
2187 llvm::StringRef setting_name) {
2188 lldb::OptionValuePropertiesSP properties_sp;
2189 lldb::OptionValuePropertiesSP plugin_type_properties_sp(
2190 GetDebuggerPropertyForPlugins(
2191 debugger, kOperatingSystemPluginName,
2192 "", // not creating to so we don't need the description
2193 false));
2194 if (plugin_type_properties_sp)
2195 properties_sp =
2196 plugin_type_properties_sp->GetSubProperty(nullptr, setting_name);
2197 return properties_sp;
2198 }
2199
CreateSettingForOperatingSystemPlugin(Debugger & debugger,const lldb::OptionValuePropertiesSP & properties_sp,llvm::StringRef description,bool is_global_property)2200 bool PluginManager::CreateSettingForOperatingSystemPlugin(
2201 Debugger &debugger, const lldb::OptionValuePropertiesSP &properties_sp,
2202 llvm::StringRef description, bool is_global_property) {
2203 if (properties_sp) {
2204 lldb::OptionValuePropertiesSP plugin_type_properties_sp(
2205 GetDebuggerPropertyForPlugins(debugger, kOperatingSystemPluginName,
2206 "Settings for operating system plug-ins",
2207 true));
2208 if (plugin_type_properties_sp) {
2209 plugin_type_properties_sp->AppendProperty(properties_sp->GetName(),
2210 description, is_global_property,
2211 properties_sp);
2212 return true;
2213 }
2214 }
2215 return false;
2216 }
2217
2218 lldb::OptionValuePropertiesSP
GetSettingForStructuredDataPlugin(Debugger & debugger,llvm::StringRef setting_name)2219 PluginManager::GetSettingForStructuredDataPlugin(Debugger &debugger,
2220 llvm::StringRef setting_name) {
2221 return GetSettingForPlugin(debugger, setting_name, kStructuredDataPluginName);
2222 }
2223
CreateSettingForStructuredDataPlugin(Debugger & debugger,const lldb::OptionValuePropertiesSP & properties_sp,llvm::StringRef description,bool is_global_property)2224 bool PluginManager::CreateSettingForStructuredDataPlugin(
2225 Debugger &debugger, const lldb::OptionValuePropertiesSP &properties_sp,
2226 llvm::StringRef description, bool is_global_property) {
2227 return CreateSettingForPlugin(debugger, kStructuredDataPluginName,
2228 "Settings for structured data plug-ins",
2229 properties_sp, description, is_global_property);
2230 }
2231
2232 lldb::OptionValuePropertiesSP
GetSettingForCPlusPlusLanguagePlugin(Debugger & debugger,llvm::StringRef setting_name)2233 PluginManager::GetSettingForCPlusPlusLanguagePlugin(
2234 Debugger &debugger, llvm::StringRef setting_name) {
2235 return GetSettingForPlugin(debugger, setting_name, kCPlusPlusLanguagePlugin);
2236 }
2237
CreateSettingForCPlusPlusLanguagePlugin(Debugger & debugger,const lldb::OptionValuePropertiesSP & properties_sp,llvm::StringRef description,bool is_global_property)2238 bool PluginManager::CreateSettingForCPlusPlusLanguagePlugin(
2239 Debugger &debugger, const lldb::OptionValuePropertiesSP &properties_sp,
2240 llvm::StringRef description, bool is_global_property) {
2241 return CreateSettingForPlugin(debugger, kCPlusPlusLanguagePlugin,
2242 "Settings for CPlusPlus language plug-ins",
2243 properties_sp, description, is_global_property);
2244 }
2245
2246 //
2247 // Plugin Info+Enable Implementations
2248 //
GetABIPluginInfo()2249 std::vector<RegisteredPluginInfo> PluginManager::GetABIPluginInfo() {
2250 return GetABIInstances().GetPluginInfoForAllInstances();
2251 }
SetABIPluginEnabled(llvm::StringRef name,bool enable)2252 bool PluginManager::SetABIPluginEnabled(llvm::StringRef name, bool enable) {
2253 return GetABIInstances().SetInstanceEnabled(name, enable);
2254 }
2255
GetArchitecturePluginInfo()2256 std::vector<RegisteredPluginInfo> PluginManager::GetArchitecturePluginInfo() {
2257 return GetArchitectureInstances().GetPluginInfoForAllInstances();
2258 }
SetArchitecturePluginEnabled(llvm::StringRef name,bool enable)2259 bool PluginManager::SetArchitecturePluginEnabled(llvm::StringRef name,
2260 bool enable) {
2261 return GetArchitectureInstances().SetInstanceEnabled(name, enable);
2262 }
2263
GetDisassemblerPluginInfo()2264 std::vector<RegisteredPluginInfo> PluginManager::GetDisassemblerPluginInfo() {
2265 return GetDisassemblerInstances().GetPluginInfoForAllInstances();
2266 }
SetDisassemblerPluginEnabled(llvm::StringRef name,bool enable)2267 bool PluginManager::SetDisassemblerPluginEnabled(llvm::StringRef name,
2268 bool enable) {
2269 return GetDisassemblerInstances().SetInstanceEnabled(name, enable);
2270 }
2271
GetDynamicLoaderPluginInfo()2272 std::vector<RegisteredPluginInfo> PluginManager::GetDynamicLoaderPluginInfo() {
2273 return GetDynamicLoaderInstances().GetPluginInfoForAllInstances();
2274 }
SetDynamicLoaderPluginEnabled(llvm::StringRef name,bool enable)2275 bool PluginManager::SetDynamicLoaderPluginEnabled(llvm::StringRef name,
2276 bool enable) {
2277 return GetDynamicLoaderInstances().SetInstanceEnabled(name, enable);
2278 }
2279
2280 std::vector<RegisteredPluginInfo>
GetEmulateInstructionPluginInfo()2281 PluginManager::GetEmulateInstructionPluginInfo() {
2282 return GetEmulateInstructionInstances().GetPluginInfoForAllInstances();
2283 }
SetEmulateInstructionPluginEnabled(llvm::StringRef name,bool enable)2284 bool PluginManager::SetEmulateInstructionPluginEnabled(llvm::StringRef name,
2285 bool enable) {
2286 return GetEmulateInstructionInstances().SetInstanceEnabled(name, enable);
2287 }
2288
2289 std::vector<RegisteredPluginInfo>
GetInstrumentationRuntimePluginInfo()2290 PluginManager::GetInstrumentationRuntimePluginInfo() {
2291 return GetInstrumentationRuntimeInstances().GetPluginInfoForAllInstances();
2292 }
SetInstrumentationRuntimePluginEnabled(llvm::StringRef name,bool enable)2293 bool PluginManager::SetInstrumentationRuntimePluginEnabled(llvm::StringRef name,
2294 bool enable) {
2295 return GetInstrumentationRuntimeInstances().SetInstanceEnabled(name, enable);
2296 }
2297
GetJITLoaderPluginInfo()2298 std::vector<RegisteredPluginInfo> PluginManager::GetJITLoaderPluginInfo() {
2299 return GetJITLoaderInstances().GetPluginInfoForAllInstances();
2300 }
SetJITLoaderPluginEnabled(llvm::StringRef name,bool enable)2301 bool PluginManager::SetJITLoaderPluginEnabled(llvm::StringRef name,
2302 bool enable) {
2303 return GetJITLoaderInstances().SetInstanceEnabled(name, enable);
2304 }
2305
GetLanguagePluginInfo()2306 std::vector<RegisteredPluginInfo> PluginManager::GetLanguagePluginInfo() {
2307 return GetLanguageInstances().GetPluginInfoForAllInstances();
2308 }
SetLanguagePluginEnabled(llvm::StringRef name,bool enable)2309 bool PluginManager::SetLanguagePluginEnabled(llvm::StringRef name,
2310 bool enable) {
2311 return GetLanguageInstances().SetInstanceEnabled(name, enable);
2312 }
2313
2314 std::vector<RegisteredPluginInfo>
GetLanguageRuntimePluginInfo()2315 PluginManager::GetLanguageRuntimePluginInfo() {
2316 return GetLanguageRuntimeInstances().GetPluginInfoForAllInstances();
2317 }
SetLanguageRuntimePluginEnabled(llvm::StringRef name,bool enable)2318 bool PluginManager::SetLanguageRuntimePluginEnabled(llvm::StringRef name,
2319 bool enable) {
2320 return GetLanguageRuntimeInstances().SetInstanceEnabled(name, enable);
2321 }
2322
GetMemoryHistoryPluginInfo()2323 std::vector<RegisteredPluginInfo> PluginManager::GetMemoryHistoryPluginInfo() {
2324 return GetMemoryHistoryInstances().GetPluginInfoForAllInstances();
2325 }
SetMemoryHistoryPluginEnabled(llvm::StringRef name,bool enable)2326 bool PluginManager::SetMemoryHistoryPluginEnabled(llvm::StringRef name,
2327 bool enable) {
2328 return GetMemoryHistoryInstances().SetInstanceEnabled(name, enable);
2329 }
2330
2331 std::vector<RegisteredPluginInfo>
GetObjectContainerPluginInfo()2332 PluginManager::GetObjectContainerPluginInfo() {
2333 return GetObjectContainerInstances().GetPluginInfoForAllInstances();
2334 }
SetObjectContainerPluginEnabled(llvm::StringRef name,bool enable)2335 bool PluginManager::SetObjectContainerPluginEnabled(llvm::StringRef name,
2336 bool enable) {
2337 return GetObjectContainerInstances().SetInstanceEnabled(name, enable);
2338 }
2339
GetObjectFilePluginInfo()2340 std::vector<RegisteredPluginInfo> PluginManager::GetObjectFilePluginInfo() {
2341 return GetObjectFileInstances().GetPluginInfoForAllInstances();
2342 }
SetObjectFilePluginEnabled(llvm::StringRef name,bool enable)2343 bool PluginManager::SetObjectFilePluginEnabled(llvm::StringRef name,
2344 bool enable) {
2345 return GetObjectFileInstances().SetInstanceEnabled(name, enable);
2346 }
2347
2348 std::vector<RegisteredPluginInfo>
GetOperatingSystemPluginInfo()2349 PluginManager::GetOperatingSystemPluginInfo() {
2350 return GetOperatingSystemInstances().GetPluginInfoForAllInstances();
2351 }
SetOperatingSystemPluginEnabled(llvm::StringRef name,bool enable)2352 bool PluginManager::SetOperatingSystemPluginEnabled(llvm::StringRef name,
2353 bool enable) {
2354 return GetOperatingSystemInstances().SetInstanceEnabled(name, enable);
2355 }
2356
GetPlatformPluginInfo()2357 std::vector<RegisteredPluginInfo> PluginManager::GetPlatformPluginInfo() {
2358 return GetPlatformInstances().GetPluginInfoForAllInstances();
2359 }
SetPlatformPluginEnabled(llvm::StringRef name,bool enable)2360 bool PluginManager::SetPlatformPluginEnabled(llvm::StringRef name,
2361 bool enable) {
2362 return GetPlatformInstances().SetInstanceEnabled(name, enable);
2363 }
2364
GetProcessPluginInfo()2365 std::vector<RegisteredPluginInfo> PluginManager::GetProcessPluginInfo() {
2366 return GetProcessInstances().GetPluginInfoForAllInstances();
2367 }
SetProcessPluginEnabled(llvm::StringRef name,bool enable)2368 bool PluginManager::SetProcessPluginEnabled(llvm::StringRef name, bool enable) {
2369 return GetProcessInstances().SetInstanceEnabled(name, enable);
2370 }
2371
GetREPLPluginInfo()2372 std::vector<RegisteredPluginInfo> PluginManager::GetREPLPluginInfo() {
2373 return GetREPLInstances().GetPluginInfoForAllInstances();
2374 }
SetREPLPluginEnabled(llvm::StringRef name,bool enable)2375 bool PluginManager::SetREPLPluginEnabled(llvm::StringRef name, bool enable) {
2376 return GetREPLInstances().SetInstanceEnabled(name, enable);
2377 }
2378
2379 std::vector<RegisteredPluginInfo>
GetRegisterTypeBuilderPluginInfo()2380 PluginManager::GetRegisterTypeBuilderPluginInfo() {
2381 return GetRegisterTypeBuilderInstances().GetPluginInfoForAllInstances();
2382 }
SetRegisterTypeBuilderPluginEnabled(llvm::StringRef name,bool enable)2383 bool PluginManager::SetRegisterTypeBuilderPluginEnabled(llvm::StringRef name,
2384 bool enable) {
2385 return GetRegisterTypeBuilderInstances().SetInstanceEnabled(name, enable);
2386 }
2387
2388 std::vector<RegisteredPluginInfo>
GetScriptInterpreterPluginInfo()2389 PluginManager::GetScriptInterpreterPluginInfo() {
2390 return GetScriptInterpreterInstances().GetPluginInfoForAllInstances();
2391 }
SetScriptInterpreterPluginEnabled(llvm::StringRef name,bool enable)2392 bool PluginManager::SetScriptInterpreterPluginEnabled(llvm::StringRef name,
2393 bool enable) {
2394 return GetScriptInterpreterInstances().SetInstanceEnabled(name, enable);
2395 }
2396
2397 std::vector<RegisteredPluginInfo>
GetScriptedInterfacePluginInfo()2398 PluginManager::GetScriptedInterfacePluginInfo() {
2399 return GetScriptedInterfaceInstances().GetPluginInfoForAllInstances();
2400 }
SetScriptedInterfacePluginEnabled(llvm::StringRef name,bool enable)2401 bool PluginManager::SetScriptedInterfacePluginEnabled(llvm::StringRef name,
2402 bool enable) {
2403 return GetScriptedInterfaceInstances().SetInstanceEnabled(name, enable);
2404 }
2405
GetStructuredDataPluginInfo()2406 std::vector<RegisteredPluginInfo> PluginManager::GetStructuredDataPluginInfo() {
2407 return GetStructuredDataPluginInstances().GetPluginInfoForAllInstances();
2408 }
SetStructuredDataPluginEnabled(llvm::StringRef name,bool enable)2409 bool PluginManager::SetStructuredDataPluginEnabled(llvm::StringRef name,
2410 bool enable) {
2411 return GetStructuredDataPluginInstances().SetInstanceEnabled(name, enable);
2412 }
2413
GetSymbolFilePluginInfo()2414 std::vector<RegisteredPluginInfo> PluginManager::GetSymbolFilePluginInfo() {
2415 return GetSymbolFileInstances().GetPluginInfoForAllInstances();
2416 }
SetSymbolFilePluginEnabled(llvm::StringRef name,bool enable)2417 bool PluginManager::SetSymbolFilePluginEnabled(llvm::StringRef name,
2418 bool enable) {
2419 return GetSymbolFileInstances().SetInstanceEnabled(name, enable);
2420 }
2421
GetSymbolLocatorPluginInfo()2422 std::vector<RegisteredPluginInfo> PluginManager::GetSymbolLocatorPluginInfo() {
2423 return GetSymbolLocatorInstances().GetPluginInfoForAllInstances();
2424 }
SetSymbolLocatorPluginEnabled(llvm::StringRef name,bool enable)2425 bool PluginManager::SetSymbolLocatorPluginEnabled(llvm::StringRef name,
2426 bool enable) {
2427 return GetSymbolLocatorInstances().SetInstanceEnabled(name, enable);
2428 }
2429
GetSymbolVendorPluginInfo()2430 std::vector<RegisteredPluginInfo> PluginManager::GetSymbolVendorPluginInfo() {
2431 return GetSymbolVendorInstances().GetPluginInfoForAllInstances();
2432 }
SetSymbolVendorPluginEnabled(llvm::StringRef name,bool enable)2433 bool PluginManager::SetSymbolVendorPluginEnabled(llvm::StringRef name,
2434 bool enable) {
2435 return GetSymbolVendorInstances().SetInstanceEnabled(name, enable);
2436 }
2437
GetSystemRuntimePluginInfo()2438 std::vector<RegisteredPluginInfo> PluginManager::GetSystemRuntimePluginInfo() {
2439 return GetSystemRuntimeInstances().GetPluginInfoForAllInstances();
2440 }
SetSystemRuntimePluginEnabled(llvm::StringRef name,bool enable)2441 bool PluginManager::SetSystemRuntimePluginEnabled(llvm::StringRef name,
2442 bool enable) {
2443 return GetSystemRuntimeInstances().SetInstanceEnabled(name, enable);
2444 }
2445
GetTracePluginInfo()2446 std::vector<RegisteredPluginInfo> PluginManager::GetTracePluginInfo() {
2447 return GetTracePluginInstances().GetPluginInfoForAllInstances();
2448 }
SetTracePluginEnabled(llvm::StringRef name,bool enable)2449 bool PluginManager::SetTracePluginEnabled(llvm::StringRef name, bool enable) {
2450 return GetTracePluginInstances().SetInstanceEnabled(name, enable);
2451 }
2452
GetTraceExporterPluginInfo()2453 std::vector<RegisteredPluginInfo> PluginManager::GetTraceExporterPluginInfo() {
2454 return GetTraceExporterInstances().GetPluginInfoForAllInstances();
2455 }
SetTraceExporterPluginEnabled(llvm::StringRef name,bool enable)2456 bool PluginManager::SetTraceExporterPluginEnabled(llvm::StringRef name,
2457 bool enable) {
2458 return GetTraceExporterInstances().SetInstanceEnabled(name, enable);
2459 }
2460
GetTypeSystemPluginInfo()2461 std::vector<RegisteredPluginInfo> PluginManager::GetTypeSystemPluginInfo() {
2462 return GetTypeSystemInstances().GetPluginInfoForAllInstances();
2463 }
SetTypeSystemPluginEnabled(llvm::StringRef name,bool enable)2464 bool PluginManager::SetTypeSystemPluginEnabled(llvm::StringRef name,
2465 bool enable) {
2466 return GetTypeSystemInstances().SetInstanceEnabled(name, enable);
2467 }
2468
GetUnwindAssemblyPluginInfo()2469 std::vector<RegisteredPluginInfo> PluginManager::GetUnwindAssemblyPluginInfo() {
2470 return GetUnwindAssemblyInstances().GetPluginInfoForAllInstances();
2471 }
SetUnwindAssemblyPluginEnabled(llvm::StringRef name,bool enable)2472 bool PluginManager::SetUnwindAssemblyPluginEnabled(llvm::StringRef name,
2473 bool enable) {
2474 return GetUnwindAssemblyInstances().SetInstanceEnabled(name, enable);
2475 }
2476