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