xref: /freebsd-src/contrib/llvm-project/lldb/source/Core/PluginManager.cpp (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
15ffd83dbSDimitry Andric //===-- PluginManager.cpp -------------------------------------------------===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric 
90b57cec5SDimitry Andric #include "lldb/Core/PluginManager.h"
100b57cec5SDimitry Andric 
110b57cec5SDimitry Andric #include "lldb/Core/Debugger.h"
120b57cec5SDimitry Andric #include "lldb/Host/FileSystem.h"
130b57cec5SDimitry Andric #include "lldb/Host/HostInfo.h"
140b57cec5SDimitry Andric #include "lldb/Interpreter/OptionValueProperties.h"
15*0fca6ea1SDimitry Andric #include "lldb/Symbol/SaveCoreOptions.h"
16349cc55cSDimitry Andric #include "lldb/Target/Process.h"
170b57cec5SDimitry Andric #include "lldb/Utility/FileSpec.h"
180b57cec5SDimitry Andric #include "lldb/Utility/Status.h"
190b57cec5SDimitry Andric #include "lldb/Utility/StringList.h"
200b57cec5SDimitry Andric #include "llvm/ADT/StringRef.h"
210b57cec5SDimitry Andric #include "llvm/Support/DynamicLibrary.h"
220b57cec5SDimitry Andric #include "llvm/Support/FileSystem.h"
230b57cec5SDimitry Andric #include "llvm/Support/raw_ostream.h"
24fe6060f1SDimitry Andric #include <cassert>
250b57cec5SDimitry Andric #include <map>
260b57cec5SDimitry Andric #include <memory>
270b57cec5SDimitry Andric #include <mutex>
280b57cec5SDimitry Andric #include <string>
290b57cec5SDimitry Andric #include <utility>
300b57cec5SDimitry Andric #include <vector>
315ffd83dbSDimitry Andric #if defined(_WIN32)
325ffd83dbSDimitry Andric #include "lldb/Host/windows/PosixApi.h"
335ffd83dbSDimitry Andric #endif
340b57cec5SDimitry Andric 
350b57cec5SDimitry Andric using namespace lldb;
360b57cec5SDimitry Andric using namespace lldb_private;
370b57cec5SDimitry Andric 
380b57cec5SDimitry Andric typedef bool (*PluginInitCallback)();
390b57cec5SDimitry Andric typedef void (*PluginTermCallback)();
400b57cec5SDimitry Andric 
410b57cec5SDimitry Andric struct PluginInfo {
42fe6060f1SDimitry Andric   PluginInfo() = default;
430b57cec5SDimitry Andric 
440b57cec5SDimitry Andric   llvm::sys::DynamicLibrary library;
45fe6060f1SDimitry Andric   PluginInitCallback plugin_init_callback = nullptr;
46fe6060f1SDimitry Andric   PluginTermCallback plugin_term_callback = nullptr;
470b57cec5SDimitry Andric };
480b57cec5SDimitry Andric 
490b57cec5SDimitry Andric typedef std::map<FileSpec, PluginInfo> PluginTerminateMap;
500b57cec5SDimitry Andric 
510b57cec5SDimitry Andric static std::recursive_mutex &GetPluginMapMutex() {
520b57cec5SDimitry Andric   static std::recursive_mutex g_plugin_map_mutex;
530b57cec5SDimitry Andric   return g_plugin_map_mutex;
540b57cec5SDimitry Andric }
550b57cec5SDimitry Andric 
560b57cec5SDimitry Andric static PluginTerminateMap &GetPluginMap() {
570b57cec5SDimitry Andric   static PluginTerminateMap g_plugin_map;
580b57cec5SDimitry Andric   return g_plugin_map;
590b57cec5SDimitry Andric }
600b57cec5SDimitry Andric 
610b57cec5SDimitry Andric static bool PluginIsLoaded(const FileSpec &plugin_file_spec) {
620b57cec5SDimitry Andric   std::lock_guard<std::recursive_mutex> guard(GetPluginMapMutex());
630b57cec5SDimitry Andric   PluginTerminateMap &plugin_map = GetPluginMap();
640b57cec5SDimitry Andric   return plugin_map.find(plugin_file_spec) != plugin_map.end();
650b57cec5SDimitry Andric }
660b57cec5SDimitry Andric 
670b57cec5SDimitry Andric static void SetPluginInfo(const FileSpec &plugin_file_spec,
680b57cec5SDimitry Andric                           const PluginInfo &plugin_info) {
690b57cec5SDimitry Andric   std::lock_guard<std::recursive_mutex> guard(GetPluginMapMutex());
700b57cec5SDimitry Andric   PluginTerminateMap &plugin_map = GetPluginMap();
710b57cec5SDimitry Andric   assert(plugin_map.find(plugin_file_spec) == plugin_map.end());
720b57cec5SDimitry Andric   plugin_map[plugin_file_spec] = plugin_info;
730b57cec5SDimitry Andric }
740b57cec5SDimitry Andric 
750b57cec5SDimitry Andric template <typename FPtrTy> static FPtrTy CastToFPtr(void *VPtr) {
76480093f4SDimitry Andric   return reinterpret_cast<FPtrTy>(VPtr);
770b57cec5SDimitry Andric }
780b57cec5SDimitry Andric 
790b57cec5SDimitry Andric static FileSystem::EnumerateDirectoryResult
800b57cec5SDimitry Andric LoadPluginCallback(void *baton, llvm::sys::fs::file_type ft,
810b57cec5SDimitry Andric                    llvm::StringRef path) {
820b57cec5SDimitry Andric   Status error;
830b57cec5SDimitry Andric 
840b57cec5SDimitry Andric   namespace fs = llvm::sys::fs;
850b57cec5SDimitry Andric   // If we have a regular file, a symbolic link or unknown file type, try and
860b57cec5SDimitry Andric   // process the file. We must handle unknown as sometimes the directory
870b57cec5SDimitry Andric   // enumeration might be enumerating a file system that doesn't have correct
880b57cec5SDimitry Andric   // file type information.
890b57cec5SDimitry Andric   if (ft == fs::file_type::regular_file || ft == fs::file_type::symlink_file ||
900b57cec5SDimitry Andric       ft == fs::file_type::type_unknown) {
910b57cec5SDimitry Andric     FileSpec plugin_file_spec(path);
920b57cec5SDimitry Andric     FileSystem::Instance().Resolve(plugin_file_spec);
930b57cec5SDimitry Andric 
940b57cec5SDimitry Andric     if (PluginIsLoaded(plugin_file_spec))
950b57cec5SDimitry Andric       return FileSystem::eEnumerateDirectoryResultNext;
960b57cec5SDimitry Andric     else {
970b57cec5SDimitry Andric       PluginInfo plugin_info;
980b57cec5SDimitry Andric 
990b57cec5SDimitry Andric       std::string pluginLoadError;
1000b57cec5SDimitry Andric       plugin_info.library = llvm::sys::DynamicLibrary::getPermanentLibrary(
1010b57cec5SDimitry Andric           plugin_file_spec.GetPath().c_str(), &pluginLoadError);
1020b57cec5SDimitry Andric       if (plugin_info.library.isValid()) {
1030b57cec5SDimitry Andric         bool success = false;
1040b57cec5SDimitry Andric         plugin_info.plugin_init_callback = CastToFPtr<PluginInitCallback>(
1050b57cec5SDimitry Andric             plugin_info.library.getAddressOfSymbol("LLDBPluginInitialize"));
1060b57cec5SDimitry Andric         if (plugin_info.plugin_init_callback) {
1070b57cec5SDimitry Andric           // Call the plug-in "bool LLDBPluginInitialize(void)" function
1080b57cec5SDimitry Andric           success = plugin_info.plugin_init_callback();
1090b57cec5SDimitry Andric         }
1100b57cec5SDimitry Andric 
1110b57cec5SDimitry Andric         if (success) {
1120b57cec5SDimitry Andric           // It is ok for the "LLDBPluginTerminate" symbol to be nullptr
1130b57cec5SDimitry Andric           plugin_info.plugin_term_callback = CastToFPtr<PluginTermCallback>(
1140b57cec5SDimitry Andric               plugin_info.library.getAddressOfSymbol("LLDBPluginTerminate"));
1150b57cec5SDimitry Andric         } else {
1160b57cec5SDimitry Andric           // The initialize function returned FALSE which means the plug-in
1170b57cec5SDimitry Andric           // might not be compatible, or might be too new or too old, or might
1180b57cec5SDimitry Andric           // not want to run on this machine.  Set it to a default-constructed
1190b57cec5SDimitry Andric           // instance to invalidate it.
1200b57cec5SDimitry Andric           plugin_info = PluginInfo();
1210b57cec5SDimitry Andric         }
1220b57cec5SDimitry Andric 
1230b57cec5SDimitry Andric         // Regardless of success or failure, cache the plug-in load in our
1240b57cec5SDimitry Andric         // plug-in info so we don't try to load it again and again.
1250b57cec5SDimitry Andric         SetPluginInfo(plugin_file_spec, plugin_info);
1260b57cec5SDimitry Andric 
1270b57cec5SDimitry Andric         return FileSystem::eEnumerateDirectoryResultNext;
1280b57cec5SDimitry Andric       }
1290b57cec5SDimitry Andric     }
1300b57cec5SDimitry Andric   }
1310b57cec5SDimitry Andric 
1320b57cec5SDimitry Andric   if (ft == fs::file_type::directory_file ||
1330b57cec5SDimitry Andric       ft == fs::file_type::symlink_file || ft == fs::file_type::type_unknown) {
1340b57cec5SDimitry Andric     // Try and recurse into anything that a directory or symbolic link. We must
1350b57cec5SDimitry Andric     // also do this for unknown as sometimes the directory enumeration might be
1360b57cec5SDimitry Andric     // enumerating a file system that doesn't have correct file type
1370b57cec5SDimitry Andric     // information.
1380b57cec5SDimitry Andric     return FileSystem::eEnumerateDirectoryResultEnter;
1390b57cec5SDimitry Andric   }
1400b57cec5SDimitry Andric 
1410b57cec5SDimitry Andric   return FileSystem::eEnumerateDirectoryResultNext;
1420b57cec5SDimitry Andric }
1430b57cec5SDimitry Andric 
1440b57cec5SDimitry Andric void PluginManager::Initialize() {
1450b57cec5SDimitry Andric   const bool find_directories = true;
1460b57cec5SDimitry Andric   const bool find_files = true;
1470b57cec5SDimitry Andric   const bool find_other = true;
1480b57cec5SDimitry Andric   char dir_path[PATH_MAX];
1490b57cec5SDimitry Andric   if (FileSpec dir_spec = HostInfo::GetSystemPluginDir()) {
1500b57cec5SDimitry Andric     if (FileSystem::Instance().Exists(dir_spec) &&
1510b57cec5SDimitry Andric         dir_spec.GetPath(dir_path, sizeof(dir_path))) {
1520b57cec5SDimitry Andric       FileSystem::Instance().EnumerateDirectory(dir_path, find_directories,
1530b57cec5SDimitry Andric                                                 find_files, find_other,
1540b57cec5SDimitry Andric                                                 LoadPluginCallback, nullptr);
1550b57cec5SDimitry Andric     }
1560b57cec5SDimitry Andric   }
1570b57cec5SDimitry Andric 
1580b57cec5SDimitry Andric   if (FileSpec dir_spec = HostInfo::GetUserPluginDir()) {
1590b57cec5SDimitry Andric     if (FileSystem::Instance().Exists(dir_spec) &&
1600b57cec5SDimitry Andric         dir_spec.GetPath(dir_path, sizeof(dir_path))) {
1610b57cec5SDimitry Andric       FileSystem::Instance().EnumerateDirectory(dir_path, find_directories,
1620b57cec5SDimitry Andric                                                 find_files, find_other,
1630b57cec5SDimitry Andric                                                 LoadPluginCallback, nullptr);
1640b57cec5SDimitry Andric     }
1650b57cec5SDimitry Andric   }
1660b57cec5SDimitry Andric }
1670b57cec5SDimitry Andric 
1680b57cec5SDimitry Andric void PluginManager::Terminate() {
1690b57cec5SDimitry Andric   std::lock_guard<std::recursive_mutex> guard(GetPluginMapMutex());
1700b57cec5SDimitry Andric   PluginTerminateMap &plugin_map = GetPluginMap();
1710b57cec5SDimitry Andric 
1720b57cec5SDimitry Andric   PluginTerminateMap::const_iterator pos, end = plugin_map.end();
1730b57cec5SDimitry Andric   for (pos = plugin_map.begin(); pos != end; ++pos) {
1740b57cec5SDimitry Andric     // Call the plug-in "void LLDBPluginTerminate (void)" function if there is
1750b57cec5SDimitry Andric     // one (if the symbol was not nullptr).
1760b57cec5SDimitry Andric     if (pos->second.library.isValid()) {
1770b57cec5SDimitry Andric       if (pos->second.plugin_term_callback)
1780b57cec5SDimitry Andric         pos->second.plugin_term_callback();
1790b57cec5SDimitry Andric     }
1800b57cec5SDimitry Andric   }
1810b57cec5SDimitry Andric   plugin_map.clear();
1820b57cec5SDimitry Andric }
1830b57cec5SDimitry Andric 
1845ffd83dbSDimitry Andric template <typename Callback> struct PluginInstance {
1855ffd83dbSDimitry Andric   typedef Callback CallbackType;
1860b57cec5SDimitry Andric 
1875ffd83dbSDimitry Andric   PluginInstance() = default;
188349cc55cSDimitry Andric   PluginInstance(llvm::StringRef name, llvm::StringRef description,
189349cc55cSDimitry Andric                  Callback create_callback,
1905ffd83dbSDimitry Andric                  DebuggerInitializeCallback debugger_init_callback = nullptr)
191349cc55cSDimitry Andric       : name(name), description(description), create_callback(create_callback),
1925ffd83dbSDimitry Andric         debugger_init_callback(debugger_init_callback) {}
1930b57cec5SDimitry Andric 
194349cc55cSDimitry Andric   llvm::StringRef name;
195349cc55cSDimitry Andric   llvm::StringRef description;
1965ffd83dbSDimitry Andric   Callback create_callback;
1975ffd83dbSDimitry Andric   DebuggerInitializeCallback debugger_init_callback;
1980b57cec5SDimitry Andric };
1990b57cec5SDimitry Andric 
2005ffd83dbSDimitry Andric template <typename Instance> class PluginInstances {
2015ffd83dbSDimitry Andric public:
2025ffd83dbSDimitry Andric   template <typename... Args>
203349cc55cSDimitry Andric   bool RegisterPlugin(llvm::StringRef name, llvm::StringRef description,
2045ffd83dbSDimitry Andric                       typename Instance::CallbackType callback,
2055ffd83dbSDimitry Andric                       Args &&...args) {
2065ffd83dbSDimitry Andric     if (!callback)
2075ffd83dbSDimitry Andric       return false;
208349cc55cSDimitry Andric     assert(!name.empty());
2095ffd83dbSDimitry Andric     Instance instance =
2105ffd83dbSDimitry Andric         Instance(name, description, callback, std::forward<Args>(args)...);
2115ffd83dbSDimitry Andric     m_instances.push_back(instance);
2125ffd83dbSDimitry Andric     return false;
2130b57cec5SDimitry Andric   }
2140b57cec5SDimitry Andric 
2155ffd83dbSDimitry Andric   bool UnregisterPlugin(typename Instance::CallbackType callback) {
2165ffd83dbSDimitry Andric     if (!callback)
2175ffd83dbSDimitry Andric       return false;
2185ffd83dbSDimitry Andric     auto pos = m_instances.begin();
2195ffd83dbSDimitry Andric     auto end = m_instances.end();
2205ffd83dbSDimitry Andric     for (; pos != end; ++pos) {
2215ffd83dbSDimitry Andric       if (pos->create_callback == callback) {
2225ffd83dbSDimitry Andric         m_instances.erase(pos);
2235ffd83dbSDimitry Andric         return true;
2245ffd83dbSDimitry Andric       }
2255ffd83dbSDimitry Andric     }
2265ffd83dbSDimitry Andric     return false;
2275ffd83dbSDimitry Andric   }
2285ffd83dbSDimitry Andric 
2295ffd83dbSDimitry Andric   typename Instance::CallbackType GetCallbackAtIndex(uint32_t idx) {
2305ffd83dbSDimitry Andric     if (Instance *instance = GetInstanceAtIndex(idx))
2315ffd83dbSDimitry Andric       return instance->create_callback;
2325ffd83dbSDimitry Andric     return nullptr;
2335ffd83dbSDimitry Andric   }
2345ffd83dbSDimitry Andric 
235349cc55cSDimitry Andric   llvm::StringRef GetDescriptionAtIndex(uint32_t idx) {
2365ffd83dbSDimitry Andric     if (Instance *instance = GetInstanceAtIndex(idx))
237349cc55cSDimitry Andric       return instance->description;
238349cc55cSDimitry Andric     return "";
2395ffd83dbSDimitry Andric   }
2405ffd83dbSDimitry Andric 
241349cc55cSDimitry Andric   llvm::StringRef GetNameAtIndex(uint32_t idx) {
2425ffd83dbSDimitry Andric     if (Instance *instance = GetInstanceAtIndex(idx))
243349cc55cSDimitry Andric       return instance->name;
244349cc55cSDimitry Andric     return "";
2455ffd83dbSDimitry Andric   }
2465ffd83dbSDimitry Andric 
247349cc55cSDimitry Andric   typename Instance::CallbackType GetCallbackForName(llvm::StringRef name) {
248349cc55cSDimitry Andric     if (name.empty())
2495ffd83dbSDimitry Andric       return nullptr;
2505ffd83dbSDimitry Andric     for (auto &instance : m_instances) {
2515ffd83dbSDimitry Andric       if (name == instance.name)
2525ffd83dbSDimitry Andric         return instance.create_callback;
2535ffd83dbSDimitry Andric     }
2545ffd83dbSDimitry Andric     return nullptr;
2555ffd83dbSDimitry Andric   }
2565ffd83dbSDimitry Andric 
2575ffd83dbSDimitry Andric   void PerformDebuggerCallback(Debugger &debugger) {
2585ffd83dbSDimitry Andric     for (auto &instance : m_instances) {
2595ffd83dbSDimitry Andric       if (instance.debugger_init_callback)
2605ffd83dbSDimitry Andric         instance.debugger_init_callback(debugger);
2615ffd83dbSDimitry Andric     }
2625ffd83dbSDimitry Andric   }
2635ffd83dbSDimitry Andric 
2645ffd83dbSDimitry Andric   const std::vector<Instance> &GetInstances() const { return m_instances; }
2655ffd83dbSDimitry Andric   std::vector<Instance> &GetInstances() { return m_instances; }
2665ffd83dbSDimitry Andric 
2675ffd83dbSDimitry Andric   Instance *GetInstanceAtIndex(uint32_t idx) {
2685ffd83dbSDimitry Andric     if (idx < m_instances.size())
2695ffd83dbSDimitry Andric       return &m_instances[idx];
2705ffd83dbSDimitry Andric     return nullptr;
2715ffd83dbSDimitry Andric   }
272e8d8bef9SDimitry Andric 
273e8d8bef9SDimitry Andric private:
2745ffd83dbSDimitry Andric   std::vector<Instance> m_instances;
2755ffd83dbSDimitry Andric };
2765ffd83dbSDimitry Andric 
2775ffd83dbSDimitry Andric #pragma mark ABI
2785ffd83dbSDimitry Andric 
2795ffd83dbSDimitry Andric typedef PluginInstance<ABICreateInstance> ABIInstance;
2805ffd83dbSDimitry Andric typedef PluginInstances<ABIInstance> ABIInstances;
2815ffd83dbSDimitry Andric 
2820b57cec5SDimitry Andric static ABIInstances &GetABIInstances() {
2830b57cec5SDimitry Andric   static ABIInstances g_instances;
2840b57cec5SDimitry Andric   return g_instances;
2850b57cec5SDimitry Andric }
2860b57cec5SDimitry Andric 
287349cc55cSDimitry Andric bool PluginManager::RegisterPlugin(llvm::StringRef name,
288349cc55cSDimitry Andric                                    llvm::StringRef description,
2890b57cec5SDimitry Andric                                    ABICreateInstance create_callback) {
2905ffd83dbSDimitry Andric   return GetABIInstances().RegisterPlugin(name, description, create_callback);
2910b57cec5SDimitry Andric }
2920b57cec5SDimitry Andric 
2930b57cec5SDimitry Andric bool PluginManager::UnregisterPlugin(ABICreateInstance create_callback) {
2945ffd83dbSDimitry Andric   return GetABIInstances().UnregisterPlugin(create_callback);
2950b57cec5SDimitry Andric }
2960b57cec5SDimitry Andric 
2970b57cec5SDimitry Andric ABICreateInstance PluginManager::GetABICreateCallbackAtIndex(uint32_t idx) {
2985ffd83dbSDimitry Andric   return GetABIInstances().GetCallbackAtIndex(idx);
2990b57cec5SDimitry Andric }
3000b57cec5SDimitry Andric 
3010b57cec5SDimitry Andric #pragma mark Architecture
3020b57cec5SDimitry Andric 
3035ffd83dbSDimitry Andric typedef PluginInstance<ArchitectureCreateInstance> ArchitectureInstance;
3040b57cec5SDimitry Andric typedef std::vector<ArchitectureInstance> ArchitectureInstances;
3050b57cec5SDimitry Andric 
3060b57cec5SDimitry Andric static ArchitectureInstances &GetArchitectureInstances() {
3070b57cec5SDimitry Andric   static ArchitectureInstances g_instances;
3080b57cec5SDimitry Andric   return g_instances;
3090b57cec5SDimitry Andric }
3100b57cec5SDimitry Andric 
311349cc55cSDimitry Andric void PluginManager::RegisterPlugin(llvm::StringRef name,
3120b57cec5SDimitry Andric                                    llvm::StringRef description,
3130b57cec5SDimitry Andric                                    ArchitectureCreateInstance create_callback) {
314349cc55cSDimitry Andric   GetArchitectureInstances().push_back({name, description, create_callback});
3150b57cec5SDimitry Andric }
3160b57cec5SDimitry Andric 
3170b57cec5SDimitry Andric void PluginManager::UnregisterPlugin(
3180b57cec5SDimitry Andric     ArchitectureCreateInstance create_callback) {
3190b57cec5SDimitry Andric   auto &instances = GetArchitectureInstances();
3200b57cec5SDimitry Andric 
3210b57cec5SDimitry Andric   for (auto pos = instances.begin(), end = instances.end(); pos != end; ++pos) {
3220b57cec5SDimitry Andric     if (pos->create_callback == create_callback) {
3230b57cec5SDimitry Andric       instances.erase(pos);
3240b57cec5SDimitry Andric       return;
3250b57cec5SDimitry Andric     }
3260b57cec5SDimitry Andric   }
3270b57cec5SDimitry Andric   llvm_unreachable("Plugin not found");
3280b57cec5SDimitry Andric }
3290b57cec5SDimitry Andric 
3300b57cec5SDimitry Andric std::unique_ptr<Architecture>
3310b57cec5SDimitry Andric PluginManager::CreateArchitectureInstance(const ArchSpec &arch) {
3320b57cec5SDimitry Andric   for (const auto &instances : GetArchitectureInstances()) {
3330b57cec5SDimitry Andric     if (auto plugin_up = instances.create_callback(arch))
3340b57cec5SDimitry Andric       return plugin_up;
3350b57cec5SDimitry Andric   }
3360b57cec5SDimitry Andric   return nullptr;
3370b57cec5SDimitry Andric }
3380b57cec5SDimitry Andric 
3390b57cec5SDimitry Andric #pragma mark Disassembler
3400b57cec5SDimitry Andric 
3415ffd83dbSDimitry Andric typedef PluginInstance<DisassemblerCreateInstance> DisassemblerInstance;
3425ffd83dbSDimitry Andric typedef PluginInstances<DisassemblerInstance> DisassemblerInstances;
3430b57cec5SDimitry Andric 
3440b57cec5SDimitry Andric static DisassemblerInstances &GetDisassemblerInstances() {
3450b57cec5SDimitry Andric   static DisassemblerInstances g_instances;
3460b57cec5SDimitry Andric   return g_instances;
3470b57cec5SDimitry Andric }
3480b57cec5SDimitry Andric 
349349cc55cSDimitry Andric bool PluginManager::RegisterPlugin(llvm::StringRef name,
350349cc55cSDimitry Andric                                    llvm::StringRef description,
3510b57cec5SDimitry Andric                                    DisassemblerCreateInstance create_callback) {
3525ffd83dbSDimitry Andric   return GetDisassemblerInstances().RegisterPlugin(name, description,
3535ffd83dbSDimitry Andric                                                    create_callback);
3540b57cec5SDimitry Andric }
3550b57cec5SDimitry Andric 
3560b57cec5SDimitry Andric bool PluginManager::UnregisterPlugin(
3570b57cec5SDimitry Andric     DisassemblerCreateInstance create_callback) {
3585ffd83dbSDimitry Andric   return GetDisassemblerInstances().UnregisterPlugin(create_callback);
3590b57cec5SDimitry Andric }
3600b57cec5SDimitry Andric 
3610b57cec5SDimitry Andric DisassemblerCreateInstance
3620b57cec5SDimitry Andric PluginManager::GetDisassemblerCreateCallbackAtIndex(uint32_t idx) {
3635ffd83dbSDimitry Andric   return GetDisassemblerInstances().GetCallbackAtIndex(idx);
3640b57cec5SDimitry Andric }
3650b57cec5SDimitry Andric 
3660b57cec5SDimitry Andric DisassemblerCreateInstance
367349cc55cSDimitry Andric PluginManager::GetDisassemblerCreateCallbackForPluginName(
368349cc55cSDimitry Andric     llvm::StringRef name) {
3695ffd83dbSDimitry Andric   return GetDisassemblerInstances().GetCallbackForName(name);
3700b57cec5SDimitry Andric }
3710b57cec5SDimitry Andric 
3720b57cec5SDimitry Andric #pragma mark DynamicLoader
3730b57cec5SDimitry Andric 
3745ffd83dbSDimitry Andric typedef PluginInstance<DynamicLoaderCreateInstance> DynamicLoaderInstance;
3755ffd83dbSDimitry Andric typedef PluginInstances<DynamicLoaderInstance> DynamicLoaderInstances;
3760b57cec5SDimitry Andric 
3770b57cec5SDimitry Andric static DynamicLoaderInstances &GetDynamicLoaderInstances() {
3780b57cec5SDimitry Andric   static DynamicLoaderInstances g_instances;
3790b57cec5SDimitry Andric   return g_instances;
3800b57cec5SDimitry Andric }
3810b57cec5SDimitry Andric 
3820b57cec5SDimitry Andric bool PluginManager::RegisterPlugin(
383349cc55cSDimitry Andric     llvm::StringRef name, llvm::StringRef description,
3840b57cec5SDimitry Andric     DynamicLoaderCreateInstance create_callback,
3850b57cec5SDimitry Andric     DebuggerInitializeCallback debugger_init_callback) {
3865ffd83dbSDimitry Andric   return GetDynamicLoaderInstances().RegisterPlugin(
3875ffd83dbSDimitry Andric       name, description, create_callback, debugger_init_callback);
3880b57cec5SDimitry Andric }
3890b57cec5SDimitry Andric 
3900b57cec5SDimitry Andric bool PluginManager::UnregisterPlugin(
3910b57cec5SDimitry Andric     DynamicLoaderCreateInstance create_callback) {
3925ffd83dbSDimitry Andric   return GetDynamicLoaderInstances().UnregisterPlugin(create_callback);
3930b57cec5SDimitry Andric }
3940b57cec5SDimitry Andric 
3950b57cec5SDimitry Andric DynamicLoaderCreateInstance
3960b57cec5SDimitry Andric PluginManager::GetDynamicLoaderCreateCallbackAtIndex(uint32_t idx) {
3975ffd83dbSDimitry Andric   return GetDynamicLoaderInstances().GetCallbackAtIndex(idx);
3980b57cec5SDimitry Andric }
3990b57cec5SDimitry Andric 
4000b57cec5SDimitry Andric DynamicLoaderCreateInstance
401349cc55cSDimitry Andric PluginManager::GetDynamicLoaderCreateCallbackForPluginName(
402349cc55cSDimitry Andric     llvm::StringRef name) {
4035ffd83dbSDimitry Andric   return GetDynamicLoaderInstances().GetCallbackForName(name);
4040b57cec5SDimitry Andric }
4050b57cec5SDimitry Andric 
4060b57cec5SDimitry Andric #pragma mark JITLoader
4070b57cec5SDimitry Andric 
4085ffd83dbSDimitry Andric typedef PluginInstance<JITLoaderCreateInstance> JITLoaderInstance;
4095ffd83dbSDimitry Andric typedef PluginInstances<JITLoaderInstance> JITLoaderInstances;
4100b57cec5SDimitry Andric 
4110b57cec5SDimitry Andric static JITLoaderInstances &GetJITLoaderInstances() {
4120b57cec5SDimitry Andric   static JITLoaderInstances g_instances;
4130b57cec5SDimitry Andric   return g_instances;
4140b57cec5SDimitry Andric }
4150b57cec5SDimitry Andric 
4160b57cec5SDimitry Andric bool PluginManager::RegisterPlugin(
417349cc55cSDimitry Andric     llvm::StringRef name, llvm::StringRef description,
4180b57cec5SDimitry Andric     JITLoaderCreateInstance create_callback,
4190b57cec5SDimitry Andric     DebuggerInitializeCallback debugger_init_callback) {
4205ffd83dbSDimitry Andric   return GetJITLoaderInstances().RegisterPlugin(
4215ffd83dbSDimitry Andric       name, description, create_callback, debugger_init_callback);
4220b57cec5SDimitry Andric }
4230b57cec5SDimitry Andric 
4240b57cec5SDimitry Andric bool PluginManager::UnregisterPlugin(JITLoaderCreateInstance create_callback) {
4255ffd83dbSDimitry Andric   return GetJITLoaderInstances().UnregisterPlugin(create_callback);
4260b57cec5SDimitry Andric }
4270b57cec5SDimitry Andric 
4280b57cec5SDimitry Andric JITLoaderCreateInstance
4290b57cec5SDimitry Andric PluginManager::GetJITLoaderCreateCallbackAtIndex(uint32_t idx) {
4305ffd83dbSDimitry Andric   return GetJITLoaderInstances().GetCallbackAtIndex(idx);
4310b57cec5SDimitry Andric }
4320b57cec5SDimitry Andric 
4330b57cec5SDimitry Andric #pragma mark EmulateInstruction
4340b57cec5SDimitry Andric 
4355ffd83dbSDimitry Andric typedef PluginInstance<EmulateInstructionCreateInstance>
4365ffd83dbSDimitry Andric     EmulateInstructionInstance;
4375ffd83dbSDimitry Andric typedef PluginInstances<EmulateInstructionInstance> EmulateInstructionInstances;
4380b57cec5SDimitry Andric 
4390b57cec5SDimitry Andric static EmulateInstructionInstances &GetEmulateInstructionInstances() {
4400b57cec5SDimitry Andric   static EmulateInstructionInstances g_instances;
4410b57cec5SDimitry Andric   return g_instances;
4420b57cec5SDimitry Andric }
4430b57cec5SDimitry Andric 
4440b57cec5SDimitry Andric bool PluginManager::RegisterPlugin(
445349cc55cSDimitry Andric     llvm::StringRef name, llvm::StringRef description,
4460b57cec5SDimitry Andric     EmulateInstructionCreateInstance create_callback) {
4475ffd83dbSDimitry Andric   return GetEmulateInstructionInstances().RegisterPlugin(name, description,
4485ffd83dbSDimitry Andric                                                          create_callback);
4490b57cec5SDimitry Andric }
4500b57cec5SDimitry Andric 
4510b57cec5SDimitry Andric bool PluginManager::UnregisterPlugin(
4520b57cec5SDimitry Andric     EmulateInstructionCreateInstance create_callback) {
4535ffd83dbSDimitry Andric   return GetEmulateInstructionInstances().UnregisterPlugin(create_callback);
4540b57cec5SDimitry Andric }
4550b57cec5SDimitry Andric 
4560b57cec5SDimitry Andric EmulateInstructionCreateInstance
4570b57cec5SDimitry Andric PluginManager::GetEmulateInstructionCreateCallbackAtIndex(uint32_t idx) {
4585ffd83dbSDimitry Andric   return GetEmulateInstructionInstances().GetCallbackAtIndex(idx);
4590b57cec5SDimitry Andric }
4600b57cec5SDimitry Andric 
4610b57cec5SDimitry Andric EmulateInstructionCreateInstance
4620b57cec5SDimitry Andric PluginManager::GetEmulateInstructionCreateCallbackForPluginName(
463349cc55cSDimitry Andric     llvm::StringRef name) {
4645ffd83dbSDimitry Andric   return GetEmulateInstructionInstances().GetCallbackForName(name);
4650b57cec5SDimitry Andric }
4660b57cec5SDimitry Andric 
4670b57cec5SDimitry Andric #pragma mark OperatingSystem
4680b57cec5SDimitry Andric 
4695ffd83dbSDimitry Andric typedef PluginInstance<OperatingSystemCreateInstance> OperatingSystemInstance;
4705ffd83dbSDimitry Andric typedef PluginInstances<OperatingSystemInstance> OperatingSystemInstances;
4710b57cec5SDimitry Andric 
4720b57cec5SDimitry Andric static OperatingSystemInstances &GetOperatingSystemInstances() {
4730b57cec5SDimitry Andric   static OperatingSystemInstances g_instances;
4740b57cec5SDimitry Andric   return g_instances;
4750b57cec5SDimitry Andric }
4760b57cec5SDimitry Andric 
4770b57cec5SDimitry Andric bool PluginManager::RegisterPlugin(
478349cc55cSDimitry Andric     llvm::StringRef name, llvm::StringRef description,
4790b57cec5SDimitry Andric     OperatingSystemCreateInstance create_callback,
4800b57cec5SDimitry Andric     DebuggerInitializeCallback debugger_init_callback) {
4815ffd83dbSDimitry Andric   return GetOperatingSystemInstances().RegisterPlugin(
4825ffd83dbSDimitry Andric       name, description, create_callback, debugger_init_callback);
4830b57cec5SDimitry Andric }
4840b57cec5SDimitry Andric 
4850b57cec5SDimitry Andric bool PluginManager::UnregisterPlugin(
4860b57cec5SDimitry Andric     OperatingSystemCreateInstance create_callback) {
4875ffd83dbSDimitry Andric   return GetOperatingSystemInstances().UnregisterPlugin(create_callback);
4880b57cec5SDimitry Andric }
4890b57cec5SDimitry Andric 
4900b57cec5SDimitry Andric OperatingSystemCreateInstance
4910b57cec5SDimitry Andric PluginManager::GetOperatingSystemCreateCallbackAtIndex(uint32_t idx) {
4925ffd83dbSDimitry Andric   return GetOperatingSystemInstances().GetCallbackAtIndex(idx);
4930b57cec5SDimitry Andric }
4940b57cec5SDimitry Andric 
4950b57cec5SDimitry Andric OperatingSystemCreateInstance
496349cc55cSDimitry Andric PluginManager::GetOperatingSystemCreateCallbackForPluginName(
497349cc55cSDimitry Andric     llvm::StringRef name) {
4985ffd83dbSDimitry Andric   return GetOperatingSystemInstances().GetCallbackForName(name);
4990b57cec5SDimitry Andric }
5000b57cec5SDimitry Andric 
5010b57cec5SDimitry Andric #pragma mark Language
5020b57cec5SDimitry Andric 
5035ffd83dbSDimitry Andric typedef PluginInstance<LanguageCreateInstance> LanguageInstance;
5045ffd83dbSDimitry Andric typedef PluginInstances<LanguageInstance> LanguageInstances;
5050b57cec5SDimitry Andric 
5060b57cec5SDimitry Andric static LanguageInstances &GetLanguageInstances() {
5070b57cec5SDimitry Andric   static LanguageInstances g_instances;
5080b57cec5SDimitry Andric   return g_instances;
5090b57cec5SDimitry Andric }
5100b57cec5SDimitry Andric 
511349cc55cSDimitry Andric bool PluginManager::RegisterPlugin(llvm::StringRef name,
512349cc55cSDimitry Andric                                    llvm::StringRef description,
5130b57cec5SDimitry Andric                                    LanguageCreateInstance create_callback) {
5145ffd83dbSDimitry Andric   return GetLanguageInstances().RegisterPlugin(name, description,
5155ffd83dbSDimitry Andric                                                create_callback);
5160b57cec5SDimitry Andric }
5170b57cec5SDimitry Andric 
5180b57cec5SDimitry Andric bool PluginManager::UnregisterPlugin(LanguageCreateInstance create_callback) {
5195ffd83dbSDimitry Andric   return GetLanguageInstances().UnregisterPlugin(create_callback);
5200b57cec5SDimitry Andric }
5210b57cec5SDimitry Andric 
5220b57cec5SDimitry Andric LanguageCreateInstance
5230b57cec5SDimitry Andric PluginManager::GetLanguageCreateCallbackAtIndex(uint32_t idx) {
5245ffd83dbSDimitry Andric   return GetLanguageInstances().GetCallbackAtIndex(idx);
5250b57cec5SDimitry Andric }
5260b57cec5SDimitry Andric 
5270b57cec5SDimitry Andric #pragma mark LanguageRuntime
5280b57cec5SDimitry Andric 
5295ffd83dbSDimitry Andric struct LanguageRuntimeInstance
5305ffd83dbSDimitry Andric     : public PluginInstance<LanguageRuntimeCreateInstance> {
5315ffd83dbSDimitry Andric   LanguageRuntimeInstance(
532349cc55cSDimitry Andric       llvm::StringRef name, llvm::StringRef description,
533349cc55cSDimitry Andric       CallbackType create_callback,
5345ffd83dbSDimitry Andric       DebuggerInitializeCallback debugger_init_callback,
5355ffd83dbSDimitry Andric       LanguageRuntimeGetCommandObject command_callback,
5365ffd83dbSDimitry Andric       LanguageRuntimeGetExceptionPrecondition precondition_callback)
5375ffd83dbSDimitry Andric       : PluginInstance<LanguageRuntimeCreateInstance>(
538349cc55cSDimitry Andric             name, description, create_callback, debugger_init_callback),
5395ffd83dbSDimitry Andric         command_callback(command_callback),
5405ffd83dbSDimitry Andric         precondition_callback(precondition_callback) {}
5410b57cec5SDimitry Andric 
5420b57cec5SDimitry Andric   LanguageRuntimeGetCommandObject command_callback;
5430b57cec5SDimitry Andric   LanguageRuntimeGetExceptionPrecondition precondition_callback;
5440b57cec5SDimitry Andric };
5450b57cec5SDimitry Andric 
5465ffd83dbSDimitry Andric typedef PluginInstances<LanguageRuntimeInstance> LanguageRuntimeInstances;
5470b57cec5SDimitry Andric 
5480b57cec5SDimitry Andric static LanguageRuntimeInstances &GetLanguageRuntimeInstances() {
5490b57cec5SDimitry Andric   static LanguageRuntimeInstances g_instances;
5500b57cec5SDimitry Andric   return g_instances;
5510b57cec5SDimitry Andric }
5520b57cec5SDimitry Andric 
5530b57cec5SDimitry Andric bool PluginManager::RegisterPlugin(
554349cc55cSDimitry Andric     llvm::StringRef name, llvm::StringRef description,
5550b57cec5SDimitry Andric     LanguageRuntimeCreateInstance create_callback,
5560b57cec5SDimitry Andric     LanguageRuntimeGetCommandObject command_callback,
5570b57cec5SDimitry Andric     LanguageRuntimeGetExceptionPrecondition precondition_callback) {
5585ffd83dbSDimitry Andric   return GetLanguageRuntimeInstances().RegisterPlugin(
5595ffd83dbSDimitry Andric       name, description, create_callback, nullptr, command_callback,
5605ffd83dbSDimitry Andric       precondition_callback);
5610b57cec5SDimitry Andric }
5620b57cec5SDimitry Andric 
5630b57cec5SDimitry Andric bool PluginManager::UnregisterPlugin(
5640b57cec5SDimitry Andric     LanguageRuntimeCreateInstance create_callback) {
5655ffd83dbSDimitry Andric   return GetLanguageRuntimeInstances().UnregisterPlugin(create_callback);
5660b57cec5SDimitry Andric }
5670b57cec5SDimitry Andric 
5680b57cec5SDimitry Andric LanguageRuntimeCreateInstance
5690b57cec5SDimitry Andric PluginManager::GetLanguageRuntimeCreateCallbackAtIndex(uint32_t idx) {
5705ffd83dbSDimitry Andric   return GetLanguageRuntimeInstances().GetCallbackAtIndex(idx);
5710b57cec5SDimitry Andric }
5720b57cec5SDimitry Andric 
5730b57cec5SDimitry Andric LanguageRuntimeGetCommandObject
5740b57cec5SDimitry Andric PluginManager::GetLanguageRuntimeGetCommandObjectAtIndex(uint32_t idx) {
5755ffd83dbSDimitry Andric   const auto &instances = GetLanguageRuntimeInstances().GetInstances();
5760b57cec5SDimitry Andric   if (idx < instances.size())
5770b57cec5SDimitry Andric     return instances[idx].command_callback;
5780b57cec5SDimitry Andric   return nullptr;
5790b57cec5SDimitry Andric }
5800b57cec5SDimitry Andric 
5810b57cec5SDimitry Andric LanguageRuntimeGetExceptionPrecondition
5820b57cec5SDimitry Andric PluginManager::GetLanguageRuntimeGetExceptionPreconditionAtIndex(uint32_t idx) {
5835ffd83dbSDimitry Andric   const auto &instances = GetLanguageRuntimeInstances().GetInstances();
5840b57cec5SDimitry Andric   if (idx < instances.size())
5850b57cec5SDimitry Andric     return instances[idx].precondition_callback;
5860b57cec5SDimitry Andric   return nullptr;
5870b57cec5SDimitry Andric }
5880b57cec5SDimitry Andric 
5890b57cec5SDimitry Andric #pragma mark SystemRuntime
5900b57cec5SDimitry Andric 
5915ffd83dbSDimitry Andric typedef PluginInstance<SystemRuntimeCreateInstance> SystemRuntimeInstance;
5925ffd83dbSDimitry Andric typedef PluginInstances<SystemRuntimeInstance> SystemRuntimeInstances;
5930b57cec5SDimitry Andric 
5940b57cec5SDimitry Andric static SystemRuntimeInstances &GetSystemRuntimeInstances() {
5950b57cec5SDimitry Andric   static SystemRuntimeInstances g_instances;
5960b57cec5SDimitry Andric   return g_instances;
5970b57cec5SDimitry Andric }
5980b57cec5SDimitry Andric 
5990b57cec5SDimitry Andric bool PluginManager::RegisterPlugin(
600349cc55cSDimitry Andric     llvm::StringRef name, llvm::StringRef description,
6010b57cec5SDimitry Andric     SystemRuntimeCreateInstance create_callback) {
6025ffd83dbSDimitry Andric   return GetSystemRuntimeInstances().RegisterPlugin(name, description,
6035ffd83dbSDimitry Andric                                                     create_callback);
6040b57cec5SDimitry Andric }
6050b57cec5SDimitry Andric 
6060b57cec5SDimitry Andric bool PluginManager::UnregisterPlugin(
6070b57cec5SDimitry Andric     SystemRuntimeCreateInstance create_callback) {
6085ffd83dbSDimitry Andric   return GetSystemRuntimeInstances().UnregisterPlugin(create_callback);
6090b57cec5SDimitry Andric }
6100b57cec5SDimitry Andric 
6110b57cec5SDimitry Andric SystemRuntimeCreateInstance
6120b57cec5SDimitry Andric PluginManager::GetSystemRuntimeCreateCallbackAtIndex(uint32_t idx) {
6135ffd83dbSDimitry Andric   return GetSystemRuntimeInstances().GetCallbackAtIndex(idx);
6140b57cec5SDimitry Andric }
6150b57cec5SDimitry Andric 
6160b57cec5SDimitry Andric #pragma mark ObjectFile
6170b57cec5SDimitry Andric 
6185ffd83dbSDimitry Andric struct ObjectFileInstance : public PluginInstance<ObjectFileCreateInstance> {
6195ffd83dbSDimitry Andric   ObjectFileInstance(
620349cc55cSDimitry Andric       llvm::StringRef name, llvm::StringRef description,
621349cc55cSDimitry Andric       CallbackType create_callback,
6225ffd83dbSDimitry Andric       ObjectFileCreateMemoryInstance create_memory_callback,
6235ffd83dbSDimitry Andric       ObjectFileGetModuleSpecifications get_module_specifications,
62481ad6265SDimitry Andric       ObjectFileSaveCore save_core,
62581ad6265SDimitry Andric       DebuggerInitializeCallback debugger_init_callback)
62681ad6265SDimitry Andric       : PluginInstance<ObjectFileCreateInstance>(
62781ad6265SDimitry Andric             name, description, create_callback, debugger_init_callback),
6285ffd83dbSDimitry Andric         create_memory_callback(create_memory_callback),
6295ffd83dbSDimitry Andric         get_module_specifications(get_module_specifications),
6305ffd83dbSDimitry Andric         save_core(save_core) {}
6310b57cec5SDimitry Andric 
6320b57cec5SDimitry Andric   ObjectFileCreateMemoryInstance create_memory_callback;
6330b57cec5SDimitry Andric   ObjectFileGetModuleSpecifications get_module_specifications;
6340b57cec5SDimitry Andric   ObjectFileSaveCore save_core;
6350b57cec5SDimitry Andric };
6365ffd83dbSDimitry Andric typedef PluginInstances<ObjectFileInstance> ObjectFileInstances;
6370b57cec5SDimitry Andric 
6380b57cec5SDimitry Andric static ObjectFileInstances &GetObjectFileInstances() {
6390b57cec5SDimitry Andric   static ObjectFileInstances g_instances;
6400b57cec5SDimitry Andric   return g_instances;
6410b57cec5SDimitry Andric }
6420b57cec5SDimitry Andric 
643*0fca6ea1SDimitry Andric bool PluginManager::IsRegisteredObjectFilePluginName(llvm::StringRef name) {
644*0fca6ea1SDimitry Andric   if (name.empty())
645*0fca6ea1SDimitry Andric     return false;
646*0fca6ea1SDimitry Andric 
647*0fca6ea1SDimitry Andric   const auto &instances = GetObjectFileInstances().GetInstances();
648*0fca6ea1SDimitry Andric   for (auto &instance : instances) {
649*0fca6ea1SDimitry Andric     if (instance.name == name)
650*0fca6ea1SDimitry Andric       return true;
651*0fca6ea1SDimitry Andric   }
652*0fca6ea1SDimitry Andric   return false;
653*0fca6ea1SDimitry Andric }
654*0fca6ea1SDimitry Andric 
6550b57cec5SDimitry Andric bool PluginManager::RegisterPlugin(
656349cc55cSDimitry Andric     llvm::StringRef name, llvm::StringRef description,
6570b57cec5SDimitry Andric     ObjectFileCreateInstance create_callback,
6580b57cec5SDimitry Andric     ObjectFileCreateMemoryInstance create_memory_callback,
6590b57cec5SDimitry Andric     ObjectFileGetModuleSpecifications get_module_specifications,
66081ad6265SDimitry Andric     ObjectFileSaveCore save_core,
66181ad6265SDimitry Andric     DebuggerInitializeCallback debugger_init_callback) {
6625ffd83dbSDimitry Andric   return GetObjectFileInstances().RegisterPlugin(
6635ffd83dbSDimitry Andric       name, description, create_callback, create_memory_callback,
66481ad6265SDimitry Andric       get_module_specifications, save_core, debugger_init_callback);
6650b57cec5SDimitry Andric }
6660b57cec5SDimitry Andric 
6670b57cec5SDimitry Andric bool PluginManager::UnregisterPlugin(ObjectFileCreateInstance create_callback) {
6685ffd83dbSDimitry Andric   return GetObjectFileInstances().UnregisterPlugin(create_callback);
6690b57cec5SDimitry Andric }
6700b57cec5SDimitry Andric 
6710b57cec5SDimitry Andric ObjectFileCreateInstance
6720b57cec5SDimitry Andric PluginManager::GetObjectFileCreateCallbackAtIndex(uint32_t idx) {
6735ffd83dbSDimitry Andric   return GetObjectFileInstances().GetCallbackAtIndex(idx);
6740b57cec5SDimitry Andric }
6750b57cec5SDimitry Andric 
6760b57cec5SDimitry Andric ObjectFileCreateMemoryInstance
6770b57cec5SDimitry Andric PluginManager::GetObjectFileCreateMemoryCallbackAtIndex(uint32_t idx) {
6785ffd83dbSDimitry Andric   const auto &instances = GetObjectFileInstances().GetInstances();
6790b57cec5SDimitry Andric   if (idx < instances.size())
6800b57cec5SDimitry Andric     return instances[idx].create_memory_callback;
6810b57cec5SDimitry Andric   return nullptr;
6820b57cec5SDimitry Andric }
6830b57cec5SDimitry Andric 
6840b57cec5SDimitry Andric ObjectFileGetModuleSpecifications
6850b57cec5SDimitry Andric PluginManager::GetObjectFileGetModuleSpecificationsCallbackAtIndex(
6860b57cec5SDimitry Andric     uint32_t idx) {
6875ffd83dbSDimitry Andric   const auto &instances = GetObjectFileInstances().GetInstances();
6880b57cec5SDimitry Andric   if (idx < instances.size())
6890b57cec5SDimitry Andric     return instances[idx].get_module_specifications;
6900b57cec5SDimitry Andric   return nullptr;
6910b57cec5SDimitry Andric }
6920b57cec5SDimitry Andric 
6930b57cec5SDimitry Andric ObjectFileCreateMemoryInstance
6940b57cec5SDimitry Andric PluginManager::GetObjectFileCreateMemoryCallbackForPluginName(
695349cc55cSDimitry Andric     llvm::StringRef name) {
6965ffd83dbSDimitry Andric   const auto &instances = GetObjectFileInstances().GetInstances();
6975ffd83dbSDimitry Andric   for (auto &instance : instances) {
6985ffd83dbSDimitry Andric     if (instance.name == name)
6995ffd83dbSDimitry Andric       return instance.create_memory_callback;
7000b57cec5SDimitry Andric   }
7010b57cec5SDimitry Andric   return nullptr;
7020b57cec5SDimitry Andric }
7030b57cec5SDimitry Andric 
7040b57cec5SDimitry Andric Status PluginManager::SaveCore(const lldb::ProcessSP &process_sp,
705*0fca6ea1SDimitry Andric                                const lldb_private::SaveCoreOptions &options) {
706*0fca6ea1SDimitry Andric   Status error;
707*0fca6ea1SDimitry Andric   if (!options.GetOutputFile()) {
708*0fca6ea1SDimitry Andric     error.SetErrorString("No output file specified");
709*0fca6ea1SDimitry Andric     return error;
710*0fca6ea1SDimitry Andric   }
711*0fca6ea1SDimitry Andric 
712*0fca6ea1SDimitry Andric   if (!process_sp) {
713*0fca6ea1SDimitry Andric     error.SetErrorString("Invalid process");
714*0fca6ea1SDimitry Andric     return error;
715*0fca6ea1SDimitry Andric   }
716*0fca6ea1SDimitry Andric 
717*0fca6ea1SDimitry Andric   if (!options.GetPluginName().has_value()) {
718349cc55cSDimitry Andric     // Try saving core directly from the process plugin first.
719*0fca6ea1SDimitry Andric     llvm::Expected<bool> ret =
720*0fca6ea1SDimitry Andric         process_sp->SaveCore(options.GetOutputFile()->GetPath());
721349cc55cSDimitry Andric     if (!ret)
722349cc55cSDimitry Andric       return Status(ret.takeError());
723349cc55cSDimitry Andric     if (ret.get())
724349cc55cSDimitry Andric       return Status();
725349cc55cSDimitry Andric   }
726349cc55cSDimitry Andric 
727349cc55cSDimitry Andric   // Fall back to object plugins.
728*0fca6ea1SDimitry Andric   const auto &plugin_name = options.GetPluginName().value_or("");
7295ffd83dbSDimitry Andric   auto &instances = GetObjectFileInstances().GetInstances();
7305ffd83dbSDimitry Andric   for (auto &instance : instances) {
731349cc55cSDimitry Andric     if (plugin_name.empty() || instance.name == plugin_name) {
732*0fca6ea1SDimitry Andric       if (instance.save_core && instance.save_core(process_sp, options, error))
7330b57cec5SDimitry Andric         return error;
7340b57cec5SDimitry Andric     }
735349cc55cSDimitry Andric   }
736*0fca6ea1SDimitry Andric 
737*0fca6ea1SDimitry Andric   // Check to see if any of the object file plugins tried and failed to save.
738*0fca6ea1SDimitry Andric   // If none ran, set the error message.
739*0fca6ea1SDimitry Andric   if (error.Success())
7400b57cec5SDimitry Andric     error.SetErrorString(
7410b57cec5SDimitry Andric         "no ObjectFile plugins were able to save a core for this process");
7420b57cec5SDimitry Andric   return error;
7430b57cec5SDimitry Andric }
7440b57cec5SDimitry Andric 
7450b57cec5SDimitry Andric #pragma mark ObjectContainer
7460b57cec5SDimitry Andric 
7475ffd83dbSDimitry Andric struct ObjectContainerInstance
7485ffd83dbSDimitry Andric     : public PluginInstance<ObjectContainerCreateInstance> {
7495ffd83dbSDimitry Andric   ObjectContainerInstance(
750349cc55cSDimitry Andric       llvm::StringRef name, llvm::StringRef description,
751349cc55cSDimitry Andric       CallbackType create_callback,
752bdd1243dSDimitry Andric       ObjectContainerCreateMemoryInstance create_memory_callback,
7535ffd83dbSDimitry Andric       ObjectFileGetModuleSpecifications get_module_specifications)
754349cc55cSDimitry Andric       : PluginInstance<ObjectContainerCreateInstance>(name, description,
755349cc55cSDimitry Andric                                                       create_callback),
756bdd1243dSDimitry Andric         create_memory_callback(create_memory_callback),
7575ffd83dbSDimitry Andric         get_module_specifications(get_module_specifications) {}
7580b57cec5SDimitry Andric 
759bdd1243dSDimitry Andric   ObjectContainerCreateMemoryInstance create_memory_callback;
7600b57cec5SDimitry Andric   ObjectFileGetModuleSpecifications get_module_specifications;
7610b57cec5SDimitry Andric };
7625ffd83dbSDimitry Andric typedef PluginInstances<ObjectContainerInstance> ObjectContainerInstances;
7630b57cec5SDimitry Andric 
7640b57cec5SDimitry Andric static ObjectContainerInstances &GetObjectContainerInstances() {
7650b57cec5SDimitry Andric   static ObjectContainerInstances g_instances;
7660b57cec5SDimitry Andric   return g_instances;
7670b57cec5SDimitry Andric }
7680b57cec5SDimitry Andric 
7690b57cec5SDimitry Andric bool PluginManager::RegisterPlugin(
770349cc55cSDimitry Andric     llvm::StringRef name, llvm::StringRef description,
7710b57cec5SDimitry Andric     ObjectContainerCreateInstance create_callback,
772bdd1243dSDimitry Andric     ObjectFileGetModuleSpecifications get_module_specifications,
773bdd1243dSDimitry Andric     ObjectContainerCreateMemoryInstance create_memory_callback) {
7745ffd83dbSDimitry Andric   return GetObjectContainerInstances().RegisterPlugin(
775bdd1243dSDimitry Andric       name, description, create_callback, create_memory_callback,
776bdd1243dSDimitry Andric       get_module_specifications);
7770b57cec5SDimitry Andric }
7780b57cec5SDimitry Andric 
7790b57cec5SDimitry Andric bool PluginManager::UnregisterPlugin(
7800b57cec5SDimitry Andric     ObjectContainerCreateInstance create_callback) {
7815ffd83dbSDimitry Andric   return GetObjectContainerInstances().UnregisterPlugin(create_callback);
7820b57cec5SDimitry Andric }
7830b57cec5SDimitry Andric 
7840b57cec5SDimitry Andric ObjectContainerCreateInstance
7850b57cec5SDimitry Andric PluginManager::GetObjectContainerCreateCallbackAtIndex(uint32_t idx) {
7865ffd83dbSDimitry Andric   return GetObjectContainerInstances().GetCallbackAtIndex(idx);
7870b57cec5SDimitry Andric }
7880b57cec5SDimitry Andric 
789bdd1243dSDimitry Andric ObjectContainerCreateMemoryInstance
790bdd1243dSDimitry Andric PluginManager::GetObjectContainerCreateMemoryCallbackAtIndex(uint32_t idx) {
791bdd1243dSDimitry Andric   const auto &instances = GetObjectContainerInstances().GetInstances();
792bdd1243dSDimitry Andric   if (idx < instances.size())
793bdd1243dSDimitry Andric     return instances[idx].create_memory_callback;
794bdd1243dSDimitry Andric   return nullptr;
795bdd1243dSDimitry Andric }
796bdd1243dSDimitry Andric 
7970b57cec5SDimitry Andric ObjectFileGetModuleSpecifications
7980b57cec5SDimitry Andric PluginManager::GetObjectContainerGetModuleSpecificationsCallbackAtIndex(
7990b57cec5SDimitry Andric     uint32_t idx) {
8005ffd83dbSDimitry Andric   const auto &instances = GetObjectContainerInstances().GetInstances();
8010b57cec5SDimitry Andric   if (idx < instances.size())
8020b57cec5SDimitry Andric     return instances[idx].get_module_specifications;
8030b57cec5SDimitry Andric   return nullptr;
8040b57cec5SDimitry Andric }
8050b57cec5SDimitry Andric 
8060b57cec5SDimitry Andric #pragma mark Platform
8070b57cec5SDimitry Andric 
8085ffd83dbSDimitry Andric typedef PluginInstance<PlatformCreateInstance> PlatformInstance;
8095ffd83dbSDimitry Andric typedef PluginInstances<PlatformInstance> PlatformInstances;
8100b57cec5SDimitry Andric 
8110b57cec5SDimitry Andric static PlatformInstances &GetPlatformInstances() {
8120b57cec5SDimitry Andric   static PlatformInstances g_platform_instances;
8130b57cec5SDimitry Andric   return g_platform_instances;
8140b57cec5SDimitry Andric }
8150b57cec5SDimitry Andric 
8160b57cec5SDimitry Andric bool PluginManager::RegisterPlugin(
817349cc55cSDimitry Andric     llvm::StringRef name, llvm::StringRef description,
8180b57cec5SDimitry Andric     PlatformCreateInstance create_callback,
8190b57cec5SDimitry Andric     DebuggerInitializeCallback debugger_init_callback) {
8205ffd83dbSDimitry Andric   return GetPlatformInstances().RegisterPlugin(
8215ffd83dbSDimitry Andric       name, description, create_callback, debugger_init_callback);
8220b57cec5SDimitry Andric }
8230b57cec5SDimitry Andric 
8240b57cec5SDimitry Andric bool PluginManager::UnregisterPlugin(PlatformCreateInstance create_callback) {
8255ffd83dbSDimitry Andric   return GetPlatformInstances().UnregisterPlugin(create_callback);
8265ffd83dbSDimitry Andric }
8270b57cec5SDimitry Andric 
828349cc55cSDimitry Andric llvm::StringRef PluginManager::GetPlatformPluginNameAtIndex(uint32_t idx) {
8295ffd83dbSDimitry Andric   return GetPlatformInstances().GetNameAtIndex(idx);
8300b57cec5SDimitry Andric }
8315ffd83dbSDimitry Andric 
832349cc55cSDimitry Andric llvm::StringRef
833349cc55cSDimitry Andric PluginManager::GetPlatformPluginDescriptionAtIndex(uint32_t idx) {
8345ffd83dbSDimitry Andric   return GetPlatformInstances().GetDescriptionAtIndex(idx);
8350b57cec5SDimitry Andric }
8360b57cec5SDimitry Andric 
8370b57cec5SDimitry Andric PlatformCreateInstance
8380b57cec5SDimitry Andric PluginManager::GetPlatformCreateCallbackAtIndex(uint32_t idx) {
8395ffd83dbSDimitry Andric   return GetPlatformInstances().GetCallbackAtIndex(idx);
8400b57cec5SDimitry Andric }
8410b57cec5SDimitry Andric 
8420b57cec5SDimitry Andric PlatformCreateInstance
843349cc55cSDimitry Andric PluginManager::GetPlatformCreateCallbackForPluginName(llvm::StringRef name) {
8445ffd83dbSDimitry Andric   return GetPlatformInstances().GetCallbackForName(name);
8450b57cec5SDimitry Andric }
8460b57cec5SDimitry Andric 
8479dba64beSDimitry Andric void PluginManager::AutoCompletePlatformName(llvm::StringRef name,
8489dba64beSDimitry Andric                                              CompletionRequest &request) {
8495ffd83dbSDimitry Andric   for (const auto &instance : GetPlatformInstances().GetInstances()) {
8505f757f3fSDimitry Andric     if (instance.name.starts_with(name))
851349cc55cSDimitry Andric       request.AddCompletion(instance.name);
8520b57cec5SDimitry Andric   }
8530b57cec5SDimitry Andric }
8540b57cec5SDimitry Andric 
8550b57cec5SDimitry Andric #pragma mark Process
8560b57cec5SDimitry Andric 
8575ffd83dbSDimitry Andric typedef PluginInstance<ProcessCreateInstance> ProcessInstance;
8585ffd83dbSDimitry Andric typedef PluginInstances<ProcessInstance> ProcessInstances;
8590b57cec5SDimitry Andric 
8600b57cec5SDimitry Andric static ProcessInstances &GetProcessInstances() {
8610b57cec5SDimitry Andric   static ProcessInstances g_instances;
8620b57cec5SDimitry Andric   return g_instances;
8630b57cec5SDimitry Andric }
8640b57cec5SDimitry Andric 
8650b57cec5SDimitry Andric bool PluginManager::RegisterPlugin(
866349cc55cSDimitry Andric     llvm::StringRef name, llvm::StringRef description,
8670b57cec5SDimitry Andric     ProcessCreateInstance create_callback,
8680b57cec5SDimitry Andric     DebuggerInitializeCallback debugger_init_callback) {
8695ffd83dbSDimitry Andric   return GetProcessInstances().RegisterPlugin(
8705ffd83dbSDimitry Andric       name, description, create_callback, debugger_init_callback);
8710b57cec5SDimitry Andric }
8720b57cec5SDimitry Andric 
8730b57cec5SDimitry Andric bool PluginManager::UnregisterPlugin(ProcessCreateInstance create_callback) {
8745ffd83dbSDimitry Andric   return GetProcessInstances().UnregisterPlugin(create_callback);
8755ffd83dbSDimitry Andric }
8760b57cec5SDimitry Andric 
877349cc55cSDimitry Andric llvm::StringRef PluginManager::GetProcessPluginNameAtIndex(uint32_t idx) {
8785ffd83dbSDimitry Andric   return GetProcessInstances().GetNameAtIndex(idx);
8790b57cec5SDimitry Andric }
8805ffd83dbSDimitry Andric 
881349cc55cSDimitry Andric llvm::StringRef PluginManager::GetProcessPluginDescriptionAtIndex(uint32_t idx) {
8825ffd83dbSDimitry Andric   return GetProcessInstances().GetDescriptionAtIndex(idx);
8830b57cec5SDimitry Andric }
8840b57cec5SDimitry Andric 
8850b57cec5SDimitry Andric ProcessCreateInstance
8860b57cec5SDimitry Andric PluginManager::GetProcessCreateCallbackAtIndex(uint32_t idx) {
8875ffd83dbSDimitry Andric   return GetProcessInstances().GetCallbackAtIndex(idx);
8880b57cec5SDimitry Andric }
8890b57cec5SDimitry Andric 
8900b57cec5SDimitry Andric ProcessCreateInstance
891349cc55cSDimitry Andric PluginManager::GetProcessCreateCallbackForPluginName(llvm::StringRef name) {
8925ffd83dbSDimitry Andric   return GetProcessInstances().GetCallbackForName(name);
8935ffd83dbSDimitry Andric }
8940b57cec5SDimitry Andric 
8955ffd83dbSDimitry Andric void PluginManager::AutoCompleteProcessName(llvm::StringRef name,
8965ffd83dbSDimitry Andric                                             CompletionRequest &request) {
8975ffd83dbSDimitry Andric   for (const auto &instance : GetProcessInstances().GetInstances()) {
8985f757f3fSDimitry Andric     if (instance.name.starts_with(name))
899349cc55cSDimitry Andric       request.AddCompletion(instance.name, instance.description);
9000b57cec5SDimitry Andric   }
9010b57cec5SDimitry Andric }
9020b57cec5SDimitry Andric 
90306c3fb27SDimitry Andric #pragma mark RegisterTypeBuilder
90406c3fb27SDimitry Andric 
90506c3fb27SDimitry Andric struct RegisterTypeBuilderInstance
90606c3fb27SDimitry Andric     : public PluginInstance<RegisterTypeBuilderCreateInstance> {
90706c3fb27SDimitry Andric   RegisterTypeBuilderInstance(llvm::StringRef name, llvm::StringRef description,
90806c3fb27SDimitry Andric                               CallbackType create_callback)
90906c3fb27SDimitry Andric       : PluginInstance<RegisterTypeBuilderCreateInstance>(name, description,
91006c3fb27SDimitry Andric                                                           create_callback) {}
91106c3fb27SDimitry Andric };
91206c3fb27SDimitry Andric 
91306c3fb27SDimitry Andric typedef PluginInstances<RegisterTypeBuilderInstance>
91406c3fb27SDimitry Andric     RegisterTypeBuilderInstances;
91506c3fb27SDimitry Andric 
91606c3fb27SDimitry Andric static RegisterTypeBuilderInstances &GetRegisterTypeBuilderInstances() {
91706c3fb27SDimitry Andric   static RegisterTypeBuilderInstances g_instances;
91806c3fb27SDimitry Andric   return g_instances;
91906c3fb27SDimitry Andric }
92006c3fb27SDimitry Andric 
92106c3fb27SDimitry Andric bool PluginManager::RegisterPlugin(
92206c3fb27SDimitry Andric     llvm::StringRef name, llvm::StringRef description,
92306c3fb27SDimitry Andric     RegisterTypeBuilderCreateInstance create_callback) {
92406c3fb27SDimitry Andric   return GetRegisterTypeBuilderInstances().RegisterPlugin(name, description,
92506c3fb27SDimitry Andric                                                           create_callback);
92606c3fb27SDimitry Andric }
92706c3fb27SDimitry Andric 
92806c3fb27SDimitry Andric bool PluginManager::UnregisterPlugin(
92906c3fb27SDimitry Andric     RegisterTypeBuilderCreateInstance create_callback) {
93006c3fb27SDimitry Andric   return GetRegisterTypeBuilderInstances().UnregisterPlugin(create_callback);
93106c3fb27SDimitry Andric }
93206c3fb27SDimitry Andric 
93306c3fb27SDimitry Andric lldb::RegisterTypeBuilderSP
93406c3fb27SDimitry Andric PluginManager::GetRegisterTypeBuilder(Target &target) {
93506c3fb27SDimitry Andric   const auto &instances = GetRegisterTypeBuilderInstances().GetInstances();
93606c3fb27SDimitry Andric   // We assume that RegisterTypeBuilderClang is the only instance of this plugin
93706c3fb27SDimitry Andric   // type and is always present.
93806c3fb27SDimitry Andric   assert(instances.size());
93906c3fb27SDimitry Andric   return instances[0].create_callback(target);
94006c3fb27SDimitry Andric }
94106c3fb27SDimitry Andric 
9420b57cec5SDimitry Andric #pragma mark ScriptInterpreter
9430b57cec5SDimitry Andric 
9445ffd83dbSDimitry Andric struct ScriptInterpreterInstance
9455ffd83dbSDimitry Andric     : public PluginInstance<ScriptInterpreterCreateInstance> {
946349cc55cSDimitry Andric   ScriptInterpreterInstance(llvm::StringRef name, llvm::StringRef description,
9475ffd83dbSDimitry Andric                             CallbackType create_callback,
9485ffd83dbSDimitry Andric                             lldb::ScriptLanguage language)
949349cc55cSDimitry Andric       : PluginInstance<ScriptInterpreterCreateInstance>(name, description,
950349cc55cSDimitry Andric                                                         create_callback),
9515ffd83dbSDimitry Andric         language(language) {}
9520b57cec5SDimitry Andric 
9535ffd83dbSDimitry Andric   lldb::ScriptLanguage language = lldb::eScriptLanguageNone;
9540b57cec5SDimitry Andric };
9550b57cec5SDimitry Andric 
9565ffd83dbSDimitry Andric typedef PluginInstances<ScriptInterpreterInstance> ScriptInterpreterInstances;
9570b57cec5SDimitry Andric 
9580b57cec5SDimitry Andric static ScriptInterpreterInstances &GetScriptInterpreterInstances() {
9590b57cec5SDimitry Andric   static ScriptInterpreterInstances g_instances;
9600b57cec5SDimitry Andric   return g_instances;
9610b57cec5SDimitry Andric }
9620b57cec5SDimitry Andric 
9630b57cec5SDimitry Andric bool PluginManager::RegisterPlugin(
964349cc55cSDimitry Andric     llvm::StringRef name, llvm::StringRef description,
9650b57cec5SDimitry Andric     lldb::ScriptLanguage script_language,
9660b57cec5SDimitry Andric     ScriptInterpreterCreateInstance create_callback) {
9675ffd83dbSDimitry Andric   return GetScriptInterpreterInstances().RegisterPlugin(
9685ffd83dbSDimitry Andric       name, description, create_callback, script_language);
9690b57cec5SDimitry Andric }
9700b57cec5SDimitry Andric 
9710b57cec5SDimitry Andric bool PluginManager::UnregisterPlugin(
9720b57cec5SDimitry Andric     ScriptInterpreterCreateInstance create_callback) {
9735ffd83dbSDimitry Andric   return GetScriptInterpreterInstances().UnregisterPlugin(create_callback);
9740b57cec5SDimitry Andric }
9750b57cec5SDimitry Andric 
9760b57cec5SDimitry Andric ScriptInterpreterCreateInstance
9770b57cec5SDimitry Andric PluginManager::GetScriptInterpreterCreateCallbackAtIndex(uint32_t idx) {
9785ffd83dbSDimitry Andric   return GetScriptInterpreterInstances().GetCallbackAtIndex(idx);
9790b57cec5SDimitry Andric }
9800b57cec5SDimitry Andric 
9810b57cec5SDimitry Andric lldb::ScriptInterpreterSP
9820b57cec5SDimitry Andric PluginManager::GetScriptInterpreterForLanguage(lldb::ScriptLanguage script_lang,
9830b57cec5SDimitry Andric                                                Debugger &debugger) {
9845ffd83dbSDimitry Andric   const auto &instances = GetScriptInterpreterInstances().GetInstances();
9850b57cec5SDimitry Andric   ScriptInterpreterCreateInstance none_instance = nullptr;
9865ffd83dbSDimitry Andric   for (const auto &instance : instances) {
9875ffd83dbSDimitry Andric     if (instance.language == lldb::eScriptLanguageNone)
9885ffd83dbSDimitry Andric       none_instance = instance.create_callback;
9890b57cec5SDimitry Andric 
9905ffd83dbSDimitry Andric     if (script_lang == instance.language)
9915ffd83dbSDimitry Andric       return instance.create_callback(debugger);
9920b57cec5SDimitry Andric   }
9930b57cec5SDimitry Andric 
9940b57cec5SDimitry Andric   // If we didn't find one, return the ScriptInterpreter for the null language.
9950b57cec5SDimitry Andric   assert(none_instance != nullptr);
9960b57cec5SDimitry Andric   return none_instance(debugger);
9970b57cec5SDimitry Andric }
9980b57cec5SDimitry Andric 
9990b57cec5SDimitry Andric #pragma mark StructuredDataPlugin
10000b57cec5SDimitry Andric 
10015ffd83dbSDimitry Andric struct StructuredDataPluginInstance
10025ffd83dbSDimitry Andric     : public PluginInstance<StructuredDataPluginCreateInstance> {
10035ffd83dbSDimitry Andric   StructuredDataPluginInstance(
1004349cc55cSDimitry Andric       llvm::StringRef name, llvm::StringRef description,
1005349cc55cSDimitry Andric       CallbackType create_callback,
10065ffd83dbSDimitry Andric       DebuggerInitializeCallback debugger_init_callback,
10075ffd83dbSDimitry Andric       StructuredDataFilterLaunchInfo filter_callback)
10085ffd83dbSDimitry Andric       : PluginInstance<StructuredDataPluginCreateInstance>(
1009349cc55cSDimitry Andric             name, description, create_callback, debugger_init_callback),
10105ffd83dbSDimitry Andric         filter_callback(filter_callback) {}
10110b57cec5SDimitry Andric 
10125ffd83dbSDimitry Andric   StructuredDataFilterLaunchInfo filter_callback = nullptr;
10130b57cec5SDimitry Andric };
10140b57cec5SDimitry Andric 
10155ffd83dbSDimitry Andric typedef PluginInstances<StructuredDataPluginInstance>
10165ffd83dbSDimitry Andric     StructuredDataPluginInstances;
10170b57cec5SDimitry Andric 
10180b57cec5SDimitry Andric static StructuredDataPluginInstances &GetStructuredDataPluginInstances() {
10190b57cec5SDimitry Andric   static StructuredDataPluginInstances g_instances;
10200b57cec5SDimitry Andric   return g_instances;
10210b57cec5SDimitry Andric }
10220b57cec5SDimitry Andric 
10230b57cec5SDimitry Andric bool PluginManager::RegisterPlugin(
1024349cc55cSDimitry Andric     llvm::StringRef name, llvm::StringRef description,
10250b57cec5SDimitry Andric     StructuredDataPluginCreateInstance create_callback,
10260b57cec5SDimitry Andric     DebuggerInitializeCallback debugger_init_callback,
10270b57cec5SDimitry Andric     StructuredDataFilterLaunchInfo filter_callback) {
10285ffd83dbSDimitry Andric   return GetStructuredDataPluginInstances().RegisterPlugin(
10295ffd83dbSDimitry Andric       name, description, create_callback, debugger_init_callback,
10305ffd83dbSDimitry Andric       filter_callback);
10310b57cec5SDimitry Andric }
10320b57cec5SDimitry Andric 
10330b57cec5SDimitry Andric bool PluginManager::UnregisterPlugin(
10340b57cec5SDimitry Andric     StructuredDataPluginCreateInstance create_callback) {
10355ffd83dbSDimitry Andric   return GetStructuredDataPluginInstances().UnregisterPlugin(create_callback);
10360b57cec5SDimitry Andric }
10370b57cec5SDimitry Andric 
10380b57cec5SDimitry Andric StructuredDataPluginCreateInstance
10390b57cec5SDimitry Andric PluginManager::GetStructuredDataPluginCreateCallbackAtIndex(uint32_t idx) {
10405ffd83dbSDimitry Andric   return GetStructuredDataPluginInstances().GetCallbackAtIndex(idx);
10410b57cec5SDimitry Andric }
10420b57cec5SDimitry Andric 
10430b57cec5SDimitry Andric StructuredDataFilterLaunchInfo
10440b57cec5SDimitry Andric PluginManager::GetStructuredDataFilterCallbackAtIndex(
10450b57cec5SDimitry Andric     uint32_t idx, bool &iteration_complete) {
10465ffd83dbSDimitry Andric   const auto &instances = GetStructuredDataPluginInstances().GetInstances();
10470b57cec5SDimitry Andric   if (idx < instances.size()) {
10480b57cec5SDimitry Andric     iteration_complete = false;
10490b57cec5SDimitry Andric     return instances[idx].filter_callback;
10500b57cec5SDimitry Andric   } else {
10510b57cec5SDimitry Andric     iteration_complete = true;
10520b57cec5SDimitry Andric   }
10530b57cec5SDimitry Andric   return nullptr;
10540b57cec5SDimitry Andric }
10550b57cec5SDimitry Andric 
10560b57cec5SDimitry Andric #pragma mark SymbolFile
10570b57cec5SDimitry Andric 
10585ffd83dbSDimitry Andric typedef PluginInstance<SymbolFileCreateInstance> SymbolFileInstance;
10595ffd83dbSDimitry Andric typedef PluginInstances<SymbolFileInstance> SymbolFileInstances;
10600b57cec5SDimitry Andric 
10610b57cec5SDimitry Andric static SymbolFileInstances &GetSymbolFileInstances() {
10620b57cec5SDimitry Andric   static SymbolFileInstances g_instances;
10630b57cec5SDimitry Andric   return g_instances;
10640b57cec5SDimitry Andric }
10650b57cec5SDimitry Andric 
10660b57cec5SDimitry Andric bool PluginManager::RegisterPlugin(
1067349cc55cSDimitry Andric     llvm::StringRef name, llvm::StringRef description,
10680b57cec5SDimitry Andric     SymbolFileCreateInstance create_callback,
10690b57cec5SDimitry Andric     DebuggerInitializeCallback debugger_init_callback) {
10705ffd83dbSDimitry Andric   return GetSymbolFileInstances().RegisterPlugin(
10715ffd83dbSDimitry Andric       name, description, create_callback, debugger_init_callback);
10720b57cec5SDimitry Andric }
10730b57cec5SDimitry Andric 
10740b57cec5SDimitry Andric bool PluginManager::UnregisterPlugin(SymbolFileCreateInstance create_callback) {
10755ffd83dbSDimitry Andric   return GetSymbolFileInstances().UnregisterPlugin(create_callback);
10760b57cec5SDimitry Andric }
10770b57cec5SDimitry Andric 
10780b57cec5SDimitry Andric SymbolFileCreateInstance
10790b57cec5SDimitry Andric PluginManager::GetSymbolFileCreateCallbackAtIndex(uint32_t idx) {
10805ffd83dbSDimitry Andric   return GetSymbolFileInstances().GetCallbackAtIndex(idx);
10810b57cec5SDimitry Andric }
10820b57cec5SDimitry Andric 
10830b57cec5SDimitry Andric #pragma mark SymbolVendor
10840b57cec5SDimitry Andric 
10855ffd83dbSDimitry Andric typedef PluginInstance<SymbolVendorCreateInstance> SymbolVendorInstance;
10865ffd83dbSDimitry Andric typedef PluginInstances<SymbolVendorInstance> SymbolVendorInstances;
10870b57cec5SDimitry Andric 
10880b57cec5SDimitry Andric static SymbolVendorInstances &GetSymbolVendorInstances() {
10890b57cec5SDimitry Andric   static SymbolVendorInstances g_instances;
10900b57cec5SDimitry Andric   return g_instances;
10910b57cec5SDimitry Andric }
10920b57cec5SDimitry Andric 
1093349cc55cSDimitry Andric bool PluginManager::RegisterPlugin(llvm::StringRef name,
1094349cc55cSDimitry Andric                                    llvm::StringRef description,
10950b57cec5SDimitry Andric                                    SymbolVendorCreateInstance create_callback) {
10965ffd83dbSDimitry Andric   return GetSymbolVendorInstances().RegisterPlugin(name, description,
10975ffd83dbSDimitry Andric                                                    create_callback);
10980b57cec5SDimitry Andric }
10990b57cec5SDimitry Andric 
11000b57cec5SDimitry Andric bool PluginManager::UnregisterPlugin(
11010b57cec5SDimitry Andric     SymbolVendorCreateInstance create_callback) {
11025ffd83dbSDimitry Andric   return GetSymbolVendorInstances().UnregisterPlugin(create_callback);
11030b57cec5SDimitry Andric }
11040b57cec5SDimitry Andric 
11050b57cec5SDimitry Andric SymbolVendorCreateInstance
11060b57cec5SDimitry Andric PluginManager::GetSymbolVendorCreateCallbackAtIndex(uint32_t idx) {
11075ffd83dbSDimitry Andric   return GetSymbolVendorInstances().GetCallbackAtIndex(idx);
11080b57cec5SDimitry Andric }
11090b57cec5SDimitry Andric 
11105f757f3fSDimitry Andric #pragma mark SymbolLocator
11115f757f3fSDimitry Andric 
11125f757f3fSDimitry Andric struct SymbolLocatorInstance
11135f757f3fSDimitry Andric     : public PluginInstance<SymbolLocatorCreateInstance> {
11145f757f3fSDimitry Andric   SymbolLocatorInstance(
11155f757f3fSDimitry Andric       llvm::StringRef name, llvm::StringRef description,
11165f757f3fSDimitry Andric       CallbackType create_callback,
11175f757f3fSDimitry Andric       SymbolLocatorLocateExecutableObjectFile locate_executable_object_file,
11185f757f3fSDimitry Andric       SymbolLocatorLocateExecutableSymbolFile locate_executable_symbol_file,
11195f757f3fSDimitry Andric       SymbolLocatorDownloadObjectAndSymbolFile download_object_symbol_file,
11205f757f3fSDimitry Andric       SymbolLocatorFindSymbolFileInBundle find_symbol_file_in_bundle,
11215f757f3fSDimitry Andric       DebuggerInitializeCallback debugger_init_callback)
11225f757f3fSDimitry Andric       : PluginInstance<SymbolLocatorCreateInstance>(
11235f757f3fSDimitry Andric             name, description, create_callback, debugger_init_callback),
11245f757f3fSDimitry Andric         locate_executable_object_file(locate_executable_object_file),
11255f757f3fSDimitry Andric         locate_executable_symbol_file(locate_executable_symbol_file),
11265f757f3fSDimitry Andric         download_object_symbol_file(download_object_symbol_file),
11275f757f3fSDimitry Andric         find_symbol_file_in_bundle(find_symbol_file_in_bundle) {}
11285f757f3fSDimitry Andric 
11295f757f3fSDimitry Andric   SymbolLocatorLocateExecutableObjectFile locate_executable_object_file;
11305f757f3fSDimitry Andric   SymbolLocatorLocateExecutableSymbolFile locate_executable_symbol_file;
11315f757f3fSDimitry Andric   SymbolLocatorDownloadObjectAndSymbolFile download_object_symbol_file;
11325f757f3fSDimitry Andric   SymbolLocatorFindSymbolFileInBundle find_symbol_file_in_bundle;
11335f757f3fSDimitry Andric };
11345f757f3fSDimitry Andric typedef PluginInstances<SymbolLocatorInstance> SymbolLocatorInstances;
11355f757f3fSDimitry Andric 
11365f757f3fSDimitry Andric static SymbolLocatorInstances &GetSymbolLocatorInstances() {
11375f757f3fSDimitry Andric   static SymbolLocatorInstances g_instances;
11385f757f3fSDimitry Andric   return g_instances;
11395f757f3fSDimitry Andric }
11405f757f3fSDimitry Andric 
11415f757f3fSDimitry Andric bool PluginManager::RegisterPlugin(
11425f757f3fSDimitry Andric     llvm::StringRef name, llvm::StringRef description,
11435f757f3fSDimitry Andric     SymbolLocatorCreateInstance create_callback,
11445f757f3fSDimitry Andric     SymbolLocatorLocateExecutableObjectFile locate_executable_object_file,
11455f757f3fSDimitry Andric     SymbolLocatorLocateExecutableSymbolFile locate_executable_symbol_file,
11465f757f3fSDimitry Andric     SymbolLocatorDownloadObjectAndSymbolFile download_object_symbol_file,
11475f757f3fSDimitry Andric     SymbolLocatorFindSymbolFileInBundle find_symbol_file_in_bundle,
11485f757f3fSDimitry Andric     DebuggerInitializeCallback debugger_init_callback) {
11495f757f3fSDimitry Andric   return GetSymbolLocatorInstances().RegisterPlugin(
11505f757f3fSDimitry Andric       name, description, create_callback, locate_executable_object_file,
11515f757f3fSDimitry Andric       locate_executable_symbol_file, download_object_symbol_file,
11525f757f3fSDimitry Andric       find_symbol_file_in_bundle, debugger_init_callback);
11535f757f3fSDimitry Andric }
11545f757f3fSDimitry Andric 
11555f757f3fSDimitry Andric bool PluginManager::UnregisterPlugin(
11565f757f3fSDimitry Andric     SymbolLocatorCreateInstance create_callback) {
11575f757f3fSDimitry Andric   return GetSymbolLocatorInstances().UnregisterPlugin(create_callback);
11585f757f3fSDimitry Andric }
11595f757f3fSDimitry Andric 
11605f757f3fSDimitry Andric SymbolLocatorCreateInstance
11615f757f3fSDimitry Andric PluginManager::GetSymbolLocatorCreateCallbackAtIndex(uint32_t idx) {
11625f757f3fSDimitry Andric   return GetSymbolLocatorInstances().GetCallbackAtIndex(idx);
11635f757f3fSDimitry Andric }
11645f757f3fSDimitry Andric 
11655f757f3fSDimitry Andric ModuleSpec
11665f757f3fSDimitry Andric PluginManager::LocateExecutableObjectFile(const ModuleSpec &module_spec) {
11675f757f3fSDimitry Andric   auto &instances = GetSymbolLocatorInstances().GetInstances();
11685f757f3fSDimitry Andric   for (auto &instance : instances) {
11695f757f3fSDimitry Andric     if (instance.locate_executable_object_file) {
11705f757f3fSDimitry Andric       std::optional<ModuleSpec> result =
11715f757f3fSDimitry Andric           instance.locate_executable_object_file(module_spec);
11725f757f3fSDimitry Andric       if (result)
11735f757f3fSDimitry Andric         return *result;
11745f757f3fSDimitry Andric     }
11755f757f3fSDimitry Andric   }
11765f757f3fSDimitry Andric   return {};
11775f757f3fSDimitry Andric }
11785f757f3fSDimitry Andric 
11795f757f3fSDimitry Andric FileSpec PluginManager::LocateExecutableSymbolFile(
11805f757f3fSDimitry Andric     const ModuleSpec &module_spec, const FileSpecList &default_search_paths) {
11815f757f3fSDimitry Andric   auto &instances = GetSymbolLocatorInstances().GetInstances();
11825f757f3fSDimitry Andric   for (auto &instance : instances) {
11835f757f3fSDimitry Andric     if (instance.locate_executable_symbol_file) {
11845f757f3fSDimitry Andric       std::optional<FileSpec> result = instance.locate_executable_symbol_file(
11855f757f3fSDimitry Andric           module_spec, default_search_paths);
11865f757f3fSDimitry Andric       if (result)
11875f757f3fSDimitry Andric         return *result;
11885f757f3fSDimitry Andric     }
11895f757f3fSDimitry Andric   }
11905f757f3fSDimitry Andric   return {};
11915f757f3fSDimitry Andric }
11925f757f3fSDimitry Andric 
11935f757f3fSDimitry Andric bool PluginManager::DownloadObjectAndSymbolFile(ModuleSpec &module_spec,
11945f757f3fSDimitry Andric                                                 Status &error,
11955f757f3fSDimitry Andric                                                 bool force_lookup,
11965f757f3fSDimitry Andric                                                 bool copy_executable) {
11975f757f3fSDimitry Andric   auto &instances = GetSymbolLocatorInstances().GetInstances();
11985f757f3fSDimitry Andric   for (auto &instance : instances) {
11995f757f3fSDimitry Andric     if (instance.download_object_symbol_file) {
12005f757f3fSDimitry Andric       if (instance.download_object_symbol_file(module_spec, error, force_lookup,
12015f757f3fSDimitry Andric                                                copy_executable))
12025f757f3fSDimitry Andric         return true;
12035f757f3fSDimitry Andric     }
12045f757f3fSDimitry Andric   }
12055f757f3fSDimitry Andric   return false;
12065f757f3fSDimitry Andric }
12075f757f3fSDimitry Andric 
12085f757f3fSDimitry Andric FileSpec PluginManager::FindSymbolFileInBundle(const FileSpec &symfile_bundle,
12095f757f3fSDimitry Andric                                                const UUID *uuid,
12105f757f3fSDimitry Andric                                                const ArchSpec *arch) {
12115f757f3fSDimitry Andric   auto &instances = GetSymbolLocatorInstances().GetInstances();
12125f757f3fSDimitry Andric   for (auto &instance : instances) {
12135f757f3fSDimitry Andric     if (instance.find_symbol_file_in_bundle) {
12145f757f3fSDimitry Andric       std::optional<FileSpec> result =
12155f757f3fSDimitry Andric           instance.find_symbol_file_in_bundle(symfile_bundle, uuid, arch);
12165f757f3fSDimitry Andric       if (result)
12175f757f3fSDimitry Andric         return *result;
12185f757f3fSDimitry Andric     }
12195f757f3fSDimitry Andric   }
12205f757f3fSDimitry Andric   return {};
12215f757f3fSDimitry Andric }
12225f757f3fSDimitry Andric 
1223e8d8bef9SDimitry Andric #pragma mark Trace
1224e8d8bef9SDimitry Andric 
1225fe6060f1SDimitry Andric struct TraceInstance
122681ad6265SDimitry Andric     : public PluginInstance<TraceCreateInstanceFromBundle> {
1227fe6060f1SDimitry Andric   TraceInstance(
1228349cc55cSDimitry Andric       llvm::StringRef name, llvm::StringRef description,
122981ad6265SDimitry Andric       CallbackType create_callback_from_bundle,
1230fe6060f1SDimitry Andric       TraceCreateInstanceForLiveProcess create_callback_for_live_process,
1231bdd1243dSDimitry Andric       llvm::StringRef schema, DebuggerInitializeCallback debugger_init_callback)
123281ad6265SDimitry Andric       : PluginInstance<TraceCreateInstanceFromBundle>(
1233bdd1243dSDimitry Andric             name, description, create_callback_from_bundle,
1234bdd1243dSDimitry Andric             debugger_init_callback),
1235fe6060f1SDimitry Andric         schema(schema),
1236fe6060f1SDimitry Andric         create_callback_for_live_process(create_callback_for_live_process) {}
1237e8d8bef9SDimitry Andric 
1238e8d8bef9SDimitry Andric   llvm::StringRef schema;
1239fe6060f1SDimitry Andric   TraceCreateInstanceForLiveProcess create_callback_for_live_process;
1240e8d8bef9SDimitry Andric };
1241e8d8bef9SDimitry Andric 
1242e8d8bef9SDimitry Andric typedef PluginInstances<TraceInstance> TraceInstances;
1243e8d8bef9SDimitry Andric 
1244e8d8bef9SDimitry Andric static TraceInstances &GetTracePluginInstances() {
1245e8d8bef9SDimitry Andric   static TraceInstances g_instances;
1246e8d8bef9SDimitry Andric   return g_instances;
1247e8d8bef9SDimitry Andric }
1248e8d8bef9SDimitry Andric 
1249fe6060f1SDimitry Andric bool PluginManager::RegisterPlugin(
1250349cc55cSDimitry Andric     llvm::StringRef name, llvm::StringRef description,
125181ad6265SDimitry Andric     TraceCreateInstanceFromBundle create_callback_from_bundle,
1252fe6060f1SDimitry Andric     TraceCreateInstanceForLiveProcess create_callback_for_live_process,
1253bdd1243dSDimitry Andric     llvm::StringRef schema, DebuggerInitializeCallback debugger_init_callback) {
1254e8d8bef9SDimitry Andric   return GetTracePluginInstances().RegisterPlugin(
125581ad6265SDimitry Andric       name, description, create_callback_from_bundle,
1256bdd1243dSDimitry Andric       create_callback_for_live_process, schema, debugger_init_callback);
1257e8d8bef9SDimitry Andric }
1258e8d8bef9SDimitry Andric 
1259fe6060f1SDimitry Andric bool PluginManager::UnregisterPlugin(
126081ad6265SDimitry Andric     TraceCreateInstanceFromBundle create_callback_from_bundle) {
1261fe6060f1SDimitry Andric   return GetTracePluginInstances().UnregisterPlugin(
126281ad6265SDimitry Andric       create_callback_from_bundle);
1263e8d8bef9SDimitry Andric }
1264e8d8bef9SDimitry Andric 
126581ad6265SDimitry Andric TraceCreateInstanceFromBundle
1266349cc55cSDimitry Andric PluginManager::GetTraceCreateCallback(llvm::StringRef plugin_name) {
1267e8d8bef9SDimitry Andric   return GetTracePluginInstances().GetCallbackForName(plugin_name);
1268e8d8bef9SDimitry Andric }
1269e8d8bef9SDimitry Andric 
1270fe6060f1SDimitry Andric TraceCreateInstanceForLiveProcess
1271349cc55cSDimitry Andric PluginManager::GetTraceCreateCallbackForLiveProcess(llvm::StringRef plugin_name) {
1272fe6060f1SDimitry Andric   for (const TraceInstance &instance : GetTracePluginInstances().GetInstances())
1273fe6060f1SDimitry Andric     if (instance.name == plugin_name)
1274fe6060f1SDimitry Andric       return instance.create_callback_for_live_process;
1275fe6060f1SDimitry Andric   return nullptr;
1276fe6060f1SDimitry Andric }
1277fe6060f1SDimitry Andric 
1278349cc55cSDimitry Andric llvm::StringRef PluginManager::GetTraceSchema(llvm::StringRef plugin_name) {
1279e8d8bef9SDimitry Andric   for (const TraceInstance &instance : GetTracePluginInstances().GetInstances())
1280e8d8bef9SDimitry Andric     if (instance.name == plugin_name)
1281e8d8bef9SDimitry Andric       return instance.schema;
1282e8d8bef9SDimitry Andric   return llvm::StringRef();
1283e8d8bef9SDimitry Andric }
1284e8d8bef9SDimitry Andric 
1285e8d8bef9SDimitry Andric llvm::StringRef PluginManager::GetTraceSchema(size_t index) {
1286e8d8bef9SDimitry Andric   if (TraceInstance *instance =
1287e8d8bef9SDimitry Andric           GetTracePluginInstances().GetInstanceAtIndex(index))
1288e8d8bef9SDimitry Andric     return instance->schema;
1289e8d8bef9SDimitry Andric   return llvm::StringRef();
1290e8d8bef9SDimitry Andric }
1291e8d8bef9SDimitry Andric 
1292fe6060f1SDimitry Andric #pragma mark TraceExporter
1293fe6060f1SDimitry Andric 
1294fe6060f1SDimitry Andric struct TraceExporterInstance
1295fe6060f1SDimitry Andric     : public PluginInstance<TraceExporterCreateInstance> {
1296fe6060f1SDimitry Andric   TraceExporterInstance(
1297349cc55cSDimitry Andric       llvm::StringRef name, llvm::StringRef description,
1298fe6060f1SDimitry Andric       TraceExporterCreateInstance create_instance,
1299fe6060f1SDimitry Andric       ThreadTraceExportCommandCreator create_thread_trace_export_command)
1300349cc55cSDimitry Andric       : PluginInstance<TraceExporterCreateInstance>(name, description,
1301349cc55cSDimitry Andric                                                     create_instance),
1302fe6060f1SDimitry Andric         create_thread_trace_export_command(create_thread_trace_export_command) {
1303fe6060f1SDimitry Andric   }
1304fe6060f1SDimitry Andric 
1305fe6060f1SDimitry Andric   ThreadTraceExportCommandCreator create_thread_trace_export_command;
1306fe6060f1SDimitry Andric };
1307fe6060f1SDimitry Andric 
1308fe6060f1SDimitry Andric typedef PluginInstances<TraceExporterInstance> TraceExporterInstances;
1309fe6060f1SDimitry Andric 
1310fe6060f1SDimitry Andric static TraceExporterInstances &GetTraceExporterInstances() {
1311fe6060f1SDimitry Andric   static TraceExporterInstances g_instances;
1312fe6060f1SDimitry Andric   return g_instances;
1313fe6060f1SDimitry Andric }
1314fe6060f1SDimitry Andric 
1315fe6060f1SDimitry Andric bool PluginManager::RegisterPlugin(
1316349cc55cSDimitry Andric     llvm::StringRef name, llvm::StringRef description,
1317fe6060f1SDimitry Andric     TraceExporterCreateInstance create_callback,
1318fe6060f1SDimitry Andric     ThreadTraceExportCommandCreator create_thread_trace_export_command) {
1319fe6060f1SDimitry Andric   return GetTraceExporterInstances().RegisterPlugin(
1320fe6060f1SDimitry Andric       name, description, create_callback, create_thread_trace_export_command);
1321fe6060f1SDimitry Andric }
1322fe6060f1SDimitry Andric 
1323fe6060f1SDimitry Andric TraceExporterCreateInstance
1324349cc55cSDimitry Andric PluginManager::GetTraceExporterCreateCallback(llvm::StringRef plugin_name) {
1325fe6060f1SDimitry Andric   return GetTraceExporterInstances().GetCallbackForName(plugin_name);
1326fe6060f1SDimitry Andric }
1327fe6060f1SDimitry Andric 
1328fe6060f1SDimitry Andric bool PluginManager::UnregisterPlugin(
1329fe6060f1SDimitry Andric     TraceExporterCreateInstance create_callback) {
1330fe6060f1SDimitry Andric   return GetTraceExporterInstances().UnregisterPlugin(create_callback);
1331fe6060f1SDimitry Andric }
1332fe6060f1SDimitry Andric 
1333fe6060f1SDimitry Andric ThreadTraceExportCommandCreator
1334fe6060f1SDimitry Andric PluginManager::GetThreadTraceExportCommandCreatorAtIndex(uint32_t index) {
1335fe6060f1SDimitry Andric   if (TraceExporterInstance *instance =
1336fe6060f1SDimitry Andric           GetTraceExporterInstances().GetInstanceAtIndex(index))
1337fe6060f1SDimitry Andric     return instance->create_thread_trace_export_command;
1338fe6060f1SDimitry Andric   return nullptr;
1339fe6060f1SDimitry Andric }
1340fe6060f1SDimitry Andric 
1341349cc55cSDimitry Andric llvm::StringRef
1342349cc55cSDimitry Andric PluginManager::GetTraceExporterPluginNameAtIndex(uint32_t index) {
1343fe6060f1SDimitry Andric   return GetTraceExporterInstances().GetNameAtIndex(index);
1344fe6060f1SDimitry Andric }
1345fe6060f1SDimitry Andric 
13460b57cec5SDimitry Andric #pragma mark UnwindAssembly
13470b57cec5SDimitry Andric 
13485ffd83dbSDimitry Andric typedef PluginInstance<UnwindAssemblyCreateInstance> UnwindAssemblyInstance;
13495ffd83dbSDimitry Andric typedef PluginInstances<UnwindAssemblyInstance> UnwindAssemblyInstances;
13500b57cec5SDimitry Andric 
13510b57cec5SDimitry Andric static UnwindAssemblyInstances &GetUnwindAssemblyInstances() {
13520b57cec5SDimitry Andric   static UnwindAssemblyInstances g_instances;
13530b57cec5SDimitry Andric   return g_instances;
13540b57cec5SDimitry Andric }
13550b57cec5SDimitry Andric 
13560b57cec5SDimitry Andric bool PluginManager::RegisterPlugin(
1357349cc55cSDimitry Andric     llvm::StringRef name, llvm::StringRef description,
13580b57cec5SDimitry Andric     UnwindAssemblyCreateInstance create_callback) {
13595ffd83dbSDimitry Andric   return GetUnwindAssemblyInstances().RegisterPlugin(name, description,
13605ffd83dbSDimitry Andric                                                      create_callback);
13610b57cec5SDimitry Andric }
13620b57cec5SDimitry Andric 
13630b57cec5SDimitry Andric bool PluginManager::UnregisterPlugin(
13640b57cec5SDimitry Andric     UnwindAssemblyCreateInstance create_callback) {
13655ffd83dbSDimitry Andric   return GetUnwindAssemblyInstances().UnregisterPlugin(create_callback);
13660b57cec5SDimitry Andric }
13670b57cec5SDimitry Andric 
13680b57cec5SDimitry Andric UnwindAssemblyCreateInstance
13690b57cec5SDimitry Andric PluginManager::GetUnwindAssemblyCreateCallbackAtIndex(uint32_t idx) {
13705ffd83dbSDimitry Andric   return GetUnwindAssemblyInstances().GetCallbackAtIndex(idx);
13710b57cec5SDimitry Andric }
13720b57cec5SDimitry Andric 
13730b57cec5SDimitry Andric #pragma mark MemoryHistory
13740b57cec5SDimitry Andric 
13755ffd83dbSDimitry Andric typedef PluginInstance<MemoryHistoryCreateInstance> MemoryHistoryInstance;
13765ffd83dbSDimitry Andric typedef PluginInstances<MemoryHistoryInstance> MemoryHistoryInstances;
13770b57cec5SDimitry Andric 
13780b57cec5SDimitry Andric static MemoryHistoryInstances &GetMemoryHistoryInstances() {
13790b57cec5SDimitry Andric   static MemoryHistoryInstances g_instances;
13800b57cec5SDimitry Andric   return g_instances;
13810b57cec5SDimitry Andric }
13820b57cec5SDimitry Andric 
13830b57cec5SDimitry Andric bool PluginManager::RegisterPlugin(
1384349cc55cSDimitry Andric     llvm::StringRef name, llvm::StringRef description,
13850b57cec5SDimitry Andric     MemoryHistoryCreateInstance create_callback) {
13865ffd83dbSDimitry Andric   return GetMemoryHistoryInstances().RegisterPlugin(name, description,
13875ffd83dbSDimitry Andric                                                     create_callback);
13880b57cec5SDimitry Andric }
13890b57cec5SDimitry Andric 
13900b57cec5SDimitry Andric bool PluginManager::UnregisterPlugin(
13910b57cec5SDimitry Andric     MemoryHistoryCreateInstance create_callback) {
13925ffd83dbSDimitry Andric   return GetMemoryHistoryInstances().UnregisterPlugin(create_callback);
13930b57cec5SDimitry Andric }
13940b57cec5SDimitry Andric 
13950b57cec5SDimitry Andric MemoryHistoryCreateInstance
13960b57cec5SDimitry Andric PluginManager::GetMemoryHistoryCreateCallbackAtIndex(uint32_t idx) {
13975ffd83dbSDimitry Andric   return GetMemoryHistoryInstances().GetCallbackAtIndex(idx);
13980b57cec5SDimitry Andric }
13990b57cec5SDimitry Andric 
14000b57cec5SDimitry Andric #pragma mark InstrumentationRuntime
14010b57cec5SDimitry Andric 
14025ffd83dbSDimitry Andric struct InstrumentationRuntimeInstance
14035ffd83dbSDimitry Andric     : public PluginInstance<InstrumentationRuntimeCreateInstance> {
14045ffd83dbSDimitry Andric   InstrumentationRuntimeInstance(
1405349cc55cSDimitry Andric       llvm::StringRef name, llvm::StringRef description,
1406349cc55cSDimitry Andric       CallbackType create_callback,
14075ffd83dbSDimitry Andric       InstrumentationRuntimeGetType get_type_callback)
1408349cc55cSDimitry Andric       : PluginInstance<InstrumentationRuntimeCreateInstance>(name, description,
1409349cc55cSDimitry Andric                                                              create_callback),
14105ffd83dbSDimitry Andric         get_type_callback(get_type_callback) {}
14110b57cec5SDimitry Andric 
14125ffd83dbSDimitry Andric   InstrumentationRuntimeGetType get_type_callback = nullptr;
14130b57cec5SDimitry Andric };
14140b57cec5SDimitry Andric 
14155ffd83dbSDimitry Andric typedef PluginInstances<InstrumentationRuntimeInstance>
14160b57cec5SDimitry Andric     InstrumentationRuntimeInstances;
14170b57cec5SDimitry Andric 
14180b57cec5SDimitry Andric static InstrumentationRuntimeInstances &GetInstrumentationRuntimeInstances() {
14190b57cec5SDimitry Andric   static InstrumentationRuntimeInstances g_instances;
14200b57cec5SDimitry Andric   return g_instances;
14210b57cec5SDimitry Andric }
14220b57cec5SDimitry Andric 
14230b57cec5SDimitry Andric bool PluginManager::RegisterPlugin(
1424349cc55cSDimitry Andric     llvm::StringRef name, llvm::StringRef description,
14250b57cec5SDimitry Andric     InstrumentationRuntimeCreateInstance create_callback,
14260b57cec5SDimitry Andric     InstrumentationRuntimeGetType get_type_callback) {
14275ffd83dbSDimitry Andric   return GetInstrumentationRuntimeInstances().RegisterPlugin(
14285ffd83dbSDimitry Andric       name, description, create_callback, get_type_callback);
14290b57cec5SDimitry Andric }
14300b57cec5SDimitry Andric 
14310b57cec5SDimitry Andric bool PluginManager::UnregisterPlugin(
14320b57cec5SDimitry Andric     InstrumentationRuntimeCreateInstance create_callback) {
14335ffd83dbSDimitry Andric   return GetInstrumentationRuntimeInstances().UnregisterPlugin(create_callback);
14340b57cec5SDimitry Andric }
14350b57cec5SDimitry Andric 
14360b57cec5SDimitry Andric InstrumentationRuntimeGetType
14370b57cec5SDimitry Andric PluginManager::GetInstrumentationRuntimeGetTypeCallbackAtIndex(uint32_t idx) {
14385ffd83dbSDimitry Andric   const auto &instances = GetInstrumentationRuntimeInstances().GetInstances();
14390b57cec5SDimitry Andric   if (idx < instances.size())
14400b57cec5SDimitry Andric     return instances[idx].get_type_callback;
14410b57cec5SDimitry Andric   return nullptr;
14420b57cec5SDimitry Andric }
14430b57cec5SDimitry Andric 
14440b57cec5SDimitry Andric InstrumentationRuntimeCreateInstance
14450b57cec5SDimitry Andric PluginManager::GetInstrumentationRuntimeCreateCallbackAtIndex(uint32_t idx) {
14465ffd83dbSDimitry Andric   return GetInstrumentationRuntimeInstances().GetCallbackAtIndex(idx);
14470b57cec5SDimitry Andric }
14480b57cec5SDimitry Andric 
14490b57cec5SDimitry Andric #pragma mark TypeSystem
14500b57cec5SDimitry Andric 
14515ffd83dbSDimitry Andric struct TypeSystemInstance : public PluginInstance<TypeSystemCreateInstance> {
1452349cc55cSDimitry Andric   TypeSystemInstance(llvm::StringRef name, llvm::StringRef description,
14535ffd83dbSDimitry Andric                      CallbackType create_callback,
14545ffd83dbSDimitry Andric                      LanguageSet supported_languages_for_types,
14555ffd83dbSDimitry Andric                      LanguageSet supported_languages_for_expressions)
1456349cc55cSDimitry Andric       : PluginInstance<TypeSystemCreateInstance>(name, description,
14575ffd83dbSDimitry Andric                                                  create_callback),
14585ffd83dbSDimitry Andric         supported_languages_for_types(supported_languages_for_types),
14595ffd83dbSDimitry Andric         supported_languages_for_expressions(
14605ffd83dbSDimitry Andric             supported_languages_for_expressions) {}
14615ffd83dbSDimitry Andric 
14629dba64beSDimitry Andric   LanguageSet supported_languages_for_types;
14639dba64beSDimitry Andric   LanguageSet supported_languages_for_expressions;
14640b57cec5SDimitry Andric };
14650b57cec5SDimitry Andric 
14665ffd83dbSDimitry Andric typedef PluginInstances<TypeSystemInstance> TypeSystemInstances;
14670b57cec5SDimitry Andric 
14680b57cec5SDimitry Andric static TypeSystemInstances &GetTypeSystemInstances() {
14690b57cec5SDimitry Andric   static TypeSystemInstances g_instances;
14700b57cec5SDimitry Andric   return g_instances;
14710b57cec5SDimitry Andric }
14720b57cec5SDimitry Andric 
14739dba64beSDimitry Andric bool PluginManager::RegisterPlugin(
1474349cc55cSDimitry Andric     llvm::StringRef name, llvm::StringRef description,
14750b57cec5SDimitry Andric     TypeSystemCreateInstance create_callback,
14769dba64beSDimitry Andric     LanguageSet supported_languages_for_types,
14779dba64beSDimitry Andric     LanguageSet supported_languages_for_expressions) {
14785ffd83dbSDimitry Andric   return GetTypeSystemInstances().RegisterPlugin(
14795ffd83dbSDimitry Andric       name, description, create_callback, supported_languages_for_types,
14805ffd83dbSDimitry Andric       supported_languages_for_expressions);
14810b57cec5SDimitry Andric }
14820b57cec5SDimitry Andric 
14830b57cec5SDimitry Andric bool PluginManager::UnregisterPlugin(TypeSystemCreateInstance create_callback) {
14845ffd83dbSDimitry Andric   return GetTypeSystemInstances().UnregisterPlugin(create_callback);
14850b57cec5SDimitry Andric }
14860b57cec5SDimitry Andric 
14870b57cec5SDimitry Andric TypeSystemCreateInstance
14880b57cec5SDimitry Andric PluginManager::GetTypeSystemCreateCallbackAtIndex(uint32_t idx) {
14895ffd83dbSDimitry Andric   return GetTypeSystemInstances().GetCallbackAtIndex(idx);
14900b57cec5SDimitry Andric }
14910b57cec5SDimitry Andric 
14929dba64beSDimitry Andric LanguageSet PluginManager::GetAllTypeSystemSupportedLanguagesForTypes() {
14935ffd83dbSDimitry Andric   const auto &instances = GetTypeSystemInstances().GetInstances();
14949dba64beSDimitry Andric   LanguageSet all;
14959dba64beSDimitry Andric   for (unsigned i = 0; i < instances.size(); ++i)
14969dba64beSDimitry Andric     all.bitvector |= instances[i].supported_languages_for_types.bitvector;
14979dba64beSDimitry Andric   return all;
14980b57cec5SDimitry Andric }
14990b57cec5SDimitry Andric 
15009dba64beSDimitry Andric LanguageSet PluginManager::GetAllTypeSystemSupportedLanguagesForExpressions() {
15015ffd83dbSDimitry Andric   const auto &instances = GetTypeSystemInstances().GetInstances();
15029dba64beSDimitry Andric   LanguageSet all;
15039dba64beSDimitry Andric   for (unsigned i = 0; i < instances.size(); ++i)
15049dba64beSDimitry Andric     all.bitvector |= instances[i].supported_languages_for_expressions.bitvector;
15059dba64beSDimitry Andric   return all;
15060b57cec5SDimitry Andric }
15070b57cec5SDimitry Andric 
15080b57cec5SDimitry Andric #pragma mark REPL
15090b57cec5SDimitry Andric 
15105ffd83dbSDimitry Andric struct REPLInstance : public PluginInstance<REPLCreateInstance> {
1511349cc55cSDimitry Andric   REPLInstance(llvm::StringRef name, llvm::StringRef description,
15125ffd83dbSDimitry Andric                CallbackType create_callback, LanguageSet supported_languages)
1513349cc55cSDimitry Andric       : PluginInstance<REPLCreateInstance>(name, description, create_callback),
15145ffd83dbSDimitry Andric         supported_languages(supported_languages) {}
15150b57cec5SDimitry Andric 
15169dba64beSDimitry Andric   LanguageSet supported_languages;
15170b57cec5SDimitry Andric };
15180b57cec5SDimitry Andric 
15195ffd83dbSDimitry Andric typedef PluginInstances<REPLInstance> REPLInstances;
15200b57cec5SDimitry Andric 
15210b57cec5SDimitry Andric static REPLInstances &GetREPLInstances() {
15220b57cec5SDimitry Andric   static REPLInstances g_instances;
15230b57cec5SDimitry Andric   return g_instances;
15240b57cec5SDimitry Andric }
15250b57cec5SDimitry Andric 
1526349cc55cSDimitry Andric bool PluginManager::RegisterPlugin(llvm::StringRef name, llvm::StringRef description,
15270b57cec5SDimitry Andric                                    REPLCreateInstance create_callback,
15289dba64beSDimitry Andric                                    LanguageSet supported_languages) {
15295ffd83dbSDimitry Andric   return GetREPLInstances().RegisterPlugin(name, description, create_callback,
15305ffd83dbSDimitry Andric                                            supported_languages);
15310b57cec5SDimitry Andric }
15320b57cec5SDimitry Andric 
15330b57cec5SDimitry Andric bool PluginManager::UnregisterPlugin(REPLCreateInstance create_callback) {
15345ffd83dbSDimitry Andric   return GetREPLInstances().UnregisterPlugin(create_callback);
15350b57cec5SDimitry Andric }
15360b57cec5SDimitry Andric 
15370b57cec5SDimitry Andric REPLCreateInstance PluginManager::GetREPLCreateCallbackAtIndex(uint32_t idx) {
15385ffd83dbSDimitry Andric   return GetREPLInstances().GetCallbackAtIndex(idx);
15390b57cec5SDimitry Andric }
15400b57cec5SDimitry Andric 
15410eae32dcSDimitry Andric LanguageSet PluginManager::GetREPLSupportedLanguagesAtIndex(uint32_t idx) {
15420eae32dcSDimitry Andric   const auto &instances = GetREPLInstances().GetInstances();
15430eae32dcSDimitry Andric   return idx < instances.size() ? instances[idx].supported_languages
15440eae32dcSDimitry Andric                                 : LanguageSet();
15450eae32dcSDimitry Andric }
15460eae32dcSDimitry Andric 
15479dba64beSDimitry Andric LanguageSet PluginManager::GetREPLAllTypeSystemSupportedLanguages() {
15485ffd83dbSDimitry Andric   const auto &instances = GetREPLInstances().GetInstances();
15499dba64beSDimitry Andric   LanguageSet all;
15509dba64beSDimitry Andric   for (unsigned i = 0; i < instances.size(); ++i)
15519dba64beSDimitry Andric     all.bitvector |= instances[i].supported_languages.bitvector;
15529dba64beSDimitry Andric   return all;
15530b57cec5SDimitry Andric }
15540b57cec5SDimitry Andric 
15550b57cec5SDimitry Andric #pragma mark PluginManager
15560b57cec5SDimitry Andric 
15570b57cec5SDimitry Andric void PluginManager::DebuggerInitialize(Debugger &debugger) {
15585ffd83dbSDimitry Andric   GetDynamicLoaderInstances().PerformDebuggerCallback(debugger);
15595ffd83dbSDimitry Andric   GetJITLoaderInstances().PerformDebuggerCallback(debugger);
156081ad6265SDimitry Andric   GetObjectFileInstances().PerformDebuggerCallback(debugger);
15615ffd83dbSDimitry Andric   GetPlatformInstances().PerformDebuggerCallback(debugger);
15625ffd83dbSDimitry Andric   GetProcessInstances().PerformDebuggerCallback(debugger);
15635ffd83dbSDimitry Andric   GetSymbolFileInstances().PerformDebuggerCallback(debugger);
15645f757f3fSDimitry Andric   GetSymbolLocatorInstances().PerformDebuggerCallback(debugger);
15655ffd83dbSDimitry Andric   GetOperatingSystemInstances().PerformDebuggerCallback(debugger);
15665ffd83dbSDimitry Andric   GetStructuredDataPluginInstances().PerformDebuggerCallback(debugger);
1567e8d8bef9SDimitry Andric   GetTracePluginInstances().PerformDebuggerCallback(debugger);
15680b57cec5SDimitry Andric }
15690b57cec5SDimitry Andric 
15700b57cec5SDimitry Andric // This is the preferred new way to register plugin specific settings.  e.g.
15710b57cec5SDimitry Andric // This will put a plugin's settings under e.g.
15720b57cec5SDimitry Andric // "plugin.<plugin_type_name>.<plugin_type_desc>.SETTINGNAME".
15735ffd83dbSDimitry Andric static lldb::OptionValuePropertiesSP
157406c3fb27SDimitry Andric GetDebuggerPropertyForPlugins(Debugger &debugger, llvm::StringRef plugin_type_name,
157506c3fb27SDimitry Andric                               llvm::StringRef plugin_type_desc,
157606c3fb27SDimitry Andric                               bool can_create) {
15770b57cec5SDimitry Andric   lldb::OptionValuePropertiesSP parent_properties_sp(
15780b57cec5SDimitry Andric       debugger.GetValueProperties());
15790b57cec5SDimitry Andric   if (parent_properties_sp) {
158006c3fb27SDimitry Andric     static constexpr llvm::StringLiteral g_property_name("plugin");
15810b57cec5SDimitry Andric 
15820b57cec5SDimitry Andric     OptionValuePropertiesSP plugin_properties_sp =
15830b57cec5SDimitry Andric         parent_properties_sp->GetSubProperty(nullptr, g_property_name);
15840b57cec5SDimitry Andric     if (!plugin_properties_sp && can_create) {
15850b57cec5SDimitry Andric       plugin_properties_sp =
15860b57cec5SDimitry Andric           std::make_shared<OptionValueProperties>(g_property_name);
158706c3fb27SDimitry Andric       parent_properties_sp->AppendProperty(g_property_name,
158806c3fb27SDimitry Andric                                            "Settings specify to plugins.", true,
15890b57cec5SDimitry Andric                                            plugin_properties_sp);
15900b57cec5SDimitry Andric     }
15910b57cec5SDimitry Andric 
15920b57cec5SDimitry Andric     if (plugin_properties_sp) {
15930b57cec5SDimitry Andric       lldb::OptionValuePropertiesSP plugin_type_properties_sp =
15940b57cec5SDimitry Andric           plugin_properties_sp->GetSubProperty(nullptr, plugin_type_name);
15950b57cec5SDimitry Andric       if (!plugin_type_properties_sp && can_create) {
15960b57cec5SDimitry Andric         plugin_type_properties_sp =
15970b57cec5SDimitry Andric             std::make_shared<OptionValueProperties>(plugin_type_name);
15980b57cec5SDimitry Andric         plugin_properties_sp->AppendProperty(plugin_type_name, plugin_type_desc,
15990b57cec5SDimitry Andric                                              true, plugin_type_properties_sp);
16000b57cec5SDimitry Andric       }
16010b57cec5SDimitry Andric       return plugin_type_properties_sp;
16020b57cec5SDimitry Andric     }
16030b57cec5SDimitry Andric   }
16040b57cec5SDimitry Andric   return lldb::OptionValuePropertiesSP();
16050b57cec5SDimitry Andric }
16060b57cec5SDimitry Andric 
16070b57cec5SDimitry Andric // This is deprecated way to register plugin specific settings.  e.g.
16080b57cec5SDimitry Andric // "<plugin_type_name>.plugin.<plugin_type_desc>.SETTINGNAME" and Platform
16090b57cec5SDimitry Andric // generic settings would be under "platform.SETTINGNAME".
16100b57cec5SDimitry Andric static lldb::OptionValuePropertiesSP GetDebuggerPropertyForPluginsOldStyle(
161106c3fb27SDimitry Andric     Debugger &debugger, llvm::StringRef plugin_type_name,
161206c3fb27SDimitry Andric     llvm::StringRef plugin_type_desc, bool can_create) {
161306c3fb27SDimitry Andric   static constexpr llvm::StringLiteral g_property_name("plugin");
16140b57cec5SDimitry Andric   lldb::OptionValuePropertiesSP parent_properties_sp(
16150b57cec5SDimitry Andric       debugger.GetValueProperties());
16160b57cec5SDimitry Andric   if (parent_properties_sp) {
16170b57cec5SDimitry Andric     OptionValuePropertiesSP plugin_properties_sp =
16180b57cec5SDimitry Andric         parent_properties_sp->GetSubProperty(nullptr, plugin_type_name);
16190b57cec5SDimitry Andric     if (!plugin_properties_sp && can_create) {
16200b57cec5SDimitry Andric       plugin_properties_sp =
16210b57cec5SDimitry Andric           std::make_shared<OptionValueProperties>(plugin_type_name);
16220b57cec5SDimitry Andric       parent_properties_sp->AppendProperty(plugin_type_name, plugin_type_desc,
16230b57cec5SDimitry Andric                                            true, plugin_properties_sp);
16240b57cec5SDimitry Andric     }
16250b57cec5SDimitry Andric 
16260b57cec5SDimitry Andric     if (plugin_properties_sp) {
16270b57cec5SDimitry Andric       lldb::OptionValuePropertiesSP plugin_type_properties_sp =
16280b57cec5SDimitry Andric           plugin_properties_sp->GetSubProperty(nullptr, g_property_name);
16290b57cec5SDimitry Andric       if (!plugin_type_properties_sp && can_create) {
16300b57cec5SDimitry Andric         plugin_type_properties_sp =
16310b57cec5SDimitry Andric             std::make_shared<OptionValueProperties>(g_property_name);
163206c3fb27SDimitry Andric         plugin_properties_sp->AppendProperty(g_property_name,
163306c3fb27SDimitry Andric                                              "Settings specific to plugins",
163406c3fb27SDimitry Andric                                              true, plugin_type_properties_sp);
16350b57cec5SDimitry Andric       }
16360b57cec5SDimitry Andric       return plugin_type_properties_sp;
16370b57cec5SDimitry Andric     }
16380b57cec5SDimitry Andric   }
16390b57cec5SDimitry Andric   return lldb::OptionValuePropertiesSP();
16400b57cec5SDimitry Andric }
16410b57cec5SDimitry Andric 
16420b57cec5SDimitry Andric namespace {
16430b57cec5SDimitry Andric 
16440b57cec5SDimitry Andric typedef lldb::OptionValuePropertiesSP
164506c3fb27SDimitry Andric GetDebuggerPropertyForPluginsPtr(Debugger &, llvm::StringRef, llvm::StringRef,
16465ffd83dbSDimitry Andric                                  bool can_create);
1647349cc55cSDimitry Andric }
16480b57cec5SDimitry Andric 
1649349cc55cSDimitry Andric static lldb::OptionValuePropertiesSP
165006c3fb27SDimitry Andric GetSettingForPlugin(Debugger &debugger, llvm::StringRef setting_name,
165106c3fb27SDimitry Andric                     llvm::StringRef plugin_type_name,
16520b57cec5SDimitry Andric                     GetDebuggerPropertyForPluginsPtr get_debugger_property =
16530b57cec5SDimitry Andric                         GetDebuggerPropertyForPlugins) {
16540b57cec5SDimitry Andric   lldb::OptionValuePropertiesSP properties_sp;
16550b57cec5SDimitry Andric   lldb::OptionValuePropertiesSP plugin_type_properties_sp(get_debugger_property(
16560b57cec5SDimitry Andric       debugger, plugin_type_name,
165706c3fb27SDimitry Andric       "", // not creating to so we don't need the description
16580b57cec5SDimitry Andric       false));
16590b57cec5SDimitry Andric   if (plugin_type_properties_sp)
16600b57cec5SDimitry Andric     properties_sp =
16610b57cec5SDimitry Andric         plugin_type_properties_sp->GetSubProperty(nullptr, setting_name);
16620b57cec5SDimitry Andric   return properties_sp;
16630b57cec5SDimitry Andric }
16640b57cec5SDimitry Andric 
1665349cc55cSDimitry Andric static bool
166606c3fb27SDimitry Andric CreateSettingForPlugin(Debugger &debugger, llvm::StringRef plugin_type_name,
166706c3fb27SDimitry Andric                        llvm::StringRef plugin_type_desc,
1668349cc55cSDimitry Andric                        const lldb::OptionValuePropertiesSP &properties_sp,
166906c3fb27SDimitry Andric                        llvm::StringRef description, bool is_global_property,
16700b57cec5SDimitry Andric                        GetDebuggerPropertyForPluginsPtr get_debugger_property =
16710b57cec5SDimitry Andric                            GetDebuggerPropertyForPlugins) {
16720b57cec5SDimitry Andric   if (properties_sp) {
16730b57cec5SDimitry Andric     lldb::OptionValuePropertiesSP plugin_type_properties_sp(
16740b57cec5SDimitry Andric         get_debugger_property(debugger, plugin_type_name, plugin_type_desc,
16750b57cec5SDimitry Andric                               true));
16760b57cec5SDimitry Andric     if (plugin_type_properties_sp) {
16770b57cec5SDimitry Andric       plugin_type_properties_sp->AppendProperty(properties_sp->GetName(),
16780b57cec5SDimitry Andric                                                 description, is_global_property,
16790b57cec5SDimitry Andric                                                 properties_sp);
16800b57cec5SDimitry Andric       return true;
16810b57cec5SDimitry Andric     }
16820b57cec5SDimitry Andric   }
16830b57cec5SDimitry Andric   return false;
16840b57cec5SDimitry Andric }
16850b57cec5SDimitry Andric 
168606c3fb27SDimitry Andric static constexpr llvm::StringLiteral kDynamicLoaderPluginName("dynamic-loader");
168706c3fb27SDimitry Andric static constexpr llvm::StringLiteral kPlatformPluginName("platform");
168806c3fb27SDimitry Andric static constexpr llvm::StringLiteral kProcessPluginName("process");
168906c3fb27SDimitry Andric static constexpr llvm::StringLiteral kTracePluginName("trace");
169006c3fb27SDimitry Andric static constexpr llvm::StringLiteral kObjectFilePluginName("object-file");
169106c3fb27SDimitry Andric static constexpr llvm::StringLiteral kSymbolFilePluginName("symbol-file");
16925f757f3fSDimitry Andric static constexpr llvm::StringLiteral kSymbolLocatorPluginName("symbol-locator");
169306c3fb27SDimitry Andric static constexpr llvm::StringLiteral kJITLoaderPluginName("jit-loader");
169406c3fb27SDimitry Andric static constexpr llvm::StringLiteral
169506c3fb27SDimitry Andric     kStructuredDataPluginName("structured-data");
16960b57cec5SDimitry Andric 
16975ffd83dbSDimitry Andric lldb::OptionValuePropertiesSP
16985ffd83dbSDimitry Andric PluginManager::GetSettingForDynamicLoaderPlugin(Debugger &debugger,
169906c3fb27SDimitry Andric                                                 llvm::StringRef setting_name) {
170006c3fb27SDimitry Andric   return GetSettingForPlugin(debugger, setting_name, kDynamicLoaderPluginName);
17010b57cec5SDimitry Andric }
17020b57cec5SDimitry Andric 
17030b57cec5SDimitry Andric bool PluginManager::CreateSettingForDynamicLoaderPlugin(
17040b57cec5SDimitry Andric     Debugger &debugger, const lldb::OptionValuePropertiesSP &properties_sp,
170506c3fb27SDimitry Andric     llvm::StringRef description, bool is_global_property) {
170606c3fb27SDimitry Andric   return CreateSettingForPlugin(debugger, kDynamicLoaderPluginName,
170706c3fb27SDimitry Andric                                 "Settings for dynamic loader plug-ins",
170806c3fb27SDimitry Andric                                 properties_sp, description, is_global_property);
17090b57cec5SDimitry Andric }
17100b57cec5SDimitry Andric 
17110b57cec5SDimitry Andric lldb::OptionValuePropertiesSP
17120b57cec5SDimitry Andric PluginManager::GetSettingForPlatformPlugin(Debugger &debugger,
171306c3fb27SDimitry Andric                                            llvm::StringRef setting_name) {
171406c3fb27SDimitry Andric   return GetSettingForPlugin(debugger, setting_name, kPlatformPluginName,
17150b57cec5SDimitry Andric                              GetDebuggerPropertyForPluginsOldStyle);
17160b57cec5SDimitry Andric }
17170b57cec5SDimitry Andric 
17180b57cec5SDimitry Andric bool PluginManager::CreateSettingForPlatformPlugin(
17190b57cec5SDimitry Andric     Debugger &debugger, const lldb::OptionValuePropertiesSP &properties_sp,
172006c3fb27SDimitry Andric     llvm::StringRef description, bool is_global_property) {
172106c3fb27SDimitry Andric   return CreateSettingForPlugin(debugger, kPlatformPluginName,
172206c3fb27SDimitry Andric                                 "Settings for platform plug-ins", properties_sp,
172306c3fb27SDimitry Andric                                 description, is_global_property,
17240b57cec5SDimitry Andric                                 GetDebuggerPropertyForPluginsOldStyle);
17250b57cec5SDimitry Andric }
17260b57cec5SDimitry Andric 
17270b57cec5SDimitry Andric lldb::OptionValuePropertiesSP
17280b57cec5SDimitry Andric PluginManager::GetSettingForProcessPlugin(Debugger &debugger,
172906c3fb27SDimitry Andric                                           llvm::StringRef setting_name) {
173006c3fb27SDimitry Andric   return GetSettingForPlugin(debugger, setting_name, kProcessPluginName);
17310b57cec5SDimitry Andric }
17320b57cec5SDimitry Andric 
17330b57cec5SDimitry Andric bool PluginManager::CreateSettingForProcessPlugin(
17340b57cec5SDimitry Andric     Debugger &debugger, const lldb::OptionValuePropertiesSP &properties_sp,
173506c3fb27SDimitry Andric     llvm::StringRef description, bool is_global_property) {
173606c3fb27SDimitry Andric   return CreateSettingForPlugin(debugger, kProcessPluginName,
173706c3fb27SDimitry Andric                                 "Settings for process plug-ins", properties_sp,
173806c3fb27SDimitry Andric                                 description, is_global_property);
17390b57cec5SDimitry Andric }
17400b57cec5SDimitry Andric 
17415f757f3fSDimitry Andric lldb::OptionValuePropertiesSP
17425f757f3fSDimitry Andric PluginManager::GetSettingForSymbolLocatorPlugin(Debugger &debugger,
17435f757f3fSDimitry Andric                                                 llvm::StringRef setting_name) {
17445f757f3fSDimitry Andric   return GetSettingForPlugin(debugger, setting_name, kSymbolLocatorPluginName);
17455f757f3fSDimitry Andric }
17465f757f3fSDimitry Andric 
17475f757f3fSDimitry Andric bool PluginManager::CreateSettingForSymbolLocatorPlugin(
17485f757f3fSDimitry Andric     Debugger &debugger, const lldb::OptionValuePropertiesSP &properties_sp,
17495f757f3fSDimitry Andric     llvm::StringRef description, bool is_global_property) {
17505f757f3fSDimitry Andric   return CreateSettingForPlugin(debugger, kSymbolLocatorPluginName,
17515f757f3fSDimitry Andric                                 "Settings for symbol locator plug-ins",
17525f757f3fSDimitry Andric                                 properties_sp, description, is_global_property);
17535f757f3fSDimitry Andric }
17545f757f3fSDimitry Andric 
1755bdd1243dSDimitry Andric bool PluginManager::CreateSettingForTracePlugin(
1756bdd1243dSDimitry Andric     Debugger &debugger, const lldb::OptionValuePropertiesSP &properties_sp,
175706c3fb27SDimitry Andric     llvm::StringRef description, bool is_global_property) {
175806c3fb27SDimitry Andric   return CreateSettingForPlugin(debugger, kTracePluginName,
175906c3fb27SDimitry Andric                                 "Settings for trace plug-ins", properties_sp,
176006c3fb27SDimitry Andric                                 description, is_global_property);
1761bdd1243dSDimitry Andric }
1762bdd1243dSDimitry Andric 
17630b57cec5SDimitry Andric lldb::OptionValuePropertiesSP
176481ad6265SDimitry Andric PluginManager::GetSettingForObjectFilePlugin(Debugger &debugger,
176506c3fb27SDimitry Andric                                              llvm::StringRef setting_name) {
176606c3fb27SDimitry Andric   return GetSettingForPlugin(debugger, setting_name, kObjectFilePluginName);
176781ad6265SDimitry Andric }
176881ad6265SDimitry Andric 
176981ad6265SDimitry Andric bool PluginManager::CreateSettingForObjectFilePlugin(
177081ad6265SDimitry Andric     Debugger &debugger, const lldb::OptionValuePropertiesSP &properties_sp,
177106c3fb27SDimitry Andric     llvm::StringRef description, bool is_global_property) {
177206c3fb27SDimitry Andric   return CreateSettingForPlugin(debugger, kObjectFilePluginName,
177306c3fb27SDimitry Andric                                 "Settings for object file plug-ins",
177406c3fb27SDimitry Andric                                 properties_sp, description, is_global_property);
177581ad6265SDimitry Andric }
177681ad6265SDimitry Andric 
177781ad6265SDimitry Andric lldb::OptionValuePropertiesSP
17780b57cec5SDimitry Andric PluginManager::GetSettingForSymbolFilePlugin(Debugger &debugger,
177906c3fb27SDimitry Andric                                              llvm::StringRef setting_name) {
178006c3fb27SDimitry Andric   return GetSettingForPlugin(debugger, setting_name, kSymbolFilePluginName);
17810b57cec5SDimitry Andric }
17820b57cec5SDimitry Andric 
17830b57cec5SDimitry Andric bool PluginManager::CreateSettingForSymbolFilePlugin(
17840b57cec5SDimitry Andric     Debugger &debugger, const lldb::OptionValuePropertiesSP &properties_sp,
178506c3fb27SDimitry Andric     llvm::StringRef description, bool is_global_property) {
178606c3fb27SDimitry Andric   return CreateSettingForPlugin(debugger, kSymbolFilePluginName,
178706c3fb27SDimitry Andric                                 "Settings for symbol file plug-ins",
178806c3fb27SDimitry Andric                                 properties_sp, description, is_global_property);
17890b57cec5SDimitry Andric }
17900b57cec5SDimitry Andric 
17910b57cec5SDimitry Andric lldb::OptionValuePropertiesSP
17920b57cec5SDimitry Andric PluginManager::GetSettingForJITLoaderPlugin(Debugger &debugger,
179306c3fb27SDimitry Andric                                             llvm::StringRef setting_name) {
179406c3fb27SDimitry Andric   return GetSettingForPlugin(debugger, setting_name, kJITLoaderPluginName);
17950b57cec5SDimitry Andric }
17960b57cec5SDimitry Andric 
17970b57cec5SDimitry Andric bool PluginManager::CreateSettingForJITLoaderPlugin(
17980b57cec5SDimitry Andric     Debugger &debugger, const lldb::OptionValuePropertiesSP &properties_sp,
179906c3fb27SDimitry Andric     llvm::StringRef description, bool is_global_property) {
180006c3fb27SDimitry Andric   return CreateSettingForPlugin(debugger, kJITLoaderPluginName,
180106c3fb27SDimitry Andric                                 "Settings for JIT loader plug-ins",
18020b57cec5SDimitry Andric                                 properties_sp, description, is_global_property);
18030b57cec5SDimitry Andric }
18040b57cec5SDimitry Andric 
18050b57cec5SDimitry Andric static const char *kOperatingSystemPluginName("os");
18060b57cec5SDimitry Andric 
18075ffd83dbSDimitry Andric lldb::OptionValuePropertiesSP
18085ffd83dbSDimitry Andric PluginManager::GetSettingForOperatingSystemPlugin(Debugger &debugger,
180906c3fb27SDimitry Andric                                                   llvm::StringRef setting_name) {
18100b57cec5SDimitry Andric   lldb::OptionValuePropertiesSP properties_sp;
18110b57cec5SDimitry Andric   lldb::OptionValuePropertiesSP plugin_type_properties_sp(
18120b57cec5SDimitry Andric       GetDebuggerPropertyForPlugins(
181306c3fb27SDimitry Andric           debugger, kOperatingSystemPluginName,
181406c3fb27SDimitry Andric           "", // not creating to so we don't need the description
18150b57cec5SDimitry Andric           false));
18160b57cec5SDimitry Andric   if (plugin_type_properties_sp)
18170b57cec5SDimitry Andric     properties_sp =
18180b57cec5SDimitry Andric         plugin_type_properties_sp->GetSubProperty(nullptr, setting_name);
18190b57cec5SDimitry Andric   return properties_sp;
18200b57cec5SDimitry Andric }
18210b57cec5SDimitry Andric 
18220b57cec5SDimitry Andric bool PluginManager::CreateSettingForOperatingSystemPlugin(
18230b57cec5SDimitry Andric     Debugger &debugger, const lldb::OptionValuePropertiesSP &properties_sp,
182406c3fb27SDimitry Andric     llvm::StringRef description, bool is_global_property) {
18250b57cec5SDimitry Andric   if (properties_sp) {
18260b57cec5SDimitry Andric     lldb::OptionValuePropertiesSP plugin_type_properties_sp(
182706c3fb27SDimitry Andric         GetDebuggerPropertyForPlugins(debugger, kOperatingSystemPluginName,
182806c3fb27SDimitry Andric                                       "Settings for operating system plug-ins",
182906c3fb27SDimitry Andric                                       true));
18300b57cec5SDimitry Andric     if (plugin_type_properties_sp) {
18310b57cec5SDimitry Andric       plugin_type_properties_sp->AppendProperty(properties_sp->GetName(),
18320b57cec5SDimitry Andric                                                 description, is_global_property,
18330b57cec5SDimitry Andric                                                 properties_sp);
18340b57cec5SDimitry Andric       return true;
18350b57cec5SDimitry Andric     }
18360b57cec5SDimitry Andric   }
18370b57cec5SDimitry Andric   return false;
18380b57cec5SDimitry Andric }
18390b57cec5SDimitry Andric 
18405ffd83dbSDimitry Andric lldb::OptionValuePropertiesSP
18415ffd83dbSDimitry Andric PluginManager::GetSettingForStructuredDataPlugin(Debugger &debugger,
184206c3fb27SDimitry Andric                                                  llvm::StringRef setting_name) {
184306c3fb27SDimitry Andric   return GetSettingForPlugin(debugger, setting_name, kStructuredDataPluginName);
18440b57cec5SDimitry Andric }
18450b57cec5SDimitry Andric 
18460b57cec5SDimitry Andric bool PluginManager::CreateSettingForStructuredDataPlugin(
18470b57cec5SDimitry Andric     Debugger &debugger, const lldb::OptionValuePropertiesSP &properties_sp,
184806c3fb27SDimitry Andric     llvm::StringRef description, bool is_global_property) {
184906c3fb27SDimitry Andric   return CreateSettingForPlugin(debugger, kStructuredDataPluginName,
185006c3fb27SDimitry Andric                                 "Settings for structured data plug-ins",
185106c3fb27SDimitry Andric                                 properties_sp, description, is_global_property);
18520b57cec5SDimitry Andric }
1853