brintos

brintos / llvm-project-archived public Read only

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