xref: /llvm-project/lldb/source/Core/PluginManager.cpp (revision 0642cd768b80665585c8500bed2933a3b99123dc)
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 
51 static std::recursive_mutex &GetPluginMapMutex() {
52   static std::recursive_mutex g_plugin_map_mutex;
53   return g_plugin_map_mutex;
54 }
55 
56 static PluginTerminateMap &GetPluginMap() {
57   static PluginTerminateMap g_plugin_map;
58   return g_plugin_map;
59 }
60 
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 
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 
75 template <typename FPtrTy> static FPtrTy CastToFPtr(void *VPtr) {
76   return reinterpret_cast<FPtrTy>(VPtr);
77 }
78 
79 static FileSystem::EnumerateDirectoryResult
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 
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 
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 
184 template <typename Callback> struct PluginInstance {
185   typedef Callback CallbackType;
186 
187   PluginInstance() = default;
188   PluginInstance(llvm::StringRef name, llvm::StringRef description,
189                  Callback create_callback,
190                  DebuggerInitializeCallback debugger_init_callback = nullptr)
191       : name(name), description(description), create_callback(create_callback),
192         debugger_init_callback(debugger_init_callback) {}
193 
194   llvm::StringRef name;
195   llvm::StringRef description;
196   Callback create_callback;
197   DebuggerInitializeCallback debugger_init_callback;
198 };
199 
200 template <typename Instance> class PluginInstances {
201 public:
202   template <typename... Args>
203   bool RegisterPlugin(llvm::StringRef name, llvm::StringRef description,
204                       typename Instance::CallbackType callback,
205                       Args &&...args) {
206     if (!callback)
207       return false;
208     assert(!name.empty());
209     Instance instance =
210         Instance(name, description, callback, std::forward<Args>(args)...);
211     m_instances.push_back(instance);
212     return false;
213   }
214 
215   bool UnregisterPlugin(typename Instance::CallbackType callback) {
216     if (!callback)
217       return false;
218     auto pos = m_instances.begin();
219     auto end = m_instances.end();
220     for (; pos != end; ++pos) {
221       if (pos->create_callback == callback) {
222         m_instances.erase(pos);
223         return true;
224       }
225     }
226     return false;
227   }
228 
229   typename Instance::CallbackType GetCallbackAtIndex(uint32_t idx) {
230     if (Instance *instance = GetInstanceAtIndex(idx))
231       return instance->create_callback;
232     return nullptr;
233   }
234 
235   llvm::StringRef GetDescriptionAtIndex(uint32_t idx) {
236     if (Instance *instance = GetInstanceAtIndex(idx))
237       return instance->description;
238     return "";
239   }
240 
241   llvm::StringRef GetNameAtIndex(uint32_t idx) {
242     if (Instance *instance = GetInstanceAtIndex(idx))
243       return instance->name;
244     return "";
245   }
246 
247   typename Instance::CallbackType GetCallbackForName(llvm::StringRef name) {
248     if (name.empty())
249       return nullptr;
250     for (auto &instance : m_instances) {
251       if (name == instance.name)
252         return instance.create_callback;
253     }
254     return nullptr;
255   }
256 
257   void PerformDebuggerCallback(Debugger &debugger) {
258     for (auto &instance : m_instances) {
259       if (instance.debugger_init_callback)
260         instance.debugger_init_callback(debugger);
261     }
262   }
263 
264   const std::vector<Instance> &GetInstances() const { return m_instances; }
265   std::vector<Instance> &GetInstances() { return m_instances; }
266 
267   Instance *GetInstanceAtIndex(uint32_t idx) {
268     if (idx < m_instances.size())
269       return &m_instances[idx];
270     return nullptr;
271   }
272 
273 private:
274   std::vector<Instance> m_instances;
275 };
276 
277 #pragma mark ABI
278 
279 typedef PluginInstance<ABICreateInstance> ABIInstance;
280 typedef PluginInstances<ABIInstance> ABIInstances;
281 
282 static ABIInstances &GetABIInstances() {
283   static ABIInstances g_instances;
284   return g_instances;
285 }
286 
287 bool PluginManager::RegisterPlugin(llvm::StringRef name,
288                                    llvm::StringRef description,
289                                    ABICreateInstance create_callback) {
290   return GetABIInstances().RegisterPlugin(name, description, create_callback);
291 }
292 
293 bool PluginManager::UnregisterPlugin(ABICreateInstance create_callback) {
294   return GetABIInstances().UnregisterPlugin(create_callback);
295 }
296 
297 ABICreateInstance PluginManager::GetABICreateCallbackAtIndex(uint32_t idx) {
298   return GetABIInstances().GetCallbackAtIndex(idx);
299 }
300 
301 #pragma mark Architecture
302 
303 typedef PluginInstance<ArchitectureCreateInstance> ArchitectureInstance;
304 typedef std::vector<ArchitectureInstance> ArchitectureInstances;
305 
306 static ArchitectureInstances &GetArchitectureInstances() {
307   static ArchitectureInstances g_instances;
308   return g_instances;
309 }
310 
311 void PluginManager::RegisterPlugin(llvm::StringRef name,
312                                    llvm::StringRef description,
313                                    ArchitectureCreateInstance create_callback) {
314   GetArchitectureInstances().push_back({name, description, create_callback});
315 }
316 
317 void PluginManager::UnregisterPlugin(
318     ArchitectureCreateInstance create_callback) {
319   auto &instances = GetArchitectureInstances();
320 
321   for (auto pos = instances.begin(), end = instances.end(); pos != end; ++pos) {
322     if (pos->create_callback == create_callback) {
323       instances.erase(pos);
324       return;
325     }
326   }
327   llvm_unreachable("Plugin not found");
328 }
329 
330 std::unique_ptr<Architecture>
331 PluginManager::CreateArchitectureInstance(const ArchSpec &arch) {
332   for (const auto &instances : GetArchitectureInstances()) {
333     if (auto plugin_up = instances.create_callback(arch))
334       return plugin_up;
335   }
336   return nullptr;
337 }
338 
339 #pragma mark Disassembler
340 
341 typedef PluginInstance<DisassemblerCreateInstance> DisassemblerInstance;
342 typedef PluginInstances<DisassemblerInstance> DisassemblerInstances;
343 
344 static DisassemblerInstances &GetDisassemblerInstances() {
345   static DisassemblerInstances g_instances;
346   return g_instances;
347 }
348 
349 bool PluginManager::RegisterPlugin(llvm::StringRef name,
350                                    llvm::StringRef description,
351                                    DisassemblerCreateInstance create_callback) {
352   return GetDisassemblerInstances().RegisterPlugin(name, description,
353                                                    create_callback);
354 }
355 
356 bool PluginManager::UnregisterPlugin(
357     DisassemblerCreateInstance create_callback) {
358   return GetDisassemblerInstances().UnregisterPlugin(create_callback);
359 }
360 
361 DisassemblerCreateInstance
362 PluginManager::GetDisassemblerCreateCallbackAtIndex(uint32_t idx) {
363   return GetDisassemblerInstances().GetCallbackAtIndex(idx);
364 }
365 
366 DisassemblerCreateInstance
367 PluginManager::GetDisassemblerCreateCallbackForPluginName(
368     llvm::StringRef name) {
369   return GetDisassemblerInstances().GetCallbackForName(name);
370 }
371 
372 #pragma mark DynamicLoader
373 
374 typedef PluginInstance<DynamicLoaderCreateInstance> DynamicLoaderInstance;
375 typedef PluginInstances<DynamicLoaderInstance> DynamicLoaderInstances;
376 
377 static DynamicLoaderInstances &GetDynamicLoaderInstances() {
378   static DynamicLoaderInstances g_instances;
379   return g_instances;
380 }
381 
382 bool PluginManager::RegisterPlugin(
383     llvm::StringRef name, llvm::StringRef description,
384     DynamicLoaderCreateInstance create_callback,
385     DebuggerInitializeCallback debugger_init_callback) {
386   return GetDynamicLoaderInstances().RegisterPlugin(
387       name, description, create_callback, debugger_init_callback);
388 }
389 
390 bool PluginManager::UnregisterPlugin(
391     DynamicLoaderCreateInstance create_callback) {
392   return GetDynamicLoaderInstances().UnregisterPlugin(create_callback);
393 }
394 
395 DynamicLoaderCreateInstance
396 PluginManager::GetDynamicLoaderCreateCallbackAtIndex(uint32_t idx) {
397   return GetDynamicLoaderInstances().GetCallbackAtIndex(idx);
398 }
399 
400 DynamicLoaderCreateInstance
401 PluginManager::GetDynamicLoaderCreateCallbackForPluginName(
402     llvm::StringRef name) {
403   return GetDynamicLoaderInstances().GetCallbackForName(name);
404 }
405 
406 #pragma mark JITLoader
407 
408 typedef PluginInstance<JITLoaderCreateInstance> JITLoaderInstance;
409 typedef PluginInstances<JITLoaderInstance> JITLoaderInstances;
410 
411 static JITLoaderInstances &GetJITLoaderInstances() {
412   static JITLoaderInstances g_instances;
413   return g_instances;
414 }
415 
416 bool PluginManager::RegisterPlugin(
417     llvm::StringRef name, llvm::StringRef description,
418     JITLoaderCreateInstance create_callback,
419     DebuggerInitializeCallback debugger_init_callback) {
420   return GetJITLoaderInstances().RegisterPlugin(
421       name, description, create_callback, debugger_init_callback);
422 }
423 
424 bool PluginManager::UnregisterPlugin(JITLoaderCreateInstance create_callback) {
425   return GetJITLoaderInstances().UnregisterPlugin(create_callback);
426 }
427 
428 JITLoaderCreateInstance
429 PluginManager::GetJITLoaderCreateCallbackAtIndex(uint32_t idx) {
430   return GetJITLoaderInstances().GetCallbackAtIndex(idx);
431 }
432 
433 #pragma mark EmulateInstruction
434 
435 typedef PluginInstance<EmulateInstructionCreateInstance>
436     EmulateInstructionInstance;
437 typedef PluginInstances<EmulateInstructionInstance> EmulateInstructionInstances;
438 
439 static EmulateInstructionInstances &GetEmulateInstructionInstances() {
440   static EmulateInstructionInstances g_instances;
441   return g_instances;
442 }
443 
444 bool PluginManager::RegisterPlugin(
445     llvm::StringRef name, llvm::StringRef description,
446     EmulateInstructionCreateInstance create_callback) {
447   return GetEmulateInstructionInstances().RegisterPlugin(name, description,
448                                                          create_callback);
449 }
450 
451 bool PluginManager::UnregisterPlugin(
452     EmulateInstructionCreateInstance create_callback) {
453   return GetEmulateInstructionInstances().UnregisterPlugin(create_callback);
454 }
455 
456 EmulateInstructionCreateInstance
457 PluginManager::GetEmulateInstructionCreateCallbackAtIndex(uint32_t idx) {
458   return GetEmulateInstructionInstances().GetCallbackAtIndex(idx);
459 }
460 
461 EmulateInstructionCreateInstance
462 PluginManager::GetEmulateInstructionCreateCallbackForPluginName(
463     llvm::StringRef name) {
464   return GetEmulateInstructionInstances().GetCallbackForName(name);
465 }
466 
467 #pragma mark OperatingSystem
468 
469 typedef PluginInstance<OperatingSystemCreateInstance> OperatingSystemInstance;
470 typedef PluginInstances<OperatingSystemInstance> OperatingSystemInstances;
471 
472 static OperatingSystemInstances &GetOperatingSystemInstances() {
473   static OperatingSystemInstances g_instances;
474   return g_instances;
475 }
476 
477 bool PluginManager::RegisterPlugin(
478     llvm::StringRef name, llvm::StringRef description,
479     OperatingSystemCreateInstance create_callback,
480     DebuggerInitializeCallback debugger_init_callback) {
481   return GetOperatingSystemInstances().RegisterPlugin(
482       name, description, create_callback, debugger_init_callback);
483 }
484 
485 bool PluginManager::UnregisterPlugin(
486     OperatingSystemCreateInstance create_callback) {
487   return GetOperatingSystemInstances().UnregisterPlugin(create_callback);
488 }
489 
490 OperatingSystemCreateInstance
491 PluginManager::GetOperatingSystemCreateCallbackAtIndex(uint32_t idx) {
492   return GetOperatingSystemInstances().GetCallbackAtIndex(idx);
493 }
494 
495 OperatingSystemCreateInstance
496 PluginManager::GetOperatingSystemCreateCallbackForPluginName(
497     llvm::StringRef name) {
498   return GetOperatingSystemInstances().GetCallbackForName(name);
499 }
500 
501 #pragma mark Language
502 
503 typedef PluginInstance<LanguageCreateInstance> LanguageInstance;
504 typedef PluginInstances<LanguageInstance> LanguageInstances;
505 
506 static LanguageInstances &GetLanguageInstances() {
507   static LanguageInstances g_instances;
508   return g_instances;
509 }
510 
511 bool PluginManager::RegisterPlugin(llvm::StringRef name,
512                                    llvm::StringRef description,
513                                    LanguageCreateInstance create_callback) {
514   return GetLanguageInstances().RegisterPlugin(name, description,
515                                                create_callback);
516 }
517 
518 bool PluginManager::UnregisterPlugin(LanguageCreateInstance create_callback) {
519   return GetLanguageInstances().UnregisterPlugin(create_callback);
520 }
521 
522 LanguageCreateInstance
523 PluginManager::GetLanguageCreateCallbackAtIndex(uint32_t idx) {
524   return GetLanguageInstances().GetCallbackAtIndex(idx);
525 }
526 
527 #pragma mark LanguageRuntime
528 
529 struct LanguageRuntimeInstance
530     : public PluginInstance<LanguageRuntimeCreateInstance> {
531   LanguageRuntimeInstance(
532       llvm::StringRef name, llvm::StringRef description,
533       CallbackType create_callback,
534       DebuggerInitializeCallback debugger_init_callback,
535       LanguageRuntimeGetCommandObject command_callback,
536       LanguageRuntimeGetExceptionPrecondition precondition_callback)
537       : PluginInstance<LanguageRuntimeCreateInstance>(
538             name, description, create_callback, debugger_init_callback),
539         command_callback(command_callback),
540         precondition_callback(precondition_callback) {}
541 
542   LanguageRuntimeGetCommandObject command_callback;
543   LanguageRuntimeGetExceptionPrecondition precondition_callback;
544 };
545 
546 typedef PluginInstances<LanguageRuntimeInstance> LanguageRuntimeInstances;
547 
548 static LanguageRuntimeInstances &GetLanguageRuntimeInstances() {
549   static LanguageRuntimeInstances g_instances;
550   return g_instances;
551 }
552 
553 bool PluginManager::RegisterPlugin(
554     llvm::StringRef name, llvm::StringRef description,
555     LanguageRuntimeCreateInstance create_callback,
556     LanguageRuntimeGetCommandObject command_callback,
557     LanguageRuntimeGetExceptionPrecondition precondition_callback) {
558   return GetLanguageRuntimeInstances().RegisterPlugin(
559       name, description, create_callback, nullptr, command_callback,
560       precondition_callback);
561 }
562 
563 bool PluginManager::UnregisterPlugin(
564     LanguageRuntimeCreateInstance create_callback) {
565   return GetLanguageRuntimeInstances().UnregisterPlugin(create_callback);
566 }
567 
568 LanguageRuntimeCreateInstance
569 PluginManager::GetLanguageRuntimeCreateCallbackAtIndex(uint32_t idx) {
570   return GetLanguageRuntimeInstances().GetCallbackAtIndex(idx);
571 }
572 
573 LanguageRuntimeGetCommandObject
574 PluginManager::GetLanguageRuntimeGetCommandObjectAtIndex(uint32_t idx) {
575   const auto &instances = GetLanguageRuntimeInstances().GetInstances();
576   if (idx < instances.size())
577     return instances[idx].command_callback;
578   return nullptr;
579 }
580 
581 LanguageRuntimeGetExceptionPrecondition
582 PluginManager::GetLanguageRuntimeGetExceptionPreconditionAtIndex(uint32_t idx) {
583   const auto &instances = GetLanguageRuntimeInstances().GetInstances();
584   if (idx < instances.size())
585     return instances[idx].precondition_callback;
586   return nullptr;
587 }
588 
589 #pragma mark SystemRuntime
590 
591 typedef PluginInstance<SystemRuntimeCreateInstance> SystemRuntimeInstance;
592 typedef PluginInstances<SystemRuntimeInstance> SystemRuntimeInstances;
593 
594 static SystemRuntimeInstances &GetSystemRuntimeInstances() {
595   static SystemRuntimeInstances g_instances;
596   return g_instances;
597 }
598 
599 bool PluginManager::RegisterPlugin(
600     llvm::StringRef name, llvm::StringRef description,
601     SystemRuntimeCreateInstance create_callback) {
602   return GetSystemRuntimeInstances().RegisterPlugin(name, description,
603                                                     create_callback);
604 }
605 
606 bool PluginManager::UnregisterPlugin(
607     SystemRuntimeCreateInstance create_callback) {
608   return GetSystemRuntimeInstances().UnregisterPlugin(create_callback);
609 }
610 
611 SystemRuntimeCreateInstance
612 PluginManager::GetSystemRuntimeCreateCallbackAtIndex(uint32_t idx) {
613   return GetSystemRuntimeInstances().GetCallbackAtIndex(idx);
614 }
615 
616 #pragma mark ObjectFile
617 
618 struct ObjectFileInstance : public PluginInstance<ObjectFileCreateInstance> {
619   ObjectFileInstance(
620       llvm::StringRef name, llvm::StringRef description,
621       CallbackType create_callback,
622       ObjectFileCreateMemoryInstance create_memory_callback,
623       ObjectFileGetModuleSpecifications get_module_specifications,
624       ObjectFileSaveCore save_core,
625       DebuggerInitializeCallback debugger_init_callback)
626       : PluginInstance<ObjectFileCreateInstance>(
627             name, description, create_callback, debugger_init_callback),
628         create_memory_callback(create_memory_callback),
629         get_module_specifications(get_module_specifications),
630         save_core(save_core) {}
631 
632   ObjectFileCreateMemoryInstance create_memory_callback;
633   ObjectFileGetModuleSpecifications get_module_specifications;
634   ObjectFileSaveCore save_core;
635 };
636 typedef PluginInstances<ObjectFileInstance> ObjectFileInstances;
637 
638 static ObjectFileInstances &GetObjectFileInstances() {
639   static ObjectFileInstances g_instances;
640   return g_instances;
641 }
642 
643 bool PluginManager::IsRegisteredObjectFilePluginName(llvm::StringRef name) {
644   if (name.empty())
645     return false;
646 
647   const auto &instances = GetObjectFileInstances().GetInstances();
648   for (auto &instance : instances) {
649     if (instance.name == name)
650       return true;
651   }
652   return false;
653 }
654 
655 bool PluginManager::RegisterPlugin(
656     llvm::StringRef name, llvm::StringRef description,
657     ObjectFileCreateInstance create_callback,
658     ObjectFileCreateMemoryInstance create_memory_callback,
659     ObjectFileGetModuleSpecifications get_module_specifications,
660     ObjectFileSaveCore save_core,
661     DebuggerInitializeCallback debugger_init_callback) {
662   return GetObjectFileInstances().RegisterPlugin(
663       name, description, create_callback, create_memory_callback,
664       get_module_specifications, save_core, debugger_init_callback);
665 }
666 
667 bool PluginManager::UnregisterPlugin(ObjectFileCreateInstance create_callback) {
668   return GetObjectFileInstances().UnregisterPlugin(create_callback);
669 }
670 
671 ObjectFileCreateInstance
672 PluginManager::GetObjectFileCreateCallbackAtIndex(uint32_t idx) {
673   return GetObjectFileInstances().GetCallbackAtIndex(idx);
674 }
675 
676 ObjectFileCreateMemoryInstance
677 PluginManager::GetObjectFileCreateMemoryCallbackAtIndex(uint32_t idx) {
678   const auto &instances = GetObjectFileInstances().GetInstances();
679   if (idx < instances.size())
680     return instances[idx].create_memory_callback;
681   return nullptr;
682 }
683 
684 ObjectFileGetModuleSpecifications
685 PluginManager::GetObjectFileGetModuleSpecificationsCallbackAtIndex(
686     uint32_t idx) {
687   const auto &instances = GetObjectFileInstances().GetInstances();
688   if (idx < instances.size())
689     return instances[idx].get_module_specifications;
690   return nullptr;
691 }
692 
693 ObjectFileCreateMemoryInstance
694 PluginManager::GetObjectFileCreateMemoryCallbackForPluginName(
695     llvm::StringRef name) {
696   const auto &instances = GetObjectFileInstances().GetInstances();
697   for (auto &instance : instances) {
698     if (instance.name == name)
699       return instance.create_memory_callback;
700   }
701   return nullptr;
702 }
703 
704 Status PluginManager::SaveCore(const lldb::ProcessSP &process_sp,
705                                lldb_private::SaveCoreOptions &options) {
706   Status error;
707   if (!options.GetOutputFile()) {
708     error = Status::FromErrorString("No output file specified");
709     return error;
710   }
711 
712   if (!process_sp) {
713     error = Status::FromErrorString("Invalid process");
714     return error;
715   }
716 
717   error = options.EnsureValidConfiguration(process_sp);
718   if (error.Fail())
719     return error;
720 
721   if (!options.GetPluginName().has_value()) {
722     // Try saving core directly from the process plugin first.
723     llvm::Expected<bool> ret =
724         process_sp->SaveCore(options.GetOutputFile()->GetPath());
725     if (!ret)
726       return Status(ret.takeError());
727     if (ret.get())
728       return Status();
729   }
730 
731   // Fall back to object plugins.
732   const auto &plugin_name = options.GetPluginName().value_or("");
733   auto &instances = GetObjectFileInstances().GetInstances();
734   for (auto &instance : instances) {
735     if (plugin_name.empty() || instance.name == plugin_name) {
736       if (instance.save_core && instance.save_core(process_sp, options, error))
737         return error;
738     }
739   }
740 
741   // Check to see if any of the object file plugins tried and failed to save.
742   // If none ran, set the error message.
743   if (error.Success())
744     error = Status::FromErrorString(
745         "no ObjectFile plugins were able to save a core for this process");
746   return error;
747 }
748 
749 #pragma mark ObjectContainer
750 
751 struct ObjectContainerInstance
752     : public PluginInstance<ObjectContainerCreateInstance> {
753   ObjectContainerInstance(
754       llvm::StringRef name, llvm::StringRef description,
755       CallbackType create_callback,
756       ObjectContainerCreateMemoryInstance create_memory_callback,
757       ObjectFileGetModuleSpecifications get_module_specifications)
758       : PluginInstance<ObjectContainerCreateInstance>(name, description,
759                                                       create_callback),
760         create_memory_callback(create_memory_callback),
761         get_module_specifications(get_module_specifications) {}
762 
763   ObjectContainerCreateMemoryInstance create_memory_callback;
764   ObjectFileGetModuleSpecifications get_module_specifications;
765 };
766 typedef PluginInstances<ObjectContainerInstance> ObjectContainerInstances;
767 
768 static ObjectContainerInstances &GetObjectContainerInstances() {
769   static ObjectContainerInstances g_instances;
770   return g_instances;
771 }
772 
773 bool PluginManager::RegisterPlugin(
774     llvm::StringRef name, llvm::StringRef description,
775     ObjectContainerCreateInstance create_callback,
776     ObjectFileGetModuleSpecifications get_module_specifications,
777     ObjectContainerCreateMemoryInstance create_memory_callback) {
778   return GetObjectContainerInstances().RegisterPlugin(
779       name, description, create_callback, create_memory_callback,
780       get_module_specifications);
781 }
782 
783 bool PluginManager::UnregisterPlugin(
784     ObjectContainerCreateInstance create_callback) {
785   return GetObjectContainerInstances().UnregisterPlugin(create_callback);
786 }
787 
788 ObjectContainerCreateInstance
789 PluginManager::GetObjectContainerCreateCallbackAtIndex(uint32_t idx) {
790   return GetObjectContainerInstances().GetCallbackAtIndex(idx);
791 }
792 
793 ObjectContainerCreateMemoryInstance
794 PluginManager::GetObjectContainerCreateMemoryCallbackAtIndex(uint32_t idx) {
795   const auto &instances = GetObjectContainerInstances().GetInstances();
796   if (idx < instances.size())
797     return instances[idx].create_memory_callback;
798   return nullptr;
799 }
800 
801 ObjectFileGetModuleSpecifications
802 PluginManager::GetObjectContainerGetModuleSpecificationsCallbackAtIndex(
803     uint32_t idx) {
804   const auto &instances = GetObjectContainerInstances().GetInstances();
805   if (idx < instances.size())
806     return instances[idx].get_module_specifications;
807   return nullptr;
808 }
809 
810 #pragma mark Platform
811 
812 typedef PluginInstance<PlatformCreateInstance> PlatformInstance;
813 typedef PluginInstances<PlatformInstance> PlatformInstances;
814 
815 static PlatformInstances &GetPlatformInstances() {
816   static PlatformInstances g_platform_instances;
817   return g_platform_instances;
818 }
819 
820 bool PluginManager::RegisterPlugin(
821     llvm::StringRef name, llvm::StringRef description,
822     PlatformCreateInstance create_callback,
823     DebuggerInitializeCallback debugger_init_callback) {
824   return GetPlatformInstances().RegisterPlugin(
825       name, description, create_callback, debugger_init_callback);
826 }
827 
828 bool PluginManager::UnregisterPlugin(PlatformCreateInstance create_callback) {
829   return GetPlatformInstances().UnregisterPlugin(create_callback);
830 }
831 
832 llvm::StringRef PluginManager::GetPlatformPluginNameAtIndex(uint32_t idx) {
833   return GetPlatformInstances().GetNameAtIndex(idx);
834 }
835 
836 llvm::StringRef
837 PluginManager::GetPlatformPluginDescriptionAtIndex(uint32_t idx) {
838   return GetPlatformInstances().GetDescriptionAtIndex(idx);
839 }
840 
841 PlatformCreateInstance
842 PluginManager::GetPlatformCreateCallbackAtIndex(uint32_t idx) {
843   return GetPlatformInstances().GetCallbackAtIndex(idx);
844 }
845 
846 PlatformCreateInstance
847 PluginManager::GetPlatformCreateCallbackForPluginName(llvm::StringRef name) {
848   return GetPlatformInstances().GetCallbackForName(name);
849 }
850 
851 void PluginManager::AutoCompletePlatformName(llvm::StringRef name,
852                                              CompletionRequest &request) {
853   for (const auto &instance : GetPlatformInstances().GetInstances()) {
854     if (instance.name.starts_with(name))
855       request.AddCompletion(instance.name);
856   }
857 }
858 
859 #pragma mark Process
860 
861 typedef PluginInstance<ProcessCreateInstance> ProcessInstance;
862 typedef PluginInstances<ProcessInstance> ProcessInstances;
863 
864 static ProcessInstances &GetProcessInstances() {
865   static ProcessInstances g_instances;
866   return g_instances;
867 }
868 
869 bool PluginManager::RegisterPlugin(
870     llvm::StringRef name, llvm::StringRef description,
871     ProcessCreateInstance create_callback,
872     DebuggerInitializeCallback debugger_init_callback) {
873   return GetProcessInstances().RegisterPlugin(
874       name, description, create_callback, debugger_init_callback);
875 }
876 
877 bool PluginManager::UnregisterPlugin(ProcessCreateInstance create_callback) {
878   return GetProcessInstances().UnregisterPlugin(create_callback);
879 }
880 
881 llvm::StringRef PluginManager::GetProcessPluginNameAtIndex(uint32_t idx) {
882   return GetProcessInstances().GetNameAtIndex(idx);
883 }
884 
885 llvm::StringRef PluginManager::GetProcessPluginDescriptionAtIndex(uint32_t idx) {
886   return GetProcessInstances().GetDescriptionAtIndex(idx);
887 }
888 
889 ProcessCreateInstance
890 PluginManager::GetProcessCreateCallbackAtIndex(uint32_t idx) {
891   return GetProcessInstances().GetCallbackAtIndex(idx);
892 }
893 
894 ProcessCreateInstance
895 PluginManager::GetProcessCreateCallbackForPluginName(llvm::StringRef name) {
896   return GetProcessInstances().GetCallbackForName(name);
897 }
898 
899 void PluginManager::AutoCompleteProcessName(llvm::StringRef name,
900                                             CompletionRequest &request) {
901   for (const auto &instance : GetProcessInstances().GetInstances()) {
902     if (instance.name.starts_with(name))
903       request.AddCompletion(instance.name, instance.description);
904   }
905 }
906 
907 #pragma mark RegisterTypeBuilder
908 
909 struct RegisterTypeBuilderInstance
910     : public PluginInstance<RegisterTypeBuilderCreateInstance> {
911   RegisterTypeBuilderInstance(llvm::StringRef name, llvm::StringRef description,
912                               CallbackType create_callback)
913       : PluginInstance<RegisterTypeBuilderCreateInstance>(name, description,
914                                                           create_callback) {}
915 };
916 
917 typedef PluginInstances<RegisterTypeBuilderInstance>
918     RegisterTypeBuilderInstances;
919 
920 static RegisterTypeBuilderInstances &GetRegisterTypeBuilderInstances() {
921   static RegisterTypeBuilderInstances g_instances;
922   return g_instances;
923 }
924 
925 bool PluginManager::RegisterPlugin(
926     llvm::StringRef name, llvm::StringRef description,
927     RegisterTypeBuilderCreateInstance create_callback) {
928   return GetRegisterTypeBuilderInstances().RegisterPlugin(name, description,
929                                                           create_callback);
930 }
931 
932 bool PluginManager::UnregisterPlugin(
933     RegisterTypeBuilderCreateInstance create_callback) {
934   return GetRegisterTypeBuilderInstances().UnregisterPlugin(create_callback);
935 }
936 
937 lldb::RegisterTypeBuilderSP
938 PluginManager::GetRegisterTypeBuilder(Target &target) {
939   const auto &instances = GetRegisterTypeBuilderInstances().GetInstances();
940   // We assume that RegisterTypeBuilderClang is the only instance of this plugin
941   // type and is always present.
942   assert(instances.size());
943   return instances[0].create_callback(target);
944 }
945 
946 #pragma mark ScriptInterpreter
947 
948 struct ScriptInterpreterInstance
949     : public PluginInstance<ScriptInterpreterCreateInstance> {
950   ScriptInterpreterInstance(llvm::StringRef name, llvm::StringRef description,
951                             CallbackType create_callback,
952                             lldb::ScriptLanguage language)
953       : PluginInstance<ScriptInterpreterCreateInstance>(name, description,
954                                                         create_callback),
955         language(language) {}
956 
957   lldb::ScriptLanguage language = lldb::eScriptLanguageNone;
958 };
959 
960 typedef PluginInstances<ScriptInterpreterInstance> ScriptInterpreterInstances;
961 
962 static ScriptInterpreterInstances &GetScriptInterpreterInstances() {
963   static ScriptInterpreterInstances g_instances;
964   return g_instances;
965 }
966 
967 bool PluginManager::RegisterPlugin(
968     llvm::StringRef name, llvm::StringRef description,
969     lldb::ScriptLanguage script_language,
970     ScriptInterpreterCreateInstance create_callback) {
971   return GetScriptInterpreterInstances().RegisterPlugin(
972       name, description, create_callback, script_language);
973 }
974 
975 bool PluginManager::UnregisterPlugin(
976     ScriptInterpreterCreateInstance create_callback) {
977   return GetScriptInterpreterInstances().UnregisterPlugin(create_callback);
978 }
979 
980 ScriptInterpreterCreateInstance
981 PluginManager::GetScriptInterpreterCreateCallbackAtIndex(uint32_t idx) {
982   return GetScriptInterpreterInstances().GetCallbackAtIndex(idx);
983 }
984 
985 lldb::ScriptInterpreterSP
986 PluginManager::GetScriptInterpreterForLanguage(lldb::ScriptLanguage script_lang,
987                                                Debugger &debugger) {
988   const auto &instances = GetScriptInterpreterInstances().GetInstances();
989   ScriptInterpreterCreateInstance none_instance = nullptr;
990   for (const auto &instance : instances) {
991     if (instance.language == lldb::eScriptLanguageNone)
992       none_instance = instance.create_callback;
993 
994     if (script_lang == instance.language)
995       return instance.create_callback(debugger);
996   }
997 
998   // If we didn't find one, return the ScriptInterpreter for the null language.
999   assert(none_instance != nullptr);
1000   return none_instance(debugger);
1001 }
1002 
1003 #pragma mark StructuredDataPlugin
1004 
1005 struct StructuredDataPluginInstance
1006     : public PluginInstance<StructuredDataPluginCreateInstance> {
1007   StructuredDataPluginInstance(
1008       llvm::StringRef name, llvm::StringRef description,
1009       CallbackType create_callback,
1010       DebuggerInitializeCallback debugger_init_callback,
1011       StructuredDataFilterLaunchInfo filter_callback)
1012       : PluginInstance<StructuredDataPluginCreateInstance>(
1013             name, description, create_callback, debugger_init_callback),
1014         filter_callback(filter_callback) {}
1015 
1016   StructuredDataFilterLaunchInfo filter_callback = nullptr;
1017 };
1018 
1019 typedef PluginInstances<StructuredDataPluginInstance>
1020     StructuredDataPluginInstances;
1021 
1022 static StructuredDataPluginInstances &GetStructuredDataPluginInstances() {
1023   static StructuredDataPluginInstances g_instances;
1024   return g_instances;
1025 }
1026 
1027 bool PluginManager::RegisterPlugin(
1028     llvm::StringRef name, llvm::StringRef description,
1029     StructuredDataPluginCreateInstance create_callback,
1030     DebuggerInitializeCallback debugger_init_callback,
1031     StructuredDataFilterLaunchInfo filter_callback) {
1032   return GetStructuredDataPluginInstances().RegisterPlugin(
1033       name, description, create_callback, debugger_init_callback,
1034       filter_callback);
1035 }
1036 
1037 bool PluginManager::UnregisterPlugin(
1038     StructuredDataPluginCreateInstance create_callback) {
1039   return GetStructuredDataPluginInstances().UnregisterPlugin(create_callback);
1040 }
1041 
1042 StructuredDataPluginCreateInstance
1043 PluginManager::GetStructuredDataPluginCreateCallbackAtIndex(uint32_t idx) {
1044   return GetStructuredDataPluginInstances().GetCallbackAtIndex(idx);
1045 }
1046 
1047 StructuredDataFilterLaunchInfo
1048 PluginManager::GetStructuredDataFilterCallbackAtIndex(
1049     uint32_t idx, bool &iteration_complete) {
1050   const auto &instances = GetStructuredDataPluginInstances().GetInstances();
1051   if (idx < instances.size()) {
1052     iteration_complete = false;
1053     return instances[idx].filter_callback;
1054   } else {
1055     iteration_complete = true;
1056   }
1057   return nullptr;
1058 }
1059 
1060 #pragma mark SymbolFile
1061 
1062 typedef PluginInstance<SymbolFileCreateInstance> SymbolFileInstance;
1063 typedef PluginInstances<SymbolFileInstance> SymbolFileInstances;
1064 
1065 static SymbolFileInstances &GetSymbolFileInstances() {
1066   static SymbolFileInstances g_instances;
1067   return g_instances;
1068 }
1069 
1070 bool PluginManager::RegisterPlugin(
1071     llvm::StringRef name, llvm::StringRef description,
1072     SymbolFileCreateInstance create_callback,
1073     DebuggerInitializeCallback debugger_init_callback) {
1074   return GetSymbolFileInstances().RegisterPlugin(
1075       name, description, create_callback, debugger_init_callback);
1076 }
1077 
1078 bool PluginManager::UnregisterPlugin(SymbolFileCreateInstance create_callback) {
1079   return GetSymbolFileInstances().UnregisterPlugin(create_callback);
1080 }
1081 
1082 SymbolFileCreateInstance
1083 PluginManager::GetSymbolFileCreateCallbackAtIndex(uint32_t idx) {
1084   return GetSymbolFileInstances().GetCallbackAtIndex(idx);
1085 }
1086 
1087 #pragma mark SymbolVendor
1088 
1089 typedef PluginInstance<SymbolVendorCreateInstance> SymbolVendorInstance;
1090 typedef PluginInstances<SymbolVendorInstance> SymbolVendorInstances;
1091 
1092 static SymbolVendorInstances &GetSymbolVendorInstances() {
1093   static SymbolVendorInstances g_instances;
1094   return g_instances;
1095 }
1096 
1097 bool PluginManager::RegisterPlugin(llvm::StringRef name,
1098                                    llvm::StringRef description,
1099                                    SymbolVendorCreateInstance create_callback) {
1100   return GetSymbolVendorInstances().RegisterPlugin(name, description,
1101                                                    create_callback);
1102 }
1103 
1104 bool PluginManager::UnregisterPlugin(
1105     SymbolVendorCreateInstance create_callback) {
1106   return GetSymbolVendorInstances().UnregisterPlugin(create_callback);
1107 }
1108 
1109 SymbolVendorCreateInstance
1110 PluginManager::GetSymbolVendorCreateCallbackAtIndex(uint32_t idx) {
1111   return GetSymbolVendorInstances().GetCallbackAtIndex(idx);
1112 }
1113 
1114 #pragma mark SymbolLocator
1115 
1116 struct SymbolLocatorInstance
1117     : public PluginInstance<SymbolLocatorCreateInstance> {
1118   SymbolLocatorInstance(
1119       llvm::StringRef name, llvm::StringRef description,
1120       CallbackType create_callback,
1121       SymbolLocatorLocateExecutableObjectFile locate_executable_object_file,
1122       SymbolLocatorLocateExecutableSymbolFile locate_executable_symbol_file,
1123       SymbolLocatorDownloadObjectAndSymbolFile download_object_symbol_file,
1124       SymbolLocatorFindSymbolFileInBundle find_symbol_file_in_bundle,
1125       DebuggerInitializeCallback debugger_init_callback)
1126       : PluginInstance<SymbolLocatorCreateInstance>(
1127             name, description, create_callback, debugger_init_callback),
1128         locate_executable_object_file(locate_executable_object_file),
1129         locate_executable_symbol_file(locate_executable_symbol_file),
1130         download_object_symbol_file(download_object_symbol_file),
1131         find_symbol_file_in_bundle(find_symbol_file_in_bundle) {}
1132 
1133   SymbolLocatorLocateExecutableObjectFile locate_executable_object_file;
1134   SymbolLocatorLocateExecutableSymbolFile locate_executable_symbol_file;
1135   SymbolLocatorDownloadObjectAndSymbolFile download_object_symbol_file;
1136   SymbolLocatorFindSymbolFileInBundle find_symbol_file_in_bundle;
1137 };
1138 typedef PluginInstances<SymbolLocatorInstance> SymbolLocatorInstances;
1139 
1140 static SymbolLocatorInstances &GetSymbolLocatorInstances() {
1141   static SymbolLocatorInstances g_instances;
1142   return g_instances;
1143 }
1144 
1145 bool PluginManager::RegisterPlugin(
1146     llvm::StringRef name, llvm::StringRef description,
1147     SymbolLocatorCreateInstance create_callback,
1148     SymbolLocatorLocateExecutableObjectFile locate_executable_object_file,
1149     SymbolLocatorLocateExecutableSymbolFile locate_executable_symbol_file,
1150     SymbolLocatorDownloadObjectAndSymbolFile download_object_symbol_file,
1151     SymbolLocatorFindSymbolFileInBundle find_symbol_file_in_bundle,
1152     DebuggerInitializeCallback debugger_init_callback) {
1153   return GetSymbolLocatorInstances().RegisterPlugin(
1154       name, description, create_callback, locate_executable_object_file,
1155       locate_executable_symbol_file, download_object_symbol_file,
1156       find_symbol_file_in_bundle, debugger_init_callback);
1157 }
1158 
1159 bool PluginManager::UnregisterPlugin(
1160     SymbolLocatorCreateInstance create_callback) {
1161   return GetSymbolLocatorInstances().UnregisterPlugin(create_callback);
1162 }
1163 
1164 SymbolLocatorCreateInstance
1165 PluginManager::GetSymbolLocatorCreateCallbackAtIndex(uint32_t idx) {
1166   return GetSymbolLocatorInstances().GetCallbackAtIndex(idx);
1167 }
1168 
1169 ModuleSpec
1170 PluginManager::LocateExecutableObjectFile(const ModuleSpec &module_spec) {
1171   auto &instances = GetSymbolLocatorInstances().GetInstances();
1172   for (auto &instance : instances) {
1173     if (instance.locate_executable_object_file) {
1174       std::optional<ModuleSpec> result =
1175           instance.locate_executable_object_file(module_spec);
1176       if (result)
1177         return *result;
1178     }
1179   }
1180   return {};
1181 }
1182 
1183 FileSpec PluginManager::LocateExecutableSymbolFile(
1184     const ModuleSpec &module_spec, const FileSpecList &default_search_paths) {
1185   auto &instances = GetSymbolLocatorInstances().GetInstances();
1186   for (auto &instance : instances) {
1187     if (instance.locate_executable_symbol_file) {
1188       std::optional<FileSpec> result = instance.locate_executable_symbol_file(
1189           module_spec, default_search_paths);
1190       if (result)
1191         return *result;
1192     }
1193   }
1194   return {};
1195 }
1196 
1197 bool PluginManager::DownloadObjectAndSymbolFile(ModuleSpec &module_spec,
1198                                                 Status &error,
1199                                                 bool force_lookup,
1200                                                 bool copy_executable) {
1201   auto &instances = GetSymbolLocatorInstances().GetInstances();
1202   for (auto &instance : instances) {
1203     if (instance.download_object_symbol_file) {
1204       if (instance.download_object_symbol_file(module_spec, error, force_lookup,
1205                                                copy_executable))
1206         return true;
1207     }
1208   }
1209   return false;
1210 }
1211 
1212 FileSpec PluginManager::FindSymbolFileInBundle(const FileSpec &symfile_bundle,
1213                                                const UUID *uuid,
1214                                                const ArchSpec *arch) {
1215   auto &instances = GetSymbolLocatorInstances().GetInstances();
1216   for (auto &instance : instances) {
1217     if (instance.find_symbol_file_in_bundle) {
1218       std::optional<FileSpec> result =
1219           instance.find_symbol_file_in_bundle(symfile_bundle, uuid, arch);
1220       if (result)
1221         return *result;
1222     }
1223   }
1224   return {};
1225 }
1226 
1227 #pragma mark Trace
1228 
1229 struct TraceInstance
1230     : public PluginInstance<TraceCreateInstanceFromBundle> {
1231   TraceInstance(
1232       llvm::StringRef name, llvm::StringRef description,
1233       CallbackType create_callback_from_bundle,
1234       TraceCreateInstanceForLiveProcess create_callback_for_live_process,
1235       llvm::StringRef schema, DebuggerInitializeCallback debugger_init_callback)
1236       : PluginInstance<TraceCreateInstanceFromBundle>(
1237             name, description, create_callback_from_bundle,
1238             debugger_init_callback),
1239         schema(schema),
1240         create_callback_for_live_process(create_callback_for_live_process) {}
1241 
1242   llvm::StringRef schema;
1243   TraceCreateInstanceForLiveProcess create_callback_for_live_process;
1244 };
1245 
1246 typedef PluginInstances<TraceInstance> TraceInstances;
1247 
1248 static TraceInstances &GetTracePluginInstances() {
1249   static TraceInstances g_instances;
1250   return g_instances;
1251 }
1252 
1253 bool PluginManager::RegisterPlugin(
1254     llvm::StringRef name, llvm::StringRef description,
1255     TraceCreateInstanceFromBundle create_callback_from_bundle,
1256     TraceCreateInstanceForLiveProcess create_callback_for_live_process,
1257     llvm::StringRef schema, DebuggerInitializeCallback debugger_init_callback) {
1258   return GetTracePluginInstances().RegisterPlugin(
1259       name, description, create_callback_from_bundle,
1260       create_callback_for_live_process, schema, debugger_init_callback);
1261 }
1262 
1263 bool PluginManager::UnregisterPlugin(
1264     TraceCreateInstanceFromBundle create_callback_from_bundle) {
1265   return GetTracePluginInstances().UnregisterPlugin(
1266       create_callback_from_bundle);
1267 }
1268 
1269 TraceCreateInstanceFromBundle
1270 PluginManager::GetTraceCreateCallback(llvm::StringRef plugin_name) {
1271   return GetTracePluginInstances().GetCallbackForName(plugin_name);
1272 }
1273 
1274 TraceCreateInstanceForLiveProcess
1275 PluginManager::GetTraceCreateCallbackForLiveProcess(llvm::StringRef plugin_name) {
1276   for (const TraceInstance &instance : GetTracePluginInstances().GetInstances())
1277     if (instance.name == plugin_name)
1278       return instance.create_callback_for_live_process;
1279   return nullptr;
1280 }
1281 
1282 llvm::StringRef PluginManager::GetTraceSchema(llvm::StringRef plugin_name) {
1283   for (const TraceInstance &instance : GetTracePluginInstances().GetInstances())
1284     if (instance.name == plugin_name)
1285       return instance.schema;
1286   return llvm::StringRef();
1287 }
1288 
1289 llvm::StringRef PluginManager::GetTraceSchema(size_t index) {
1290   if (TraceInstance *instance =
1291           GetTracePluginInstances().GetInstanceAtIndex(index))
1292     return instance->schema;
1293   return llvm::StringRef();
1294 }
1295 
1296 #pragma mark TraceExporter
1297 
1298 struct TraceExporterInstance
1299     : public PluginInstance<TraceExporterCreateInstance> {
1300   TraceExporterInstance(
1301       llvm::StringRef name, llvm::StringRef description,
1302       TraceExporterCreateInstance create_instance,
1303       ThreadTraceExportCommandCreator create_thread_trace_export_command)
1304       : PluginInstance<TraceExporterCreateInstance>(name, description,
1305                                                     create_instance),
1306         create_thread_trace_export_command(create_thread_trace_export_command) {
1307   }
1308 
1309   ThreadTraceExportCommandCreator create_thread_trace_export_command;
1310 };
1311 
1312 typedef PluginInstances<TraceExporterInstance> TraceExporterInstances;
1313 
1314 static TraceExporterInstances &GetTraceExporterInstances() {
1315   static TraceExporterInstances g_instances;
1316   return g_instances;
1317 }
1318 
1319 bool PluginManager::RegisterPlugin(
1320     llvm::StringRef name, llvm::StringRef description,
1321     TraceExporterCreateInstance create_callback,
1322     ThreadTraceExportCommandCreator create_thread_trace_export_command) {
1323   return GetTraceExporterInstances().RegisterPlugin(
1324       name, description, create_callback, create_thread_trace_export_command);
1325 }
1326 
1327 TraceExporterCreateInstance
1328 PluginManager::GetTraceExporterCreateCallback(llvm::StringRef plugin_name) {
1329   return GetTraceExporterInstances().GetCallbackForName(plugin_name);
1330 }
1331 
1332 bool PluginManager::UnregisterPlugin(
1333     TraceExporterCreateInstance create_callback) {
1334   return GetTraceExporterInstances().UnregisterPlugin(create_callback);
1335 }
1336 
1337 ThreadTraceExportCommandCreator
1338 PluginManager::GetThreadTraceExportCommandCreatorAtIndex(uint32_t index) {
1339   if (TraceExporterInstance *instance =
1340           GetTraceExporterInstances().GetInstanceAtIndex(index))
1341     return instance->create_thread_trace_export_command;
1342   return nullptr;
1343 }
1344 
1345 llvm::StringRef
1346 PluginManager::GetTraceExporterPluginNameAtIndex(uint32_t index) {
1347   return GetTraceExporterInstances().GetNameAtIndex(index);
1348 }
1349 
1350 #pragma mark UnwindAssembly
1351 
1352 typedef PluginInstance<UnwindAssemblyCreateInstance> UnwindAssemblyInstance;
1353 typedef PluginInstances<UnwindAssemblyInstance> UnwindAssemblyInstances;
1354 
1355 static UnwindAssemblyInstances &GetUnwindAssemblyInstances() {
1356   static UnwindAssemblyInstances g_instances;
1357   return g_instances;
1358 }
1359 
1360 bool PluginManager::RegisterPlugin(
1361     llvm::StringRef name, llvm::StringRef description,
1362     UnwindAssemblyCreateInstance create_callback) {
1363   return GetUnwindAssemblyInstances().RegisterPlugin(name, description,
1364                                                      create_callback);
1365 }
1366 
1367 bool PluginManager::UnregisterPlugin(
1368     UnwindAssemblyCreateInstance create_callback) {
1369   return GetUnwindAssemblyInstances().UnregisterPlugin(create_callback);
1370 }
1371 
1372 UnwindAssemblyCreateInstance
1373 PluginManager::GetUnwindAssemblyCreateCallbackAtIndex(uint32_t idx) {
1374   return GetUnwindAssemblyInstances().GetCallbackAtIndex(idx);
1375 }
1376 
1377 #pragma mark MemoryHistory
1378 
1379 typedef PluginInstance<MemoryHistoryCreateInstance> MemoryHistoryInstance;
1380 typedef PluginInstances<MemoryHistoryInstance> MemoryHistoryInstances;
1381 
1382 static MemoryHistoryInstances &GetMemoryHistoryInstances() {
1383   static MemoryHistoryInstances g_instances;
1384   return g_instances;
1385 }
1386 
1387 bool PluginManager::RegisterPlugin(
1388     llvm::StringRef name, llvm::StringRef description,
1389     MemoryHistoryCreateInstance create_callback) {
1390   return GetMemoryHistoryInstances().RegisterPlugin(name, description,
1391                                                     create_callback);
1392 }
1393 
1394 bool PluginManager::UnregisterPlugin(
1395     MemoryHistoryCreateInstance create_callback) {
1396   return GetMemoryHistoryInstances().UnregisterPlugin(create_callback);
1397 }
1398 
1399 MemoryHistoryCreateInstance
1400 PluginManager::GetMemoryHistoryCreateCallbackAtIndex(uint32_t idx) {
1401   return GetMemoryHistoryInstances().GetCallbackAtIndex(idx);
1402 }
1403 
1404 #pragma mark InstrumentationRuntime
1405 
1406 struct InstrumentationRuntimeInstance
1407     : public PluginInstance<InstrumentationRuntimeCreateInstance> {
1408   InstrumentationRuntimeInstance(
1409       llvm::StringRef name, llvm::StringRef description,
1410       CallbackType create_callback,
1411       InstrumentationRuntimeGetType get_type_callback)
1412       : PluginInstance<InstrumentationRuntimeCreateInstance>(name, description,
1413                                                              create_callback),
1414         get_type_callback(get_type_callback) {}
1415 
1416   InstrumentationRuntimeGetType get_type_callback = nullptr;
1417 };
1418 
1419 typedef PluginInstances<InstrumentationRuntimeInstance>
1420     InstrumentationRuntimeInstances;
1421 
1422 static InstrumentationRuntimeInstances &GetInstrumentationRuntimeInstances() {
1423   static InstrumentationRuntimeInstances g_instances;
1424   return g_instances;
1425 }
1426 
1427 bool PluginManager::RegisterPlugin(
1428     llvm::StringRef name, llvm::StringRef description,
1429     InstrumentationRuntimeCreateInstance create_callback,
1430     InstrumentationRuntimeGetType get_type_callback) {
1431   return GetInstrumentationRuntimeInstances().RegisterPlugin(
1432       name, description, create_callback, get_type_callback);
1433 }
1434 
1435 bool PluginManager::UnregisterPlugin(
1436     InstrumentationRuntimeCreateInstance create_callback) {
1437   return GetInstrumentationRuntimeInstances().UnregisterPlugin(create_callback);
1438 }
1439 
1440 InstrumentationRuntimeGetType
1441 PluginManager::GetInstrumentationRuntimeGetTypeCallbackAtIndex(uint32_t idx) {
1442   const auto &instances = GetInstrumentationRuntimeInstances().GetInstances();
1443   if (idx < instances.size())
1444     return instances[idx].get_type_callback;
1445   return nullptr;
1446 }
1447 
1448 InstrumentationRuntimeCreateInstance
1449 PluginManager::GetInstrumentationRuntimeCreateCallbackAtIndex(uint32_t idx) {
1450   return GetInstrumentationRuntimeInstances().GetCallbackAtIndex(idx);
1451 }
1452 
1453 #pragma mark TypeSystem
1454 
1455 struct TypeSystemInstance : public PluginInstance<TypeSystemCreateInstance> {
1456   TypeSystemInstance(llvm::StringRef name, llvm::StringRef description,
1457                      CallbackType create_callback,
1458                      LanguageSet supported_languages_for_types,
1459                      LanguageSet supported_languages_for_expressions)
1460       : PluginInstance<TypeSystemCreateInstance>(name, description,
1461                                                  create_callback),
1462         supported_languages_for_types(supported_languages_for_types),
1463         supported_languages_for_expressions(
1464             supported_languages_for_expressions) {}
1465 
1466   LanguageSet supported_languages_for_types;
1467   LanguageSet supported_languages_for_expressions;
1468 };
1469 
1470 typedef PluginInstances<TypeSystemInstance> TypeSystemInstances;
1471 
1472 static TypeSystemInstances &GetTypeSystemInstances() {
1473   static TypeSystemInstances g_instances;
1474   return g_instances;
1475 }
1476 
1477 bool PluginManager::RegisterPlugin(
1478     llvm::StringRef name, llvm::StringRef description,
1479     TypeSystemCreateInstance create_callback,
1480     LanguageSet supported_languages_for_types,
1481     LanguageSet supported_languages_for_expressions) {
1482   return GetTypeSystemInstances().RegisterPlugin(
1483       name, description, create_callback, supported_languages_for_types,
1484       supported_languages_for_expressions);
1485 }
1486 
1487 bool PluginManager::UnregisterPlugin(TypeSystemCreateInstance create_callback) {
1488   return GetTypeSystemInstances().UnregisterPlugin(create_callback);
1489 }
1490 
1491 TypeSystemCreateInstance
1492 PluginManager::GetTypeSystemCreateCallbackAtIndex(uint32_t idx) {
1493   return GetTypeSystemInstances().GetCallbackAtIndex(idx);
1494 }
1495 
1496 LanguageSet PluginManager::GetAllTypeSystemSupportedLanguagesForTypes() {
1497   const auto &instances = GetTypeSystemInstances().GetInstances();
1498   LanguageSet all;
1499   for (unsigned i = 0; i < instances.size(); ++i)
1500     all.bitvector |= instances[i].supported_languages_for_types.bitvector;
1501   return all;
1502 }
1503 
1504 LanguageSet PluginManager::GetAllTypeSystemSupportedLanguagesForExpressions() {
1505   const auto &instances = GetTypeSystemInstances().GetInstances();
1506   LanguageSet all;
1507   for (unsigned i = 0; i < instances.size(); ++i)
1508     all.bitvector |= instances[i].supported_languages_for_expressions.bitvector;
1509   return all;
1510 }
1511 
1512 #pragma mark ScriptedInterfaces
1513 
1514 struct ScriptedInterfaceInstance
1515     : public PluginInstance<ScriptedInterfaceCreateInstance> {
1516   ScriptedInterfaceInstance(llvm::StringRef name, llvm::StringRef description,
1517                             ScriptedInterfaceCreateInstance create_callback,
1518                             lldb::ScriptLanguage language,
1519                             ScriptedInterfaceUsages usages)
1520       : PluginInstance<ScriptedInterfaceCreateInstance>(name, description,
1521                                                         create_callback),
1522         language(language), usages(usages) {}
1523 
1524   lldb::ScriptLanguage language;
1525   ScriptedInterfaceUsages usages;
1526 };
1527 
1528 typedef PluginInstances<ScriptedInterfaceInstance> ScriptedInterfaceInstances;
1529 
1530 static ScriptedInterfaceInstances &GetScriptedInterfaceInstances() {
1531   static ScriptedInterfaceInstances g_instances;
1532   return g_instances;
1533 }
1534 
1535 bool PluginManager::RegisterPlugin(
1536     llvm::StringRef name, llvm::StringRef description,
1537     ScriptedInterfaceCreateInstance create_callback,
1538     lldb::ScriptLanguage language, ScriptedInterfaceUsages usages) {
1539   return GetScriptedInterfaceInstances().RegisterPlugin(
1540       name, description, create_callback, language, usages);
1541 }
1542 
1543 bool PluginManager::UnregisterPlugin(
1544     ScriptedInterfaceCreateInstance create_callback) {
1545   return GetScriptedInterfaceInstances().UnregisterPlugin(create_callback);
1546 }
1547 
1548 uint32_t PluginManager::GetNumScriptedInterfaces() {
1549   return GetScriptedInterfaceInstances().GetInstances().size();
1550 }
1551 
1552 llvm::StringRef PluginManager::GetScriptedInterfaceNameAtIndex(uint32_t index) {
1553   return GetScriptedInterfaceInstances().GetNameAtIndex(index);
1554 }
1555 
1556 llvm::StringRef
1557 PluginManager::GetScriptedInterfaceDescriptionAtIndex(uint32_t index) {
1558   return GetScriptedInterfaceInstances().GetDescriptionAtIndex(index);
1559 }
1560 
1561 lldb::ScriptLanguage
1562 PluginManager::GetScriptedInterfaceLanguageAtIndex(uint32_t idx) {
1563   const auto &instances = GetScriptedInterfaceInstances().GetInstances();
1564   return idx < instances.size() ? instances[idx].language
1565                                 : ScriptLanguage::eScriptLanguageNone;
1566 }
1567 
1568 ScriptedInterfaceUsages
1569 PluginManager::GetScriptedInterfaceUsagesAtIndex(uint32_t idx) {
1570   const auto &instances = GetScriptedInterfaceInstances().GetInstances();
1571   if (idx >= instances.size())
1572     return {};
1573   return instances[idx].usages;
1574 }
1575 
1576 #pragma mark REPL
1577 
1578 struct REPLInstance : public PluginInstance<REPLCreateInstance> {
1579   REPLInstance(llvm::StringRef name, llvm::StringRef description,
1580                CallbackType create_callback, LanguageSet supported_languages)
1581       : PluginInstance<REPLCreateInstance>(name, description, create_callback),
1582         supported_languages(supported_languages) {}
1583 
1584   LanguageSet supported_languages;
1585 };
1586 
1587 typedef PluginInstances<REPLInstance> REPLInstances;
1588 
1589 static REPLInstances &GetREPLInstances() {
1590   static REPLInstances g_instances;
1591   return g_instances;
1592 }
1593 
1594 bool PluginManager::RegisterPlugin(llvm::StringRef name, llvm::StringRef description,
1595                                    REPLCreateInstance create_callback,
1596                                    LanguageSet supported_languages) {
1597   return GetREPLInstances().RegisterPlugin(name, description, create_callback,
1598                                            supported_languages);
1599 }
1600 
1601 bool PluginManager::UnregisterPlugin(REPLCreateInstance create_callback) {
1602   return GetREPLInstances().UnregisterPlugin(create_callback);
1603 }
1604 
1605 REPLCreateInstance PluginManager::GetREPLCreateCallbackAtIndex(uint32_t idx) {
1606   return GetREPLInstances().GetCallbackAtIndex(idx);
1607 }
1608 
1609 LanguageSet PluginManager::GetREPLSupportedLanguagesAtIndex(uint32_t idx) {
1610   const auto &instances = GetREPLInstances().GetInstances();
1611   return idx < instances.size() ? instances[idx].supported_languages
1612                                 : LanguageSet();
1613 }
1614 
1615 LanguageSet PluginManager::GetREPLAllTypeSystemSupportedLanguages() {
1616   const auto &instances = GetREPLInstances().GetInstances();
1617   LanguageSet all;
1618   for (unsigned i = 0; i < instances.size(); ++i)
1619     all.bitvector |= instances[i].supported_languages.bitvector;
1620   return all;
1621 }
1622 
1623 #pragma mark PluginManager
1624 
1625 void PluginManager::DebuggerInitialize(Debugger &debugger) {
1626   GetDynamicLoaderInstances().PerformDebuggerCallback(debugger);
1627   GetJITLoaderInstances().PerformDebuggerCallback(debugger);
1628   GetObjectFileInstances().PerformDebuggerCallback(debugger);
1629   GetPlatformInstances().PerformDebuggerCallback(debugger);
1630   GetProcessInstances().PerformDebuggerCallback(debugger);
1631   GetSymbolFileInstances().PerformDebuggerCallback(debugger);
1632   GetSymbolLocatorInstances().PerformDebuggerCallback(debugger);
1633   GetOperatingSystemInstances().PerformDebuggerCallback(debugger);
1634   GetStructuredDataPluginInstances().PerformDebuggerCallback(debugger);
1635   GetTracePluginInstances().PerformDebuggerCallback(debugger);
1636   GetScriptedInterfaceInstances().PerformDebuggerCallback(debugger);
1637 }
1638 
1639 // This is the preferred new way to register plugin specific settings.  e.g.
1640 // This will put a plugin's settings under e.g.
1641 // "plugin.<plugin_type_name>.<plugin_type_desc>.SETTINGNAME".
1642 static lldb::OptionValuePropertiesSP
1643 GetDebuggerPropertyForPlugins(Debugger &debugger, llvm::StringRef plugin_type_name,
1644                               llvm::StringRef plugin_type_desc,
1645                               bool can_create) {
1646   lldb::OptionValuePropertiesSP parent_properties_sp(
1647       debugger.GetValueProperties());
1648   if (parent_properties_sp) {
1649     static constexpr llvm::StringLiteral g_property_name("plugin");
1650 
1651     OptionValuePropertiesSP plugin_properties_sp =
1652         parent_properties_sp->GetSubProperty(nullptr, g_property_name);
1653     if (!plugin_properties_sp && can_create) {
1654       plugin_properties_sp =
1655           std::make_shared<OptionValueProperties>(g_property_name);
1656       parent_properties_sp->AppendProperty(g_property_name,
1657                                            "Settings specify to plugins.", true,
1658                                            plugin_properties_sp);
1659     }
1660 
1661     if (plugin_properties_sp) {
1662       lldb::OptionValuePropertiesSP plugin_type_properties_sp =
1663           plugin_properties_sp->GetSubProperty(nullptr, plugin_type_name);
1664       if (!plugin_type_properties_sp && can_create) {
1665         plugin_type_properties_sp =
1666             std::make_shared<OptionValueProperties>(plugin_type_name);
1667         plugin_properties_sp->AppendProperty(plugin_type_name, plugin_type_desc,
1668                                              true, plugin_type_properties_sp);
1669       }
1670       return plugin_type_properties_sp;
1671     }
1672   }
1673   return lldb::OptionValuePropertiesSP();
1674 }
1675 
1676 // This is deprecated way to register plugin specific settings.  e.g.
1677 // "<plugin_type_name>.plugin.<plugin_type_desc>.SETTINGNAME" and Platform
1678 // generic settings would be under "platform.SETTINGNAME".
1679 static lldb::OptionValuePropertiesSP GetDebuggerPropertyForPluginsOldStyle(
1680     Debugger &debugger, llvm::StringRef plugin_type_name,
1681     llvm::StringRef plugin_type_desc, bool can_create) {
1682   static constexpr llvm::StringLiteral g_property_name("plugin");
1683   lldb::OptionValuePropertiesSP parent_properties_sp(
1684       debugger.GetValueProperties());
1685   if (parent_properties_sp) {
1686     OptionValuePropertiesSP plugin_properties_sp =
1687         parent_properties_sp->GetSubProperty(nullptr, plugin_type_name);
1688     if (!plugin_properties_sp && can_create) {
1689       plugin_properties_sp =
1690           std::make_shared<OptionValueProperties>(plugin_type_name);
1691       parent_properties_sp->AppendProperty(plugin_type_name, plugin_type_desc,
1692                                            true, plugin_properties_sp);
1693     }
1694 
1695     if (plugin_properties_sp) {
1696       lldb::OptionValuePropertiesSP plugin_type_properties_sp =
1697           plugin_properties_sp->GetSubProperty(nullptr, g_property_name);
1698       if (!plugin_type_properties_sp && can_create) {
1699         plugin_type_properties_sp =
1700             std::make_shared<OptionValueProperties>(g_property_name);
1701         plugin_properties_sp->AppendProperty(g_property_name,
1702                                              "Settings specific to plugins",
1703                                              true, plugin_type_properties_sp);
1704       }
1705       return plugin_type_properties_sp;
1706     }
1707   }
1708   return lldb::OptionValuePropertiesSP();
1709 }
1710 
1711 namespace {
1712 
1713 typedef lldb::OptionValuePropertiesSP
1714 GetDebuggerPropertyForPluginsPtr(Debugger &, llvm::StringRef, llvm::StringRef,
1715                                  bool can_create);
1716 }
1717 
1718 static lldb::OptionValuePropertiesSP
1719 GetSettingForPlugin(Debugger &debugger, llvm::StringRef setting_name,
1720                     llvm::StringRef plugin_type_name,
1721                     GetDebuggerPropertyForPluginsPtr get_debugger_property =
1722                         GetDebuggerPropertyForPlugins) {
1723   lldb::OptionValuePropertiesSP properties_sp;
1724   lldb::OptionValuePropertiesSP plugin_type_properties_sp(get_debugger_property(
1725       debugger, plugin_type_name,
1726       "", // not creating to so we don't need the description
1727       false));
1728   if (plugin_type_properties_sp)
1729     properties_sp =
1730         plugin_type_properties_sp->GetSubProperty(nullptr, setting_name);
1731   return properties_sp;
1732 }
1733 
1734 static bool
1735 CreateSettingForPlugin(Debugger &debugger, llvm::StringRef plugin_type_name,
1736                        llvm::StringRef plugin_type_desc,
1737                        const lldb::OptionValuePropertiesSP &properties_sp,
1738                        llvm::StringRef description, bool is_global_property,
1739                        GetDebuggerPropertyForPluginsPtr get_debugger_property =
1740                            GetDebuggerPropertyForPlugins) {
1741   if (properties_sp) {
1742     lldb::OptionValuePropertiesSP plugin_type_properties_sp(
1743         get_debugger_property(debugger, plugin_type_name, plugin_type_desc,
1744                               true));
1745     if (plugin_type_properties_sp) {
1746       plugin_type_properties_sp->AppendProperty(properties_sp->GetName(),
1747                                                 description, is_global_property,
1748                                                 properties_sp);
1749       return true;
1750     }
1751   }
1752   return false;
1753 }
1754 
1755 static constexpr llvm::StringLiteral kDynamicLoaderPluginName("dynamic-loader");
1756 static constexpr llvm::StringLiteral kPlatformPluginName("platform");
1757 static constexpr llvm::StringLiteral kProcessPluginName("process");
1758 static constexpr llvm::StringLiteral kTracePluginName("trace");
1759 static constexpr llvm::StringLiteral kObjectFilePluginName("object-file");
1760 static constexpr llvm::StringLiteral kSymbolFilePluginName("symbol-file");
1761 static constexpr llvm::StringLiteral kSymbolLocatorPluginName("symbol-locator");
1762 static constexpr llvm::StringLiteral kJITLoaderPluginName("jit-loader");
1763 static constexpr llvm::StringLiteral
1764     kStructuredDataPluginName("structured-data");
1765 
1766 lldb::OptionValuePropertiesSP
1767 PluginManager::GetSettingForDynamicLoaderPlugin(Debugger &debugger,
1768                                                 llvm::StringRef setting_name) {
1769   return GetSettingForPlugin(debugger, setting_name, kDynamicLoaderPluginName);
1770 }
1771 
1772 bool PluginManager::CreateSettingForDynamicLoaderPlugin(
1773     Debugger &debugger, const lldb::OptionValuePropertiesSP &properties_sp,
1774     llvm::StringRef description, bool is_global_property) {
1775   return CreateSettingForPlugin(debugger, kDynamicLoaderPluginName,
1776                                 "Settings for dynamic loader plug-ins",
1777                                 properties_sp, description, is_global_property);
1778 }
1779 
1780 lldb::OptionValuePropertiesSP
1781 PluginManager::GetSettingForPlatformPlugin(Debugger &debugger,
1782                                            llvm::StringRef setting_name) {
1783   return GetSettingForPlugin(debugger, setting_name, kPlatformPluginName,
1784                              GetDebuggerPropertyForPluginsOldStyle);
1785 }
1786 
1787 bool PluginManager::CreateSettingForPlatformPlugin(
1788     Debugger &debugger, const lldb::OptionValuePropertiesSP &properties_sp,
1789     llvm::StringRef description, bool is_global_property) {
1790   return CreateSettingForPlugin(debugger, kPlatformPluginName,
1791                                 "Settings for platform plug-ins", properties_sp,
1792                                 description, is_global_property,
1793                                 GetDebuggerPropertyForPluginsOldStyle);
1794 }
1795 
1796 lldb::OptionValuePropertiesSP
1797 PluginManager::GetSettingForProcessPlugin(Debugger &debugger,
1798                                           llvm::StringRef setting_name) {
1799   return GetSettingForPlugin(debugger, setting_name, kProcessPluginName);
1800 }
1801 
1802 bool PluginManager::CreateSettingForProcessPlugin(
1803     Debugger &debugger, const lldb::OptionValuePropertiesSP &properties_sp,
1804     llvm::StringRef description, bool is_global_property) {
1805   return CreateSettingForPlugin(debugger, kProcessPluginName,
1806                                 "Settings for process plug-ins", properties_sp,
1807                                 description, is_global_property);
1808 }
1809 
1810 lldb::OptionValuePropertiesSP
1811 PluginManager::GetSettingForSymbolLocatorPlugin(Debugger &debugger,
1812                                                 llvm::StringRef setting_name) {
1813   return GetSettingForPlugin(debugger, setting_name, kSymbolLocatorPluginName);
1814 }
1815 
1816 bool PluginManager::CreateSettingForSymbolLocatorPlugin(
1817     Debugger &debugger, const lldb::OptionValuePropertiesSP &properties_sp,
1818     llvm::StringRef description, bool is_global_property) {
1819   return CreateSettingForPlugin(debugger, kSymbolLocatorPluginName,
1820                                 "Settings for symbol locator plug-ins",
1821                                 properties_sp, description, is_global_property);
1822 }
1823 
1824 bool PluginManager::CreateSettingForTracePlugin(
1825     Debugger &debugger, const lldb::OptionValuePropertiesSP &properties_sp,
1826     llvm::StringRef description, bool is_global_property) {
1827   return CreateSettingForPlugin(debugger, kTracePluginName,
1828                                 "Settings for trace plug-ins", properties_sp,
1829                                 description, is_global_property);
1830 }
1831 
1832 lldb::OptionValuePropertiesSP
1833 PluginManager::GetSettingForObjectFilePlugin(Debugger &debugger,
1834                                              llvm::StringRef setting_name) {
1835   return GetSettingForPlugin(debugger, setting_name, kObjectFilePluginName);
1836 }
1837 
1838 bool PluginManager::CreateSettingForObjectFilePlugin(
1839     Debugger &debugger, const lldb::OptionValuePropertiesSP &properties_sp,
1840     llvm::StringRef description, bool is_global_property) {
1841   return CreateSettingForPlugin(debugger, kObjectFilePluginName,
1842                                 "Settings for object file plug-ins",
1843                                 properties_sp, description, is_global_property);
1844 }
1845 
1846 lldb::OptionValuePropertiesSP
1847 PluginManager::GetSettingForSymbolFilePlugin(Debugger &debugger,
1848                                              llvm::StringRef setting_name) {
1849   return GetSettingForPlugin(debugger, setting_name, kSymbolFilePluginName);
1850 }
1851 
1852 bool PluginManager::CreateSettingForSymbolFilePlugin(
1853     Debugger &debugger, const lldb::OptionValuePropertiesSP &properties_sp,
1854     llvm::StringRef description, bool is_global_property) {
1855   return CreateSettingForPlugin(debugger, kSymbolFilePluginName,
1856                                 "Settings for symbol file plug-ins",
1857                                 properties_sp, description, is_global_property);
1858 }
1859 
1860 lldb::OptionValuePropertiesSP
1861 PluginManager::GetSettingForJITLoaderPlugin(Debugger &debugger,
1862                                             llvm::StringRef setting_name) {
1863   return GetSettingForPlugin(debugger, setting_name, kJITLoaderPluginName);
1864 }
1865 
1866 bool PluginManager::CreateSettingForJITLoaderPlugin(
1867     Debugger &debugger, const lldb::OptionValuePropertiesSP &properties_sp,
1868     llvm::StringRef description, bool is_global_property) {
1869   return CreateSettingForPlugin(debugger, kJITLoaderPluginName,
1870                                 "Settings for JIT loader plug-ins",
1871                                 properties_sp, description, is_global_property);
1872 }
1873 
1874 static const char *kOperatingSystemPluginName("os");
1875 
1876 lldb::OptionValuePropertiesSP
1877 PluginManager::GetSettingForOperatingSystemPlugin(Debugger &debugger,
1878                                                   llvm::StringRef setting_name) {
1879   lldb::OptionValuePropertiesSP properties_sp;
1880   lldb::OptionValuePropertiesSP plugin_type_properties_sp(
1881       GetDebuggerPropertyForPlugins(
1882           debugger, kOperatingSystemPluginName,
1883           "", // not creating to so we don't need the description
1884           false));
1885   if (plugin_type_properties_sp)
1886     properties_sp =
1887         plugin_type_properties_sp->GetSubProperty(nullptr, setting_name);
1888   return properties_sp;
1889 }
1890 
1891 bool PluginManager::CreateSettingForOperatingSystemPlugin(
1892     Debugger &debugger, const lldb::OptionValuePropertiesSP &properties_sp,
1893     llvm::StringRef description, bool is_global_property) {
1894   if (properties_sp) {
1895     lldb::OptionValuePropertiesSP plugin_type_properties_sp(
1896         GetDebuggerPropertyForPlugins(debugger, kOperatingSystemPluginName,
1897                                       "Settings for operating system plug-ins",
1898                                       true));
1899     if (plugin_type_properties_sp) {
1900       plugin_type_properties_sp->AppendProperty(properties_sp->GetName(),
1901                                                 description, is_global_property,
1902                                                 properties_sp);
1903       return true;
1904     }
1905   }
1906   return false;
1907 }
1908 
1909 lldb::OptionValuePropertiesSP
1910 PluginManager::GetSettingForStructuredDataPlugin(Debugger &debugger,
1911                                                  llvm::StringRef setting_name) {
1912   return GetSettingForPlugin(debugger, setting_name, kStructuredDataPluginName);
1913 }
1914 
1915 bool PluginManager::CreateSettingForStructuredDataPlugin(
1916     Debugger &debugger, const lldb::OptionValuePropertiesSP &properties_sp,
1917     llvm::StringRef description, bool is_global_property) {
1918   return CreateSettingForPlugin(debugger, kStructuredDataPluginName,
1919                                 "Settings for structured data plug-ins",
1920                                 properties_sp, description, is_global_property);
1921 }
1922