https://github.com/JDevlieghere created 
https://github.com/llvm/llvm-project/pull/184837

This PR replaces the Get*CallbackAtIndex pattern in the PluginManager with 
returning a snapshot of callbacks that the caller can iterate over using a 
range-based for loop.

This change was largely mechanical and I used Claude to do the menial work of 
updating the signatures and call sites.

>From 0a8ab6ece9ca6e5268c2189003cab210716fc8e7 Mon Sep 17 00:00:00 2001
From: Jonas Devlieghere <[email protected]>
Date: Thu, 5 Mar 2026 09:13:31 -0800
Subject: [PATCH] [lldb] Use range-based for loops over plugins

This PR replaces the Get*CallbackAtIndex pattern in the PluginManager
with returning a snapshot of callbacks that the caller can iterate over
using a range-based for loop.

This change was largely mechanical and I used Claude to do the rote
replacement.
---
 lldb/include/lldb/Core/PluginManager.h        | 157 +++++-----
 lldb/source/Commands/CommandObjectThread.cpp  |  13 +-
 lldb/source/Core/Disassembler.cpp             |   6 +-
 lldb/source/Core/DynamicLoader.cpp            |   7 +-
 lldb/source/Core/EmulateInstruction.cpp       |   7 +-
 lldb/source/Core/Highlighter.cpp              |   4 +-
 lldb/source/Core/PluginManager.cpp            | 288 ++++++++----------
 lldb/source/Expression/REPL.cpp               |  13 +-
 lldb/source/Symbol/ObjectContainer.cpp        |  13 +-
 lldb/source/Symbol/ObjectFile.cpp             |  54 +---
 lldb/source/Symbol/SymbolFile.cpp             |   6 +-
 lldb/source/Symbol/SymbolVendor.cpp           |   6 +-
 lldb/source/Symbol/TypeSystem.cpp             |   6 +-
 lldb/source/Target/ABI.cpp                    |  15 +-
 lldb/source/Target/InstrumentationRuntime.cpp |  20 +-
 lldb/source/Target/JITLoader.cpp              |   6 +-
 lldb/source/Target/Language.cpp               |   6 +-
 lldb/source/Target/LanguageRuntime.cpp        |  35 +--
 lldb/source/Target/MemoryHistory.cpp          |  11 +-
 lldb/source/Target/OperatingSystem.cpp        |   7 +-
 lldb/source/Target/Platform.cpp               |  28 +-
 lldb/source/Target/Process.cpp                |  14 +-
 lldb/source/Target/SyntheticFrameProvider.cpp |   8 +-
 lldb/source/Target/SystemRuntime.cpp          |   7 +-
 lldb/source/Target/UnwindAssembly.cpp         |   8 +-
 lldb/unittests/Core/PluginManagerTest.cpp     | 174 +++++------
 26 files changed, 368 insertions(+), 551 deletions(-)

diff --git a/lldb/include/lldb/Core/PluginManager.h 
b/lldb/include/lldb/Core/PluginManager.h
index 26680bf95fae6..868aff2527ddd 100644
--- a/lldb/include/lldb/Core/PluginManager.h
+++ b/lldb/include/lldb/Core/PluginManager.h
@@ -82,6 +82,46 @@ struct PluginNamespace {
   SetPluginEnabled set_enabled;
 };
 
