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