Path: blob/main/contrib/llvm-project/lldb/source/Core/PluginManager.cpp
39587 views
//===-- PluginManager.cpp -------------------------------------------------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//78#include "lldb/Core/PluginManager.h"910#include "lldb/Core/Debugger.h"11#include "lldb/Host/FileSystem.h"12#include "lldb/Host/HostInfo.h"13#include "lldb/Interpreter/OptionValueProperties.h"14#include "lldb/Symbol/SaveCoreOptions.h"15#include "lldb/Target/Process.h"16#include "lldb/Utility/FileSpec.h"17#include "lldb/Utility/Status.h"18#include "lldb/Utility/StringList.h"19#include "llvm/ADT/StringRef.h"20#include "llvm/Support/DynamicLibrary.h"21#include "llvm/Support/FileSystem.h"22#include "llvm/Support/raw_ostream.h"23#include <cassert>24#include <map>25#include <memory>26#include <mutex>27#include <string>28#include <utility>29#include <vector>30#if defined(_WIN32)31#include "lldb/Host/windows/PosixApi.h"32#endif3334using namespace lldb;35using namespace lldb_private;3637typedef bool (*PluginInitCallback)();38typedef void (*PluginTermCallback)();3940struct PluginInfo {41PluginInfo() = default;4243llvm::sys::DynamicLibrary library;44PluginInitCallback plugin_init_callback = nullptr;45PluginTermCallback plugin_term_callback = nullptr;46};4748typedef std::map<FileSpec, PluginInfo> PluginTerminateMap;4950static std::recursive_mutex &GetPluginMapMutex() {51static std::recursive_mutex g_plugin_map_mutex;52return g_plugin_map_mutex;53}5455static PluginTerminateMap &GetPluginMap() {56static PluginTerminateMap g_plugin_map;57return g_plugin_map;58}5960static bool PluginIsLoaded(const FileSpec &plugin_file_spec) {61std::lock_guard<std::recursive_mutex> guard(GetPluginMapMutex());62PluginTerminateMap &plugin_map = GetPluginMap();63return plugin_map.find(plugin_file_spec) != plugin_map.end();64}6566static void SetPluginInfo(const FileSpec &plugin_file_spec,67const PluginInfo &plugin_info) {68std::lock_guard<std::recursive_mutex> guard(GetPluginMapMutex());69PluginTerminateMap &plugin_map = GetPluginMap();70assert(plugin_map.find(plugin_file_spec) == plugin_map.end());71plugin_map[plugin_file_spec] = plugin_info;72}7374template <typename FPtrTy> static FPtrTy CastToFPtr(void *VPtr) {75return reinterpret_cast<FPtrTy>(VPtr);76}7778static FileSystem::EnumerateDirectoryResult79LoadPluginCallback(void *baton, llvm::sys::fs::file_type ft,80llvm::StringRef path) {81Status error;8283namespace fs = llvm::sys::fs;84// If we have a regular file, a symbolic link or unknown file type, try and85// process the file. We must handle unknown as sometimes the directory86// enumeration might be enumerating a file system that doesn't have correct87// file type information.88if (ft == fs::file_type::regular_file || ft == fs::file_type::symlink_file ||89ft == fs::file_type::type_unknown) {90FileSpec plugin_file_spec(path);91FileSystem::Instance().Resolve(plugin_file_spec);9293if (PluginIsLoaded(plugin_file_spec))94return FileSystem::eEnumerateDirectoryResultNext;95else {96PluginInfo plugin_info;9798std::string pluginLoadError;99plugin_info.library = llvm::sys::DynamicLibrary::getPermanentLibrary(100plugin_file_spec.GetPath().c_str(), &pluginLoadError);101if (plugin_info.library.isValid()) {102bool success = false;103plugin_info.plugin_init_callback = CastToFPtr<PluginInitCallback>(104plugin_info.library.getAddressOfSymbol("LLDBPluginInitialize"));105if (plugin_info.plugin_init_callback) {106// Call the plug-in "bool LLDBPluginInitialize(void)" function107success = plugin_info.plugin_init_callback();108}109110if (success) {111// It is ok for the "LLDBPluginTerminate" symbol to be nullptr112plugin_info.plugin_term_callback = CastToFPtr<PluginTermCallback>(113plugin_info.library.getAddressOfSymbol("LLDBPluginTerminate"));114} else {115// The initialize function returned FALSE which means the plug-in116// might not be compatible, or might be too new or too old, or might117// not want to run on this machine. Set it to a default-constructed118// instance to invalidate it.119plugin_info = PluginInfo();120}121122// Regardless of success or failure, cache the plug-in load in our123// plug-in info so we don't try to load it again and again.124SetPluginInfo(plugin_file_spec, plugin_info);125126return FileSystem::eEnumerateDirectoryResultNext;127}128}129}130131if (ft == fs::file_type::directory_file ||132ft == fs::file_type::symlink_file || ft == fs::file_type::type_unknown) {133// Try and recurse into anything that a directory or symbolic link. We must134// also do this for unknown as sometimes the directory enumeration might be135// enumerating a file system that doesn't have correct file type136// information.137return FileSystem::eEnumerateDirectoryResultEnter;138}139140return FileSystem::eEnumerateDirectoryResultNext;141}142143void PluginManager::Initialize() {144const bool find_directories = true;145const bool find_files = true;146const bool find_other = true;147char dir_path[PATH_MAX];148if (FileSpec dir_spec = HostInfo::GetSystemPluginDir()) {149if (FileSystem::Instance().Exists(dir_spec) &&150dir_spec.GetPath(dir_path, sizeof(dir_path))) {151FileSystem::Instance().EnumerateDirectory(dir_path, find_directories,152find_files, find_other,153LoadPluginCallback, nullptr);154}155}156157if (FileSpec dir_spec = HostInfo::GetUserPluginDir()) {158if (FileSystem::Instance().Exists(dir_spec) &&159dir_spec.GetPath(dir_path, sizeof(dir_path))) {160FileSystem::Instance().EnumerateDirectory(dir_path, find_directories,161find_files, find_other,162LoadPluginCallback, nullptr);163}164}165}166167void PluginManager::Terminate() {168std::lock_guard<std::recursive_mutex> guard(GetPluginMapMutex());169PluginTerminateMap &plugin_map = GetPluginMap();170171PluginTerminateMap::const_iterator pos, end = plugin_map.end();172for (pos = plugin_map.begin(); pos != end; ++pos) {173// Call the plug-in "void LLDBPluginTerminate (void)" function if there is174// one (if the symbol was not nullptr).175if (pos->second.library.isValid()) {176if (pos->second.plugin_term_callback)177pos->second.plugin_term_callback();178}179}180plugin_map.clear();181}182183template <typename Callback> struct PluginInstance {184typedef Callback CallbackType;185186PluginInstance() = default;187PluginInstance(llvm::StringRef name, llvm::StringRef description,188Callback create_callback,189DebuggerInitializeCallback debugger_init_callback = nullptr)190: name(name), description(description), create_callback(create_callback),191debugger_init_callback(debugger_init_callback) {}192193llvm::StringRef name;194llvm::StringRef description;195Callback create_callback;196DebuggerInitializeCallback debugger_init_callback;197};198199template <typename Instance> class PluginInstances {200public:201template <typename... Args>202bool RegisterPlugin(llvm::StringRef name, llvm::StringRef description,203typename Instance::CallbackType callback,204Args &&...args) {205if (!callback)206return false;207assert(!name.empty());208Instance instance =209Instance(name, description, callback, std::forward<Args>(args)...);210m_instances.push_back(instance);211return false;212}213214bool UnregisterPlugin(typename Instance::CallbackType callback) {215if (!callback)216return false;217auto pos = m_instances.begin();218auto end = m_instances.end();219for (; pos != end; ++pos) {220if (pos->create_callback == callback) {221m_instances.erase(pos);222return true;223}224}225return false;226}227228typename Instance::CallbackType GetCallbackAtIndex(uint32_t idx) {229if (Instance *instance = GetInstanceAtIndex(idx))230return instance->create_callback;231return nullptr;232}233234llvm::StringRef GetDescriptionAtIndex(uint32_t idx) {235if (Instance *instance = GetInstanceAtIndex(idx))236return instance->description;237return "";238}239240llvm::StringRef GetNameAtIndex(uint32_t idx) {241if (Instance *instance = GetInstanceAtIndex(idx))242return instance->name;243return "";244}245246typename Instance::CallbackType GetCallbackForName(llvm::StringRef name) {247if (name.empty())248return nullptr;249for (auto &instance : m_instances) {250if (name == instance.name)251return instance.create_callback;252}253return nullptr;254}255256void PerformDebuggerCallback(Debugger &debugger) {257for (auto &instance : m_instances) {258if (instance.debugger_init_callback)259instance.debugger_init_callback(debugger);260}261}262263const std::vector<Instance> &GetInstances() const { return m_instances; }264std::vector<Instance> &GetInstances() { return m_instances; }265266Instance *GetInstanceAtIndex(uint32_t idx) {267if (idx < m_instances.size())268return &m_instances[idx];269return nullptr;270}271272private:273std::vector<Instance> m_instances;274};275276#pragma mark ABI277278typedef PluginInstance<ABICreateInstance> ABIInstance;279typedef PluginInstances<ABIInstance> ABIInstances;280281static ABIInstances &GetABIInstances() {282static ABIInstances g_instances;283return g_instances;284}285286bool PluginManager::RegisterPlugin(llvm::StringRef name,287llvm::StringRef description,288ABICreateInstance create_callback) {289return GetABIInstances().RegisterPlugin(name, description, create_callback);290}291292bool PluginManager::UnregisterPlugin(ABICreateInstance create_callback) {293return GetABIInstances().UnregisterPlugin(create_callback);294}295296ABICreateInstance PluginManager::GetABICreateCallbackAtIndex(uint32_t idx) {297return GetABIInstances().GetCallbackAtIndex(idx);298}299300#pragma mark Architecture301302typedef PluginInstance<ArchitectureCreateInstance> ArchitectureInstance;303typedef std::vector<ArchitectureInstance> ArchitectureInstances;304305static ArchitectureInstances &GetArchitectureInstances() {306static ArchitectureInstances g_instances;307return g_instances;308}309310void PluginManager::RegisterPlugin(llvm::StringRef name,311llvm::StringRef description,312ArchitectureCreateInstance create_callback) {313GetArchitectureInstances().push_back({name, description, create_callback});314}315316void PluginManager::UnregisterPlugin(317ArchitectureCreateInstance create_callback) {318auto &instances = GetArchitectureInstances();319320for (auto pos = instances.begin(), end = instances.end(); pos != end; ++pos) {321if (pos->create_callback == create_callback) {322instances.erase(pos);323return;324}325}326llvm_unreachable("Plugin not found");327}328329std::unique_ptr<Architecture>330PluginManager::CreateArchitectureInstance(const ArchSpec &arch) {331for (const auto &instances : GetArchitectureInstances()) {332if (auto plugin_up = instances.create_callback(arch))333return plugin_up;334}335return nullptr;336}337338#pragma mark Disassembler339340typedef PluginInstance<DisassemblerCreateInstance> DisassemblerInstance;341typedef PluginInstances<DisassemblerInstance> DisassemblerInstances;342343static DisassemblerInstances &GetDisassemblerInstances() {344static DisassemblerInstances g_instances;345return g_instances;346}347348bool PluginManager::RegisterPlugin(llvm::StringRef name,349llvm::StringRef description,350DisassemblerCreateInstance create_callback) {351return GetDisassemblerInstances().RegisterPlugin(name, description,352create_callback);353}354355bool PluginManager::UnregisterPlugin(356DisassemblerCreateInstance create_callback) {357return GetDisassemblerInstances().UnregisterPlugin(create_callback);358}359360DisassemblerCreateInstance361PluginManager::GetDisassemblerCreateCallbackAtIndex(uint32_t idx) {362return GetDisassemblerInstances().GetCallbackAtIndex(idx);363}364365DisassemblerCreateInstance366PluginManager::GetDisassemblerCreateCallbackForPluginName(367llvm::StringRef name) {368return GetDisassemblerInstances().GetCallbackForName(name);369}370371#pragma mark DynamicLoader372373typedef PluginInstance<DynamicLoaderCreateInstance> DynamicLoaderInstance;374typedef PluginInstances<DynamicLoaderInstance> DynamicLoaderInstances;375376static DynamicLoaderInstances &GetDynamicLoaderInstances() {377static DynamicLoaderInstances g_instances;378return g_instances;379}380381bool PluginManager::RegisterPlugin(382llvm::StringRef name, llvm::StringRef description,383DynamicLoaderCreateInstance create_callback,384DebuggerInitializeCallback debugger_init_callback) {385return GetDynamicLoaderInstances().RegisterPlugin(386name, description, create_callback, debugger_init_callback);387}388389bool PluginManager::UnregisterPlugin(390DynamicLoaderCreateInstance create_callback) {391return GetDynamicLoaderInstances().UnregisterPlugin(create_callback);392}393394DynamicLoaderCreateInstance395PluginManager::GetDynamicLoaderCreateCallbackAtIndex(uint32_t idx) {396return GetDynamicLoaderInstances().GetCallbackAtIndex(idx);397}398399DynamicLoaderCreateInstance400PluginManager::GetDynamicLoaderCreateCallbackForPluginName(401llvm::StringRef name) {402return GetDynamicLoaderInstances().GetCallbackForName(name);403}404405#pragma mark JITLoader406407typedef PluginInstance<JITLoaderCreateInstance> JITLoaderInstance;408typedef PluginInstances<JITLoaderInstance> JITLoaderInstances;409410static JITLoaderInstances &GetJITLoaderInstances() {411static JITLoaderInstances g_instances;412return g_instances;413}414415bool PluginManager::RegisterPlugin(416llvm::StringRef name, llvm::StringRef description,417JITLoaderCreateInstance create_callback,418DebuggerInitializeCallback debugger_init_callback) {419return GetJITLoaderInstances().RegisterPlugin(420name, description, create_callback, debugger_init_callback);421}422423bool PluginManager::UnregisterPlugin(JITLoaderCreateInstance create_callback) {424return GetJITLoaderInstances().UnregisterPlugin(create_callback);425}426427JITLoaderCreateInstance428PluginManager::GetJITLoaderCreateCallbackAtIndex(uint32_t idx) {429return GetJITLoaderInstances().GetCallbackAtIndex(idx);430}431432#pragma mark EmulateInstruction433434typedef PluginInstance<EmulateInstructionCreateInstance>435EmulateInstructionInstance;436typedef PluginInstances<EmulateInstructionInstance> EmulateInstructionInstances;437438static EmulateInstructionInstances &GetEmulateInstructionInstances() {439static EmulateInstructionInstances g_instances;440return g_instances;441}442443bool PluginManager::RegisterPlugin(444llvm::StringRef name, llvm::StringRef description,445EmulateInstructionCreateInstance create_callback) {446return GetEmulateInstructionInstances().RegisterPlugin(name, description,447create_callback);448}449450bool PluginManager::UnregisterPlugin(451EmulateInstructionCreateInstance create_callback) {452return GetEmulateInstructionInstances().UnregisterPlugin(create_callback);453}454455EmulateInstructionCreateInstance456PluginManager::GetEmulateInstructionCreateCallbackAtIndex(uint32_t idx) {457return GetEmulateInstructionInstances().GetCallbackAtIndex(idx);458}459460EmulateInstructionCreateInstance461PluginManager::GetEmulateInstructionCreateCallbackForPluginName(462llvm::StringRef name) {463return GetEmulateInstructionInstances().GetCallbackForName(name);464}465466#pragma mark OperatingSystem467468typedef PluginInstance<OperatingSystemCreateInstance> OperatingSystemInstance;469typedef PluginInstances<OperatingSystemInstance> OperatingSystemInstances;470471static OperatingSystemInstances &GetOperatingSystemInstances() {472static OperatingSystemInstances g_instances;473return g_instances;474}475476bool PluginManager::RegisterPlugin(477llvm::StringRef name, llvm::StringRef description,478OperatingSystemCreateInstance create_callback,479DebuggerInitializeCallback debugger_init_callback) {480return GetOperatingSystemInstances().RegisterPlugin(481name, description, create_callback, debugger_init_callback);482}483484bool PluginManager::UnregisterPlugin(485OperatingSystemCreateInstance create_callback) {486return GetOperatingSystemInstances().UnregisterPlugin(create_callback);487}488489OperatingSystemCreateInstance490PluginManager::GetOperatingSystemCreateCallbackAtIndex(uint32_t idx) {491return GetOperatingSystemInstances().GetCallbackAtIndex(idx);492}493494OperatingSystemCreateInstance495PluginManager::GetOperatingSystemCreateCallbackForPluginName(496llvm::StringRef name) {497return GetOperatingSystemInstances().GetCallbackForName(name);498}499500#pragma mark Language501502typedef PluginInstance<LanguageCreateInstance> LanguageInstance;503typedef PluginInstances<LanguageInstance> LanguageInstances;504505static LanguageInstances &GetLanguageInstances() {506static LanguageInstances g_instances;507return g_instances;508}509510bool PluginManager::RegisterPlugin(llvm::StringRef name,511llvm::StringRef description,512LanguageCreateInstance create_callback) {513return GetLanguageInstances().RegisterPlugin(name, description,514create_callback);515}516517bool PluginManager::UnregisterPlugin(LanguageCreateInstance create_callback) {518return GetLanguageInstances().UnregisterPlugin(create_callback);519}520521LanguageCreateInstance522PluginManager::GetLanguageCreateCallbackAtIndex(uint32_t idx) {523return GetLanguageInstances().GetCallbackAtIndex(idx);524}525526#pragma mark LanguageRuntime527528struct LanguageRuntimeInstance529: public PluginInstance<LanguageRuntimeCreateInstance> {530LanguageRuntimeInstance(531llvm::StringRef name, llvm::StringRef description,532CallbackType create_callback,533DebuggerInitializeCallback debugger_init_callback,534LanguageRuntimeGetCommandObject command_callback,535LanguageRuntimeGetExceptionPrecondition precondition_callback)536: PluginInstance<LanguageRuntimeCreateInstance>(537name, description, create_callback, debugger_init_callback),538command_callback(command_callback),539precondition_callback(precondition_callback) {}540541LanguageRuntimeGetCommandObject command_callback;542LanguageRuntimeGetExceptionPrecondition precondition_callback;543};544545typedef PluginInstances<LanguageRuntimeInstance> LanguageRuntimeInstances;546547static LanguageRuntimeInstances &GetLanguageRuntimeInstances() {548static LanguageRuntimeInstances g_instances;549return g_instances;550}551552bool PluginManager::RegisterPlugin(553llvm::StringRef name, llvm::StringRef description,554LanguageRuntimeCreateInstance create_callback,555LanguageRuntimeGetCommandObject command_callback,556LanguageRuntimeGetExceptionPrecondition precondition_callback) {557return GetLanguageRuntimeInstances().RegisterPlugin(558name, description, create_callback, nullptr, command_callback,559precondition_callback);560}561562bool PluginManager::UnregisterPlugin(563LanguageRuntimeCreateInstance create_callback) {564return GetLanguageRuntimeInstances().UnregisterPlugin(create_callback);565}566567LanguageRuntimeCreateInstance568PluginManager::GetLanguageRuntimeCreateCallbackAtIndex(uint32_t idx) {569return GetLanguageRuntimeInstances().GetCallbackAtIndex(idx);570}571572LanguageRuntimeGetCommandObject573PluginManager::GetLanguageRuntimeGetCommandObjectAtIndex(uint32_t idx) {574const auto &instances = GetLanguageRuntimeInstances().GetInstances();575if (idx < instances.size())576return instances[idx].command_callback;577return nullptr;578}579580LanguageRuntimeGetExceptionPrecondition581PluginManager::GetLanguageRuntimeGetExceptionPreconditionAtIndex(uint32_t idx) {582const auto &instances = GetLanguageRuntimeInstances().GetInstances();583if (idx < instances.size())584return instances[idx].precondition_callback;585return nullptr;586}587588#pragma mark SystemRuntime589590typedef PluginInstance<SystemRuntimeCreateInstance> SystemRuntimeInstance;591typedef PluginInstances<SystemRuntimeInstance> SystemRuntimeInstances;592593static SystemRuntimeInstances &GetSystemRuntimeInstances() {594static SystemRuntimeInstances g_instances;595return g_instances;596}597598bool PluginManager::RegisterPlugin(599llvm::StringRef name, llvm::StringRef description,600SystemRuntimeCreateInstance create_callback) {601return GetSystemRuntimeInstances().RegisterPlugin(name, description,602create_callback);603}604605bool PluginManager::UnregisterPlugin(606SystemRuntimeCreateInstance create_callback) {607return GetSystemRuntimeInstances().UnregisterPlugin(create_callback);608}609610SystemRuntimeCreateInstance611PluginManager::GetSystemRuntimeCreateCallbackAtIndex(uint32_t idx) {612return GetSystemRuntimeInstances().GetCallbackAtIndex(idx);613}614615#pragma mark ObjectFile616617struct ObjectFileInstance : public PluginInstance<ObjectFileCreateInstance> {618ObjectFileInstance(619llvm::StringRef name, llvm::StringRef description,620CallbackType create_callback,621ObjectFileCreateMemoryInstance create_memory_callback,622ObjectFileGetModuleSpecifications get_module_specifications,623ObjectFileSaveCore save_core,624DebuggerInitializeCallback debugger_init_callback)625: PluginInstance<ObjectFileCreateInstance>(626name, description, create_callback, debugger_init_callback),627create_memory_callback(create_memory_callback),628get_module_specifications(get_module_specifications),629save_core(save_core) {}630631ObjectFileCreateMemoryInstance create_memory_callback;632ObjectFileGetModuleSpecifications get_module_specifications;633ObjectFileSaveCore save_core;634};635typedef PluginInstances<ObjectFileInstance> ObjectFileInstances;636637static ObjectFileInstances &GetObjectFileInstances() {638static ObjectFileInstances g_instances;639return g_instances;640}641642bool PluginManager::IsRegisteredObjectFilePluginName(llvm::StringRef name) {643if (name.empty())644return false;645646const auto &instances = GetObjectFileInstances().GetInstances();647for (auto &instance : instances) {648if (instance.name == name)649return true;650}651return false;652}653654bool PluginManager::RegisterPlugin(655llvm::StringRef name, llvm::StringRef description,656ObjectFileCreateInstance create_callback,657ObjectFileCreateMemoryInstance create_memory_callback,658ObjectFileGetModuleSpecifications get_module_specifications,659ObjectFileSaveCore save_core,660DebuggerInitializeCallback debugger_init_callback) {661return GetObjectFileInstances().RegisterPlugin(662name, description, create_callback, create_memory_callback,663get_module_specifications, save_core, debugger_init_callback);664}665666bool PluginManager::UnregisterPlugin(ObjectFileCreateInstance create_callback) {667return GetObjectFileInstances().UnregisterPlugin(create_callback);668}669670ObjectFileCreateInstance671PluginManager::GetObjectFileCreateCallbackAtIndex(uint32_t idx) {672return GetObjectFileInstances().GetCallbackAtIndex(idx);673}674675ObjectFileCreateMemoryInstance676PluginManager::GetObjectFileCreateMemoryCallbackAtIndex(uint32_t idx) {677const auto &instances = GetObjectFileInstances().GetInstances();678if (idx < instances.size())679return instances[idx].create_memory_callback;680return nullptr;681}682683ObjectFileGetModuleSpecifications684PluginManager::GetObjectFileGetModuleSpecificationsCallbackAtIndex(685uint32_t idx) {686const auto &instances = GetObjectFileInstances().GetInstances();687if (idx < instances.size())688return instances[idx].get_module_specifications;689return nullptr;690}691692ObjectFileCreateMemoryInstance693PluginManager::GetObjectFileCreateMemoryCallbackForPluginName(694llvm::StringRef name) {695const auto &instances = GetObjectFileInstances().GetInstances();696for (auto &instance : instances) {697if (instance.name == name)698return instance.create_memory_callback;699}700return nullptr;701}702703Status PluginManager::SaveCore(const lldb::ProcessSP &process_sp,704const lldb_private::SaveCoreOptions &options) {705Status error;706if (!options.GetOutputFile()) {707error.SetErrorString("No output file specified");708return error;709}710711if (!process_sp) {712error.SetErrorString("Invalid process");713return error;714}715716if (!options.GetPluginName().has_value()) {717// Try saving core directly from the process plugin first.718llvm::Expected<bool> ret =719process_sp->SaveCore(options.GetOutputFile()->GetPath());720if (!ret)721return Status(ret.takeError());722if (ret.get())723return Status();724}725726// Fall back to object plugins.727const auto &plugin_name = options.GetPluginName().value_or("");728auto &instances = GetObjectFileInstances().GetInstances();729for (auto &instance : instances) {730if (plugin_name.empty() || instance.name == plugin_name) {731if (instance.save_core && instance.save_core(process_sp, options, error))732return error;733}734}735736// Check to see if any of the object file plugins tried and failed to save.737// If none ran, set the error message.738if (error.Success())739error.SetErrorString(740"no ObjectFile plugins were able to save a core for this process");741return error;742}743744#pragma mark ObjectContainer745746struct ObjectContainerInstance747: public PluginInstance<ObjectContainerCreateInstance> {748ObjectContainerInstance(749llvm::StringRef name, llvm::StringRef description,750CallbackType create_callback,751ObjectContainerCreateMemoryInstance create_memory_callback,752ObjectFileGetModuleSpecifications get_module_specifications)753: PluginInstance<ObjectContainerCreateInstance>(name, description,754create_callback),755create_memory_callback(create_memory_callback),756get_module_specifications(get_module_specifications) {}757758ObjectContainerCreateMemoryInstance create_memory_callback;759ObjectFileGetModuleSpecifications get_module_specifications;760};761typedef PluginInstances<ObjectContainerInstance> ObjectContainerInstances;762763static ObjectContainerInstances &GetObjectContainerInstances() {764static ObjectContainerInstances g_instances;765return g_instances;766}767768bool PluginManager::RegisterPlugin(769llvm::StringRef name, llvm::StringRef description,770ObjectContainerCreateInstance create_callback,771ObjectFileGetModuleSpecifications get_module_specifications,772ObjectContainerCreateMemoryInstance create_memory_callback) {773return GetObjectContainerInstances().RegisterPlugin(774name, description, create_callback, create_memory_callback,775get_module_specifications);776}777778bool PluginManager::UnregisterPlugin(779ObjectContainerCreateInstance create_callback) {780return GetObjectContainerInstances().UnregisterPlugin(create_callback);781}782783ObjectContainerCreateInstance784PluginManager::GetObjectContainerCreateCallbackAtIndex(uint32_t idx) {785return GetObjectContainerInstances().GetCallbackAtIndex(idx);786}787788ObjectContainerCreateMemoryInstance789PluginManager::GetObjectContainerCreateMemoryCallbackAtIndex(uint32_t idx) {790const auto &instances = GetObjectContainerInstances().GetInstances();791if (idx < instances.size())792return instances[idx].create_memory_callback;793return nullptr;794}795796ObjectFileGetModuleSpecifications797PluginManager::GetObjectContainerGetModuleSpecificationsCallbackAtIndex(798uint32_t idx) {799const auto &instances = GetObjectContainerInstances().GetInstances();800if (idx < instances.size())801return instances[idx].get_module_specifications;802return nullptr;803}804805#pragma mark Platform806807typedef PluginInstance<PlatformCreateInstance> PlatformInstance;808typedef PluginInstances<PlatformInstance> PlatformInstances;809810static PlatformInstances &GetPlatformInstances() {811static PlatformInstances g_platform_instances;812return g_platform_instances;813}814815bool PluginManager::RegisterPlugin(816llvm::StringRef name, llvm::StringRef description,817PlatformCreateInstance create_callback,818DebuggerInitializeCallback debugger_init_callback) {819return GetPlatformInstances().RegisterPlugin(820name, description, create_callback, debugger_init_callback);821}822823bool PluginManager::UnregisterPlugin(PlatformCreateInstance create_callback) {824return GetPlatformInstances().UnregisterPlugin(create_callback);825}826827llvm::StringRef PluginManager::GetPlatformPluginNameAtIndex(uint32_t idx) {828return GetPlatformInstances().GetNameAtIndex(idx);829}830831llvm::StringRef832PluginManager::GetPlatformPluginDescriptionAtIndex(uint32_t idx) {833return GetPlatformInstances().GetDescriptionAtIndex(idx);834}835836PlatformCreateInstance837PluginManager::GetPlatformCreateCallbackAtIndex(uint32_t idx) {838return GetPlatformInstances().GetCallbackAtIndex(idx);839}840841PlatformCreateInstance842PluginManager::GetPlatformCreateCallbackForPluginName(llvm::StringRef name) {843return GetPlatformInstances().GetCallbackForName(name);844}845846void PluginManager::AutoCompletePlatformName(llvm::StringRef name,847CompletionRequest &request) {848for (const auto &instance : GetPlatformInstances().GetInstances()) {849if (instance.name.starts_with(name))850request.AddCompletion(instance.name);851}852}853854#pragma mark Process855856typedef PluginInstance<ProcessCreateInstance> ProcessInstance;857typedef PluginInstances<ProcessInstance> ProcessInstances;858859static ProcessInstances &GetProcessInstances() {860static ProcessInstances g_instances;861return g_instances;862}863864bool PluginManager::RegisterPlugin(865llvm::StringRef name, llvm::StringRef description,866ProcessCreateInstance create_callback,867DebuggerInitializeCallback debugger_init_callback) {868return GetProcessInstances().RegisterPlugin(869name, description, create_callback, debugger_init_callback);870}871872bool PluginManager::UnregisterPlugin(ProcessCreateInstance create_callback) {873return GetProcessInstances().UnregisterPlugin(create_callback);874}875876llvm::StringRef PluginManager::GetProcessPluginNameAtIndex(uint32_t idx) {877return GetProcessInstances().GetNameAtIndex(idx);878}879880llvm::StringRef PluginManager::GetProcessPluginDescriptionAtIndex(uint32_t idx) {881return GetProcessInstances().GetDescriptionAtIndex(idx);882}883884ProcessCreateInstance885PluginManager::GetProcessCreateCallbackAtIndex(uint32_t idx) {886return GetProcessInstances().GetCallbackAtIndex(idx);887}888889ProcessCreateInstance890PluginManager::GetProcessCreateCallbackForPluginName(llvm::StringRef name) {891return GetProcessInstances().GetCallbackForName(name);892}893894void PluginManager::AutoCompleteProcessName(llvm::StringRef name,895CompletionRequest &request) {896for (const auto &instance : GetProcessInstances().GetInstances()) {897if (instance.name.starts_with(name))898request.AddCompletion(instance.name, instance.description);899}900}901902#pragma mark RegisterTypeBuilder903904struct RegisterTypeBuilderInstance905: public PluginInstance<RegisterTypeBuilderCreateInstance> {906RegisterTypeBuilderInstance(llvm::StringRef name, llvm::StringRef description,907CallbackType create_callback)908: PluginInstance<RegisterTypeBuilderCreateInstance>(name, description,909create_callback) {}910};911912typedef PluginInstances<RegisterTypeBuilderInstance>913RegisterTypeBuilderInstances;914915static RegisterTypeBuilderInstances &GetRegisterTypeBuilderInstances() {916static RegisterTypeBuilderInstances g_instances;917return g_instances;918}919920bool PluginManager::RegisterPlugin(921llvm::StringRef name, llvm::StringRef description,922RegisterTypeBuilderCreateInstance create_callback) {923return GetRegisterTypeBuilderInstances().RegisterPlugin(name, description,924create_callback);925}926927bool PluginManager::UnregisterPlugin(928RegisterTypeBuilderCreateInstance create_callback) {929return GetRegisterTypeBuilderInstances().UnregisterPlugin(create_callback);930}931932lldb::RegisterTypeBuilderSP933PluginManager::GetRegisterTypeBuilder(Target &target) {934const auto &instances = GetRegisterTypeBuilderInstances().GetInstances();935// We assume that RegisterTypeBuilderClang is the only instance of this plugin936// type and is always present.937assert(instances.size());938return instances[0].create_callback(target);939}940941#pragma mark ScriptInterpreter942943struct ScriptInterpreterInstance944: public PluginInstance<ScriptInterpreterCreateInstance> {945ScriptInterpreterInstance(llvm::StringRef name, llvm::StringRef description,946CallbackType create_callback,947lldb::ScriptLanguage language)948: PluginInstance<ScriptInterpreterCreateInstance>(name, description,949create_callback),950language(language) {}951952lldb::ScriptLanguage language = lldb::eScriptLanguageNone;953};954955typedef PluginInstances<ScriptInterpreterInstance> ScriptInterpreterInstances;956957static ScriptInterpreterInstances &GetScriptInterpreterInstances() {958static ScriptInterpreterInstances g_instances;959return g_instances;960}961962bool PluginManager::RegisterPlugin(963llvm::StringRef name, llvm::StringRef description,964lldb::ScriptLanguage script_language,965ScriptInterpreterCreateInstance create_callback) {966return GetScriptInterpreterInstances().RegisterPlugin(967name, description, create_callback, script_language);968}969970bool PluginManager::UnregisterPlugin(971ScriptInterpreterCreateInstance create_callback) {972return GetScriptInterpreterInstances().UnregisterPlugin(create_callback);973}974975ScriptInterpreterCreateInstance976PluginManager::GetScriptInterpreterCreateCallbackAtIndex(uint32_t idx) {977return GetScriptInterpreterInstances().GetCallbackAtIndex(idx);978}979980lldb::ScriptInterpreterSP981PluginManager::GetScriptInterpreterForLanguage(lldb::ScriptLanguage script_lang,982Debugger &debugger) {983const auto &instances = GetScriptInterpreterInstances().GetInstances();984ScriptInterpreterCreateInstance none_instance = nullptr;985for (const auto &instance : instances) {986if (instance.language == lldb::eScriptLanguageNone)987none_instance = instance.create_callback;988989if (script_lang == instance.language)990return instance.create_callback(debugger);991}992993// If we didn't find one, return the ScriptInterpreter for the null language.994assert(none_instance != nullptr);995return none_instance(debugger);996}997998#pragma mark StructuredDataPlugin9991000struct StructuredDataPluginInstance1001: public PluginInstance<StructuredDataPluginCreateInstance> {1002StructuredDataPluginInstance(1003llvm::StringRef name, llvm::StringRef description,1004CallbackType create_callback,1005DebuggerInitializeCallback debugger_init_callback,1006StructuredDataFilterLaunchInfo filter_callback)1007: PluginInstance<StructuredDataPluginCreateInstance>(1008name, description, create_callback, debugger_init_callback),1009filter_callback(filter_callback) {}10101011StructuredDataFilterLaunchInfo filter_callback = nullptr;1012};10131014typedef PluginInstances<StructuredDataPluginInstance>1015StructuredDataPluginInstances;10161017static StructuredDataPluginInstances &GetStructuredDataPluginInstances() {1018static StructuredDataPluginInstances g_instances;1019return g_instances;1020}10211022bool PluginManager::RegisterPlugin(1023llvm::StringRef name, llvm::StringRef description,1024StructuredDataPluginCreateInstance create_callback,1025DebuggerInitializeCallback debugger_init_callback,1026StructuredDataFilterLaunchInfo filter_callback) {1027return GetStructuredDataPluginInstances().RegisterPlugin(1028name, description, create_callback, debugger_init_callback,1029filter_callback);1030}10311032bool PluginManager::UnregisterPlugin(1033StructuredDataPluginCreateInstance create_callback) {1034return GetStructuredDataPluginInstances().UnregisterPlugin(create_callback);1035}10361037StructuredDataPluginCreateInstance1038PluginManager::GetStructuredDataPluginCreateCallbackAtIndex(uint32_t idx) {1039return GetStructuredDataPluginInstances().GetCallbackAtIndex(idx);1040}10411042StructuredDataFilterLaunchInfo1043PluginManager::GetStructuredDataFilterCallbackAtIndex(1044uint32_t idx, bool &iteration_complete) {1045const auto &instances = GetStructuredDataPluginInstances().GetInstances();1046if (idx < instances.size()) {1047iteration_complete = false;1048return instances[idx].filter_callback;1049} else {1050iteration_complete = true;1051}1052return nullptr;1053}10541055#pragma mark SymbolFile10561057typedef PluginInstance<SymbolFileCreateInstance> SymbolFileInstance;1058typedef PluginInstances<SymbolFileInstance> SymbolFileInstances;10591060static SymbolFileInstances &GetSymbolFileInstances() {1061static SymbolFileInstances g_instances;1062return g_instances;1063}10641065bool PluginManager::RegisterPlugin(1066llvm::StringRef name, llvm::StringRef description,1067SymbolFileCreateInstance create_callback,1068DebuggerInitializeCallback debugger_init_callback) {1069return GetSymbolFileInstances().RegisterPlugin(1070name, description, create_callback, debugger_init_callback);1071}10721073bool PluginManager::UnregisterPlugin(SymbolFileCreateInstance create_callback) {1074return GetSymbolFileInstances().UnregisterPlugin(create_callback);1075}10761077SymbolFileCreateInstance1078PluginManager::GetSymbolFileCreateCallbackAtIndex(uint32_t idx) {1079return GetSymbolFileInstances().GetCallbackAtIndex(idx);1080}10811082#pragma mark SymbolVendor10831084typedef PluginInstance<SymbolVendorCreateInstance> SymbolVendorInstance;1085typedef PluginInstances<SymbolVendorInstance> SymbolVendorInstances;10861087static SymbolVendorInstances &GetSymbolVendorInstances() {1088static SymbolVendorInstances g_instances;1089return g_instances;1090}10911092bool PluginManager::RegisterPlugin(llvm::StringRef name,1093llvm::StringRef description,1094SymbolVendorCreateInstance create_callback) {1095return GetSymbolVendorInstances().RegisterPlugin(name, description,1096create_callback);1097}10981099bool PluginManager::UnregisterPlugin(1100SymbolVendorCreateInstance create_callback) {1101return GetSymbolVendorInstances().UnregisterPlugin(create_callback);1102}11031104SymbolVendorCreateInstance1105PluginManager::GetSymbolVendorCreateCallbackAtIndex(uint32_t idx) {1106return GetSymbolVendorInstances().GetCallbackAtIndex(idx);1107}11081109#pragma mark SymbolLocator11101111struct SymbolLocatorInstance1112: public PluginInstance<SymbolLocatorCreateInstance> {1113SymbolLocatorInstance(1114llvm::StringRef name, llvm::StringRef description,1115CallbackType create_callback,1116SymbolLocatorLocateExecutableObjectFile locate_executable_object_file,1117SymbolLocatorLocateExecutableSymbolFile locate_executable_symbol_file,1118SymbolLocatorDownloadObjectAndSymbolFile download_object_symbol_file,1119SymbolLocatorFindSymbolFileInBundle find_symbol_file_in_bundle,1120DebuggerInitializeCallback debugger_init_callback)1121: PluginInstance<SymbolLocatorCreateInstance>(1122name, description, create_callback, debugger_init_callback),1123locate_executable_object_file(locate_executable_object_file),1124locate_executable_symbol_file(locate_executable_symbol_file),1125download_object_symbol_file(download_object_symbol_file),1126find_symbol_file_in_bundle(find_symbol_file_in_bundle) {}11271128SymbolLocatorLocateExecutableObjectFile locate_executable_object_file;1129SymbolLocatorLocateExecutableSymbolFile locate_executable_symbol_file;1130SymbolLocatorDownloadObjectAndSymbolFile download_object_symbol_file;1131SymbolLocatorFindSymbolFileInBundle find_symbol_file_in_bundle;1132};1133typedef PluginInstances<SymbolLocatorInstance> SymbolLocatorInstances;11341135static SymbolLocatorInstances &GetSymbolLocatorInstances() {1136static SymbolLocatorInstances g_instances;1137return g_instances;1138}11391140bool PluginManager::RegisterPlugin(1141llvm::StringRef name, llvm::StringRef description,1142SymbolLocatorCreateInstance create_callback,1143SymbolLocatorLocateExecutableObjectFile locate_executable_object_file,1144SymbolLocatorLocateExecutableSymbolFile locate_executable_symbol_file,1145SymbolLocatorDownloadObjectAndSymbolFile download_object_symbol_file,1146SymbolLocatorFindSymbolFileInBundle find_symbol_file_in_bundle,1147DebuggerInitializeCallback debugger_init_callback) {1148return GetSymbolLocatorInstances().RegisterPlugin(1149name, description, create_callback, locate_executable_object_file,1150locate_executable_symbol_file, download_object_symbol_file,1151find_symbol_file_in_bundle, debugger_init_callback);1152}11531154bool PluginManager::UnregisterPlugin(1155SymbolLocatorCreateInstance create_callback) {1156return GetSymbolLocatorInstances().UnregisterPlugin(create_callback);1157}11581159SymbolLocatorCreateInstance1160PluginManager::GetSymbolLocatorCreateCallbackAtIndex(uint32_t idx) {1161return GetSymbolLocatorInstances().GetCallbackAtIndex(idx);1162}11631164ModuleSpec1165PluginManager::LocateExecutableObjectFile(const ModuleSpec &module_spec) {1166auto &instances = GetSymbolLocatorInstances().GetInstances();1167for (auto &instance : instances) {1168if (instance.locate_executable_object_file) {1169std::optional<ModuleSpec> result =1170instance.locate_executable_object_file(module_spec);1171if (result)1172return *result;1173}1174}1175return {};1176}11771178FileSpec PluginManager::LocateExecutableSymbolFile(1179const ModuleSpec &module_spec, const FileSpecList &default_search_paths) {1180auto &instances = GetSymbolLocatorInstances().GetInstances();1181for (auto &instance : instances) {1182if (instance.locate_executable_symbol_file) {1183std::optional<FileSpec> result = instance.locate_executable_symbol_file(1184module_spec, default_search_paths);1185if (result)1186return *result;1187}1188}1189return {};1190}11911192bool PluginManager::DownloadObjectAndSymbolFile(ModuleSpec &module_spec,1193Status &error,1194bool force_lookup,1195bool copy_executable) {1196auto &instances = GetSymbolLocatorInstances().GetInstances();1197for (auto &instance : instances) {1198if (instance.download_object_symbol_file) {1199if (instance.download_object_symbol_file(module_spec, error, force_lookup,1200copy_executable))1201return true;1202}1203}1204return false;1205}12061207FileSpec PluginManager::FindSymbolFileInBundle(const FileSpec &symfile_bundle,1208const UUID *uuid,1209const ArchSpec *arch) {1210auto &instances = GetSymbolLocatorInstances().GetInstances();1211for (auto &instance : instances) {1212if (instance.find_symbol_file_in_bundle) {1213std::optional<FileSpec> result =1214instance.find_symbol_file_in_bundle(symfile_bundle, uuid, arch);1215if (result)1216return *result;1217}1218}1219return {};1220}12211222#pragma mark Trace12231224struct TraceInstance1225: public PluginInstance<TraceCreateInstanceFromBundle> {1226TraceInstance(1227llvm::StringRef name, llvm::StringRef description,1228CallbackType create_callback_from_bundle,1229TraceCreateInstanceForLiveProcess create_callback_for_live_process,1230llvm::StringRef schema, DebuggerInitializeCallback debugger_init_callback)1231: PluginInstance<TraceCreateInstanceFromBundle>(1232name, description, create_callback_from_bundle,1233debugger_init_callback),1234schema(schema),1235create_callback_for_live_process(create_callback_for_live_process) {}12361237llvm::StringRef schema;1238TraceCreateInstanceForLiveProcess create_callback_for_live_process;1239};12401241typedef PluginInstances<TraceInstance> TraceInstances;12421243static TraceInstances &GetTracePluginInstances() {1244static TraceInstances g_instances;1245return g_instances;1246}12471248bool PluginManager::RegisterPlugin(1249llvm::StringRef name, llvm::StringRef description,1250TraceCreateInstanceFromBundle create_callback_from_bundle,1251TraceCreateInstanceForLiveProcess create_callback_for_live_process,1252llvm::StringRef schema, DebuggerInitializeCallback debugger_init_callback) {1253return GetTracePluginInstances().RegisterPlugin(1254name, description, create_callback_from_bundle,1255create_callback_for_live_process, schema, debugger_init_callback);1256}12571258bool PluginManager::UnregisterPlugin(1259TraceCreateInstanceFromBundle create_callback_from_bundle) {1260return GetTracePluginInstances().UnregisterPlugin(1261create_callback_from_bundle);1262}12631264TraceCreateInstanceFromBundle1265PluginManager::GetTraceCreateCallback(llvm::StringRef plugin_name) {1266return GetTracePluginInstances().GetCallbackForName(plugin_name);1267}12681269TraceCreateInstanceForLiveProcess1270PluginManager::GetTraceCreateCallbackForLiveProcess(llvm::StringRef plugin_name) {1271for (const TraceInstance &instance : GetTracePluginInstances().GetInstances())1272if (instance.name == plugin_name)1273return instance.create_callback_for_live_process;1274return nullptr;1275}12761277llvm::StringRef PluginManager::GetTraceSchema(llvm::StringRef plugin_name) {1278for (const TraceInstance &instance : GetTracePluginInstances().GetInstances())1279if (instance.name == plugin_name)1280return instance.schema;1281return llvm::StringRef();1282}12831284llvm::StringRef PluginManager::GetTraceSchema(size_t index) {1285if (TraceInstance *instance =1286GetTracePluginInstances().GetInstanceAtIndex(index))1287return instance->schema;1288return llvm::StringRef();1289}12901291#pragma mark TraceExporter12921293struct TraceExporterInstance1294: public PluginInstance<TraceExporterCreateInstance> {1295TraceExporterInstance(1296llvm::StringRef name, llvm::StringRef description,1297TraceExporterCreateInstance create_instance,1298ThreadTraceExportCommandCreator create_thread_trace_export_command)1299: PluginInstance<TraceExporterCreateInstance>(name, description,1300create_instance),1301create_thread_trace_export_command(create_thread_trace_export_command) {1302}13031304ThreadTraceExportCommandCreator create_thread_trace_export_command;1305};13061307typedef PluginInstances<TraceExporterInstance> TraceExporterInstances;13081309static TraceExporterInstances &GetTraceExporterInstances() {1310static TraceExporterInstances g_instances;1311return g_instances;1312}13131314bool PluginManager::RegisterPlugin(1315llvm::StringRef name, llvm::StringRef description,1316TraceExporterCreateInstance create_callback,1317ThreadTraceExportCommandCreator create_thread_trace_export_command) {1318return GetTraceExporterInstances().RegisterPlugin(1319name, description, create_callback, create_thread_trace_export_command);1320}13211322TraceExporterCreateInstance1323PluginManager::GetTraceExporterCreateCallback(llvm::StringRef plugin_name) {1324return GetTraceExporterInstances().GetCallbackForName(plugin_name);1325}13261327bool PluginManager::UnregisterPlugin(1328TraceExporterCreateInstance create_callback) {1329return GetTraceExporterInstances().UnregisterPlugin(create_callback);1330}13311332ThreadTraceExportCommandCreator1333PluginManager::GetThreadTraceExportCommandCreatorAtIndex(uint32_t index) {1334if (TraceExporterInstance *instance =1335GetTraceExporterInstances().GetInstanceAtIndex(index))1336return instance->create_thread_trace_export_command;1337return nullptr;1338}13391340llvm::StringRef1341PluginManager::GetTraceExporterPluginNameAtIndex(uint32_t index) {1342return GetTraceExporterInstances().GetNameAtIndex(index);1343}13441345#pragma mark UnwindAssembly13461347typedef PluginInstance<UnwindAssemblyCreateInstance> UnwindAssemblyInstance;1348typedef PluginInstances<UnwindAssemblyInstance> UnwindAssemblyInstances;13491350static UnwindAssemblyInstances &GetUnwindAssemblyInstances() {1351static UnwindAssemblyInstances g_instances;1352return g_instances;1353}13541355bool PluginManager::RegisterPlugin(1356llvm::StringRef name, llvm::StringRef description,1357UnwindAssemblyCreateInstance create_callback) {1358return GetUnwindAssemblyInstances().RegisterPlugin(name, description,1359create_callback);1360}13611362bool PluginManager::UnregisterPlugin(1363UnwindAssemblyCreateInstance create_callback) {1364return GetUnwindAssemblyInstances().UnregisterPlugin(create_callback);1365}13661367UnwindAssemblyCreateInstance1368PluginManager::GetUnwindAssemblyCreateCallbackAtIndex(uint32_t idx) {1369return GetUnwindAssemblyInstances().GetCallbackAtIndex(idx);1370}13711372#pragma mark MemoryHistory13731374typedef PluginInstance<MemoryHistoryCreateInstance> MemoryHistoryInstance;1375typedef PluginInstances<MemoryHistoryInstance> MemoryHistoryInstances;13761377static MemoryHistoryInstances &GetMemoryHistoryInstances() {1378static MemoryHistoryInstances g_instances;1379return g_instances;1380}13811382bool PluginManager::RegisterPlugin(1383llvm::StringRef name, llvm::StringRef description,1384MemoryHistoryCreateInstance create_callback) {1385return GetMemoryHistoryInstances().RegisterPlugin(name, description,1386create_callback);1387}13881389bool PluginManager::UnregisterPlugin(1390MemoryHistoryCreateInstance create_callback) {1391return GetMemoryHistoryInstances().UnregisterPlugin(create_callback);1392}13931394MemoryHistoryCreateInstance1395PluginManager::GetMemoryHistoryCreateCallbackAtIndex(uint32_t idx) {1396return GetMemoryHistoryInstances().GetCallbackAtIndex(idx);1397}13981399#pragma mark InstrumentationRuntime14001401struct InstrumentationRuntimeInstance1402: public PluginInstance<InstrumentationRuntimeCreateInstance> {1403InstrumentationRuntimeInstance(1404llvm::StringRef name, llvm::StringRef description,1405CallbackType create_callback,1406InstrumentationRuntimeGetType get_type_callback)1407: PluginInstance<InstrumentationRuntimeCreateInstance>(name, description,1408create_callback),1409get_type_callback(get_type_callback) {}14101411InstrumentationRuntimeGetType get_type_callback = nullptr;1412};14131414typedef PluginInstances<InstrumentationRuntimeInstance>1415InstrumentationRuntimeInstances;14161417static InstrumentationRuntimeInstances &GetInstrumentationRuntimeInstances() {1418static InstrumentationRuntimeInstances g_instances;1419return g_instances;1420}14211422bool PluginManager::RegisterPlugin(1423llvm::StringRef name, llvm::StringRef description,1424InstrumentationRuntimeCreateInstance create_callback,1425InstrumentationRuntimeGetType get_type_callback) {1426return GetInstrumentationRuntimeInstances().RegisterPlugin(1427name, description, create_callback, get_type_callback);1428}14291430bool PluginManager::UnregisterPlugin(1431InstrumentationRuntimeCreateInstance create_callback) {1432return GetInstrumentationRuntimeInstances().UnregisterPlugin(create_callback);1433}14341435InstrumentationRuntimeGetType1436PluginManager::GetInstrumentationRuntimeGetTypeCallbackAtIndex(uint32_t idx) {1437const auto &instances = GetInstrumentationRuntimeInstances().GetInstances();1438if (idx < instances.size())1439return instances[idx].get_type_callback;1440return nullptr;1441}14421443InstrumentationRuntimeCreateInstance1444PluginManager::GetInstrumentationRuntimeCreateCallbackAtIndex(uint32_t idx) {1445return GetInstrumentationRuntimeInstances().GetCallbackAtIndex(idx);1446}14471448#pragma mark TypeSystem14491450struct TypeSystemInstance : public PluginInstance<TypeSystemCreateInstance> {1451TypeSystemInstance(llvm::StringRef name, llvm::StringRef description,1452CallbackType create_callback,1453LanguageSet supported_languages_for_types,1454LanguageSet supported_languages_for_expressions)1455: PluginInstance<TypeSystemCreateInstance>(name, description,1456create_callback),1457supported_languages_for_types(supported_languages_for_types),1458supported_languages_for_expressions(1459supported_languages_for_expressions) {}14601461LanguageSet supported_languages_for_types;1462LanguageSet supported_languages_for_expressions;1463};14641465typedef PluginInstances<TypeSystemInstance> TypeSystemInstances;14661467static TypeSystemInstances &GetTypeSystemInstances() {1468static TypeSystemInstances g_instances;1469return g_instances;1470}14711472bool PluginManager::RegisterPlugin(1473llvm::StringRef name, llvm::StringRef description,1474TypeSystemCreateInstance create_callback,1475LanguageSet supported_languages_for_types,1476LanguageSet supported_languages_for_expressions) {1477return GetTypeSystemInstances().RegisterPlugin(1478name, description, create_callback, supported_languages_for_types,1479supported_languages_for_expressions);1480}14811482bool PluginManager::UnregisterPlugin(TypeSystemCreateInstance create_callback) {1483return GetTypeSystemInstances().UnregisterPlugin(create_callback);1484}14851486TypeSystemCreateInstance1487PluginManager::GetTypeSystemCreateCallbackAtIndex(uint32_t idx) {1488return GetTypeSystemInstances().GetCallbackAtIndex(idx);1489}14901491LanguageSet PluginManager::GetAllTypeSystemSupportedLanguagesForTypes() {1492const auto &instances = GetTypeSystemInstances().GetInstances();1493LanguageSet all;1494for (unsigned i = 0; i < instances.size(); ++i)1495all.bitvector |= instances[i].supported_languages_for_types.bitvector;1496return all;1497}14981499LanguageSet PluginManager::GetAllTypeSystemSupportedLanguagesForExpressions() {1500const auto &instances = GetTypeSystemInstances().GetInstances();1501LanguageSet all;1502for (unsigned i = 0; i < instances.size(); ++i)1503all.bitvector |= instances[i].supported_languages_for_expressions.bitvector;1504return all;1505}15061507#pragma mark REPL15081509struct REPLInstance : public PluginInstance<REPLCreateInstance> {1510REPLInstance(llvm::StringRef name, llvm::StringRef description,1511CallbackType create_callback, LanguageSet supported_languages)1512: PluginInstance<REPLCreateInstance>(name, description, create_callback),1513supported_languages(supported_languages) {}15141515LanguageSet supported_languages;1516};15171518typedef PluginInstances<REPLInstance> REPLInstances;15191520static REPLInstances &GetREPLInstances() {1521static REPLInstances g_instances;1522return g_instances;1523}15241525bool PluginManager::RegisterPlugin(llvm::StringRef name, llvm::StringRef description,1526REPLCreateInstance create_callback,1527LanguageSet supported_languages) {1528return GetREPLInstances().RegisterPlugin(name, description, create_callback,1529supported_languages);1530}15311532bool PluginManager::UnregisterPlugin(REPLCreateInstance create_callback) {1533return GetREPLInstances().UnregisterPlugin(create_callback);1534}15351536REPLCreateInstance PluginManager::GetREPLCreateCallbackAtIndex(uint32_t idx) {1537return GetREPLInstances().GetCallbackAtIndex(idx);1538}15391540LanguageSet PluginManager::GetREPLSupportedLanguagesAtIndex(uint32_t idx) {1541const auto &instances = GetREPLInstances().GetInstances();1542return idx < instances.size() ? instances[idx].supported_languages1543: LanguageSet();1544}15451546LanguageSet PluginManager::GetREPLAllTypeSystemSupportedLanguages() {1547const auto &instances = GetREPLInstances().GetInstances();1548LanguageSet all;1549for (unsigned i = 0; i < instances.size(); ++i)1550all.bitvector |= instances[i].supported_languages.bitvector;1551return all;1552}15531554#pragma mark PluginManager15551556void PluginManager::DebuggerInitialize(Debugger &debugger) {1557GetDynamicLoaderInstances().PerformDebuggerCallback(debugger);1558GetJITLoaderInstances().PerformDebuggerCallback(debugger);1559GetObjectFileInstances().PerformDebuggerCallback(debugger);1560GetPlatformInstances().PerformDebuggerCallback(debugger);1561GetProcessInstances().PerformDebuggerCallback(debugger);1562GetSymbolFileInstances().PerformDebuggerCallback(debugger);1563GetSymbolLocatorInstances().PerformDebuggerCallback(debugger);1564GetOperatingSystemInstances().PerformDebuggerCallback(debugger);1565GetStructuredDataPluginInstances().PerformDebuggerCallback(debugger);1566GetTracePluginInstances().PerformDebuggerCallback(debugger);1567}15681569// This is the preferred new way to register plugin specific settings. e.g.1570// This will put a plugin's settings under e.g.1571// "plugin.<plugin_type_name>.<plugin_type_desc>.SETTINGNAME".1572static lldb::OptionValuePropertiesSP1573GetDebuggerPropertyForPlugins(Debugger &debugger, llvm::StringRef plugin_type_name,1574llvm::StringRef plugin_type_desc,1575bool can_create) {1576lldb::OptionValuePropertiesSP parent_properties_sp(1577debugger.GetValueProperties());1578if (parent_properties_sp) {1579static constexpr llvm::StringLiteral g_property_name("plugin");15801581OptionValuePropertiesSP plugin_properties_sp =1582parent_properties_sp->GetSubProperty(nullptr, g_property_name);1583if (!plugin_properties_sp && can_create) {1584plugin_properties_sp =1585std::make_shared<OptionValueProperties>(g_property_name);1586parent_properties_sp->AppendProperty(g_property_name,1587"Settings specify to plugins.", true,1588plugin_properties_sp);1589}15901591if (plugin_properties_sp) {1592lldb::OptionValuePropertiesSP plugin_type_properties_sp =1593plugin_properties_sp->GetSubProperty(nullptr, plugin_type_name);1594if (!plugin_type_properties_sp && can_create) {1595plugin_type_properties_sp =1596std::make_shared<OptionValueProperties>(plugin_type_name);1597plugin_properties_sp->AppendProperty(plugin_type_name, plugin_type_desc,1598true, plugin_type_properties_sp);1599}1600return plugin_type_properties_sp;1601}1602}1603return lldb::OptionValuePropertiesSP();1604}16051606// This is deprecated way to register plugin specific settings. e.g.1607// "<plugin_type_name>.plugin.<plugin_type_desc>.SETTINGNAME" and Platform1608// generic settings would be under "platform.SETTINGNAME".1609static lldb::OptionValuePropertiesSP GetDebuggerPropertyForPluginsOldStyle(1610Debugger &debugger, llvm::StringRef plugin_type_name,1611llvm::StringRef plugin_type_desc, bool can_create) {1612static constexpr llvm::StringLiteral g_property_name("plugin");1613lldb::OptionValuePropertiesSP parent_properties_sp(1614debugger.GetValueProperties());1615if (parent_properties_sp) {1616OptionValuePropertiesSP plugin_properties_sp =1617parent_properties_sp->GetSubProperty(nullptr, plugin_type_name);1618if (!plugin_properties_sp && can_create) {1619plugin_properties_sp =1620std::make_shared<OptionValueProperties>(plugin_type_name);1621parent_properties_sp->AppendProperty(plugin_type_name, plugin_type_desc,1622true, plugin_properties_sp);1623}16241625if (plugin_properties_sp) {1626lldb::OptionValuePropertiesSP plugin_type_properties_sp =1627plugin_properties_sp->GetSubProperty(nullptr, g_property_name);1628if (!plugin_type_properties_sp && can_create) {1629plugin_type_properties_sp =1630std::make_shared<OptionValueProperties>(g_property_name);1631plugin_properties_sp->AppendProperty(g_property_name,1632"Settings specific to plugins",1633true, plugin_type_properties_sp);1634}1635return plugin_type_properties_sp;1636}1637}1638return lldb::OptionValuePropertiesSP();1639}16401641namespace {16421643typedef lldb::OptionValuePropertiesSP1644GetDebuggerPropertyForPluginsPtr(Debugger &, llvm::StringRef, llvm::StringRef,1645bool can_create);1646}16471648static lldb::OptionValuePropertiesSP1649GetSettingForPlugin(Debugger &debugger, llvm::StringRef setting_name,1650llvm::StringRef plugin_type_name,1651GetDebuggerPropertyForPluginsPtr get_debugger_property =1652GetDebuggerPropertyForPlugins) {1653lldb::OptionValuePropertiesSP properties_sp;1654lldb::OptionValuePropertiesSP plugin_type_properties_sp(get_debugger_property(1655debugger, plugin_type_name,1656"", // not creating to so we don't need the description1657false));1658if (plugin_type_properties_sp)1659properties_sp =1660plugin_type_properties_sp->GetSubProperty(nullptr, setting_name);1661return properties_sp;1662}16631664static bool1665CreateSettingForPlugin(Debugger &debugger, llvm::StringRef plugin_type_name,1666llvm::StringRef plugin_type_desc,1667const lldb::OptionValuePropertiesSP &properties_sp,1668llvm::StringRef description, bool is_global_property,1669GetDebuggerPropertyForPluginsPtr get_debugger_property =1670GetDebuggerPropertyForPlugins) {1671if (properties_sp) {1672lldb::OptionValuePropertiesSP plugin_type_properties_sp(1673get_debugger_property(debugger, plugin_type_name, plugin_type_desc,1674true));1675if (plugin_type_properties_sp) {1676plugin_type_properties_sp->AppendProperty(properties_sp->GetName(),1677description, is_global_property,1678properties_sp);1679return true;1680}1681}1682return false;1683}16841685static constexpr llvm::StringLiteral kDynamicLoaderPluginName("dynamic-loader");1686static constexpr llvm::StringLiteral kPlatformPluginName("platform");1687static constexpr llvm::StringLiteral kProcessPluginName("process");1688static constexpr llvm::StringLiteral kTracePluginName("trace");1689static constexpr llvm::StringLiteral kObjectFilePluginName("object-file");1690static constexpr llvm::StringLiteral kSymbolFilePluginName("symbol-file");1691static constexpr llvm::StringLiteral kSymbolLocatorPluginName("symbol-locator");1692static constexpr llvm::StringLiteral kJITLoaderPluginName("jit-loader");1693static constexpr llvm::StringLiteral1694kStructuredDataPluginName("structured-data");16951696lldb::OptionValuePropertiesSP1697PluginManager::GetSettingForDynamicLoaderPlugin(Debugger &debugger,1698llvm::StringRef setting_name) {1699return GetSettingForPlugin(debugger, setting_name, kDynamicLoaderPluginName);1700}17011702bool PluginManager::CreateSettingForDynamicLoaderPlugin(1703Debugger &debugger, const lldb::OptionValuePropertiesSP &properties_sp,1704llvm::StringRef description, bool is_global_property) {1705return CreateSettingForPlugin(debugger, kDynamicLoaderPluginName,1706"Settings for dynamic loader plug-ins",1707properties_sp, description, is_global_property);1708}17091710lldb::OptionValuePropertiesSP1711PluginManager::GetSettingForPlatformPlugin(Debugger &debugger,1712llvm::StringRef setting_name) {1713return GetSettingForPlugin(debugger, setting_name, kPlatformPluginName,1714GetDebuggerPropertyForPluginsOldStyle);1715}17161717bool PluginManager::CreateSettingForPlatformPlugin(1718Debugger &debugger, const lldb::OptionValuePropertiesSP &properties_sp,1719llvm::StringRef description, bool is_global_property) {1720return CreateSettingForPlugin(debugger, kPlatformPluginName,1721"Settings for platform plug-ins", properties_sp,1722description, is_global_property,1723GetDebuggerPropertyForPluginsOldStyle);1724}17251726lldb::OptionValuePropertiesSP1727PluginManager::GetSettingForProcessPlugin(Debugger &debugger,1728llvm::StringRef setting_name) {1729return GetSettingForPlugin(debugger, setting_name, kProcessPluginName);1730}17311732bool PluginManager::CreateSettingForProcessPlugin(1733Debugger &debugger, const lldb::OptionValuePropertiesSP &properties_sp,1734llvm::StringRef description, bool is_global_property) {1735return CreateSettingForPlugin(debugger, kProcessPluginName,1736"Settings for process plug-ins", properties_sp,1737description, is_global_property);1738}17391740lldb::OptionValuePropertiesSP1741PluginManager::GetSettingForSymbolLocatorPlugin(Debugger &debugger,1742llvm::StringRef setting_name) {1743return GetSettingForPlugin(debugger, setting_name, kSymbolLocatorPluginName);1744}17451746bool PluginManager::CreateSettingForSymbolLocatorPlugin(1747Debugger &debugger, const lldb::OptionValuePropertiesSP &properties_sp,1748llvm::StringRef description, bool is_global_property) {1749return CreateSettingForPlugin(debugger, kSymbolLocatorPluginName,1750"Settings for symbol locator plug-ins",1751properties_sp, description, is_global_property);1752}17531754bool PluginManager::CreateSettingForTracePlugin(1755Debugger &debugger, const lldb::OptionValuePropertiesSP &properties_sp,1756llvm::StringRef description, bool is_global_property) {1757return CreateSettingForPlugin(debugger, kTracePluginName,1758"Settings for trace plug-ins", properties_sp,1759description, is_global_property);1760}17611762lldb::OptionValuePropertiesSP1763PluginManager::GetSettingForObjectFilePlugin(Debugger &debugger,1764llvm::StringRef setting_name) {1765return GetSettingForPlugin(debugger, setting_name, kObjectFilePluginName);1766}17671768bool PluginManager::CreateSettingForObjectFilePlugin(1769Debugger &debugger, const lldb::OptionValuePropertiesSP &properties_sp,1770llvm::StringRef description, bool is_global_property) {1771return CreateSettingForPlugin(debugger, kObjectFilePluginName,1772"Settings for object file plug-ins",1773properties_sp, description, is_global_property);1774}17751776lldb::OptionValuePropertiesSP1777PluginManager::GetSettingForSymbolFilePlugin(Debugger &debugger,1778llvm::StringRef setting_name) {1779return GetSettingForPlugin(debugger, setting_name, kSymbolFilePluginName);1780}17811782bool PluginManager::CreateSettingForSymbolFilePlugin(1783Debugger &debugger, const lldb::OptionValuePropertiesSP &properties_sp,1784llvm::StringRef description, bool is_global_property) {1785return CreateSettingForPlugin(debugger, kSymbolFilePluginName,1786"Settings for symbol file plug-ins",1787properties_sp, description, is_global_property);1788}17891790lldb::OptionValuePropertiesSP1791PluginManager::GetSettingForJITLoaderPlugin(Debugger &debugger,1792llvm::StringRef setting_name) {1793return GetSettingForPlugin(debugger, setting_name, kJITLoaderPluginName);1794}17951796bool PluginManager::CreateSettingForJITLoaderPlugin(1797Debugger &debugger, const lldb::OptionValuePropertiesSP &properties_sp,1798llvm::StringRef description, bool is_global_property) {1799return CreateSettingForPlugin(debugger, kJITLoaderPluginName,1800"Settings for JIT loader plug-ins",1801properties_sp, description, is_global_property);1802}18031804static const char *kOperatingSystemPluginName("os");18051806lldb::OptionValuePropertiesSP1807PluginManager::GetSettingForOperatingSystemPlugin(Debugger &debugger,1808llvm::StringRef setting_name) {1809lldb::OptionValuePropertiesSP properties_sp;1810lldb::OptionValuePropertiesSP plugin_type_properties_sp(1811GetDebuggerPropertyForPlugins(1812debugger, kOperatingSystemPluginName,1813"", // not creating to so we don't need the description1814false));1815if (plugin_type_properties_sp)1816properties_sp =1817plugin_type_properties_sp->GetSubProperty(nullptr, setting_name);1818return properties_sp;1819}18201821bool PluginManager::CreateSettingForOperatingSystemPlugin(1822Debugger &debugger, const lldb::OptionValuePropertiesSP &properties_sp,1823llvm::StringRef description, bool is_global_property) {1824if (properties_sp) {1825lldb::OptionValuePropertiesSP plugin_type_properties_sp(1826GetDebuggerPropertyForPlugins(debugger, kOperatingSystemPluginName,1827"Settings for operating system plug-ins",1828true));1829if (plugin_type_properties_sp) {1830plugin_type_properties_sp->AppendProperty(properties_sp->GetName(),1831description, is_global_property,1832properties_sp);1833return true;1834}1835}1836return false;1837}18381839lldb::OptionValuePropertiesSP1840PluginManager::GetSettingForStructuredDataPlugin(Debugger &debugger,1841llvm::StringRef setting_name) {1842return GetSettingForPlugin(debugger, setting_name, kStructuredDataPluginName);1843}18441845bool PluginManager::CreateSettingForStructuredDataPlugin(1846Debugger &debugger, const lldb::OptionValuePropertiesSP &properties_sp,1847llvm::StringRef description, bool is_global_property) {1848return CreateSettingForPlugin(debugger, kStructuredDataPluginName,1849"Settings for structured data plug-ins",1850properties_sp, description, is_global_property);1851}185218531854