+struct InstrumentationRuntimeCallbacks {
+  InstrumentationRuntimeCreateInstance create_callback;
+  InstrumentationRuntimeGetType get_type_callback;
+};
+
+struct LanguageRuntimeCallbacks {
+  LanguageRuntimeCreateInstance create_callback;
+  LanguageRuntimeGetCommandObject command_callback;
+  LanguageRuntimeGetExceptionPrecondition precondition_callback;
+};
+
+struct ObjectFileCallbacks {
+  ObjectFileCreateInstance create_callback;
+  ObjectFileCreateMemoryInstance create_memory_callback;
+  ObjectFileGetModuleSpecifications get_module_specifications;
+  ObjectFileSaveCore save_core;
+};
+
+struct ObjectContainerCallbacks {
+  ObjectContainerCreateInstance create_callback;
+  ObjectContainerCreateMemoryInstance create_memory_callback;
+  ObjectFileGetModuleSpecifications get_module_specifications;
+};
+
+struct StructuredDataPluginCallbacks {
+  StructuredDataPluginCreateInstance create_callback;
+  StructuredDataFilterLaunchInfo filter_callback; // may be null
+};
+
+struct REPLCallbacks {
+  REPLCreateInstance create_callback;
+  LanguageSet supported_languages;
+};
+
+struct TraceExporterCallbacks {
+  llvm::StringRef name;
+  TraceExporterCreateInstance create_callback;
+  ThreadTraceExportCommandCreator create_thread_trace_export_command;
+};
+
 class PluginManager {
 public:
   static void Initialize();
@@ -130,7 +170,7 @@ class PluginManager {
 
   static bool UnregisterPlugin(ABICreateInstance create_callback);
 
-  static ABICreateInstance GetABICreateCallbackAtIndex(uint32_t idx);
+  static std::vector<ABICreateInstance> GetABICreateCallbacks();
 
   // Architecture
   static void RegisterPlugin(llvm::StringRef name, llvm::StringRef description,
@@ -147,8 +187,8 @@ class PluginManager {
 
   static bool UnregisterPlugin(DisassemblerCreateInstance create_callback);
 
-  static DisassemblerCreateInstance
-  GetDisassemblerCreateCallbackAtIndex(uint32_t idx);
+  static std::vector<DisassemblerCreateInstance>
+  GetDisassemblerCreateCallbacks();
 
   static DisassemblerCreateInstance
   GetDisassemblerCreateCallbackForPluginName(llvm::StringRef name);
@@ -161,8 +201,8 @@ class PluginManager {
 
   static bool UnregisterPlugin(DynamicLoaderCreateInstance create_callback);
 
-  static DynamicLoaderCreateInstance
-  GetDynamicLoaderCreateCallbackAtIndex(uint32_t idx);
+  static std::vector<DynamicLoaderCreateInstance>
+  GetDynamicLoaderCreateCallbacks();
 
   static DynamicLoaderCreateInstance
   GetDynamicLoaderCreateCallbackForPluginName(llvm::StringRef name);
@@ -175,8 +215,7 @@ class PluginManager {
 
   static bool UnregisterPlugin(JITLoaderCreateInstance create_callback);
 
-  static JITLoaderCreateInstance
-  GetJITLoaderCreateCallbackAtIndex(uint32_t idx);
+  static std::vector<JITLoaderCreateInstance> GetJITLoaderCreateCallbacks();
 
   // EmulateInstruction
   static bool RegisterPlugin(llvm::StringRef name, llvm::StringRef description,
@@ -185,8 +224,8 @@ class PluginManager {
   static bool
   UnregisterPlugin(EmulateInstructionCreateInstance create_callback);
 
-  static EmulateInstructionCreateInstance
-  GetEmulateInstructionCreateCallbackAtIndex(uint32_t idx);
+  static std::vector<EmulateInstructionCreateInstance>
+  GetEmulateInstructionCreateCallbacks();
 
   static EmulateInstructionCreateInstance
   GetEmulateInstructionCreateCallbackForPluginName(llvm::StringRef name);
@@ -198,8 +237,8 @@ class PluginManager {
 
   static bool UnregisterPlugin(OperatingSystemCreateInstance create_callback);
 
-  static OperatingSystemCreateInstance
-  GetOperatingSystemCreateCallbackAtIndex(uint32_t idx);
+  static std::vector<OperatingSystemCreateInstance>
+  GetOperatingSystemCreateCallbacks();
 
   static OperatingSystemCreateInstance
   GetOperatingSystemCreateCallbackForPluginName(llvm::StringRef name);
@@ -212,7 +251,7 @@ class PluginManager {
 
   static bool UnregisterPlugin(LanguageCreateInstance create_callback);
 
-  static LanguageCreateInstance GetLanguageCreateCallbackAtIndex(uint32_t idx);
+  static std::vector<LanguageCreateInstance> GetLanguageCreateCallbacks();
 
   // LanguageRuntime
   static bool RegisterPlugin(
@@ -223,14 +262,7 @@ class PluginManager {
 
   static bool UnregisterPlugin(LanguageRuntimeCreateInstance create_callback);
 
-  static LanguageRuntimeCreateInstance
-  GetLanguageRuntimeCreateCallbackAtIndex(uint32_t idx);
-
-  static LanguageRuntimeGetCommandObject
-  GetLanguageRuntimeGetCommandObjectAtIndex(uint32_t idx);
-
-  static LanguageRuntimeGetExceptionPrecondition
-  GetLanguageRuntimeGetExceptionPreconditionAtIndex(uint32_t idx);
+  static std::vector<LanguageRuntimeCallbacks> GetLanguageRuntimeCallbacks();
 
   // SystemRuntime
   static bool RegisterPlugin(llvm::StringRef name, llvm::StringRef description,
@@ -238,8 +270,8 @@ class PluginManager {
 
   static bool UnregisterPlugin(SystemRuntimeCreateInstance create_callback);
 
-  static SystemRuntimeCreateInstance
-  GetSystemRuntimeCreateCallbackAtIndex(uint32_t idx);
+  static std::vector<SystemRuntimeCreateInstance>
+  GetSystemRuntimeCreateCallbacks();
 
   // ObjectFile
   static bool
@@ -254,14 +286,7 @@ class PluginManager {
 
   static bool IsRegisteredObjectFilePluginName(llvm::StringRef name);
 
-  static ObjectFileCreateInstance
-  GetObjectFileCreateCallbackAtIndex(uint32_t idx);
-
-  static ObjectFileCreateMemoryInstance
-  GetObjectFileCreateMemoryCallbackAtIndex(uint32_t idx);
-
-  static ObjectFileGetModuleSpecifications
-  GetObjectFileGetModuleSpecificationsCallbackAtIndex(uint32_t idx);
+  static std::vector<ObjectFileCallbacks> GetObjectFileCallbacks();
 
   static ObjectFileCreateMemoryInstance
   GetObjectFileCreateMemoryCallbackForPluginName(llvm::StringRef name);
@@ -279,14 +304,7 @@ class PluginManager {
 
   static bool UnregisterPlugin(ObjectContainerCreateInstance create_callback);
 
-  static ObjectContainerCreateInstance
-  GetObjectContainerCreateCallbackAtIndex(uint32_t idx);
-
-  static ObjectContainerCreateMemoryInstance
-  GetObjectContainerCreateMemoryCallbackAtIndex(uint32_t idx);
-
-  static ObjectFileGetModuleSpecifications
-  GetObjectContainerGetModuleSpecificationsCallbackAtIndex(uint32_t idx);
+  static std::vector<ObjectContainerCallbacks> GetObjectContainerCallbacks();
 
   // Platform
   static bool
@@ -296,7 +314,7 @@ class PluginManager {
 
   static bool UnregisterPlugin(PlatformCreateInstance create_callback);
 
-  static PlatformCreateInstance GetPlatformCreateCallbackAtIndex(uint32_t idx);
+  static std::vector<PlatformCreateInstance> GetPlatformCreateCallbacks();
 
   static PlatformCreateInstance
   GetPlatformCreateCallbackForPluginName(llvm::StringRef name);
@@ -315,7 +333,7 @@ class PluginManager {
 
   static bool UnregisterPlugin(ProcessCreateInstance create_callback);
 
-  static ProcessCreateInstance GetProcessCreateCallbackAtIndex(uint32_t idx);
+  static std::vector<ProcessCreateInstance> GetProcessCreateCallbacks();
 
   static ProcessCreateInstance
   GetProcessCreateCallbackForPluginName(llvm::StringRef name);
@@ -356,8 +374,8 @@ class PluginManager {
 
   static bool UnregisterPlugin(ScriptInterpreterCreateInstance 
create_callback);
 
-  static ScriptInterpreterCreateInstance
-  GetScriptInterpreterCreateCallbackAtIndex(uint32_t idx);
+  static std::vector<ScriptInterpreterCreateInstance>
+  GetScriptInterpreterCreateCallbacks();
 
   static lldb::ScriptInterpreterSP
   GetScriptInterpreterForLanguage(lldb::ScriptLanguage script_lang,
@@ -381,8 +399,8 @@ class PluginManager {
   static SyntheticFrameProviderCreateInstance
   GetSyntheticFrameProviderCreateCallbackForPluginName(llvm::StringRef name);
 
-  static ScriptedFrameProviderCreateInstance
-  GetScriptedFrameProviderCreateCallbackAtIndex(uint32_t idx);
+  static std::vector<ScriptedFrameProviderCreateInstance>
+  GetScriptedFrameProviderCreateCallbacks();
 
   // StructuredDataPlugin
 
@@ -427,12 +445,8 @@ class PluginManager {
   static bool
   UnregisterPlugin(StructuredDataPluginCreateInstance create_callback);
 
-  static StructuredDataPluginCreateInstance
-  GetStructuredDataPluginCreateCallbackAtIndex(uint32_t idx);
-
-  static StructuredDataFilterLaunchInfo
-  GetStructuredDataFilterCallbackAtIndex(uint32_t idx,
-                                         bool &iteration_complete);
+  static std::vector<StructuredDataPluginCallbacks>
+  GetStructuredDataPluginCallbacks();
 
   // SymbolFile
   static bool
@@ -442,8 +456,7 @@ class PluginManager {
 
   static bool UnregisterPlugin(SymbolFileCreateInstance create_callback);
 
-  static SymbolFileCreateInstance
-  GetSymbolFileCreateCallbackAtIndex(uint32_t idx);
+  static std::vector<SymbolFileCreateInstance> GetSymbolFileCreateCallbacks();
 
   // SymbolVendor
   static bool RegisterPlugin(llvm::StringRef name, llvm::StringRef description,
@@ -451,8 +464,8 @@ class PluginManager {
 
   static bool UnregisterPlugin(SymbolVendorCreateInstance create_callback);
 
-  static SymbolVendorCreateInstance
-  GetSymbolVendorCreateCallbackAtIndex(uint32_t idx);
+  static std::vector<SymbolVendorCreateInstance>
+  GetSymbolVendorCreateCallbacks();
 
   // SymbolLocator
   static bool RegisterPlugin(
@@ -469,8 +482,8 @@ class PluginManager {
 
   static bool UnregisterPlugin(SymbolLocatorCreateInstance create_callback);
 
-  static SymbolLocatorCreateInstance
-  GetSymbolLocatorCreateCallbackAtIndex(uint32_t idx);
+  static std::vector<SymbolLocatorCreateInstance>
+  GetSymbolLocatorCreateCallbacks();
 
   static ModuleSpec LocateExecutableObjectFile(const ModuleSpec &module_spec,
                                                StatisticsMap &map);
@@ -542,12 +555,7 @@ class PluginManager {
 
   static bool UnregisterPlugin(TraceExporterCreateInstance create_callback);
 
-  static llvm::StringRef GetTraceExporterPluginNameAtIndex(uint32_t index);
-
-  /// Return the callback used to create the CommandObject that will be listed
-  /// under "thread trace export". Can be \b null.
-  static ThreadTraceExportCommandCreator
-  GetThreadTraceExportCommandCreatorAtIndex(uint32_t index);
+  static std::vector<TraceExporterCallbacks> GetTraceExporterCallbacks();
 
   // UnwindAssembly
   static bool RegisterPlugin(llvm::StringRef name, llvm::StringRef description,
@@ -555,8 +563,8 @@ class PluginManager {
 
   static bool UnregisterPlugin(UnwindAssemblyCreateInstance create_callback);
 
-  static UnwindAssemblyCreateInstance
-  GetUnwindAssemblyCreateCallbackAtIndex(uint32_t idx);
+  static std::vector<UnwindAssemblyCreateInstance>
+  GetUnwindAssemblyCreateCallbacks();
 
   // MemoryHistory
   static bool RegisterPlugin(llvm::StringRef name, llvm::StringRef description,
@@ -564,8 +572,8 @@ class PluginManager {
 
   static bool UnregisterPlugin(MemoryHistoryCreateInstance create_callback);
 
-  static MemoryHistoryCreateInstance
-  GetMemoryHistoryCreateCallbackAtIndex(uint32_t idx);
+  static std::vector<MemoryHistoryCreateInstance>
+  GetMemoryHistoryCreateCallbacks();
 
   // InstrumentationRuntime
   static bool
@@ -576,11 +584,8 @@ class PluginManager {
   static bool
   UnregisterPlugin(InstrumentationRuntimeCreateInstance create_callback);
 
-  static InstrumentationRuntimeGetType
-  GetInstrumentationRuntimeGetTypeCallbackAtIndex(uint32_t idx);
-
-  static InstrumentationRuntimeCreateInstance
-  GetInstrumentationRuntimeCreateCallbackAtIndex(uint32_t idx);
+  static std::vector<InstrumentationRuntimeCallbacks>
+  GetInstrumentationRuntimeCallbacks();
 
   // TypeSystem
   static bool RegisterPlugin(llvm::StringRef name, llvm::StringRef description,
@@ -590,8 +595,7 @@ class PluginManager {
 
   static bool UnregisterPlugin(TypeSystemCreateInstance create_callback);
 
-  static TypeSystemCreateInstance
-  GetTypeSystemCreateCallbackAtIndex(uint32_t idx);
+  static std::vector<TypeSystemCreateInstance> GetTypeSystemCreateCallbacks();
 
   static LanguageSet GetAllTypeSystemSupportedLanguagesForTypes();
 
@@ -623,9 +627,7 @@ class PluginManager {
 
   static bool UnregisterPlugin(REPLCreateInstance create_callback);
 
-  static REPLCreateInstance GetREPLCreateCallbackAtIndex(uint32_t idx);
-
-  static LanguageSet GetREPLSupportedLanguagesAtIndex(uint32_t idx);
+  static std::vector<REPLCallbacks> GetREPLCallbacks();
 
   static LanguageSet GetREPLAllTypeSystemSupportedLanguages();
 
@@ -635,8 +637,7 @@ class PluginManager {
 
   static bool UnregisterPlugin(HighlighterCreateInstance create_callback);
 
-  static HighlighterCreateInstance
-  GetHighlighterCreateCallbackAtIndex(uint32_t idx);
+  static std::vector<HighlighterCreateInstance> 
GetHighlighterCreateCallbacks();
 
   // Some plug-ins might register a DebuggerInitializeCallback callback when
   // registering the plug-in. After a new Debugger instance is created, this
diff --git a/lldb/source/Commands/CommandObjectThread.cpp 
b/lldb/source/Commands/CommandObjectThread.cpp
index bbec714642ec9..e870b86bc0a33 100644
--- a/lldb/source/Commands/CommandObjectThread.cpp
+++ b/lldb/source/Commands/CommandObjectThread.cpp
@@ -2031,15 +2031,10 @@ class CommandObjectTraceExport : public 
CommandObjectMultiword {
             "process to different formats.",
             "thread trace export <export-plugin> [<subcommand objects>]") {
 
-    unsigned i = 0;
-    for (llvm::StringRef plugin_name =
-             PluginManager::GetTraceExporterPluginNameAtIndex(i);
-         !plugin_name.empty();
-         plugin_name = PluginManager::GetTraceExporterPluginNameAtIndex(i++)) {
-      if (ThreadTraceExportCommandCreator command_creator =
-              PluginManager::GetThreadTraceExportCommandCreatorAtIndex(i)) {
-        LoadSubCommand(plugin_name, command_creator(interpreter));
-      }
+    for (auto &cbs : PluginManager::GetTraceExporterCallbacks()) {
+      if (cbs.create_thread_trace_export_command)
+        LoadSubCommand(cbs.name,
+                       cbs.create_thread_trace_export_command(interpreter));
     }
   }
 };
diff --git a/lldb/source/Core/Disassembler.cpp 
b/lldb/source/Core/Disassembler.cpp
index c41863ff99a8a..3011b6aede3d2 100644
--- a/lldb/source/Core/Disassembler.cpp
+++ b/lldb/source/Core/Disassembler.cpp
@@ -78,10 +78,8 @@ DisassemblerSP Disassembler::FindPlugin(const ArchSpec &arch,
         return disasm_sp;
     }
   } else {
-    for (uint32_t idx = 0;
-         (create_callback = 
PluginManager::GetDisassemblerCreateCallbackAtIndex(
-              idx)) != nullptr;
-         ++idx) {
+    for (auto create_callback :
+         PluginManager::GetDisassemblerCreateCallbacks()) {
       if (auto disasm_sp = create_callback(arch, flavor, cpu, features))
         return disasm_sp;
     }
diff --git a/lldb/source/Core/DynamicLoader.cpp 
b/lldb/source/Core/DynamicLoader.cpp
index 8426d35cf4bff..0259e7e63a161 100644
--- a/lldb/source/Core/DynamicLoader.cpp
+++ b/lldb/source/Core/DynamicLoader.cpp
@@ -47,11 +47,8 @@ DynamicLoader *DynamicLoader::FindPlugin(Process *process,
         return instance_up.release();
     }
   } else {
-    for (uint32_t idx = 0;
-         (create_callback =
-              PluginManager::GetDynamicLoaderCreateCallbackAtIndex(idx)) !=
-         nullptr;
-         ++idx) {
+    for (auto create_callback :
+         PluginManager::GetDynamicLoaderCreateCallbacks()) {
       std::unique_ptr<DynamicLoader> instance_up(
           create_callback(process, false));
       if (instance_up)
diff --git a/lldb/source/Core/EmulateInstruction.cpp 
b/lldb/source/Core/EmulateInstruction.cpp
index 634ce1075d54b..79ada4eef50a1 100644
--- a/lldb/source/Core/EmulateInstruction.cpp
+++ b/lldb/source/Core/EmulateInstruction.cpp
@@ -57,11 +57,8 @@ EmulateInstruction::FindPlugin(const ArchSpec &arch,
         return emulate_insn_ptr;
     }
   } else {
-    for (uint32_t idx = 0;
-         (create_callback =
-              PluginManager::GetEmulateInstructionCreateCallbackAtIndex(idx)) 
!=
-         nullptr;
-         ++idx) {
+    for (auto create_callback :
+         PluginManager::GetEmulateInstructionCreateCallbacks()) {
       EmulateInstruction *emulate_insn_ptr =
           create_callback(arch, supported_inst_type);
       if (emulate_insn_ptr)
diff --git a/lldb/source/Core/Highlighter.cpp b/lldb/source/Core/Highlighter.cpp
index abb6d3fa024c5..371ae5c2eed03 100644
--- a/lldb/source/Core/Highlighter.cpp
+++ b/lldb/source/Core/Highlighter.cpp
@@ -51,9 +51,7 @@ HighlighterManager::getHighlighterFor(lldb::LanguageType 
language_type,
   if (it != m_highlighters.end())
     return *it->second;
 
-  uint32_t idx = 0;
-  while (HighlighterCreateInstance create_instance =
-             PluginManager::GetHighlighterCreateCallbackAtIndex(idx++)) {
+  for (auto create_instance : PluginManager::GetHighlighterCreateCallbacks()) {
     if (Highlighter *highlighter = create_instance(language_type))
       m_highlighters.try_emplace(language_type,
                                  std::unique_ptr<Highlighter>(highlighter));
diff --git a/lldb/source/Core/PluginManager.cpp 
b/lldb/source/Core/PluginManager.cpp
index 430c9131ee6be..da7cb1f999d7f 100644
--- a/lldb/source/Core/PluginManager.cpp
+++ b/lldb/source/Core/PluginManager.cpp
@@ -514,12 +514,6 @@ template <typename Instance> class PluginInstances {
     return false;
   }
 
-  typename Instance::CallbackType GetCallbackAtIndex(uint32_t idx) {
-    if (auto instance = GetInstanceAtIndex(idx))
-      return instance->create_callback;
-    return nullptr;
-  }
-
   llvm::StringRef GetDescriptionAtIndex(uint32_t idx) {
     if (auto instance = GetInstanceAtIndex(idx))
       return instance->description;
@@ -538,6 +532,15 @@ template <typename Instance> class PluginInstances {
     return nullptr;
   }
 
+  std::vector<typename Instance::CallbackType> GetCreateCallbacks() {
+    std::vector<Instance> snapshot = GetSnapshot();
+    std::vector<typename Instance::CallbackType> result;
+    result.reserve(snapshot.size());
+    for (const auto &instance : snapshot)
+      result.push_back(instance.create_callback);
+    return result;
+  }
+
   void PerformDebuggerCallback(Debugger &debugger) {
     for (const auto &instance : GetSnapshot()) {
       if (instance.debugger_init_callback)
@@ -641,8 +644,8 @@ bool PluginManager::UnregisterPlugin(ABICreateInstance 
create_callback) {
   return GetABIInstances().UnregisterPlugin(create_callback);
 }
 
-ABICreateInstance PluginManager::GetABICreateCallbackAtIndex(uint32_t idx) {
-  return GetABIInstances().GetCallbackAtIndex(idx);
+std::vector<ABICreateInstance> PluginManager::GetABICreateCallbacks() {
+  return GetABIInstances().GetCreateCallbacks();
 }
 
 #pragma mark Architecture
@@ -698,9 +701,9 @@ bool PluginManager::UnregisterPlugin(
   return GetDisassemblerInstances().UnregisterPlugin(create_callback);
 }
 
-DisassemblerCreateInstance
-PluginManager::GetDisassemblerCreateCallbackAtIndex(uint32_t idx) {
-  return GetDisassemblerInstances().GetCallbackAtIndex(idx);
+std::vector<DisassemblerCreateInstance>
+PluginManager::GetDisassemblerCreateCallbacks() {
+  return GetDisassemblerInstances().GetCreateCallbacks();
 }
 
 DisassemblerCreateInstance
@@ -732,9 +735,9 @@ bool PluginManager::UnregisterPlugin(
   return GetDynamicLoaderInstances().UnregisterPlugin(create_callback);
 }
 
-DynamicLoaderCreateInstance
-PluginManager::GetDynamicLoaderCreateCallbackAtIndex(uint32_t idx) {
-  return GetDynamicLoaderInstances().GetCallbackAtIndex(idx);
+std::vector<DynamicLoaderCreateInstance>
+PluginManager::GetDynamicLoaderCreateCallbacks() {
+  return GetDynamicLoaderInstances().GetCreateCallbacks();
 }
 
 DynamicLoaderCreateInstance
@@ -765,9 +768,9 @@ bool 
PluginManager::UnregisterPlugin(JITLoaderCreateInstance create_callback) {
   return GetJITLoaderInstances().UnregisterPlugin(create_callback);
 }
 
-JITLoaderCreateInstance
-PluginManager::GetJITLoaderCreateCallbackAtIndex(uint32_t idx) {
-  return GetJITLoaderInstances().GetCallbackAtIndex(idx);
+std::vector<JITLoaderCreateInstance>
+PluginManager::GetJITLoaderCreateCallbacks() {
+  return GetJITLoaderInstances().GetCreateCallbacks();
 }
 
 #pragma mark EmulateInstruction
@@ -793,9 +796,9 @@ bool PluginManager::UnregisterPlugin(
   return GetEmulateInstructionInstances().UnregisterPlugin(create_callback);
 }
 
-EmulateInstructionCreateInstance
-PluginManager::GetEmulateInstructionCreateCallbackAtIndex(uint32_t idx) {
-  return GetEmulateInstructionInstances().GetCallbackAtIndex(idx);
+std::vector<EmulateInstructionCreateInstance>
+PluginManager::GetEmulateInstructionCreateCallbacks() {
+  return GetEmulateInstructionInstances().GetCreateCallbacks();
 }
 
 EmulateInstructionCreateInstance
@@ -827,9 +830,9 @@ bool PluginManager::UnregisterPlugin(
   return GetOperatingSystemInstances().UnregisterPlugin(create_callback);
 }
 
-OperatingSystemCreateInstance
-PluginManager::GetOperatingSystemCreateCallbackAtIndex(uint32_t idx) {
-  return GetOperatingSystemInstances().GetCallbackAtIndex(idx);
+std::vector<OperatingSystemCreateInstance>
+PluginManager::GetOperatingSystemCreateCallbacks() {
+  return GetOperatingSystemInstances().GetCreateCallbacks();
 }
 
 OperatingSystemCreateInstance
@@ -860,9 +863,9 @@ bool PluginManager::UnregisterPlugin(LanguageCreateInstance 
create_callback) {
   return GetLanguageInstances().UnregisterPlugin(create_callback);
 }
 
-LanguageCreateInstance
-PluginManager::GetLanguageCreateCallbackAtIndex(uint32_t idx) {
-  return GetLanguageInstances().GetCallbackAtIndex(idx);
+std::vector<LanguageCreateInstance>
+PluginManager::GetLanguageCreateCallbacks() {
+  return GetLanguageInstances().GetCreateCallbacks();
 }
 
 #pragma mark LanguageRuntime
@@ -906,23 +909,15 @@ bool PluginManager::UnregisterPlugin(
   return GetLanguageRuntimeInstances().UnregisterPlugin(create_callback);
 }
 
-LanguageRuntimeCreateInstance
-PluginManager::GetLanguageRuntimeCreateCallbackAtIndex(uint32_t idx) {
-  return GetLanguageRuntimeInstances().GetCallbackAtIndex(idx);
-}
-
-LanguageRuntimeGetCommandObject
-PluginManager::GetLanguageRuntimeGetCommandObjectAtIndex(uint32_t idx) {
-  if (auto instance = GetLanguageRuntimeInstances().GetInstanceAtIndex(idx))
-    return instance->command_callback;
-  return nullptr;
-}
-
-LanguageRuntimeGetExceptionPrecondition
-PluginManager::GetLanguageRuntimeGetExceptionPreconditionAtIndex(uint32_t idx) 
{
-  if (auto instance = GetLanguageRuntimeInstances().GetInstanceAtIndex(idx))
-    return instance->precondition_callback;
-  return nullptr;
+std::vector<LanguageRuntimeCallbacks>
+PluginManager::GetLanguageRuntimeCallbacks() {
+  auto instances = GetLanguageRuntimeInstances().GetSnapshot();
+  std::vector<LanguageRuntimeCallbacks> result;
+  result.reserve(instances.size());
+  for (auto &instance : instances)
+    result.push_back({instance.create_callback, instance.command_callback,
+                      instance.precondition_callback});
+  return result;
 }
 
 #pragma mark SystemRuntime
@@ -947,9 +942,9 @@ bool PluginManager::UnregisterPlugin(
   return GetSystemRuntimeInstances().UnregisterPlugin(create_callback);
 }
 
-SystemRuntimeCreateInstance
-PluginManager::GetSystemRuntimeCreateCallbackAtIndex(uint32_t idx) {
-  return GetSystemRuntimeInstances().GetCallbackAtIndex(idx);
+std::vector<SystemRuntimeCreateInstance>
+PluginManager::GetSystemRuntimeCreateCallbacks() {
+  return GetSystemRuntimeInstances().GetCreateCallbacks();
 }
 
 #pragma mark ObjectFile
@@ -1002,24 +997,14 @@ bool 
PluginManager::UnregisterPlugin(ObjectFileCreateInstance create_callback) {
   return GetObjectFileInstances().UnregisterPlugin(create_callback);
 }
 
-ObjectFileCreateInstance
-PluginManager::GetObjectFileCreateCallbackAtIndex(uint32_t idx) {
-  return GetObjectFileInstances().GetCallbackAtIndex(idx);
-}
-
-ObjectFileCreateMemoryInstance
-PluginManager::GetObjectFileCreateMemoryCallbackAtIndex(uint32_t idx) {
-  if (auto instance = GetObjectFileInstances().GetInstanceAtIndex(idx))
-    return instance->create_memory_callback;
-  return nullptr;
-}
-
-ObjectFileGetModuleSpecifications
-PluginManager::GetObjectFileGetModuleSpecificationsCallbackAtIndex(
-    uint32_t idx) {
-  if (auto instance = GetObjectFileInstances().GetInstanceAtIndex(idx))
-    return instance->get_module_specifications;
-  return nullptr;
+std::vector<ObjectFileCallbacks> PluginManager::GetObjectFileCallbacks() {
+  auto instances = GetObjectFileInstances().GetSnapshot();
+  std::vector<ObjectFileCallbacks> result;
+  result.reserve(instances.size());
+  for (auto &instance : instances)
+    result.push_back({instance.create_callback, 
instance.create_memory_callback,
+                      instance.get_module_specifications, instance.save_core});
+  return result;
 }
 
 ObjectFileCreateMemoryInstance
@@ -1133,24 +1118,15 @@ bool PluginManager::UnregisterPlugin(
   return GetObjectContainerInstances().UnregisterPlugin(create_callback);
 }
 
-ObjectContainerCreateInstance
-PluginManager::GetObjectContainerCreateCallbackAtIndex(uint32_t idx) {
-  return GetObjectContainerInstances().GetCallbackAtIndex(idx);
-}
-
-ObjectContainerCreateMemoryInstance
-PluginManager::GetObjectContainerCreateMemoryCallbackAtIndex(uint32_t idx) {
-  if (auto instance = GetObjectContainerInstances().GetInstanceAtIndex(idx))
-    return instance->create_memory_callback;
-  return nullptr;
-}
-
-ObjectFileGetModuleSpecifications
-PluginManager::GetObjectContainerGetModuleSpecificationsCallbackAtIndex(
-    uint32_t idx) {
-  if (auto instance = GetObjectContainerInstances().GetInstanceAtIndex(idx))
-    return instance->get_module_specifications;
-  return nullptr;
+std::vector<ObjectContainerCallbacks>
+PluginManager::GetObjectContainerCallbacks() {
+  auto instances = GetObjectContainerInstances().GetSnapshot();
+  std::vector<ObjectContainerCallbacks> result;
+  result.reserve(instances.size());
+  for (auto &instance : instances)
+    result.push_back({instance.create_callback, 
instance.create_memory_callback,
+                      instance.get_module_specifications});
+  return result;
 }
 
 #pragma mark Platform
@@ -1184,16 +1160,16 @@ 
PluginManager::GetPlatformPluginDescriptionAtIndex(uint32_t idx) {
   return GetPlatformInstances().GetDescriptionAtIndex(idx);
 }
 
-PlatformCreateInstance
-PluginManager::GetPlatformCreateCallbackAtIndex(uint32_t idx) {
-  return GetPlatformInstances().GetCallbackAtIndex(idx);
-}
-
 PlatformCreateInstance
 PluginManager::GetPlatformCreateCallbackForPluginName(llvm::StringRef name) {
   return GetPlatformInstances().GetCallbackForName(name);
 }
 
+std::vector<PlatformCreateInstance>
+PluginManager::GetPlatformCreateCallbacks() {
+  return GetPlatformInstances().GetCreateCallbacks();
+}
+
 void PluginManager::AutoCompletePlatformName(llvm::StringRef name,
                                              CompletionRequest &request) {
   for (const auto &instance : GetPlatformInstances().GetSnapshot()) {
@@ -1233,16 +1209,15 @@ 
PluginManager::GetProcessPluginDescriptionAtIndex(uint32_t idx) {
   return GetProcessInstances().GetDescriptionAtIndex(idx);
 }
 
-ProcessCreateInstance
-PluginManager::GetProcessCreateCallbackAtIndex(uint32_t idx) {
-  return GetProcessInstances().GetCallbackAtIndex(idx);
-}
-
 ProcessCreateInstance
 PluginManager::GetProcessCreateCallbackForPluginName(llvm::StringRef name) {
   return GetProcessInstances().GetCallbackForName(name);
 }
 
+std::vector<ProcessCreateInstance> PluginManager::GetProcessCreateCallbacks() {
+  return GetProcessInstances().GetCreateCallbacks();
+}
+
 void PluginManager::AutoCompleteProcessName(llvm::StringRef name,
                                             CompletionRequest &request) {
   for (const auto &instance : GetProcessInstances().GetSnapshot()) {
@@ -1359,9 +1334,9 @@ bool PluginManager::UnregisterPlugin(
   return GetScriptInterpreterInstances().UnregisterPlugin(create_callback);
 }
 
-ScriptInterpreterCreateInstance
-PluginManager::GetScriptInterpreterCreateCallbackAtIndex(uint32_t idx) {
-  return GetScriptInterpreterInstances().GetCallbackAtIndex(idx);
+std::vector<ScriptInterpreterCreateInstance>
+PluginManager::GetScriptInterpreterCreateCallbacks() {
+  return GetScriptInterpreterInstances().GetCreateCallbacks();
 }
 
 lldb::ScriptInterpreterSP
@@ -1442,9 +1417,9 @@ 
PluginManager::GetSyntheticFrameProviderCreateCallbackForPluginName(
   return GetSyntheticFrameProviderInstances().GetCallbackForName(name);
 }
 
-ScriptedFrameProviderCreateInstance
-PluginManager::GetScriptedFrameProviderCreateCallbackAtIndex(uint32_t idx) {
-  return GetScriptedFrameProviderInstances().GetCallbackAtIndex(idx);
+std::vector<ScriptedFrameProviderCreateInstance>
+PluginManager::GetScriptedFrameProviderCreateCallbacks() {
+  return GetScriptedFrameProviderInstances().GetCreateCallbacks();
 }
 
 #pragma mark StructuredDataPlugin
@@ -1486,21 +1461,14 @@ bool PluginManager::UnregisterPlugin(
   return GetStructuredDataPluginInstances().UnregisterPlugin(create_callback);
 }
 
-StructuredDataPluginCreateInstance
-PluginManager::GetStructuredDataPluginCreateCallbackAtIndex(uint32_t idx) {
-  return GetStructuredDataPluginInstances().GetCallbackAtIndex(idx);
-}
-
-StructuredDataFilterLaunchInfo
-PluginManager::GetStructuredDataFilterCallbackAtIndex(
-    uint32_t idx, bool &iteration_complete) {
-  if (auto instance =
-          GetStructuredDataPluginInstances().GetInstanceAtIndex(idx)) {
-    iteration_complete = false;
-    return instance->filter_callback;
-  }
-  iteration_complete = true;
-  return nullptr;
+std::vector<StructuredDataPluginCallbacks>
+PluginManager::GetStructuredDataPluginCallbacks() {
+  auto instances = GetStructuredDataPluginInstances().GetSnapshot();
+  std::vector<StructuredDataPluginCallbacks> result;
+  result.reserve(instances.size());
+  for (auto &instance : instances)
+    result.push_back({instance.create_callback, instance.filter_callback});
+  return result;
 }
 
 #pragma mark SymbolFile
@@ -1525,9 +1493,9 @@ bool 
PluginManager::UnregisterPlugin(SymbolFileCreateInstance create_callback) {
   return GetSymbolFileInstances().UnregisterPlugin(create_callback);
 }
 
-SymbolFileCreateInstance
-PluginManager::GetSymbolFileCreateCallbackAtIndex(uint32_t idx) {
-  return GetSymbolFileInstances().GetCallbackAtIndex(idx);
+std::vector<SymbolFileCreateInstance>
+PluginManager::GetSymbolFileCreateCallbacks() {
+  return GetSymbolFileInstances().GetCreateCallbacks();
 }
 
 #pragma mark SymbolVendor
@@ -1552,9 +1520,9 @@ bool PluginManager::UnregisterPlugin(
   return GetSymbolVendorInstances().UnregisterPlugin(create_callback);
 }
 
-SymbolVendorCreateInstance
-PluginManager::GetSymbolVendorCreateCallbackAtIndex(uint32_t idx) {
-  return GetSymbolVendorInstances().GetCallbackAtIndex(idx);
+std::vector<SymbolVendorCreateInstance>
+PluginManager::GetSymbolVendorCreateCallbacks() {
+  return GetSymbolVendorInstances().GetCreateCallbacks();
 }
 
 #pragma mark SymbolLocator
@@ -1607,9 +1575,9 @@ bool PluginManager::UnregisterPlugin(
   return GetSymbolLocatorInstances().UnregisterPlugin(create_callback);
 }
 
-SymbolLocatorCreateInstance
-PluginManager::GetSymbolLocatorCreateCallbackAtIndex(uint32_t idx) {
-  return GetSymbolLocatorInstances().GetCallbackAtIndex(idx);
+std::vector<SymbolLocatorCreateInstance>
+PluginManager::GetSymbolLocatorCreateCallbacks() {
+  return GetSymbolLocatorInstances().GetCreateCallbacks();
 }
 
 ModuleSpec
@@ -1791,16 +1759,14 @@ bool PluginManager::UnregisterPlugin(
   return GetTraceExporterInstances().UnregisterPlugin(create_callback);
 }
 
-ThreadTraceExportCommandCreator
-PluginManager::GetThreadTraceExportCommandCreatorAtIndex(uint32_t index) {
-  if (auto instance = GetTraceExporterInstances().GetInstanceAtIndex(index))
-    return instance->create_thread_trace_export_command;
-  return nullptr;
-}
-
-llvm::StringRef
-PluginManager::GetTraceExporterPluginNameAtIndex(uint32_t index) {
-  return GetTraceExporterInstances().GetNameAtIndex(index);
+std::vector<TraceExporterCallbacks> PluginManager::GetTraceExporterCallbacks() 
{
+  auto instances = GetTraceExporterInstances().GetSnapshot();
+  std::vector<TraceExporterCallbacks> result;
+  result.reserve(instances.size());
+  for (auto &instance : instances)
+    result.push_back({instance.name, instance.create_callback,
+                      instance.create_thread_trace_export_command});
+  return result;
 }
 
 #pragma mark UnwindAssembly
@@ -1825,9 +1791,9 @@ bool PluginManager::UnregisterPlugin(
   return GetUnwindAssemblyInstances().UnregisterPlugin(create_callback);
 }
 
-UnwindAssemblyCreateInstance
-PluginManager::GetUnwindAssemblyCreateCallbackAtIndex(uint32_t idx) {
-  return GetUnwindAssemblyInstances().GetCallbackAtIndex(idx);
+std::vector<UnwindAssemblyCreateInstance>
+PluginManager::GetUnwindAssemblyCreateCallbacks() {
+  return GetUnwindAssemblyInstances().GetCreateCallbacks();
 }
 
 #pragma mark MemoryHistory
@@ -1852,9 +1818,9 @@ bool PluginManager::UnregisterPlugin(
   return GetMemoryHistoryInstances().UnregisterPlugin(create_callback);
 }
 
-MemoryHistoryCreateInstance
-PluginManager::GetMemoryHistoryCreateCallbackAtIndex(uint32_t idx) {
-  return GetMemoryHistoryInstances().GetCallbackAtIndex(idx);
+std::vector<MemoryHistoryCreateInstance>
+PluginManager::GetMemoryHistoryCreateCallbacks() {
+  return GetMemoryHistoryInstances().GetCreateCallbacks();
 }
 
 #pragma mark InstrumentationRuntime
@@ -1893,17 +1859,14 @@ bool PluginManager::UnregisterPlugin(
   return 
GetInstrumentationRuntimeInstances().UnregisterPlugin(create_callback);
 }
 
-InstrumentationRuntimeGetType
-PluginManager::GetInstrumentationRuntimeGetTypeCallbackAtIndex(uint32_t idx) {
-  if (auto instance =
-          GetInstrumentationRuntimeInstances().GetInstanceAtIndex(idx))
-    return instance->get_type_callback;
-  return nullptr;
-}
-
-InstrumentationRuntimeCreateInstance
-PluginManager::GetInstrumentationRuntimeCreateCallbackAtIndex(uint32_t idx) {
-  return GetInstrumentationRuntimeInstances().GetCallbackAtIndex(idx);
+std::vector<InstrumentationRuntimeCallbacks>
+PluginManager::GetInstrumentationRuntimeCallbacks() {
+  auto instances = GetInstrumentationRuntimeInstances().GetSnapshot();
+  std::vector<InstrumentationRuntimeCallbacks> result;
+  result.reserve(instances.size());
+  for (auto &instance : instances)
+    result.push_back({instance.create_callback, instance.get_type_callback});
+  return result;
 }
 
 #pragma mark TypeSystem
@@ -1944,9 +1907,9 @@ bool 
PluginManager::UnregisterPlugin(TypeSystemCreateInstance create_callback) {
   return GetTypeSystemInstances().UnregisterPlugin(create_callback);
 }
 
-TypeSystemCreateInstance
-PluginManager::GetTypeSystemCreateCallbackAtIndex(uint32_t idx) {
-  return GetTypeSystemInstances().GetCallbackAtIndex(idx);
+std::vector<TypeSystemCreateInstance>
+PluginManager::GetTypeSystemCreateCallbacks() {
+  return GetTypeSystemInstances().GetCreateCallbacks();
 }
 
 LanguageSet PluginManager::GetAllTypeSystemSupportedLanguagesForTypes() {
@@ -2058,14 +2021,13 @@ bool PluginManager::UnregisterPlugin(REPLCreateInstance 
create_callback) {
   return GetREPLInstances().UnregisterPlugin(create_callback);
 }
 
-REPLCreateInstance PluginManager::GetREPLCreateCallbackAtIndex(uint32_t idx) {
-  return GetREPLInstances().GetCallbackAtIndex(idx);
-}
-
-LanguageSet PluginManager::GetREPLSupportedLanguagesAtIndex(uint32_t idx) {
-  if (auto instance = GetREPLInstances().GetInstanceAtIndex(idx))
-    return instance->supported_languages;
-  return LanguageSet();
+std::vector<REPLCallbacks> PluginManager::GetREPLCallbacks() {
+  auto instances = GetREPLInstances().GetSnapshot();
+  std::vector<REPLCallbacks> result;
+  result.reserve(instances.size());
+  for (auto &instance : instances)
+    result.push_back({instance.create_callback, instance.supported_languages});
+  return result;
 }
 
 LanguageSet PluginManager::GetREPLAllTypeSystemSupportedLanguages() {
@@ -2104,9 +2066,9 @@ bool PluginManager::UnregisterPlugin(
   return GetHighlighterInstances().UnregisterPlugin(create_callback);
 }
 
-HighlighterCreateInstance
-PluginManager::GetHighlighterCreateCallbackAtIndex(uint32_t idx) {
-  return GetHighlighterInstances().GetCallbackAtIndex(idx);
+std::vector<HighlighterCreateInstance>
+PluginManager::GetHighlighterCreateCallbacks() {
+  return GetHighlighterInstances().GetCreateCallbacks();
 }
 
 #pragma mark PluginManager
diff --git a/lldb/source/Expression/REPL.cpp b/lldb/source/Expression/REPL.cpp
index 2c73703bf441e..20d4cb700e161 100644
--- a/lldb/source/Expression/REPL.cpp
+++ b/lldb/source/Expression/REPL.cpp
@@ -38,19 +38,14 @@ REPL::~REPL() = default;
 lldb::REPLSP REPL::Create(Status &err, lldb::LanguageType language,
                           Debugger *debugger, Target *target,
                           const char *repl_options) {
-  uint32_t idx = 0;
   lldb::REPLSP ret;
 
-  while (REPLCreateInstance create_instance =
-             PluginManager::GetREPLCreateCallbackAtIndex(idx)) {
-    LanguageSet supported_languages =
-        PluginManager::GetREPLSupportedLanguagesAtIndex(idx++);
-    if (!supported_languages[language])
+  for (auto &cbs : PluginManager::GetREPLCallbacks()) {
+    if (!cbs.supported_languages[language])
       continue;
-    ret = (*create_instance)(err, language, debugger, target, repl_options);
-    if (ret) {
+    ret = (*cbs.create_callback)(err, language, debugger, target, 
repl_options);
+    if (ret)
       break;
-    }
   }
 
   return ret;
diff --git a/lldb/source/Symbol/ObjectContainer.cpp 
b/lldb/source/Symbol/ObjectContainer.cpp
index 7ad0c25db30a7..87d0911341e8f 100644
--- a/lldb/source/Symbol/ObjectContainer.cpp
+++ b/lldb/source/Symbol/ObjectContainer.cpp
@@ -45,14 +45,11 @@ ObjectContainerSP ObjectContainer::FindPlugin(const 
lldb::ModuleSP &module_sp,
                      module_sp->GetFileSpec().GetPath().c_str(),
                      static_cast<void *>(process_sp.get()), header_addr);
 
-  ObjectContainerCreateMemoryInstance create_callback;
-  for (size_t idx = 0;
-       (create_callback =
-            PluginManager::GetObjectContainerCreateMemoryCallbackAtIndex(
-                idx)) != nullptr;
-       ++idx) {
-    ObjectContainerSP object_container_sp(
-        create_callback(module_sp, data_sp, process_sp, header_addr));
+  for (auto &cbs : PluginManager::GetObjectContainerCallbacks()) {
+    if (!cbs.create_memory_callback)
+      continue;
+    ObjectContainerSP object_container_sp(cbs.create_memory_callback(
+        module_sp, data_sp, process_sp, header_addr));
     if (object_container_sp)
       return object_container_sp;
   }
diff --git a/lldb/source/Symbol/ObjectFile.cpp 
b/lldb/source/Symbol/ObjectFile.cpp
index 31a925238c533..be6c1b57dac37 100644
--- a/lldb/source/Symbol/ObjectFile.cpp
+++ b/lldb/source/Symbol/ObjectFile.cpp
@@ -36,12 +36,8 @@ static ObjectFileSP
 CreateObjectFromContainer(const lldb::ModuleSP &module_sp, const FileSpec 
*file,
                           lldb::offset_t file_offset, lldb::offset_t file_size,
                           DataBufferSP data_sp, lldb::offset_t &data_offset) {
-  ObjectContainerCreateInstance callback;
-  for (uint32_t idx = 0;
-       (callback = PluginManager::GetObjectContainerCreateCallbackAtIndex(
-            idx)) != nullptr;
-       ++idx) {
-    std::unique_ptr<ObjectContainer> object_container_up(callback(
+  for (auto &cbs : PluginManager::GetObjectContainerCallbacks()) {
+    std::unique_ptr<ObjectContainer> object_container_up(cbs.create_callback(
         module_sp, data_sp, data_offset, file, file_offset, file_size));
     if (object_container_up)
       return object_container_up->GetObjectFile(file);
@@ -132,13 +128,9 @@ ObjectFileSP ObjectFile::FindPlugin(const lldb::ModuleSP 
&module_sp,
   if (extractor_sp && extractor_sp->HasData()) {
     // Check if this is a normal object file by iterating through all
     // object file plugin instances.
-    ObjectFileCreateInstance callback;
-    for (uint32_t idx = 0;
-         (callback = PluginManager::GetObjectFileCreateCallbackAtIndex(idx)) !=
-         nullptr;
-         ++idx) {
-      ObjectFileSP object_file_sp(callback(module_sp, extractor_sp, 
data_offset,
-                                           file, file_offset, file_size));
+    for (auto &cbs : PluginManager::GetObjectFileCallbacks()) {
+      ObjectFileSP object_file_sp(cbs.create_callback(
+          module_sp, extractor_sp, data_offset, file, file_offset, file_size));
       if (object_file_sp.get())
         return object_file_sp;
     }
@@ -170,18 +162,14 @@ ObjectFileSP ObjectFile::FindPlugin(const lldb::ModuleSP 
&module_sp,
                        "0x%" PRIx64 ")",
                        module_sp->GetFileSpec().GetPath().c_str(),
                        static_cast<void *>(process_sp.get()), header_addr);
-    uint32_t idx;
 
     // Check if this is a normal object file by iterating through all object
     // file plugin instances.
-    ObjectFileCreateMemoryInstance create_callback;
-    for (idx = 0;
-         (create_callback =
-              PluginManager::GetObjectFileCreateMemoryCallbackAtIndex(idx)) !=
-         nullptr;
-         ++idx) {
-      object_file_sp.reset(
-          create_callback(module_sp, data_sp, process_sp, header_addr));
+    for (auto &cbs : PluginManager::GetObjectFileCallbacks()) {
+      if (!cbs.create_memory_callback)
+        continue;
+      object_file_sp.reset(cbs.create_memory_callback(module_sp, data_sp,
+                                                      process_sp, 
header_addr));
       if (object_file_sp.get())
         return object_file_sp;
     }
@@ -236,27 +224,17 @@ size_t ObjectFile::GetModuleSpecifications(
     lldb::offset_t data_offset, lldb::offset_t file_offset,
     lldb::offset_t file_size, lldb_private::ModuleSpecList &specs) {
   const size_t initial_count = specs.GetSize();
-  ObjectFileGetModuleSpecifications callback;
-  uint32_t i;
   // Try the ObjectFile plug-ins
-  for (i = 0;
-       (callback =
-            PluginManager::GetObjectFileGetModuleSpecificationsCallbackAtIndex(
-                i)) != nullptr;
-       ++i) {
-    if (callback(file, extractor_sp, data_offset, file_offset, file_size,
-                 specs) > 0)
+  for (auto &cbs : PluginManager::GetObjectFileCallbacks()) {
+    if (cbs.get_module_specifications(file, extractor_sp, data_offset,
+                                      file_offset, file_size, specs) > 0)
       return specs.GetSize() - initial_count;
   }
 
   // Try the ObjectContainer plug-ins
-  for (i = 0;
-       (callback = PluginManager::
-            GetObjectContainerGetModuleSpecificationsCallbackAtIndex(i)) !=
-       nullptr;
-       ++i) {
-    if (callback(file, extractor_sp, data_offset, file_offset, file_size,
-                 specs) > 0)
+  for (auto &cbs : PluginManager::GetObjectContainerCallbacks()) {
+    if (cbs.get_module_specifications(file, extractor_sp, data_offset,
+                                      file_offset, file_size, specs) > 0)
       return specs.GetSize() - initial_count;
   }
   return 0;
diff --git a/lldb/source/Symbol/SymbolFile.cpp 
b/lldb/source/Symbol/SymbolFile.cpp
index bfc63003216b2..7c2b499c97b4c 100644
--- a/lldb/source/Symbol/SymbolFile.cpp
+++ b/lldb/source/Symbol/SymbolFile.cpp
@@ -59,11 +59,7 @@ SymbolFile *SymbolFile::FindPlugin(ObjectFileSP objfile_sp) {
 
     uint32_t best_symfile_abilities = 0;
 
-    SymbolFileCreateInstance create_callback;
-    for (uint32_t idx = 0;
-         (create_callback = PluginManager::GetSymbolFileCreateCallbackAtIndex(
-              idx)) != nullptr;
-         ++idx) {
+    for (auto create_callback : PluginManager::GetSymbolFileCreateCallbacks()) 
{
       std::unique_ptr<SymbolFile> curr_symfile_up(create_callback(objfile_sp));
 
       if (curr_symfile_up) {
diff --git a/lldb/source/Symbol/SymbolVendor.cpp 
b/lldb/source/Symbol/SymbolVendor.cpp
index a6350d57735d0..bbadb8949969e 100644
--- a/lldb/source/Symbol/SymbolVendor.cpp
+++ b/lldb/source/Symbol/SymbolVendor.cpp
@@ -26,12 +26,8 @@ using namespace lldb_private;
 SymbolVendor *SymbolVendor::FindPlugin(const lldb::ModuleSP &module_sp,
                                        lldb_private::Stream *feedback_strm) {
   std::unique_ptr<SymbolVendor> instance_up;
-  SymbolVendorCreateInstance create_callback;
 
-  for (size_t idx = 0;
-       (create_callback = PluginManager::GetSymbolVendorCreateCallbackAtIndex(
-            idx)) != nullptr;
-       ++idx) {
+  for (auto create_callback : PluginManager::GetSymbolVendorCreateCallbacks()) 
{
     instance_up.reset(create_callback(module_sp, feedback_strm));
 
     if (instance_up) {
diff --git a/lldb/source/Symbol/TypeSystem.cpp 
b/lldb/source/Symbol/TypeSystem.cpp
index 8712142893835..1fe361f87ef61 100644
--- a/lldb/source/Symbol/TypeSystem.cpp
+++ b/lldb/source/Symbol/TypeSystem.cpp
@@ -41,14 +41,10 @@ TypeSystem::~TypeSystem() = default;
 
 static TypeSystemSP CreateInstanceHelper(lldb::LanguageType language,
                                          Module *module, Target *target) {
-  uint32_t i = 0;
-  TypeSystemCreateInstance create_callback;
-  while ((create_callback = PluginManager::GetTypeSystemCreateCallbackAtIndex(
-              i++)) != nullptr) {
+  for (auto create_callback : PluginManager::GetTypeSystemCreateCallbacks()) {
     if (auto type_system_sp = create_callback(language, module, target))
       return type_system_sp;
   }
-
   return {};
 }
 
diff --git a/lldb/source/Target/ABI.cpp b/lldb/source/Target/ABI.cpp
index 3c51074340149..b7b45f9f4c44b 100644
--- a/lldb/source/Target/ABI.cpp
+++ b/lldb/source/Target/ABI.cpp
@@ -25,20 +25,11 @@ using namespace lldb_private;
 
 ABISP
 ABI::FindPlugin(lldb::ProcessSP process_sp, const ArchSpec &arch) {
-  ABISP abi_sp;
-  ABICreateInstance create_callback;
-
-  for (uint32_t idx = 0;
-       (create_callback = PluginManager::GetABICreateCallbackAtIndex(idx)) !=
-       nullptr;
-       ++idx) {
-    abi_sp = create_callback(process_sp, arch);
-
-    if (abi_sp)
+  for (auto create_callback : PluginManager::GetABICreateCallbacks()) {
+    if (ABISP abi_sp = create_callback(process_sp, arch))
       return abi_sp;
   }
-  abi_sp.reset();
-  return abi_sp;
+  return {};
 }
 
 ABI::~ABI() = default;
diff --git a/lldb/source/Target/InstrumentationRuntime.cpp 
b/lldb/source/Target/InstrumentationRuntime.cpp
index d9800a8541f4e..66feba813304d 100644
--- a/lldb/source/Target/InstrumentationRuntime.cpp
+++ b/lldb/source/Target/InstrumentationRuntime.cpp
@@ -20,22 +20,10 @@ using namespace lldb_private;
 void InstrumentationRuntime::ModulesDidLoad(
     lldb_private::ModuleList &module_list, lldb_private::Process *process,
     InstrumentationRuntimeCollection &runtimes) {
-  InstrumentationRuntimeCreateInstance create_callback = nullptr;
-  InstrumentationRuntimeGetType get_type_callback;
-  for (uint32_t idx = 0;; ++idx) {
-    create_callback =
-        PluginManager::GetInstrumentationRuntimeCreateCallbackAtIndex(idx);
-    if (create_callback == nullptr)
-      break;
-    get_type_callback =
-        PluginManager::GetInstrumentationRuntimeGetTypeCallbackAtIndex(idx);
-    InstrumentationRuntimeType type = get_type_callback();
-
-    InstrumentationRuntimeCollection::iterator pos;
-    pos = runtimes.find(type);
-    if (pos == runtimes.end()) {
-      runtimes[type] = create_callback(process->shared_from_this());
-    }
+  for (auto &cbs : PluginManager::GetInstrumentationRuntimeCallbacks()) {
+    InstrumentationRuntimeType type = cbs.get_type_callback();
+    if (runtimes.find(type) == runtimes.end())
+      runtimes[type] = cbs.create_callback(process->shared_from_this());
   }
 }
 
diff --git a/lldb/source/Target/JITLoader.cpp b/lldb/source/Target/JITLoader.cpp
index 8ff349e063b62..4b810a57bf310 100644
--- a/lldb/source/Target/JITLoader.cpp
+++ b/lldb/source/Target/JITLoader.cpp
@@ -16,11 +16,7 @@ using namespace lldb;
 using namespace lldb_private;
 
 void JITLoader::LoadPlugins(Process *process, JITLoaderList &list) {
-  JITLoaderCreateInstance create_callback = nullptr;
-  for (uint32_t idx = 0;
-       (create_callback =
-            PluginManager::GetJITLoaderCreateCallbackAtIndex(idx)) != nullptr;
-       ++idx) {
+  for (auto create_callback : PluginManager::GetJITLoaderCreateCallbacks()) {
     JITLoaderSP instance_sp(create_callback(process, false));
     if (instance_sp)
       list.Append(std::move(instance_sp));
diff --git a/lldb/source/Target/Language.cpp b/lldb/source/Target/Language.cpp
index d22e58b0a6a9a..03754e988faa4 100644
--- a/lldb/source/Target/Language.cpp
+++ b/lldb/source/Target/Language.cpp
@@ -89,12 +89,8 @@ Language *Language::FindPlugin(lldb::LanguageType language) {
     return iter->second.get();
 
   Language *language_ptr = nullptr;
-  LanguageCreateInstance create_callback;
 
-  for (uint32_t idx = 0;
-       (create_callback =
-            PluginManager::GetLanguageCreateCallbackAtIndex(idx)) != nullptr;
-       ++idx) {
+  for (auto create_callback : PluginManager::GetLanguageCreateCallbacks()) {
     language_ptr = create_callback(language);
 
     if (language_ptr) {
diff --git a/lldb/source/Target/LanguageRuntime.cpp 
b/lldb/source/Target/LanguageRuntime.cpp
index 269d1e017fdf2..7aa89e7432870 100644
--- a/lldb/source/Target/LanguageRuntime.cpp
+++ b/lldb/source/Target/LanguageRuntime.cpp
@@ -201,13 +201,8 @@ class ExceptionBreakpointResolver : public 
BreakpointResolver {
 
 LanguageRuntime *LanguageRuntime::FindPlugin(Process *process,
                                              lldb::LanguageType language) {
-  LanguageRuntimeCreateInstance create_callback;
-  for (uint32_t idx = 0;
-       (create_callback =
-            PluginManager::GetLanguageRuntimeCreateCallbackAtIndex(idx)) !=
-       nullptr;
-       ++idx) {
-    if (LanguageRuntime *runtime = create_callback(process, language))
+  for (auto &cbs : PluginManager::GetLanguageRuntimeCallbacks()) {
+    if (LanguageRuntime *runtime = cbs.create_callback(process, language))
       return runtime;
   }
   return nullptr;
@@ -218,17 +213,10 @@ LanguageRuntime::LanguageRuntime(Process *process) : 
Runtime(process) {}
 BreakpointPreconditionSP
 LanguageRuntime::GetExceptionPrecondition(LanguageType language,
                                           bool throw_bp) {
-  LanguageRuntimeCreateInstance create_callback;
-  for (uint32_t idx = 0;
-       (create_callback =
-            PluginManager::GetLanguageRuntimeCreateCallbackAtIndex(idx)) !=
-       nullptr;
-       idx++) {
-    if (auto precondition_callback =
-            PluginManager::GetLanguageRuntimeGetExceptionPreconditionAtIndex(
-                idx)) {
+  for (auto &cbs : PluginManager::GetLanguageRuntimeCallbacks()) {
+    if (cbs.precondition_callback) {
       if (BreakpointPreconditionSP precond =
-              precondition_callback(language, throw_bp))
+              cbs.precondition_callback(language, throw_bp))
         return precond;
     }
   }
@@ -289,17 +277,10 @@ void LanguageRuntime::InitializeCommands(CommandObject 
*parent) {
   if (!parent->IsMultiwordObject())
     return;
 
-  LanguageRuntimeCreateInstance create_callback;
-
-  for (uint32_t idx = 0;
-       (create_callback =
-            PluginManager::GetLanguageRuntimeCreateCallbackAtIndex(idx)) !=
-       nullptr;
-       ++idx) {
-    if (LanguageRuntimeGetCommandObject command_callback =
-            PluginManager::GetLanguageRuntimeGetCommandObjectAtIndex(idx)) {
+  for (auto &cbs : PluginManager::GetLanguageRuntimeCallbacks()) {
+    if (cbs.command_callback) {
       CommandObjectSP command =
-          command_callback(parent->GetCommandInterpreter());
+          cbs.command_callback(parent->GetCommandInterpreter());
       if (command) {
         // the CommandObject vended by a Language plugin cannot be created once
         // and cached because we may create multiple debuggers and need one
diff --git a/lldb/source/Target/MemoryHistory.cpp 
b/lldb/source/Target/MemoryHistory.cpp
index 0ebf796a56bbd..f2c0de0d2017f 100644
--- a/lldb/source/Target/MemoryHistory.cpp
+++ b/lldb/source/Target/MemoryHistory.cpp
@@ -13,16 +13,11 @@ using namespace lldb;
 using namespace lldb_private;
 
 lldb::MemoryHistorySP MemoryHistory::FindPlugin(const ProcessSP process) {
-  MemoryHistoryCreateInstance create_callback = nullptr;
-
-  for (uint32_t idx = 0;
-       (create_callback = PluginManager::GetMemoryHistoryCreateCallbackAtIndex(
-            idx)) != nullptr;
-       ++idx) {
+  for (auto create_callback :
+       PluginManager::GetMemoryHistoryCreateCallbacks()) {
     MemoryHistorySP memory_history_sp(create_callback(process));
     if (memory_history_sp)
       return memory_history_sp;
   }
-
-  return MemoryHistorySP();
+  return {};
 }
diff --git a/lldb/source/Target/OperatingSystem.cpp 
b/lldb/source/Target/OperatingSystem.cpp
index 75762c05151d1..7b418067695e1 100644
--- a/lldb/source/Target/OperatingSystem.cpp
+++ b/lldb/source/Target/OperatingSystem.cpp
@@ -27,11 +27,8 @@ OperatingSystem *OperatingSystem::FindPlugin(Process 
*process,
         return instance_up.release();
     }
   } else {
-    for (uint32_t idx = 0;
-         (create_callback =
-              PluginManager::GetOperatingSystemCreateCallbackAtIndex(idx)) !=
-         nullptr;
-         ++idx) {
+    for (auto create_callback :
+         PluginManager::GetOperatingSystemCreateCallbacks()) {
       std::unique_ptr<OperatingSystem> instance_up(
           create_callback(process, false));
       if (instance_up)
diff --git a/lldb/source/Target/Platform.cpp b/lldb/source/Target/Platform.cpp
index 4068210cc1632..c85c7d2b578ef 100644
--- a/lldb/source/Target/Platform.cpp
+++ b/lldb/source/Target/Platform.cpp
@@ -1010,17 +1010,10 @@ lldb::ProcessSP 
Platform::DebugProcess(ProcessLaunchInfo &launch_info,
 
   // Allow any StructuredData process-bound plugins to adjust the launch info
   // if needed
-  size_t i = 0;
-  bool iteration_complete = false;
-  // Note iteration can't simply go until a nullptr callback is returned, as it
-  // is valid for a plugin to not supply a filter.
-  auto get_filter_func = PluginManager::GetStructuredDataFilterCallbackAtIndex;
-  for (auto filter_callback = get_filter_func(i, iteration_complete);
-       !iteration_complete;
-       filter_callback = get_filter_func(++i, iteration_complete)) {
-    if (filter_callback) {
+  for (auto &cbs : PluginManager::GetStructuredDataPluginCallbacks()) {
+    if (cbs.filter_callback) {
       // Give this ProcessLaunchInfo filter a chance to adjust the launch info.
-      error = (*filter_callback)(launch_info, &target);
+      error = (*cbs.filter_callback)(launch_info, &target);
       if (!error.Success()) {
         LLDB_LOGF(log,
                   "Platform::%s() StructuredDataPlugin launch "
@@ -2135,12 +2128,8 @@ PlatformSP PlatformList::GetOrCreate(const ArchSpec 
&arch,
       return platform_sp;
   }
 
-  PlatformCreateInstance create_callback;
   // First try exact arch matches across all platform plug-ins
-  uint32_t idx;
-  for (idx = 0;
-       (create_callback = 
PluginManager::GetPlatformCreateCallbackAtIndex(idx));
-       ++idx) {
+  for (auto create_callback : PluginManager::GetPlatformCreateCallbacks()) {
     PlatformSP platform_sp = create_callback(false, &arch);
     if (platform_sp &&
         platform_sp->IsCompatibleArchitecture(
@@ -2150,9 +2139,7 @@ PlatformSP PlatformList::GetOrCreate(const ArchSpec &arch,
     }
   }
   // Next try compatible arch matches across all platform plug-ins
-  for (idx = 0;
-       (create_callback = 
PluginManager::GetPlatformCreateCallbackAtIndex(idx));
-       ++idx) {
+  for (auto create_callback : PluginManager::GetPlatformCreateCallbacks()) {
     PlatformSP platform_sp = create_callback(false, &arch);
     if (platform_sp && platform_sp->IsCompatibleArchitecture(
                            arch, process_host_arch, ArchSpec::CompatibleMatch,
@@ -2239,10 +2226,7 @@ bool PlatformList::LoadPlatformBinaryAndSetup(Process 
*process,
                                               lldb::addr_t addr, bool notify) {
   std::lock_guard<std::recursive_mutex> guard(m_mutex);
 
-  PlatformCreateInstance create_callback;
-  for (int idx = 0;
-       (create_callback = 
PluginManager::GetPlatformCreateCallbackAtIndex(idx));
-       ++idx) {
+  for (auto create_callback : PluginManager::GetPlatformCreateCallbacks()) {
     ArchSpec arch;
     PlatformSP platform_sp = create_callback(true, &arch);
     if (platform_sp) {
diff --git a/lldb/source/Target/Process.cpp b/lldb/source/Target/Process.cpp
index aa64c6fb4ebc1..5e364b4932903 100644
--- a/lldb/source/Target/Process.cpp
+++ b/lldb/source/Target/Process.cpp
@@ -402,10 +402,7 @@ ProcessSP Process::FindPlugin(lldb::TargetSP target_sp,
       }
     }
   } else {
-    for (uint32_t idx = 0;
-         (create_callback =
-              PluginManager::GetProcessCreateCallbackAtIndex(idx)) != nullptr;
-         ++idx) {
+    for (auto create_callback : PluginManager::GetProcessCreateCallbacks()) {
       process_sp = create_callback(target_sp, listener_sp, crash_file_path,
                                    can_connect);
       if (process_sp) {
@@ -6448,15 +6445,12 @@ void Process::MapSupportedStructuredDataPlugins(
   // we've consumed all the type names.
   // FIXME: should we return an error if there are type names nobody
   // supports?
-  for (uint32_t plugin_index = 0; !type_names.empty(); plugin_index++) {
-    auto create_instance =
-        PluginManager::GetStructuredDataPluginCreateCallbackAtIndex(
-            plugin_index);
-    if (!create_instance)
+  for (auto &cbs : PluginManager::GetStructuredDataPluginCallbacks()) {
+    if (type_names.empty())
       break;
 
     // Create the plugin.
-    StructuredDataPluginSP plugin_sp = (*create_instance)(*this);
+    StructuredDataPluginSP plugin_sp = (*cbs.create_callback)(*this);
     if (!plugin_sp) {
       // This plugin doesn't think it can work with the process. Move on to the
       // next.
diff --git a/lldb/source/Target/SyntheticFrameProvider.cpp 
b/lldb/source/Target/SyntheticFrameProvider.cpp
index e799ad23b7512..0e4408eaad480 100644
--- a/lldb/source/Target/SyntheticFrameProvider.cpp
+++ b/lldb/source/Target/SyntheticFrameProvider.cpp
@@ -84,12 +84,8 @@ llvm::Expected<SyntheticFrameProviderSP> 
SyntheticFrameProvider::CreateInstance(
         "cannot create synthetic frame provider: invalid input frames");
 
   // Iterate through all registered ScriptedFrameProvider plugins.
-  ScriptedFrameProviderCreateInstance create_callback = nullptr;
-  for (uint32_t idx = 0;
-       (create_callback =
-            PluginManager::GetScriptedFrameProviderCreateCallbackAtIndex(
-                idx)) != nullptr;
-       ++idx) {
+  for (auto create_callback :
+       PluginManager::GetScriptedFrameProviderCreateCallbacks()) {
     auto provider_or_err = create_callback(input_frames, descriptor);
     if (!provider_or_err) {
       LLDB_LOG_ERROR(GetLog(LLDBLog::Target), provider_or_err.takeError(),
diff --git a/lldb/source/Target/SystemRuntime.cpp 
b/lldb/source/Target/SystemRuntime.cpp
index 6d8a2ef55225f..0a4d8b630e5bd 100644
--- a/lldb/source/Target/SystemRuntime.cpp
+++ b/lldb/source/Target/SystemRuntime.cpp
@@ -15,11 +15,8 @@ using namespace lldb;
 using namespace lldb_private;
 
 SystemRuntime *SystemRuntime::FindPlugin(Process *process) {
-  SystemRuntimeCreateInstance create_callback = nullptr;
-  for (uint32_t idx = 0;
-       (create_callback = PluginManager::GetSystemRuntimeCreateCallbackAtIndex(
-            idx)) != nullptr;
-       ++idx) {
+  for (auto create_callback :
+       PluginManager::GetSystemRuntimeCreateCallbacks()) {
     std::unique_ptr<SystemRuntime> instance_up(create_callback(process));
     if (instance_up)
       return instance_up.release();
diff --git a/lldb/source/Target/UnwindAssembly.cpp 
b/lldb/source/Target/UnwindAssembly.cpp
index 75f2b328cef88..ad2a74a7fc27e 100644
--- a/lldb/source/Target/UnwindAssembly.cpp
+++ b/lldb/source/Target/UnwindAssembly.cpp
@@ -15,12 +15,8 @@ using namespace lldb;
 using namespace lldb_private;
 
 UnwindAssemblySP UnwindAssembly::FindPlugin(const ArchSpec &arch) {
-  UnwindAssemblyCreateInstance create_callback;
-
-  for (uint32_t idx = 0;
-       (create_callback = 
PluginManager::GetUnwindAssemblyCreateCallbackAtIndex(
-            idx)) != nullptr;
-       ++idx) {
+  for (auto create_callback :
+       PluginManager::GetUnwindAssemblyCreateCallbacks()) {
     UnwindAssemblySP assembly_profiler_up(create_callback(arch));
     if (assembly_profiler_up)
       return assembly_profiler_up;
diff --git a/lldb/unittests/Core/PluginManagerTest.cpp 
b/lldb/unittests/Core/PluginManagerTest.cpp
index c7a56b28a42fc..0339e387f2c58 100644
--- a/lldb/unittests/Core/PluginManagerTest.cpp
+++ b/lldb/unittests/Core/PluginManagerTest.cpp
@@ -57,22 +57,16 @@ class PluginManagerTest : public testing::Test {
   static void RemoveAllRegisteredSystemRuntimePlugins() {
     // Enable all currently registered plugins so we can get a handle to
     // their create callbacks in the loop below. Only enabled plugins
-    // are returned from the PluginManager Get*CreateCallbackAtIndex apis.
+    // are returned from the PluginManager GetSystemRuntimeCreateCallbacks()
+    // api.
     for (const RegisteredPluginInfo &PluginInfo :
          PluginManager::GetSystemRuntimePluginInfo()) {
       PluginManager::SetSystemRuntimePluginEnabled(PluginInfo.name, true);
     }
 
     // Get a handle to the create call backs for all the registered plugins.
-    std::vector<SystemRuntimeCreateInstance> registered_plugin_callbacks;
-    SystemRuntimeCreateInstance create_callback = nullptr;
-    for (uint32_t idx = 0;
-         (create_callback =
-              PluginManager::GetSystemRuntimeCreateCallbackAtIndex(idx)) !=
-         nullptr;
-         ++idx) {
-      registered_plugin_callbacks.push_back((create_callback));
-    }
+    std::vector<SystemRuntimeCreateInstance> registered_plugin_callbacks =
+        PluginManager::GetSystemRuntimeCreateCallbacks();
 
     // Remove all currently registered plugins.
     for (SystemRuntimeCreateInstance create_callback :
@@ -86,16 +80,11 @@ class PluginManagerTest : public testing::Test {
 TEST_F(PluginManagerTest, RegisterSystemRuntimePlugin) {
   RegisterMockSystemRuntimePlugins();
 
-  ASSERT_EQ(PluginManager::GetSystemRuntimeCreateCallbackAtIndex(0),
-            CreateSystemRuntimePluginA);
-
-  ASSERT_EQ(PluginManager::GetSystemRuntimeCreateCallbackAtIndex(1),
-            CreateSystemRuntimePluginB);
-
-  ASSERT_EQ(PluginManager::GetSystemRuntimeCreateCallbackAtIndex(2),
-            CreateSystemRuntimePluginC);
-
-  ASSERT_EQ(PluginManager::GetSystemRuntimeCreateCallbackAtIndex(3), nullptr);
+  auto callbacks = PluginManager::GetSystemRuntimeCreateCallbacks();
+  ASSERT_EQ(callbacks.size(), 3u);
+  ASSERT_EQ(callbacks[0], CreateSystemRuntimePluginA);
+  ASSERT_EQ(callbacks[1], CreateSystemRuntimePluginB);
+  ASSERT_EQ(callbacks[2], CreateSystemRuntimePluginC);
 }
 
 // Test basic un-register functionality.
@@ -104,13 +93,10 @@ TEST_F(PluginManagerTest, UnRegisterSystemRuntimePlugin) {
 
   ASSERT_TRUE(PluginManager::UnregisterPlugin(CreateSystemRuntimePluginB));
 
-  ASSERT_EQ(PluginManager::GetSystemRuntimeCreateCallbackAtIndex(0),
-            CreateSystemRuntimePluginA);
-
-  ASSERT_EQ(PluginManager::GetSystemRuntimeCreateCallbackAtIndex(1),
-            CreateSystemRuntimePluginC);
-
-  ASSERT_EQ(PluginManager::GetSystemRuntimeCreateCallbackAtIndex(2), nullptr);
+  auto callbacks = PluginManager::GetSystemRuntimeCreateCallbacks();
+  ASSERT_EQ(callbacks.size(), 2u);
+  ASSERT_EQ(callbacks[0], CreateSystemRuntimePluginA);
+  ASSERT_EQ(callbacks[1], CreateSystemRuntimePluginC);
 }
 
 // Test registered plugin info functionality.
@@ -170,11 +156,10 @@ TEST_F(PluginManagerTest, SystemRuntimePluginDisable) {
   ASSERT_EQ(plugin_info[2].enabled, true);
 
   // Disabling a plugin does remove it from available plugins.
-  ASSERT_EQ(PluginManager::GetSystemRuntimeCreateCallbackAtIndex(0),
-            CreateSystemRuntimePluginA);
-  ASSERT_EQ(PluginManager::GetSystemRuntimeCreateCallbackAtIndex(1),
-            CreateSystemRuntimePluginC);
-  ASSERT_EQ(PluginManager::GetSystemRuntimeCreateCallbackAtIndex(2), nullptr);
+  auto callbacks = PluginManager::GetSystemRuntimeCreateCallbacks();
+  ASSERT_EQ(callbacks.size(), 2u);
+  ASSERT_EQ(callbacks[0], CreateSystemRuntimePluginA);
+  ASSERT_EQ(callbacks[1], CreateSystemRuntimePluginC);
 }
 
 // Test plugin disable and enable functionality.
@@ -182,25 +167,30 @@ TEST_F(PluginManagerTest, 
SystemRuntimePluginDisableThenEnable) {
   RegisterMockSystemRuntimePlugins();
 
   // Initially plugin b is available in slot 1.
-  ASSERT_EQ(PluginManager::GetSystemRuntimeCreateCallbackAtIndex(1),
-            CreateSystemRuntimePluginB);
+  {
+    auto callbacks = PluginManager::GetSystemRuntimeCreateCallbacks();
+    ASSERT_EQ(callbacks[1], CreateSystemRuntimePluginB);
+  }
 
   // Disabling it will remove it from available plugins.
   ASSERT_TRUE(PluginManager::SetSystemRuntimePluginEnabled("b", false));
-  ASSERT_EQ(PluginManager::GetSystemRuntimeCreateCallbackAtIndex(0),
-            CreateSystemRuntimePluginA);
-  ASSERT_EQ(PluginManager::GetSystemRuntimeCreateCallbackAtIndex(1),
-            CreateSystemRuntimePluginC);
+  {
+    auto callbacks = PluginManager::GetSystemRuntimeCreateCallbacks();
+    ASSERT_EQ(callbacks.size(), 2u);
+    ASSERT_EQ(callbacks[0], CreateSystemRuntimePluginA);
+    ASSERT_EQ(callbacks[1], CreateSystemRuntimePluginC);
+  }
 
   // We can re-enable the plugin later and it should go back to the original
   // slot.
   ASSERT_TRUE(PluginManager::SetSystemRuntimePluginEnabled("b", true));
-  ASSERT_EQ(PluginManager::GetSystemRuntimeCreateCallbackAtIndex(0),
-            CreateSystemRuntimePluginA);
-  ASSERT_EQ(PluginManager::GetSystemRuntimeCreateCallbackAtIndex(1),
-            CreateSystemRuntimePluginB);
-  ASSERT_EQ(PluginManager::GetSystemRuntimeCreateCallbackAtIndex(2),
-            CreateSystemRuntimePluginC);
+  {
+    auto callbacks = PluginManager::GetSystemRuntimeCreateCallbacks();
+    ASSERT_EQ(callbacks.size(), 3u);
+    ASSERT_EQ(callbacks[0], CreateSystemRuntimePluginA);
+    ASSERT_EQ(callbacks[1], CreateSystemRuntimePluginB);
+    ASSERT_EQ(callbacks[2], CreateSystemRuntimePluginC);
+  }
 
   // And show up in the plugin info correctly.
   std::vector<RegisteredPluginInfo> plugin_info =
@@ -248,12 +238,13 @@ TEST_F(PluginManagerTest, SystemRuntimePluginDisableAll) {
   RegisterMockSystemRuntimePlugins();
 
   // Validate initial state of registered plugins.
-  ASSERT_EQ(PluginManager::GetSystemRuntimeCreateCallbackAtIndex(0),
-            CreateSystemRuntimePluginA);
-  ASSERT_EQ(PluginManager::GetSystemRuntimeCreateCallbackAtIndex(1),
-            CreateSystemRuntimePluginB);
-  ASSERT_EQ(PluginManager::GetSystemRuntimeCreateCallbackAtIndex(2),
-            CreateSystemRuntimePluginC);
+  {
+    auto callbacks = PluginManager::GetSystemRuntimeCreateCallbacks();
+    ASSERT_EQ(callbacks.size(), 3u);
+    ASSERT_EQ(callbacks[0], CreateSystemRuntimePluginA);
+    ASSERT_EQ(callbacks[1], CreateSystemRuntimePluginB);
+    ASSERT_EQ(callbacks[2], CreateSystemRuntimePluginC);
+  }
 
   // Disable all the active plugins.
   ASSERT_TRUE(PluginManager::SetSystemRuntimePluginEnabled("a", false));
@@ -261,9 +252,7 @@ TEST_F(PluginManagerTest, SystemRuntimePluginDisableAll) {
   ASSERT_TRUE(PluginManager::SetSystemRuntimePluginEnabled("c", false));
 
   // Should have no active plugins.
-  ASSERT_EQ(PluginManager::GetSystemRuntimeCreateCallbackAtIndex(0), nullptr);
-  ASSERT_EQ(PluginManager::GetSystemRuntimeCreateCallbackAtIndex(1), nullptr);
-  ASSERT_EQ(PluginManager::GetSystemRuntimeCreateCallbackAtIndex(2), nullptr);
+  ASSERT_EQ(PluginManager::GetSystemRuntimeCreateCallbacks().size(), 0u);
 
   // And show up in the plugin info correctly.
   std::vector<RegisteredPluginInfo> plugin_info =
@@ -279,22 +268,28 @@ TEST_F(PluginManagerTest, SystemRuntimePluginDisableAll) {
   // Enable plugins in reverse order and validate expected indicies.
   // They should show up in the original plugin order.
   ASSERT_TRUE(PluginManager::SetSystemRuntimePluginEnabled("c", true));
-  ASSERT_EQ(PluginManager::GetSystemRuntimeCreateCallbackAtIndex(0),
-            CreateSystemRuntimePluginC);
+  {
+    auto callbacks = PluginManager::GetSystemRuntimeCreateCallbacks();
+    ASSERT_EQ(callbacks.size(), 1u);
+    ASSERT_EQ(callbacks[0], CreateSystemRuntimePluginC);
+  }
 
   ASSERT_TRUE(PluginManager::SetSystemRuntimePluginEnabled("a", true));
-  ASSERT_EQ(PluginManager::GetSystemRuntimeCreateCallbackAtIndex(0),
-            CreateSystemRuntimePluginA);
-  ASSERT_EQ(PluginManager::GetSystemRuntimeCreateCallbackAtIndex(1),
-            CreateSystemRuntimePluginC);
+  {
+    auto callbacks = PluginManager::GetSystemRuntimeCreateCallbacks();
+    ASSERT_EQ(callbacks.size(), 2u);
+    ASSERT_EQ(callbacks[0], CreateSystemRuntimePluginA);
+    ASSERT_EQ(callbacks[1], CreateSystemRuntimePluginC);
+  }
 
   ASSERT_TRUE(PluginManager::SetSystemRuntimePluginEnabled("b", true));
-  ASSERT_EQ(PluginManager::GetSystemRuntimeCreateCallbackAtIndex(0),
-            CreateSystemRuntimePluginA);
-  ASSERT_EQ(PluginManager::GetSystemRuntimeCreateCallbackAtIndex(1),
-            CreateSystemRuntimePluginB);
-  ASSERT_EQ(PluginManager::GetSystemRuntimeCreateCallbackAtIndex(2),
-            CreateSystemRuntimePluginC);
+  {
+    auto callbacks = PluginManager::GetSystemRuntimeCreateCallbacks();
+    ASSERT_EQ(callbacks.size(), 3u);
+    ASSERT_EQ(callbacks[0], CreateSystemRuntimePluginA);
+    ASSERT_EQ(callbacks[1], CreateSystemRuntimePluginB);
+    ASSERT_EQ(callbacks[2], CreateSystemRuntimePluginC);
+  }
 }
 
 // Test un-registering a disabled plugin works.
@@ -326,12 +321,13 @@ TEST_F(PluginManagerTest, 
UnRegisterSystemRuntimePluginChangesOrder) {
 
   std::vector<RegisteredPluginInfo> plugin_info =
       PluginManager::GetSystemRuntimePluginInfo();
-  ASSERT_EQ(PluginManager::GetSystemRuntimeCreateCallbackAtIndex(0),
-            CreateSystemRuntimePluginA);
-  ASSERT_EQ(PluginManager::GetSystemRuntimeCreateCallbackAtIndex(1),
-            CreateSystemRuntimePluginB);
-  ASSERT_EQ(PluginManager::GetSystemRuntimeCreateCallbackAtIndex(2),
-            CreateSystemRuntimePluginC);
+  {
+    auto callbacks = PluginManager::GetSystemRuntimeCreateCallbacks();
+    ASSERT_EQ(callbacks.size(), 3u);
+    ASSERT_EQ(callbacks[0], CreateSystemRuntimePluginA);
+    ASSERT_EQ(callbacks[1], CreateSystemRuntimePluginB);
+    ASSERT_EQ(callbacks[2], CreateSystemRuntimePluginC);
+  }
 
   ASSERT_EQ(plugin_info.size(), 3u);
   ASSERT_EQ(plugin_info[0].name, "a");
@@ -346,12 +342,13 @@ TEST_F(PluginManagerTest, 
UnRegisterSystemRuntimePluginChangesOrder) {
 
   // Check the callback indices match as expected.
   plugin_info = PluginManager::GetSystemRuntimePluginInfo();
-  ASSERT_EQ(PluginManager::GetSystemRuntimeCreateCallbackAtIndex(0),
-            CreateSystemRuntimePluginA);
-  ASSERT_EQ(PluginManager::GetSystemRuntimeCreateCallbackAtIndex(1),
-            CreateSystemRuntimePluginC);
-  ASSERT_EQ(PluginManager::GetSystemRuntimeCreateCallbackAtIndex(2),
-            CreateSystemRuntimePluginB);
+  {
+    auto callbacks = PluginManager::GetSystemRuntimeCreateCallbacks();
+    ASSERT_EQ(callbacks.size(), 3u);
+    ASSERT_EQ(callbacks[0], CreateSystemRuntimePluginA);
+    ASSERT_EQ(callbacks[1], CreateSystemRuntimePluginC);
+    ASSERT_EQ(callbacks[2], CreateSystemRuntimePluginB);
+  }
 
   // And plugin info should match as well.
   ASSERT_EQ(plugin_info.size(), 3u);
@@ -365,19 +362,22 @@ TEST_F(PluginManagerTest, 
UnRegisterSystemRuntimePluginChangesOrder) {
   // un-registering and re-registering "b" it should now stay in
   // the middle of the order.
   ASSERT_TRUE(PluginManager::SetSystemRuntimePluginEnabled("c", false));
-  ASSERT_EQ(PluginManager::GetSystemRuntimeCreateCallbackAtIndex(0),
-            CreateSystemRuntimePluginA);
-  ASSERT_EQ(PluginManager::GetSystemRuntimeCreateCallbackAtIndex(1),
-            CreateSystemRuntimePluginB);
+  {
+    auto callbacks = PluginManager::GetSystemRuntimeCreateCallbacks();
+    ASSERT_EQ(callbacks.size(), 2u);
+    ASSERT_EQ(callbacks[0], CreateSystemRuntimePluginA);
+    ASSERT_EQ(callbacks[1], CreateSystemRuntimePluginB);
+  }
 
   // And re-enabling
   ASSERT_TRUE(PluginManager::SetSystemRuntimePluginEnabled("c", true));
-  ASSERT_EQ(PluginManager::GetSystemRuntimeCreateCallbackAtIndex(0),
-            CreateSystemRuntimePluginA);
-  ASSERT_EQ(PluginManager::GetSystemRuntimeCreateCallbackAtIndex(1),
-            CreateSystemRuntimePluginC);
-  ASSERT_EQ(PluginManager::GetSystemRuntimeCreateCallbackAtIndex(2),
-            CreateSystemRuntimePluginB);
+  {
+    auto callbacks = PluginManager::GetSystemRuntimeCreateCallbacks();
+    ASSERT_EQ(callbacks.size(), 3u);
+    ASSERT_EQ(callbacks[0], CreateSystemRuntimePluginA);
+    ASSERT_EQ(callbacks[1], CreateSystemRuntimePluginC);
+    ASSERT_EQ(callbacks[2], CreateSystemRuntimePluginB);
+  }
 }
 
 TEST_F(PluginManagerTest, MatchPluginName) {

_______________________________________________
lldb-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to