blob: cf940dd70349461968a93099d0e0d45e8d5de168 [file] [log] [blame]
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001//===-- PluginManager.cpp ---------------------------------------*- C++ -*-===//
2//
Chandler Carruth2946cd72019-01-19 08:50:56 +00003// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
Chris Lattner30fdc8d2010-06-08 16:52:24 +00006//
7//===----------------------------------------------------------------------===//
8
9#include "lldb/Core/PluginManager.h"
10
Greg Claytone8cd0c92012-10-19 18:02:49 +000011#include "lldb/Core/Debugger.h"
Jonas Devlieghere35e4c842018-11-01 00:33:27 +000012#include "lldb/Host/FileSystem.h"
Zachary Turner42ff0ad2014-08-21 17:29:12 +000013#include "lldb/Host/HostInfo.h"
Greg Claytone8cd0c92012-10-19 18:02:49 +000014#include "lldb/Interpreter/OptionValueProperties.h"
Jonas Devlieghere672d2c12018-11-11 23:16:43 +000015#include "lldb/Utility/ConstString.h"
Zachary Turner5713a052017-03-22 18:40:07 +000016#include "lldb/Utility/FileSpec.h"
Zachary Turner97206d52017-05-12 04:51:55 +000017#include "lldb/Utility/Status.h"
Jonas Devlieghere672d2c12018-11-11 23:16:43 +000018#include "lldb/Utility/StringList.h"
Zachary Turner2f3df612017-04-06 21:28:29 +000019
Nico Weberb1cb0b792018-04-10 13:33:45 +000020#if defined(_WIN32)
Jonas Devlieghere672d2c12018-11-11 23:16:43 +000021#include "lldb/Host/windows/PosixApi.h"
Zachary Turner2f3df612017-04-06 21:28:29 +000022#endif
23
24#include "llvm/ADT/StringRef.h"
25#include "llvm/Support/DynamicLibrary.h"
Jonas Devlieghere672d2c12018-11-11 23:16:43 +000026#include "llvm/Support/FileSystem.h"
27#include "llvm/Support/raw_ostream.h"
Zachary Turner2f3df612017-04-06 21:28:29 +000028
Jonas Devlieghere672d2c12018-11-11 23:16:43 +000029#include <map>
30#include <memory>
Zachary Turner2f3df612017-04-06 21:28:29 +000031#include <mutex>
32#include <string>
Jonas Devlieghere672d2c12018-11-11 23:16:43 +000033#include <utility>
Zachary Turner2f3df612017-04-06 21:28:29 +000034#include <vector>
35
Jonas Devlieghere672d2c12018-11-11 23:16:43 +000036#include <assert.h>
Zachary Turner2f3df612017-04-06 21:28:29 +000037
38namespace lldb_private {
39class CommandInterpreter;
40}
Greg Clayton4272cc72011-02-02 02:24:04 +000041
42using namespace lldb;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000043using namespace lldb_private;
44
Kate Stoneb9c1b512016-09-06 20:57:50 +000045enum PluginAction {
46 ePluginRegisterInstance,
47 ePluginUnregisterInstance,
48 ePluginGetInstanceAtIndex
Chris Lattner30fdc8d2010-06-08 16:52:24 +000049};
50
Eugene Zelenko89183722016-03-11 21:55:47 +000051typedef bool (*PluginInitCallback)();
52typedef void (*PluginTermCallback)();
Greg Clayton03da4cc2013-04-19 21:31:16 +000053
Kate Stoneb9c1b512016-09-06 20:57:50 +000054struct PluginInfo {
55 PluginInfo() : plugin_init_callback(nullptr), plugin_term_callback(nullptr) {}
Zachary Turner58a559c2014-08-27 20:15:09 +000056
Kate Stoneb9c1b512016-09-06 20:57:50 +000057 llvm::sys::DynamicLibrary library;
58 PluginInitCallback plugin_init_callback;
59 PluginTermCallback plugin_term_callback;
Greg Clayton4272cc72011-02-02 02:24:04 +000060};
61
62typedef std::map<FileSpec, PluginInfo> PluginTerminateMap;
63
Kate Stoneb9c1b512016-09-06 20:57:50 +000064static std::recursive_mutex &GetPluginMapMutex() {
65 static std::recursive_mutex g_plugin_map_mutex;
66 return g_plugin_map_mutex;
Greg Clayton4272cc72011-02-02 02:24:04 +000067}
68
Kate Stoneb9c1b512016-09-06 20:57:50 +000069static PluginTerminateMap &GetPluginMap() {
70 static PluginTerminateMap g_plugin_map;
71 return g_plugin_map;
Greg Clayton4272cc72011-02-02 02:24:04 +000072}
73
Kate Stoneb9c1b512016-09-06 20:57:50 +000074static bool PluginIsLoaded(const FileSpec &plugin_file_spec) {
75 std::lock_guard<std::recursive_mutex> guard(GetPluginMapMutex());
76 PluginTerminateMap &plugin_map = GetPluginMap();
77 return plugin_map.find(plugin_file_spec) != plugin_map.end();
Greg Clayton4272cc72011-02-02 02:24:04 +000078}
79
Kate Stoneb9c1b512016-09-06 20:57:50 +000080static void SetPluginInfo(const FileSpec &plugin_file_spec,
81 const PluginInfo &plugin_info) {
82 std::lock_guard<std::recursive_mutex> guard(GetPluginMapMutex());
83 PluginTerminateMap &plugin_map = GetPluginMap();
84 assert(plugin_map.find(plugin_file_spec) == plugin_map.end());
85 plugin_map[plugin_file_spec] = plugin_info;
David Majnemer5ff02782014-07-22 21:59:22 +000086}
Greg Clayton4272cc72011-02-02 02:24:04 +000087
Kate Stoneb9c1b512016-09-06 20:57:50 +000088template <typename FPtrTy> static FPtrTy CastToFPtr(void *VPtr) {
89 return reinterpret_cast<FPtrTy>(reinterpret_cast<intptr_t>(VPtr));
90}
Greg Clayton45319462011-02-08 00:35:34 +000091
Jonas Devlieghere35e4c842018-11-01 00:33:27 +000092static FileSystem::EnumerateDirectoryResult
Zachary Turner7d86ee52017-03-08 17:56:08 +000093LoadPluginCallback(void *baton, llvm::sys::fs::file_type ft,
Jonas Devlieghere35e4c842018-11-01 00:33:27 +000094 llvm::StringRef path) {
Kate Stoneb9c1b512016-09-06 20:57:50 +000095 // PluginManager *plugin_manager = (PluginManager *)baton;
Zachary Turner97206d52017-05-12 04:51:55 +000096 Status error;
Greg Clayton4272cc72011-02-02 02:24:04 +000097
Zachary Turner7d86ee52017-03-08 17:56:08 +000098 namespace fs = llvm::sys::fs;
Adrian Prantl05097242018-04-30 16:49:04 +000099 // If we have a regular file, a symbolic link or unknown file type, try and
100 // process the file. We must handle unknown as sometimes the directory
Kate Stoneb9c1b512016-09-06 20:57:50 +0000101 // enumeration might be enumerating a file system that doesn't have correct
102 // file type information.
Zachary Turner7d86ee52017-03-08 17:56:08 +0000103 if (ft == fs::file_type::regular_file || ft == fs::file_type::symlink_file ||
104 ft == fs::file_type::type_unknown) {
Jonas Devlieghere8f3be7a2018-11-01 21:05:36 +0000105 FileSpec plugin_file_spec(path);
106 FileSystem::Instance().Resolve(plugin_file_spec);
Greg Clayton4272cc72011-02-02 02:24:04 +0000107
Kate Stoneb9c1b512016-09-06 20:57:50 +0000108 if (PluginIsLoaded(plugin_file_spec))
Jonas Devlieghere35e4c842018-11-01 00:33:27 +0000109 return FileSystem::eEnumerateDirectoryResultNext;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000110 else {
111 PluginInfo plugin_info;
Greg Clayton4272cc72011-02-02 02:24:04 +0000112
Kate Stoneb9c1b512016-09-06 20:57:50 +0000113 std::string pluginLoadError;
114 plugin_info.library = llvm::sys::DynamicLibrary::getPermanentLibrary(
115 plugin_file_spec.GetPath().c_str(), &pluginLoadError);
116 if (plugin_info.library.isValid()) {
117 bool success = false;
118 plugin_info.plugin_init_callback = CastToFPtr<PluginInitCallback>(
119 plugin_info.library.getAddressOfSymbol("LLDBPluginInitialize"));
120 if (plugin_info.plugin_init_callback) {
121 // Call the plug-in "bool LLDBPluginInitialize(void)" function
122 success = plugin_info.plugin_init_callback();
Greg Clayton4272cc72011-02-02 02:24:04 +0000123 }
Greg Clayton4272cc72011-02-02 02:24:04 +0000124
Kate Stoneb9c1b512016-09-06 20:57:50 +0000125 if (success) {
126 // It is ok for the "LLDBPluginTerminate" symbol to be nullptr
127 plugin_info.plugin_term_callback = CastToFPtr<PluginTermCallback>(
128 plugin_info.library.getAddressOfSymbol("LLDBPluginTerminate"));
129 } else {
130 // The initialize function returned FALSE which means the plug-in
Adrian Prantl05097242018-04-30 16:49:04 +0000131 // might not be compatible, or might be too new or too old, or might
132 // not want to run on this machine. Set it to a default-constructed
133 // instance to invalidate it.
Kate Stoneb9c1b512016-09-06 20:57:50 +0000134 plugin_info = PluginInfo();
135 }
136
Adrian Prantl05097242018-04-30 16:49:04 +0000137 // Regardless of success or failure, cache the plug-in load in our
138 // plug-in info so we don't try to load it again and again.
Kate Stoneb9c1b512016-09-06 20:57:50 +0000139 SetPluginInfo(plugin_file_spec, plugin_info);
140
Jonas Devlieghere35e4c842018-11-01 00:33:27 +0000141 return FileSystem::eEnumerateDirectoryResultNext;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000142 }
143 }
144 }
145
Zachary Turner7d86ee52017-03-08 17:56:08 +0000146 if (ft == fs::file_type::directory_file ||
147 ft == fs::file_type::symlink_file || ft == fs::file_type::type_unknown) {
Adrian Prantl05097242018-04-30 16:49:04 +0000148 // Try and recurse into anything that a directory or symbolic link. We must
149 // also do this for unknown as sometimes the directory enumeration might be
150 // enumerating a file system that doesn't have correct file type
Kate Stoneb9c1b512016-09-06 20:57:50 +0000151 // information.
Jonas Devlieghere35e4c842018-11-01 00:33:27 +0000152 return FileSystem::eEnumerateDirectoryResultEnter;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000153 }
154
Jonas Devlieghere35e4c842018-11-01 00:33:27 +0000155 return FileSystem::eEnumerateDirectoryResultNext;
Greg Clayton4272cc72011-02-02 02:24:04 +0000156}
157
Kate Stoneb9c1b512016-09-06 20:57:50 +0000158void PluginManager::Initialize() {
Greg Clayton1cb64962011-03-24 04:28:38 +0000159#if 1
Kate Stoneb9c1b512016-09-06 20:57:50 +0000160 const bool find_directories = true;
161 const bool find_files = true;
162 const bool find_other = true;
163 char dir_path[PATH_MAX];
Pavel Labath60f028f2018-06-19 15:09:07 +0000164 if (FileSpec dir_spec = HostInfo::GetSystemPluginDir()) {
Jonas Devliegheredbd7fab2018-11-01 17:09:25 +0000165 if (FileSystem::Instance().Exists(dir_spec) &&
166 dir_spec.GetPath(dir_path, sizeof(dir_path))) {
Jonas Devlieghere35e4c842018-11-01 00:33:27 +0000167 FileSystem::Instance().EnumerateDirectory(dir_path, find_directories,
168 find_files, find_other,
169 LoadPluginCallback, nullptr);
Greg Clayton4272cc72011-02-02 02:24:04 +0000170 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000171 }
Greg Clayton4272cc72011-02-02 02:24:04 +0000172
Pavel Labath60f028f2018-06-19 15:09:07 +0000173 if (FileSpec dir_spec = HostInfo::GetUserPluginDir()) {
Jonas Devliegheredbd7fab2018-11-01 17:09:25 +0000174 if (FileSystem::Instance().Exists(dir_spec) &&
175 dir_spec.GetPath(dir_path, sizeof(dir_path))) {
Jonas Devlieghere35e4c842018-11-01 00:33:27 +0000176 FileSystem::Instance().EnumerateDirectory(dir_path, find_directories,
177 find_files, find_other,
178 LoadPluginCallback, nullptr);
Greg Clayton4272cc72011-02-02 02:24:04 +0000179 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000180 }
Greg Clayton1cb64962011-03-24 04:28:38 +0000181#endif
Greg Clayton4272cc72011-02-02 02:24:04 +0000182}
183
Kate Stoneb9c1b512016-09-06 20:57:50 +0000184void PluginManager::Terminate() {
185 std::lock_guard<std::recursive_mutex> guard(GetPluginMapMutex());
186 PluginTerminateMap &plugin_map = GetPluginMap();
187
188 PluginTerminateMap::const_iterator pos, end = plugin_map.end();
189 for (pos = plugin_map.begin(); pos != end; ++pos) {
Adrian Prantl05097242018-04-30 16:49:04 +0000190 // Call the plug-in "void LLDBPluginTerminate (void)" function if there is
191 // one (if the symbol was not nullptr).
Kate Stoneb9c1b512016-09-06 20:57:50 +0000192 if (pos->second.library.isValid()) {
193 if (pos->second.plugin_term_callback)
194 pos->second.plugin_term_callback();
Greg Clayton4272cc72011-02-02 02:24:04 +0000195 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000196 }
197 plugin_map.clear();
Greg Clayton4272cc72011-02-02 02:24:04 +0000198}
199
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000200#pragma mark ABI
201
Kate Stoneb9c1b512016-09-06 20:57:50 +0000202struct ABIInstance {
203 ABIInstance() : name(), description(), create_callback(nullptr) {}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000204
Kate Stoneb9c1b512016-09-06 20:57:50 +0000205 ConstString name;
206 std::string description;
207 ABICreateInstance create_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000208};
209
210typedef std::vector<ABIInstance> ABIInstances;
211
Kate Stoneb9c1b512016-09-06 20:57:50 +0000212static std::recursive_mutex &GetABIInstancesMutex() {
213 static std::recursive_mutex g_instances_mutex;
214 return g_instances_mutex;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000215}
216
Kate Stoneb9c1b512016-09-06 20:57:50 +0000217static ABIInstances &GetABIInstances() {
218 static ABIInstances g_instances;
219 return g_instances;
Greg Claytonded470d2011-03-19 01:12:21 +0000220}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000221
Adrian Prantl0e4c4822019-03-06 21:22:25 +0000222bool PluginManager::RegisterPlugin(ConstString name,
Kate Stoneb9c1b512016-09-06 20:57:50 +0000223 const char *description,
224 ABICreateInstance create_callback) {
225 if (create_callback) {
226 ABIInstance instance;
227 assert((bool)name);
228 instance.name = name;
229 if (description && description[0])
230 instance.description = description;
231 instance.create_callback = create_callback;
Saleem Abdulrasool16ff8602016-05-18 01:59:10 +0000232 std::lock_guard<std::recursive_mutex> guard(GetABIInstancesMutex());
Kate Stoneb9c1b512016-09-06 20:57:50 +0000233 GetABIInstances().push_back(instance);
234 return true;
235 }
236 return false;
237}
238
239bool PluginManager::UnregisterPlugin(ABICreateInstance create_callback) {
240 if (create_callback) {
241 std::lock_guard<std::recursive_mutex> guard(GetABIInstancesMutex());
242 ABIInstances &instances = GetABIInstances();
243
244 ABIInstances::iterator pos, end = instances.end();
245 for (pos = instances.begin(); pos != end; ++pos) {
246 if (pos->create_callback == create_callback) {
247 instances.erase(pos);
248 return true;
249 }
250 }
251 }
252 return false;
253}
254
255ABICreateInstance PluginManager::GetABICreateCallbackAtIndex(uint32_t idx) {
256 std::lock_guard<std::recursive_mutex> guard(GetABIInstancesMutex());
257 ABIInstances &instances = GetABIInstances();
258 if (idx < instances.size())
259 return instances[idx].create_callback;
260 return nullptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000261}
262
263ABICreateInstance
Adrian Prantl0e4c4822019-03-06 21:22:25 +0000264PluginManager::GetABICreateCallbackForPluginName(ConstString name) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000265 if (name) {
266 std::lock_guard<std::recursive_mutex> guard(GetABIInstancesMutex());
267 ABIInstances &instances = GetABIInstances();
Greg Claytonded470d2011-03-19 01:12:21 +0000268
Kate Stoneb9c1b512016-09-06 20:57:50 +0000269 ABIInstances::iterator pos, end = instances.end();
270 for (pos = instances.begin(); pos != end; ++pos) {
271 if (name == pos->name)
272 return pos->create_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000273 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000274 }
275 return nullptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000276}
277
Pavel Labath13e37d42017-10-25 21:05:31 +0000278#pragma mark Architecture
279
280struct ArchitectureInstance {
281 ConstString name;
282 std::string description;
283 PluginManager::ArchitectureCreateInstance create_callback;
284};
285
286typedef std::vector<ArchitectureInstance> ArchitectureInstances;
287
Kuba Mracekb2413ea2018-11-12 16:52:58 +0000288static std::mutex &GetArchitectureMutex() {
289 static std::mutex g_architecture_mutex;
290 return g_architecture_mutex;
291}
Pavel Labath13e37d42017-10-25 21:05:31 +0000292
293static ArchitectureInstances &GetArchitectureInstances() {
294 static ArchitectureInstances g_instances;
295 return g_instances;
296}
297
Adrian Prantl0e4c4822019-03-06 21:22:25 +0000298void PluginManager::RegisterPlugin(ConstString name,
Pavel Labath13e37d42017-10-25 21:05:31 +0000299 llvm::StringRef description,
300 ArchitectureCreateInstance create_callback) {
Kuba Mracekb2413ea2018-11-12 16:52:58 +0000301 std::lock_guard<std::mutex> guard(GetArchitectureMutex());
Pavel Labath13e37d42017-10-25 21:05:31 +0000302 GetArchitectureInstances().push_back({name, description, create_callback});
303}
304
305void PluginManager::UnregisterPlugin(
306 ArchitectureCreateInstance create_callback) {
Kuba Mracekb2413ea2018-11-12 16:52:58 +0000307 std::lock_guard<std::mutex> guard(GetArchitectureMutex());
Pavel Labath13e37d42017-10-25 21:05:31 +0000308 auto &instances = GetArchitectureInstances();
309
310 for (auto pos = instances.begin(), end = instances.end(); pos != end; ++pos) {
311 if (pos->create_callback == create_callback) {
312 instances.erase(pos);
313 return;
314 }
315 }
316 llvm_unreachable("Plugin not found");
317}
318
319std::unique_ptr<Architecture>
320PluginManager::CreateArchitectureInstance(const ArchSpec &arch) {
Kuba Mracekb2413ea2018-11-12 16:52:58 +0000321 std::lock_guard<std::mutex> guard(GetArchitectureMutex());
Pavel Labath13e37d42017-10-25 21:05:31 +0000322 for (const auto &instances : GetArchitectureInstances()) {
323 if (auto plugin_up = instances.create_callback(arch))
324 return plugin_up;
325 }
326 return nullptr;
327}
328
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000329#pragma mark Disassembler
330
Kate Stoneb9c1b512016-09-06 20:57:50 +0000331struct DisassemblerInstance {
332 DisassemblerInstance() : name(), description(), create_callback(nullptr) {}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000333
Kate Stoneb9c1b512016-09-06 20:57:50 +0000334 ConstString name;
335 std::string description;
336 DisassemblerCreateInstance create_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000337};
338
339typedef std::vector<DisassemblerInstance> DisassemblerInstances;
340
Kate Stoneb9c1b512016-09-06 20:57:50 +0000341static std::recursive_mutex &GetDisassemblerMutex() {
342 static std::recursive_mutex g_instances_mutex;
343 return g_instances_mutex;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000344}
345
Kate Stoneb9c1b512016-09-06 20:57:50 +0000346static DisassemblerInstances &GetDisassemblerInstances() {
347 static DisassemblerInstances g_instances;
348 return g_instances;
Greg Claytonab65b342011-04-13 22:47:15 +0000349}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000350
Adrian Prantl0e4c4822019-03-06 21:22:25 +0000351bool PluginManager::RegisterPlugin(ConstString name,
Kate Stoneb9c1b512016-09-06 20:57:50 +0000352 const char *description,
353 DisassemblerCreateInstance create_callback) {
354 if (create_callback) {
355 DisassemblerInstance instance;
356 assert((bool)name);
357 instance.name = name;
358 if (description && description[0])
359 instance.description = description;
360 instance.create_callback = create_callback;
Saleem Abdulrasool16ff8602016-05-18 01:59:10 +0000361 std::lock_guard<std::recursive_mutex> guard(GetDisassemblerMutex());
Kate Stoneb9c1b512016-09-06 20:57:50 +0000362 GetDisassemblerInstances().push_back(instance);
363 return true;
364 }
365 return false;
366}
367
368bool PluginManager::UnregisterPlugin(
369 DisassemblerCreateInstance create_callback) {
370 if (create_callback) {
371 std::lock_guard<std::recursive_mutex> guard(GetDisassemblerMutex());
372 DisassemblerInstances &instances = GetDisassemblerInstances();
373
374 DisassemblerInstances::iterator pos, end = instances.end();
375 for (pos = instances.begin(); pos != end; ++pos) {
376 if (pos->create_callback == create_callback) {
377 instances.erase(pos);
378 return true;
379 }
380 }
381 }
382 return false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000383}
384
385DisassemblerCreateInstance
Kate Stoneb9c1b512016-09-06 20:57:50 +0000386PluginManager::GetDisassemblerCreateCallbackAtIndex(uint32_t idx) {
387 std::lock_guard<std::recursive_mutex> guard(GetDisassemblerMutex());
388 DisassemblerInstances &instances = GetDisassemblerInstances();
389 if (idx < instances.size())
390 return instances[idx].create_callback;
391 return nullptr;
392}
393
394DisassemblerCreateInstance
395PluginManager::GetDisassemblerCreateCallbackForPluginName(
Adrian Prantl0e4c4822019-03-06 21:22:25 +0000396 ConstString name) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000397 if (name) {
398 std::lock_guard<std::recursive_mutex> guard(GetDisassemblerMutex());
399 DisassemblerInstances &instances = GetDisassemblerInstances();
400
401 DisassemblerInstances::iterator pos, end = instances.end();
402 for (pos = instances.begin(); pos != end; ++pos) {
403 if (name == pos->name)
404 return pos->create_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000405 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000406 }
407 return nullptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000408}
409
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000410#pragma mark DynamicLoader
411
Kate Stoneb9c1b512016-09-06 20:57:50 +0000412struct DynamicLoaderInstance {
413 DynamicLoaderInstance()
414 : name(), description(), create_callback(nullptr),
415 debugger_init_callback(nullptr) {}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000416
Kate Stoneb9c1b512016-09-06 20:57:50 +0000417 ConstString name;
418 std::string description;
419 DynamicLoaderCreateInstance create_callback;
420 DebuggerInitializeCallback debugger_init_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000421};
422
423typedef std::vector<DynamicLoaderInstance> DynamicLoaderInstances;
424
Kate Stoneb9c1b512016-09-06 20:57:50 +0000425static std::recursive_mutex &GetDynamicLoaderMutex() {
426 static std::recursive_mutex g_instances_mutex;
427 return g_instances_mutex;
Greg Claytonab65b342011-04-13 22:47:15 +0000428}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000429
Kate Stoneb9c1b512016-09-06 20:57:50 +0000430static DynamicLoaderInstances &GetDynamicLoaderInstances() {
431 static DynamicLoaderInstances g_instances;
432 return g_instances;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000433}
434
Kate Stoneb9c1b512016-09-06 20:57:50 +0000435bool PluginManager::RegisterPlugin(
Adrian Prantl0e4c4822019-03-06 21:22:25 +0000436 ConstString name, const char *description,
Kate Stoneb9c1b512016-09-06 20:57:50 +0000437 DynamicLoaderCreateInstance create_callback,
438 DebuggerInitializeCallback debugger_init_callback) {
439 if (create_callback) {
440 DynamicLoaderInstance instance;
441 assert((bool)name);
442 instance.name = name;
443 if (description && description[0])
444 instance.description = description;
445 instance.create_callback = create_callback;
446 instance.debugger_init_callback = debugger_init_callback;
Saleem Abdulrasool16ff8602016-05-18 01:59:10 +0000447 std::lock_guard<std::recursive_mutex> guard(GetDynamicLoaderMutex());
Kate Stoneb9c1b512016-09-06 20:57:50 +0000448 GetDynamicLoaderInstances().push_back(instance);
449 }
450 return false;
451}
452
453bool PluginManager::UnregisterPlugin(
454 DynamicLoaderCreateInstance create_callback) {
455 if (create_callback) {
456 std::lock_guard<std::recursive_mutex> guard(GetDynamicLoaderMutex());
457 DynamicLoaderInstances &instances = GetDynamicLoaderInstances();
458
459 DynamicLoaderInstances::iterator pos, end = instances.end();
460 for (pos = instances.begin(); pos != end; ++pos) {
461 if (pos->create_callback == create_callback) {
462 instances.erase(pos);
463 return true;
464 }
465 }
466 }
467 return false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000468}
469
470DynamicLoaderCreateInstance
Kate Stoneb9c1b512016-09-06 20:57:50 +0000471PluginManager::GetDynamicLoaderCreateCallbackAtIndex(uint32_t idx) {
472 std::lock_guard<std::recursive_mutex> guard(GetDynamicLoaderMutex());
473 DynamicLoaderInstances &instances = GetDynamicLoaderInstances();
474 if (idx < instances.size())
475 return instances[idx].create_callback;
476 return nullptr;
477}
478
479DynamicLoaderCreateInstance
480PluginManager::GetDynamicLoaderCreateCallbackForPluginName(
Adrian Prantl0e4c4822019-03-06 21:22:25 +0000481 ConstString name) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000482 if (name) {
483 std::lock_guard<std::recursive_mutex> guard(GetDynamicLoaderMutex());
484 DynamicLoaderInstances &instances = GetDynamicLoaderInstances();
485
486 DynamicLoaderInstances::iterator pos, end = instances.end();
487 for (pos = instances.begin(); pos != end; ++pos) {
488 if (name == pos->name)
489 return pos->create_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000490 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000491 }
492 return nullptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000493}
494
Andrew MacPherson17220c12014-03-05 10:12:43 +0000495#pragma mark JITLoader
496
Kate Stoneb9c1b512016-09-06 20:57:50 +0000497struct JITLoaderInstance {
498 JITLoaderInstance()
499 : name(), description(), create_callback(nullptr),
500 debugger_init_callback(nullptr) {}
Andrew MacPherson17220c12014-03-05 10:12:43 +0000501
Kate Stoneb9c1b512016-09-06 20:57:50 +0000502 ConstString name;
503 std::string description;
504 JITLoaderCreateInstance create_callback;
505 DebuggerInitializeCallback debugger_init_callback;
Andrew MacPherson17220c12014-03-05 10:12:43 +0000506};
507
508typedef std::vector<JITLoaderInstance> JITLoaderInstances;
509
Kate Stoneb9c1b512016-09-06 20:57:50 +0000510static std::recursive_mutex &GetJITLoaderMutex() {
511 static std::recursive_mutex g_instances_mutex;
512 return g_instances_mutex;
Andrew MacPherson17220c12014-03-05 10:12:43 +0000513}
514
Kate Stoneb9c1b512016-09-06 20:57:50 +0000515static JITLoaderInstances &GetJITLoaderInstances() {
516 static JITLoaderInstances g_instances;
517 return g_instances;
Andrew MacPherson17220c12014-03-05 10:12:43 +0000518}
519
Kate Stoneb9c1b512016-09-06 20:57:50 +0000520bool PluginManager::RegisterPlugin(
Adrian Prantl0e4c4822019-03-06 21:22:25 +0000521 ConstString name, const char *description,
Kate Stoneb9c1b512016-09-06 20:57:50 +0000522 JITLoaderCreateInstance create_callback,
523 DebuggerInitializeCallback debugger_init_callback) {
524 if (create_callback) {
525 JITLoaderInstance instance;
526 assert((bool)name);
527 instance.name = name;
528 if (description && description[0])
529 instance.description = description;
530 instance.create_callback = create_callback;
531 instance.debugger_init_callback = debugger_init_callback;
Saleem Abdulrasool16ff8602016-05-18 01:59:10 +0000532 std::lock_guard<std::recursive_mutex> guard(GetJITLoaderMutex());
Kate Stoneb9c1b512016-09-06 20:57:50 +0000533 GetJITLoaderInstances().push_back(instance);
534 }
535 return false;
536}
537
538bool PluginManager::UnregisterPlugin(JITLoaderCreateInstance create_callback) {
539 if (create_callback) {
540 std::lock_guard<std::recursive_mutex> guard(GetJITLoaderMutex());
541 JITLoaderInstances &instances = GetJITLoaderInstances();
542
543 JITLoaderInstances::iterator pos, end = instances.end();
544 for (pos = instances.begin(); pos != end; ++pos) {
545 if (pos->create_callback == create_callback) {
546 instances.erase(pos);
547 return true;
548 }
549 }
550 }
551 return false;
Andrew MacPherson17220c12014-03-05 10:12:43 +0000552}
553
554JITLoaderCreateInstance
Kate Stoneb9c1b512016-09-06 20:57:50 +0000555PluginManager::GetJITLoaderCreateCallbackAtIndex(uint32_t idx) {
556 std::lock_guard<std::recursive_mutex> guard(GetJITLoaderMutex());
557 JITLoaderInstances &instances = GetJITLoaderInstances();
558 if (idx < instances.size())
559 return instances[idx].create_callback;
560 return nullptr;
561}
562
563JITLoaderCreateInstance PluginManager::GetJITLoaderCreateCallbackForPluginName(
Adrian Prantl0e4c4822019-03-06 21:22:25 +0000564 ConstString name) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000565 if (name) {
566 std::lock_guard<std::recursive_mutex> guard(GetJITLoaderMutex());
567 JITLoaderInstances &instances = GetJITLoaderInstances();
568
569 JITLoaderInstances::iterator pos, end = instances.end();
570 for (pos = instances.begin(); pos != end; ++pos) {
571 if (name == pos->name)
572 return pos->create_callback;
Andrew MacPherson17220c12014-03-05 10:12:43 +0000573 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000574 }
575 return nullptr;
Andrew MacPherson17220c12014-03-05 10:12:43 +0000576}
577
Greg Claytonf03bbe22011-02-01 01:37:45 +0000578#pragma mark EmulateInstruction
579
Kate Stoneb9c1b512016-09-06 20:57:50 +0000580struct EmulateInstructionInstance {
581 EmulateInstructionInstance()
582 : name(), description(), create_callback(nullptr) {}
583
584 ConstString name;
585 std::string description;
586 EmulateInstructionCreateInstance create_callback;
Greg Claytonf03bbe22011-02-01 01:37:45 +0000587};
588
589typedef std::vector<EmulateInstructionInstance> EmulateInstructionInstances;
590
Kate Stoneb9c1b512016-09-06 20:57:50 +0000591static std::recursive_mutex &GetEmulateInstructionMutex() {
592 static std::recursive_mutex g_instances_mutex;
593 return g_instances_mutex;
Greg Claytonab65b342011-04-13 22:47:15 +0000594}
595
Kate Stoneb9c1b512016-09-06 20:57:50 +0000596static EmulateInstructionInstances &GetEmulateInstructionInstances() {
597 static EmulateInstructionInstances g_instances;
598 return g_instances;
Greg Claytonf03bbe22011-02-01 01:37:45 +0000599}
600
Kate Stoneb9c1b512016-09-06 20:57:50 +0000601bool PluginManager::RegisterPlugin(
Adrian Prantl0e4c4822019-03-06 21:22:25 +0000602 ConstString name, const char *description,
Kate Stoneb9c1b512016-09-06 20:57:50 +0000603 EmulateInstructionCreateInstance create_callback) {
604 if (create_callback) {
605 EmulateInstructionInstance instance;
606 assert((bool)name);
607 instance.name = name;
608 if (description && description[0])
609 instance.description = description;
610 instance.create_callback = create_callback;
Saleem Abdulrasool16ff8602016-05-18 01:59:10 +0000611 std::lock_guard<std::recursive_mutex> guard(GetEmulateInstructionMutex());
Kate Stoneb9c1b512016-09-06 20:57:50 +0000612 GetEmulateInstructionInstances().push_back(instance);
613 }
614 return false;
615}
616
617bool PluginManager::UnregisterPlugin(
618 EmulateInstructionCreateInstance create_callback) {
619 if (create_callback) {
620 std::lock_guard<std::recursive_mutex> guard(GetEmulateInstructionMutex());
621 EmulateInstructionInstances &instances = GetEmulateInstructionInstances();
622
623 EmulateInstructionInstances::iterator pos, end = instances.end();
624 for (pos = instances.begin(); pos != end; ++pos) {
625 if (pos->create_callback == create_callback) {
626 instances.erase(pos);
627 return true;
628 }
629 }
630 }
631 return false;
Greg Claytonf03bbe22011-02-01 01:37:45 +0000632}
633
634EmulateInstructionCreateInstance
Kate Stoneb9c1b512016-09-06 20:57:50 +0000635PluginManager::GetEmulateInstructionCreateCallbackAtIndex(uint32_t idx) {
636 std::lock_guard<std::recursive_mutex> guard(GetEmulateInstructionMutex());
637 EmulateInstructionInstances &instances = GetEmulateInstructionInstances();
638 if (idx < instances.size())
639 return instances[idx].create_callback;
640 return nullptr;
641}
642
643EmulateInstructionCreateInstance
644PluginManager::GetEmulateInstructionCreateCallbackForPluginName(
Adrian Prantl0e4c4822019-03-06 21:22:25 +0000645 ConstString name) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000646 if (name) {
647 std::lock_guard<std::recursive_mutex> guard(GetEmulateInstructionMutex());
648 EmulateInstructionInstances &instances = GetEmulateInstructionInstances();
649
650 EmulateInstructionInstances::iterator pos, end = instances.end();
651 for (pos = instances.begin(); pos != end; ++pos) {
652 if (name == pos->name)
653 return pos->create_callback;
Greg Claytonf03bbe22011-02-01 01:37:45 +0000654 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000655 }
656 return nullptr;
Greg Claytonf03bbe22011-02-01 01:37:45 +0000657}
Greg Clayton56d9a1b2011-08-22 02:49:39 +0000658
Eugene Zelenko89183722016-03-11 21:55:47 +0000659#pragma mark OperatingSystem
Greg Clayton56d9a1b2011-08-22 02:49:39 +0000660
Kate Stoneb9c1b512016-09-06 20:57:50 +0000661struct OperatingSystemInstance {
662 OperatingSystemInstance()
663 : name(), description(), create_callback(nullptr),
664 debugger_init_callback(nullptr) {}
665
666 ConstString name;
667 std::string description;
668 OperatingSystemCreateInstance create_callback;
669 DebuggerInitializeCallback debugger_init_callback;
Greg Clayton56d9a1b2011-08-22 02:49:39 +0000670};
671
672typedef std::vector<OperatingSystemInstance> OperatingSystemInstances;
673
Kate Stoneb9c1b512016-09-06 20:57:50 +0000674static std::recursive_mutex &GetOperatingSystemMutex() {
675 static std::recursive_mutex g_instances_mutex;
676 return g_instances_mutex;
Greg Clayton56d9a1b2011-08-22 02:49:39 +0000677}
678
Kate Stoneb9c1b512016-09-06 20:57:50 +0000679static OperatingSystemInstances &GetOperatingSystemInstances() {
680 static OperatingSystemInstances g_instances;
681 return g_instances;
Greg Clayton56d9a1b2011-08-22 02:49:39 +0000682}
683
Kate Stoneb9c1b512016-09-06 20:57:50 +0000684bool PluginManager::RegisterPlugin(
Adrian Prantl0e4c4822019-03-06 21:22:25 +0000685 ConstString name, const char *description,
Kate Stoneb9c1b512016-09-06 20:57:50 +0000686 OperatingSystemCreateInstance create_callback,
687 DebuggerInitializeCallback debugger_init_callback) {
688 if (create_callback) {
689 OperatingSystemInstance instance;
690 assert((bool)name);
691 instance.name = name;
692 if (description && description[0])
693 instance.description = description;
694 instance.create_callback = create_callback;
695 instance.debugger_init_callback = debugger_init_callback;
Saleem Abdulrasool16ff8602016-05-18 01:59:10 +0000696 std::lock_guard<std::recursive_mutex> guard(GetOperatingSystemMutex());
Kate Stoneb9c1b512016-09-06 20:57:50 +0000697 GetOperatingSystemInstances().push_back(instance);
698 }
699 return false;
700}
701
702bool PluginManager::UnregisterPlugin(
703 OperatingSystemCreateInstance create_callback) {
704 if (create_callback) {
705 std::lock_guard<std::recursive_mutex> guard(GetOperatingSystemMutex());
706 OperatingSystemInstances &instances = GetOperatingSystemInstances();
707
708 OperatingSystemInstances::iterator pos, end = instances.end();
709 for (pos = instances.begin(); pos != end; ++pos) {
710 if (pos->create_callback == create_callback) {
711 instances.erase(pos);
712 return true;
713 }
714 }
715 }
716 return false;
Greg Clayton56d9a1b2011-08-22 02:49:39 +0000717}
718
719OperatingSystemCreateInstance
Kate Stoneb9c1b512016-09-06 20:57:50 +0000720PluginManager::GetOperatingSystemCreateCallbackAtIndex(uint32_t idx) {
721 std::lock_guard<std::recursive_mutex> guard(GetOperatingSystemMutex());
722 OperatingSystemInstances &instances = GetOperatingSystemInstances();
723 if (idx < instances.size())
724 return instances[idx].create_callback;
725 return nullptr;
726}
727
728OperatingSystemCreateInstance
729PluginManager::GetOperatingSystemCreateCallbackForPluginName(
Adrian Prantl0e4c4822019-03-06 21:22:25 +0000730 ConstString name) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000731 if (name) {
732 std::lock_guard<std::recursive_mutex> guard(GetOperatingSystemMutex());
733 OperatingSystemInstances &instances = GetOperatingSystemInstances();
734
735 OperatingSystemInstances::iterator pos, end = instances.end();
736 for (pos = instances.begin(); pos != end; ++pos) {
737 if (name == pos->name)
738 return pos->create_callback;
Greg Clayton56d9a1b2011-08-22 02:49:39 +0000739 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000740 }
741 return nullptr;
Greg Clayton56d9a1b2011-08-22 02:49:39 +0000742}
Greg Claytonf03bbe22011-02-01 01:37:45 +0000743
Enrico Granata5f9d3102015-08-27 21:33:50 +0000744#pragma mark Language
745
Kate Stoneb9c1b512016-09-06 20:57:50 +0000746struct LanguageInstance {
747 LanguageInstance() : name(), description(), create_callback(nullptr) {}
748
749 ConstString name;
750 std::string description;
751 LanguageCreateInstance create_callback;
Enrico Granata5f9d3102015-08-27 21:33:50 +0000752};
753
754typedef std::vector<LanguageInstance> LanguageInstances;
755
Kate Stoneb9c1b512016-09-06 20:57:50 +0000756static std::recursive_mutex &GetLanguageMutex() {
757 static std::recursive_mutex g_instances_mutex;
758 return g_instances_mutex;
Enrico Granata5f9d3102015-08-27 21:33:50 +0000759}
760
Kate Stoneb9c1b512016-09-06 20:57:50 +0000761static LanguageInstances &GetLanguageInstances() {
762 static LanguageInstances g_instances;
763 return g_instances;
Enrico Granata5f9d3102015-08-27 21:33:50 +0000764}
765
Adrian Prantl0e4c4822019-03-06 21:22:25 +0000766bool PluginManager::RegisterPlugin(ConstString name,
Kate Stoneb9c1b512016-09-06 20:57:50 +0000767 const char *description,
768 LanguageCreateInstance create_callback) {
769 if (create_callback) {
770 LanguageInstance instance;
771 assert((bool)name);
772 instance.name = name;
773 if (description && description[0])
774 instance.description = description;
775 instance.create_callback = create_callback;
Saleem Abdulrasool16ff8602016-05-18 01:59:10 +0000776 std::lock_guard<std::recursive_mutex> guard(GetLanguageMutex());
Kate Stoneb9c1b512016-09-06 20:57:50 +0000777 GetLanguageInstances().push_back(instance);
778 }
779 return false;
780}
781
782bool PluginManager::UnregisterPlugin(LanguageCreateInstance create_callback) {
783 if (create_callback) {
784 std::lock_guard<std::recursive_mutex> guard(GetLanguageMutex());
785 LanguageInstances &instances = GetLanguageInstances();
786
787 LanguageInstances::iterator pos, end = instances.end();
788 for (pos = instances.begin(); pos != end; ++pos) {
789 if (pos->create_callback == create_callback) {
790 instances.erase(pos);
791 return true;
792 }
793 }
794 }
795 return false;
Enrico Granata5f9d3102015-08-27 21:33:50 +0000796}
797
798LanguageCreateInstance
Kate Stoneb9c1b512016-09-06 20:57:50 +0000799PluginManager::GetLanguageCreateCallbackAtIndex(uint32_t idx) {
800 std::lock_guard<std::recursive_mutex> guard(GetLanguageMutex());
801 LanguageInstances &instances = GetLanguageInstances();
802 if (idx < instances.size())
803 return instances[idx].create_callback;
804 return nullptr;
805}
806
807LanguageCreateInstance
Adrian Prantl0e4c4822019-03-06 21:22:25 +0000808PluginManager::GetLanguageCreateCallbackForPluginName(ConstString name) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000809 if (name) {
810 std::lock_guard<std::recursive_mutex> guard(GetLanguageMutex());
811 LanguageInstances &instances = GetLanguageInstances();
812
813 LanguageInstances::iterator pos, end = instances.end();
814 for (pos = instances.begin(); pos != end; ++pos) {
815 if (name == pos->name)
816 return pos->create_callback;
Enrico Granata5f9d3102015-08-27 21:33:50 +0000817 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000818 }
819 return nullptr;
Enrico Granata5f9d3102015-08-27 21:33:50 +0000820}
821
Jim Ingham22777012010-09-23 02:01:19 +0000822#pragma mark LanguageRuntime
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000823
Kate Stoneb9c1b512016-09-06 20:57:50 +0000824struct LanguageRuntimeInstance {
825 LanguageRuntimeInstance() : name(), description(), create_callback(nullptr) {}
Jim Ingham22777012010-09-23 02:01:19 +0000826
Kate Stoneb9c1b512016-09-06 20:57:50 +0000827 ConstString name;
828 std::string description;
829 LanguageRuntimeCreateInstance create_callback;
830 LanguageRuntimeGetCommandObject command_callback;
Jim Ingham22777012010-09-23 02:01:19 +0000831};
832
833typedef std::vector<LanguageRuntimeInstance> LanguageRuntimeInstances;
834
Kate Stoneb9c1b512016-09-06 20:57:50 +0000835static std::recursive_mutex &GetLanguageRuntimeMutex() {
836 static std::recursive_mutex g_instances_mutex;
837 return g_instances_mutex;
Jim Ingham22777012010-09-23 02:01:19 +0000838}
839
Kate Stoneb9c1b512016-09-06 20:57:50 +0000840static LanguageRuntimeInstances &GetLanguageRuntimeInstances() {
841 static LanguageRuntimeInstances g_instances;
842 return g_instances;
Greg Claytonab65b342011-04-13 22:47:15 +0000843}
Jim Ingham22777012010-09-23 02:01:19 +0000844
Kate Stoneb9c1b512016-09-06 20:57:50 +0000845bool PluginManager::RegisterPlugin(
Adrian Prantl0e4c4822019-03-06 21:22:25 +0000846 ConstString name, const char *description,
Kate Stoneb9c1b512016-09-06 20:57:50 +0000847 LanguageRuntimeCreateInstance create_callback,
848 LanguageRuntimeGetCommandObject command_callback) {
849 if (create_callback) {
850 LanguageRuntimeInstance instance;
851 assert((bool)name);
852 instance.name = name;
853 if (description && description[0])
854 instance.description = description;
855 instance.create_callback = create_callback;
856 instance.command_callback = command_callback;
857 std::lock_guard<std::recursive_mutex> guard(GetLanguageRuntimeMutex());
858 GetLanguageRuntimeInstances().push_back(instance);
859 }
860 return false;
861}
862
863bool PluginManager::UnregisterPlugin(
864 LanguageRuntimeCreateInstance create_callback) {
865 if (create_callback) {
866 std::lock_guard<std::recursive_mutex> guard(GetLanguageRuntimeMutex());
867 LanguageRuntimeInstances &instances = GetLanguageRuntimeInstances();
868
869 LanguageRuntimeInstances::iterator pos, end = instances.end();
870 for (pos = instances.begin(); pos != end; ++pos) {
871 if (pos->create_callback == create_callback) {
872 instances.erase(pos);
873 return true;
874 }
Jim Ingham22777012010-09-23 02:01:19 +0000875 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000876 }
877 return false;
Jim Ingham22777012010-09-23 02:01:19 +0000878}
879
880LanguageRuntimeCreateInstance
Kate Stoneb9c1b512016-09-06 20:57:50 +0000881PluginManager::GetLanguageRuntimeCreateCallbackAtIndex(uint32_t idx) {
882 std::lock_guard<std::recursive_mutex> guard(GetLanguageRuntimeMutex());
883 LanguageRuntimeInstances &instances = GetLanguageRuntimeInstances();
884 if (idx < instances.size())
885 return instances[idx].create_callback;
886 return nullptr;
Jim Ingham22777012010-09-23 02:01:19 +0000887}
888
Colin Rileyc9c55a22015-05-04 18:39:38 +0000889LanguageRuntimeGetCommandObject
Kate Stoneb9c1b512016-09-06 20:57:50 +0000890PluginManager::GetLanguageRuntimeGetCommandObjectAtIndex(uint32_t idx) {
891 std::lock_guard<std::recursive_mutex> guard(GetLanguageRuntimeMutex());
892 LanguageRuntimeInstances &instances = GetLanguageRuntimeInstances();
893 if (idx < instances.size())
894 return instances[idx].command_callback;
895 return nullptr;
Colin Rileyc9c55a22015-05-04 18:39:38 +0000896}
897
Jim Ingham22777012010-09-23 02:01:19 +0000898LanguageRuntimeCreateInstance
Kate Stoneb9c1b512016-09-06 20:57:50 +0000899PluginManager::GetLanguageRuntimeCreateCallbackForPluginName(
Adrian Prantl0e4c4822019-03-06 21:22:25 +0000900 ConstString name) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000901 if (name) {
902 std::lock_guard<std::recursive_mutex> guard(GetLanguageRuntimeMutex());
903 LanguageRuntimeInstances &instances = GetLanguageRuntimeInstances();
904
905 LanguageRuntimeInstances::iterator pos, end = instances.end();
906 for (pos = instances.begin(); pos != end; ++pos) {
907 if (name == pos->name)
908 return pos->create_callback;
Jim Ingham22777012010-09-23 02:01:19 +0000909 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000910 }
911 return nullptr;
Jim Ingham22777012010-09-23 02:01:19 +0000912}
913
Jason Molendaeef51062013-11-05 03:57:19 +0000914#pragma mark SystemRuntime
915
Kate Stoneb9c1b512016-09-06 20:57:50 +0000916struct SystemRuntimeInstance {
917 SystemRuntimeInstance() : name(), description(), create_callback(nullptr) {}
Jason Molendaeef51062013-11-05 03:57:19 +0000918
Kate Stoneb9c1b512016-09-06 20:57:50 +0000919 ConstString name;
920 std::string description;
921 SystemRuntimeCreateInstance create_callback;
Jason Molendaeef51062013-11-05 03:57:19 +0000922};
923
924typedef std::vector<SystemRuntimeInstance> SystemRuntimeInstances;
925
Kate Stoneb9c1b512016-09-06 20:57:50 +0000926static std::recursive_mutex &GetSystemRuntimeMutex() {
927 static std::recursive_mutex g_instances_mutex;
928 return g_instances_mutex;
Jason Molendaeef51062013-11-05 03:57:19 +0000929}
930
Kate Stoneb9c1b512016-09-06 20:57:50 +0000931static SystemRuntimeInstances &GetSystemRuntimeInstances() {
932 static SystemRuntimeInstances g_instances;
933 return g_instances;
Jason Molendaeef51062013-11-05 03:57:19 +0000934}
935
Kate Stoneb9c1b512016-09-06 20:57:50 +0000936bool PluginManager::RegisterPlugin(
Adrian Prantl0e4c4822019-03-06 21:22:25 +0000937 ConstString name, const char *description,
Kate Stoneb9c1b512016-09-06 20:57:50 +0000938 SystemRuntimeCreateInstance create_callback) {
939 if (create_callback) {
940 SystemRuntimeInstance instance;
941 assert((bool)name);
942 instance.name = name;
943 if (description && description[0])
944 instance.description = description;
945 instance.create_callback = create_callback;
Saleem Abdulrasool16ff8602016-05-18 01:59:10 +0000946 std::lock_guard<std::recursive_mutex> guard(GetSystemRuntimeMutex());
Kate Stoneb9c1b512016-09-06 20:57:50 +0000947 GetSystemRuntimeInstances().push_back(instance);
948 }
949 return false;
950}
951
952bool PluginManager::UnregisterPlugin(
953 SystemRuntimeCreateInstance create_callback) {
954 if (create_callback) {
955 std::lock_guard<std::recursive_mutex> guard(GetSystemRuntimeMutex());
956 SystemRuntimeInstances &instances = GetSystemRuntimeInstances();
957
958 SystemRuntimeInstances::iterator pos, end = instances.end();
959 for (pos = instances.begin(); pos != end; ++pos) {
960 if (pos->create_callback == create_callback) {
961 instances.erase(pos);
962 return true;
963 }
964 }
965 }
966 return false;
Jason Molendaeef51062013-11-05 03:57:19 +0000967}
968
969SystemRuntimeCreateInstance
Kate Stoneb9c1b512016-09-06 20:57:50 +0000970PluginManager::GetSystemRuntimeCreateCallbackAtIndex(uint32_t idx) {
971 std::lock_guard<std::recursive_mutex> guard(GetSystemRuntimeMutex());
972 SystemRuntimeInstances &instances = GetSystemRuntimeInstances();
973 if (idx < instances.size())
974 return instances[idx].create_callback;
975 return nullptr;
976}
977
978SystemRuntimeCreateInstance
979PluginManager::GetSystemRuntimeCreateCallbackForPluginName(
Adrian Prantl0e4c4822019-03-06 21:22:25 +0000980 ConstString name) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000981 if (name) {
982 std::lock_guard<std::recursive_mutex> guard(GetSystemRuntimeMutex());
983 SystemRuntimeInstances &instances = GetSystemRuntimeInstances();
984
985 SystemRuntimeInstances::iterator pos, end = instances.end();
986 for (pos = instances.begin(); pos != end; ++pos) {
987 if (name == pos->name)
988 return pos->create_callback;
Jason Molendaeef51062013-11-05 03:57:19 +0000989 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000990 }
991 return nullptr;
Jason Molendaeef51062013-11-05 03:57:19 +0000992}
993
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000994#pragma mark ObjectFile
995
Kate Stoneb9c1b512016-09-06 20:57:50 +0000996struct ObjectFileInstance {
997 ObjectFileInstance()
998 : name(), description(), create_callback(nullptr),
999 create_memory_callback(nullptr), get_module_specifications(nullptr),
1000 save_core(nullptr) {}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001001
Kate Stoneb9c1b512016-09-06 20:57:50 +00001002 ConstString name;
1003 std::string description;
1004 ObjectFileCreateInstance create_callback;
1005 ObjectFileCreateMemoryInstance create_memory_callback;
1006 ObjectFileGetModuleSpecifications get_module_specifications;
1007 ObjectFileSaveCore save_core;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001008};
1009
1010typedef std::vector<ObjectFileInstance> ObjectFileInstances;
1011
Kate Stoneb9c1b512016-09-06 20:57:50 +00001012static std::recursive_mutex &GetObjectFileMutex() {
1013 static std::recursive_mutex g_instances_mutex;
1014 return g_instances_mutex;
Greg Claytonab65b342011-04-13 22:47:15 +00001015}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001016
Kate Stoneb9c1b512016-09-06 20:57:50 +00001017static ObjectFileInstances &GetObjectFileInstances() {
1018 static ObjectFileInstances g_instances;
1019 return g_instances;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001020}
1021
Kate Stoneb9c1b512016-09-06 20:57:50 +00001022bool PluginManager::RegisterPlugin(
Adrian Prantl0e4c4822019-03-06 21:22:25 +00001023 ConstString name, const char *description,
Kate Stoneb9c1b512016-09-06 20:57:50 +00001024 ObjectFileCreateInstance create_callback,
1025 ObjectFileCreateMemoryInstance create_memory_callback,
1026 ObjectFileGetModuleSpecifications get_module_specifications,
1027 ObjectFileSaveCore save_core) {
1028 if (create_callback) {
1029 ObjectFileInstance instance;
1030 assert((bool)name);
1031 instance.name = name;
1032 if (description && description[0])
1033 instance.description = description;
1034 instance.create_callback = create_callback;
1035 instance.create_memory_callback = create_memory_callback;
1036 instance.save_core = save_core;
1037 instance.get_module_specifications = get_module_specifications;
1038 std::lock_guard<std::recursive_mutex> guard(GetObjectFileMutex());
1039 GetObjectFileInstances().push_back(instance);
1040 }
1041 return false;
1042}
1043
1044bool PluginManager::UnregisterPlugin(ObjectFileCreateInstance create_callback) {
1045 if (create_callback) {
1046 std::lock_guard<std::recursive_mutex> guard(GetObjectFileMutex());
1047 ObjectFileInstances &instances = GetObjectFileInstances();
1048
1049 ObjectFileInstances::iterator pos, end = instances.end();
1050 for (pos = instances.begin(); pos != end; ++pos) {
1051 if (pos->create_callback == create_callback) {
1052 instances.erase(pos);
1053 return true;
1054 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001055 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00001056 }
1057 return false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001058}
1059
1060ObjectFileCreateInstance
Kate Stoneb9c1b512016-09-06 20:57:50 +00001061PluginManager::GetObjectFileCreateCallbackAtIndex(uint32_t idx) {
1062 std::lock_guard<std::recursive_mutex> guard(GetObjectFileMutex());
1063 ObjectFileInstances &instances = GetObjectFileInstances();
1064 if (idx < instances.size())
1065 return instances[idx].create_callback;
1066 return nullptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001067}
Greg Claytonab65b342011-04-13 22:47:15 +00001068
Greg Claytonc9660542012-02-05 02:38:54 +00001069ObjectFileCreateMemoryInstance
Kate Stoneb9c1b512016-09-06 20:57:50 +00001070PluginManager::GetObjectFileCreateMemoryCallbackAtIndex(uint32_t idx) {
1071 std::lock_guard<std::recursive_mutex> guard(GetObjectFileMutex());
1072 ObjectFileInstances &instances = GetObjectFileInstances();
1073 if (idx < instances.size())
1074 return instances[idx].create_memory_callback;
1075 return nullptr;
Greg Claytonc9660542012-02-05 02:38:54 +00001076}
1077
Greg Claytonf4d6de62013-04-24 22:29:28 +00001078ObjectFileGetModuleSpecifications
Kate Stoneb9c1b512016-09-06 20:57:50 +00001079PluginManager::GetObjectFileGetModuleSpecificationsCallbackAtIndex(
1080 uint32_t idx) {
1081 std::lock_guard<std::recursive_mutex> guard(GetObjectFileMutex());
1082 ObjectFileInstances &instances = GetObjectFileInstances();
1083 if (idx < instances.size())
1084 return instances[idx].get_module_specifications;
1085 return nullptr;
Greg Claytonf4d6de62013-04-24 22:29:28 +00001086}
1087
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001088ObjectFileCreateInstance
Kate Stoneb9c1b512016-09-06 20:57:50 +00001089PluginManager::GetObjectFileCreateCallbackForPluginName(
Adrian Prantl0e4c4822019-03-06 21:22:25 +00001090 ConstString name) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00001091 if (name) {
1092 std::lock_guard<std::recursive_mutex> guard(GetObjectFileMutex());
1093 ObjectFileInstances &instances = GetObjectFileInstances();
1094
1095 ObjectFileInstances::iterator pos, end = instances.end();
1096 for (pos = instances.begin(); pos != end; ++pos) {
1097 if (name == pos->name)
1098 return pos->create_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001099 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00001100 }
1101 return nullptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001102}
1103
Greg Claytonc9660542012-02-05 02:38:54 +00001104ObjectFileCreateMemoryInstance
Kate Stoneb9c1b512016-09-06 20:57:50 +00001105PluginManager::GetObjectFileCreateMemoryCallbackForPluginName(
Adrian Prantl0e4c4822019-03-06 21:22:25 +00001106 ConstString name) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00001107 if (name) {
1108 std::lock_guard<std::recursive_mutex> guard(GetObjectFileMutex());
1109 ObjectFileInstances &instances = GetObjectFileInstances();
1110
1111 ObjectFileInstances::iterator pos, end = instances.end();
1112 for (pos = instances.begin(); pos != end; ++pos) {
1113 if (name == pos->name)
1114 return pos->create_memory_callback;
Greg Claytonc9660542012-02-05 02:38:54 +00001115 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00001116 }
1117 return nullptr;
Greg Claytonc9660542012-02-05 02:38:54 +00001118}
1119
Zachary Turner97206d52017-05-12 04:51:55 +00001120Status PluginManager::SaveCore(const lldb::ProcessSP &process_sp,
1121 const FileSpec &outfile) {
1122 Status error;
Kate Stoneb9c1b512016-09-06 20:57:50 +00001123 std::lock_guard<std::recursive_mutex> guard(GetObjectFileMutex());
1124 ObjectFileInstances &instances = GetObjectFileInstances();
1125
1126 ObjectFileInstances::iterator pos, end = instances.end();
1127 for (pos = instances.begin(); pos != end; ++pos) {
1128 if (pos->save_core && pos->save_core(process_sp, outfile, error))
1129 return error;
1130 }
1131 error.SetErrorString(
1132 "no ObjectFile plugins were able to save a core for this process");
1133 return error;
Greg Claytona2715cf2014-06-13 00:54:12 +00001134}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001135
1136#pragma mark ObjectContainer
1137
Kate Stoneb9c1b512016-09-06 20:57:50 +00001138struct ObjectContainerInstance {
1139 ObjectContainerInstance()
1140 : name(), description(), create_callback(nullptr),
1141 get_module_specifications(nullptr) {}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001142
Kate Stoneb9c1b512016-09-06 20:57:50 +00001143 ConstString name;
1144 std::string description;
1145 ObjectContainerCreateInstance create_callback;
1146 ObjectFileGetModuleSpecifications get_module_specifications;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001147};
1148
1149typedef std::vector<ObjectContainerInstance> ObjectContainerInstances;
1150
Kate Stoneb9c1b512016-09-06 20:57:50 +00001151static std::recursive_mutex &GetObjectContainerMutex() {
1152 static std::recursive_mutex g_instances_mutex;
1153 return g_instances_mutex;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001154}
1155
Kate Stoneb9c1b512016-09-06 20:57:50 +00001156static ObjectContainerInstances &GetObjectContainerInstances() {
1157 static ObjectContainerInstances g_instances;
1158 return g_instances;
Greg Claytonab65b342011-04-13 22:47:15 +00001159}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001160
Kate Stoneb9c1b512016-09-06 20:57:50 +00001161bool PluginManager::RegisterPlugin(
Adrian Prantl0e4c4822019-03-06 21:22:25 +00001162 ConstString name, const char *description,
Kate Stoneb9c1b512016-09-06 20:57:50 +00001163 ObjectContainerCreateInstance create_callback,
1164 ObjectFileGetModuleSpecifications get_module_specifications) {
1165 if (create_callback) {
1166 ObjectContainerInstance instance;
1167 assert((bool)name);
1168 instance.name = name;
1169 if (description && description[0])
1170 instance.description = description;
1171 instance.create_callback = create_callback;
1172 instance.get_module_specifications = get_module_specifications;
Saleem Abdulrasool16ff8602016-05-18 01:59:10 +00001173 std::lock_guard<std::recursive_mutex> guard(GetObjectContainerMutex());
Kate Stoneb9c1b512016-09-06 20:57:50 +00001174 GetObjectContainerInstances().push_back(instance);
1175 }
1176 return false;
1177}
1178
1179bool PluginManager::UnregisterPlugin(
1180 ObjectContainerCreateInstance create_callback) {
1181 if (create_callback) {
1182 std::lock_guard<std::recursive_mutex> guard(GetObjectContainerMutex());
1183 ObjectContainerInstances &instances = GetObjectContainerInstances();
1184
1185 ObjectContainerInstances::iterator pos, end = instances.end();
1186 for (pos = instances.begin(); pos != end; ++pos) {
1187 if (pos->create_callback == create_callback) {
1188 instances.erase(pos);
1189 return true;
1190 }
1191 }
1192 }
1193 return false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001194}
Greg Claytonab65b342011-04-13 22:47:15 +00001195
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001196ObjectContainerCreateInstance
Kate Stoneb9c1b512016-09-06 20:57:50 +00001197PluginManager::GetObjectContainerCreateCallbackAtIndex(uint32_t idx) {
1198 std::lock_guard<std::recursive_mutex> guard(GetObjectContainerMutex());
1199 ObjectContainerInstances &instances = GetObjectContainerInstances();
1200 if (idx < instances.size())
1201 return instances[idx].create_callback;
1202 return nullptr;
1203}
1204
1205ObjectContainerCreateInstance
1206PluginManager::GetObjectContainerCreateCallbackForPluginName(
Adrian Prantl0e4c4822019-03-06 21:22:25 +00001207 ConstString name) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00001208 if (name) {
1209 std::lock_guard<std::recursive_mutex> guard(GetObjectContainerMutex());
1210 ObjectContainerInstances &instances = GetObjectContainerInstances();
1211
1212 ObjectContainerInstances::iterator pos, end = instances.end();
1213 for (pos = instances.begin(); pos != end; ++pos) {
1214 if (name == pos->name)
1215 return pos->create_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001216 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00001217 }
1218 return nullptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001219}
1220
Greg Claytonf4d6de62013-04-24 22:29:28 +00001221ObjectFileGetModuleSpecifications
Kate Stoneb9c1b512016-09-06 20:57:50 +00001222PluginManager::GetObjectContainerGetModuleSpecificationsCallbackAtIndex(
1223 uint32_t idx) {
1224 std::lock_guard<std::recursive_mutex> guard(GetObjectContainerMutex());
1225 ObjectContainerInstances &instances = GetObjectContainerInstances();
1226 if (idx < instances.size())
1227 return instances[idx].get_module_specifications;
1228 return nullptr;
Greg Claytonf4d6de62013-04-24 22:29:28 +00001229}
1230
Greg Claytone996fd32011-03-08 22:40:15 +00001231#pragma mark Platform
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001232
Kate Stoneb9c1b512016-09-06 20:57:50 +00001233struct PlatformInstance {
1234 PlatformInstance()
1235 : name(), description(), create_callback(nullptr),
1236 debugger_init_callback(nullptr) {}
1237
1238 ConstString name;
1239 std::string description;
1240 PlatformCreateInstance create_callback;
1241 DebuggerInitializeCallback debugger_init_callback;
Greg Claytone996fd32011-03-08 22:40:15 +00001242};
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001243
Greg Claytone996fd32011-03-08 22:40:15 +00001244typedef std::vector<PlatformInstance> PlatformInstances;
1245
Kate Stoneb9c1b512016-09-06 20:57:50 +00001246static std::recursive_mutex &GetPlatformInstancesMutex() {
1247 static std::recursive_mutex g_platform_instances_mutex;
1248 return g_platform_instances_mutex;
Greg Claytone996fd32011-03-08 22:40:15 +00001249}
1250
Kate Stoneb9c1b512016-09-06 20:57:50 +00001251static PlatformInstances &GetPlatformInstances() {
1252 static PlatformInstances g_platform_instances;
1253 return g_platform_instances;
Greg Claytonded470d2011-03-19 01:12:21 +00001254}
Greg Claytone996fd32011-03-08 22:40:15 +00001255
Kate Stoneb9c1b512016-09-06 20:57:50 +00001256bool PluginManager::RegisterPlugin(
Adrian Prantl0e4c4822019-03-06 21:22:25 +00001257 ConstString name, const char *description,
Kate Stoneb9c1b512016-09-06 20:57:50 +00001258 PlatformCreateInstance create_callback,
1259 DebuggerInitializeCallback debugger_init_callback) {
1260 if (create_callback) {
1261 std::lock_guard<std::recursive_mutex> guard(GetPlatformInstancesMutex());
Saleem Abdulrasool16ff8602016-05-18 01:59:10 +00001262
Kate Stoneb9c1b512016-09-06 20:57:50 +00001263 PlatformInstance instance;
1264 assert((bool)name);
1265 instance.name = name;
1266 if (description && description[0])
1267 instance.description = description;
1268 instance.create_callback = create_callback;
1269 instance.debugger_init_callback = debugger_init_callback;
1270 GetPlatformInstances().push_back(instance);
1271 return true;
1272 }
1273 return false;
1274}
1275
1276const char *PluginManager::GetPlatformPluginNameAtIndex(uint32_t idx) {
1277 std::lock_guard<std::recursive_mutex> guard(GetPlatformInstancesMutex());
1278 PlatformInstances &instances = GetPlatformInstances();
1279 if (idx < instances.size())
1280 return instances[idx].name.GetCString();
1281 return nullptr;
1282}
1283
1284const char *PluginManager::GetPlatformPluginDescriptionAtIndex(uint32_t idx) {
1285 std::lock_guard<std::recursive_mutex> guard(GetPlatformInstancesMutex());
1286 PlatformInstances &instances = GetPlatformInstances();
1287 if (idx < instances.size())
1288 return instances[idx].description.c_str();
1289 return nullptr;
1290}
1291
1292bool PluginManager::UnregisterPlugin(PlatformCreateInstance create_callback) {
1293 if (create_callback) {
1294 std::lock_guard<std::recursive_mutex> guard(GetPlatformInstancesMutex());
1295 PlatformInstances &instances = GetPlatformInstances();
1296
1297 PlatformInstances::iterator pos, end = instances.end();
1298 for (pos = instances.begin(); pos != end; ++pos) {
1299 if (pos->create_callback == create_callback) {
1300 instances.erase(pos);
Greg Claytonded470d2011-03-19 01:12:21 +00001301 return true;
Kate Stoneb9c1b512016-09-06 20:57:50 +00001302 }
Greg Claytone996fd32011-03-08 22:40:15 +00001303 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00001304 }
1305 return false;
Greg Claytone996fd32011-03-08 22:40:15 +00001306}
1307
1308PlatformCreateInstance
Kate Stoneb9c1b512016-09-06 20:57:50 +00001309PluginManager::GetPlatformCreateCallbackAtIndex(uint32_t idx) {
1310 std::lock_guard<std::recursive_mutex> guard(GetPlatformInstancesMutex());
1311 PlatformInstances &instances = GetPlatformInstances();
1312 if (idx < instances.size())
1313 return instances[idx].create_callback;
1314 return nullptr;
Greg Claytone996fd32011-03-08 22:40:15 +00001315}
1316
1317PlatformCreateInstance
Adrian Prantl0e4c4822019-03-06 21:22:25 +00001318PluginManager::GetPlatformCreateCallbackForPluginName(ConstString name) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00001319 if (name) {
1320 std::lock_guard<std::recursive_mutex> guard(GetPlatformInstancesMutex());
1321 PlatformInstances &instances = GetPlatformInstances();
Greg Claytonded470d2011-03-19 01:12:21 +00001322
Kate Stoneb9c1b512016-09-06 20:57:50 +00001323 PlatformInstances::iterator pos, end = instances.end();
1324 for (pos = instances.begin(); pos != end; ++pos) {
1325 if (name == pos->name)
1326 return pos->create_callback;
Greg Claytone996fd32011-03-08 22:40:15 +00001327 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00001328 }
1329 return nullptr;
Greg Claytone996fd32011-03-08 22:40:15 +00001330}
1331
Zachary Turner4aa87532016-11-17 01:37:42 +00001332size_t PluginManager::AutoCompletePlatformName(llvm::StringRef name,
Kate Stoneb9c1b512016-09-06 20:57:50 +00001333 StringList &matches) {
Zachary Turner4aa87532016-11-17 01:37:42 +00001334 if (name.empty())
1335 return matches.GetSize();
Greg Claytonab65b342011-04-13 22:47:15 +00001336
Zachary Turner4aa87532016-11-17 01:37:42 +00001337 std::lock_guard<std::recursive_mutex> guard(GetPlatformInstancesMutex());
1338 PlatformInstances &instances = GetPlatformInstances();
1339 llvm::StringRef name_sref(name);
1340
1341 PlatformInstances::iterator pos, end = instances.end();
1342 for (pos = instances.begin(); pos != end; ++pos) {
1343 llvm::StringRef plugin_name(pos->name.GetCString());
1344 if (plugin_name.startswith(name_sref))
1345 matches.AppendString(plugin_name.data());
Kate Stoneb9c1b512016-09-06 20:57:50 +00001346 }
1347 return matches.GetSize();
Greg Claytonab65b342011-04-13 22:47:15 +00001348}
Eugene Zelenko89183722016-03-11 21:55:47 +00001349
Greg Claytone996fd32011-03-08 22:40:15 +00001350#pragma mark Process
1351
Kate Stoneb9c1b512016-09-06 20:57:50 +00001352struct ProcessInstance {
1353 ProcessInstance()
1354 : name(), description(), create_callback(nullptr),
1355 debugger_init_callback(nullptr) {}
1356
1357 ConstString name;
1358 std::string description;
1359 ProcessCreateInstance create_callback;
1360 DebuggerInitializeCallback debugger_init_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001361};
1362
1363typedef std::vector<ProcessInstance> ProcessInstances;
1364
Kate Stoneb9c1b512016-09-06 20:57:50 +00001365static std::recursive_mutex &GetProcessMutex() {
1366 static std::recursive_mutex g_instances_mutex;
1367 return g_instances_mutex;
Greg Claytonab65b342011-04-13 22:47:15 +00001368}
1369
Kate Stoneb9c1b512016-09-06 20:57:50 +00001370static ProcessInstances &GetProcessInstances() {
1371 static ProcessInstances g_instances;
1372 return g_instances;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001373}
1374
Kate Stoneb9c1b512016-09-06 20:57:50 +00001375bool PluginManager::RegisterPlugin(
Adrian Prantl0e4c4822019-03-06 21:22:25 +00001376 ConstString name, const char *description,
Kate Stoneb9c1b512016-09-06 20:57:50 +00001377 ProcessCreateInstance create_callback,
1378 DebuggerInitializeCallback debugger_init_callback) {
1379 if (create_callback) {
1380 ProcessInstance instance;
1381 assert((bool)name);
1382 instance.name = name;
1383 if (description && description[0])
1384 instance.description = description;
1385 instance.create_callback = create_callback;
1386 instance.debugger_init_callback = debugger_init_callback;
Saleem Abdulrasool16ff8602016-05-18 01:59:10 +00001387 std::lock_guard<std::recursive_mutex> guard(GetProcessMutex());
Kate Stoneb9c1b512016-09-06 20:57:50 +00001388 GetProcessInstances().push_back(instance);
1389 }
1390 return false;
Greg Claytonbfe5f3b2011-02-18 01:44:25 +00001391}
1392
Kate Stoneb9c1b512016-09-06 20:57:50 +00001393const char *PluginManager::GetProcessPluginNameAtIndex(uint32_t idx) {
1394 std::lock_guard<std::recursive_mutex> guard(GetProcessMutex());
1395 ProcessInstances &instances = GetProcessInstances();
1396 if (idx < instances.size())
1397 return instances[idx].name.GetCString();
1398 return nullptr;
1399}
1400
1401const char *PluginManager::GetProcessPluginDescriptionAtIndex(uint32_t idx) {
1402 std::lock_guard<std::recursive_mutex> guard(GetProcessMutex());
1403 ProcessInstances &instances = GetProcessInstances();
1404 if (idx < instances.size())
1405 return instances[idx].description.c_str();
1406 return nullptr;
1407}
1408
1409bool PluginManager::UnregisterPlugin(ProcessCreateInstance create_callback) {
1410 if (create_callback) {
Saleem Abdulrasool16ff8602016-05-18 01:59:10 +00001411 std::lock_guard<std::recursive_mutex> guard(GetProcessMutex());
Kate Stoneb9c1b512016-09-06 20:57:50 +00001412 ProcessInstances &instances = GetProcessInstances();
Greg Claytonbfe5f3b2011-02-18 01:44:25 +00001413
Kate Stoneb9c1b512016-09-06 20:57:50 +00001414 ProcessInstances::iterator pos, end = instances.end();
1415 for (pos = instances.begin(); pos != end; ++pos) {
1416 if (pos->create_callback == create_callback) {
1417 instances.erase(pos);
1418 return true;
1419 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001420 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00001421 }
1422 return false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001423}
1424
1425ProcessCreateInstance
Kate Stoneb9c1b512016-09-06 20:57:50 +00001426PluginManager::GetProcessCreateCallbackAtIndex(uint32_t idx) {
1427 std::lock_guard<std::recursive_mutex> guard(GetProcessMutex());
1428 ProcessInstances &instances = GetProcessInstances();
1429 if (idx < instances.size())
1430 return instances[idx].create_callback;
1431 return nullptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001432}
1433
1434ProcessCreateInstance
Adrian Prantl0e4c4822019-03-06 21:22:25 +00001435PluginManager::GetProcessCreateCallbackForPluginName(ConstString name) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00001436 if (name) {
1437 std::lock_guard<std::recursive_mutex> guard(GetProcessMutex());
1438 ProcessInstances &instances = GetProcessInstances();
1439
1440 ProcessInstances::iterator pos, end = instances.end();
1441 for (pos = instances.begin(); pos != end; ++pos) {
1442 if (name == pos->name)
1443 return pos->create_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001444 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00001445 }
1446 return nullptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001447}
1448
Zachary Turner2c1f46d2015-07-30 20:28:07 +00001449#pragma mark ScriptInterpreter
1450
Kate Stoneb9c1b512016-09-06 20:57:50 +00001451struct ScriptInterpreterInstance {
1452 ScriptInterpreterInstance()
1453 : name(), language(lldb::eScriptLanguageNone), description(),
1454 create_callback(nullptr) {}
Zachary Turner2c1f46d2015-07-30 20:28:07 +00001455
Kate Stoneb9c1b512016-09-06 20:57:50 +00001456 ConstString name;
1457 lldb::ScriptLanguage language;
1458 std::string description;
1459 ScriptInterpreterCreateInstance create_callback;
Zachary Turner2c1f46d2015-07-30 20:28:07 +00001460};
1461
1462typedef std::vector<ScriptInterpreterInstance> ScriptInterpreterInstances;
1463
Kate Stoneb9c1b512016-09-06 20:57:50 +00001464static std::recursive_mutex &GetScriptInterpreterMutex() {
1465 static std::recursive_mutex g_instances_mutex;
1466 return g_instances_mutex;
Zachary Turner2c1f46d2015-07-30 20:28:07 +00001467}
1468
Kate Stoneb9c1b512016-09-06 20:57:50 +00001469static ScriptInterpreterInstances &GetScriptInterpreterInstances() {
1470 static ScriptInterpreterInstances g_instances;
1471 return g_instances;
Zachary Turner2c1f46d2015-07-30 20:28:07 +00001472}
1473
Kate Stoneb9c1b512016-09-06 20:57:50 +00001474bool PluginManager::RegisterPlugin(
Adrian Prantl0e4c4822019-03-06 21:22:25 +00001475 ConstString name, const char *description,
Kate Stoneb9c1b512016-09-06 20:57:50 +00001476 lldb::ScriptLanguage script_language,
1477 ScriptInterpreterCreateInstance create_callback) {
1478 if (!create_callback)
Zachary Turner2c1f46d2015-07-30 20:28:07 +00001479 return false;
Kate Stoneb9c1b512016-09-06 20:57:50 +00001480 ScriptInterpreterInstance instance;
1481 assert((bool)name);
1482 instance.name = name;
1483 if (description && description[0])
1484 instance.description = description;
1485 instance.create_callback = create_callback;
1486 instance.language = script_language;
1487 std::lock_guard<std::recursive_mutex> guard(GetScriptInterpreterMutex());
1488 GetScriptInterpreterInstances().push_back(instance);
1489 return false;
Zachary Turner2c1f46d2015-07-30 20:28:07 +00001490}
1491
Kate Stoneb9c1b512016-09-06 20:57:50 +00001492bool PluginManager::UnregisterPlugin(
1493 ScriptInterpreterCreateInstance create_callback) {
1494 if (!create_callback)
Zachary Turner2c1f46d2015-07-30 20:28:07 +00001495 return false;
Kate Stoneb9c1b512016-09-06 20:57:50 +00001496 std::lock_guard<std::recursive_mutex> guard(GetScriptInterpreterMutex());
1497 ScriptInterpreterInstances &instances = GetScriptInterpreterInstances();
1498
1499 ScriptInterpreterInstances::iterator pos, end = instances.end();
1500 for (pos = instances.begin(); pos != end; ++pos) {
1501 if (pos->create_callback != create_callback)
1502 continue;
1503
1504 instances.erase(pos);
1505 return true;
1506 }
1507 return false;
Zachary Turner2c1f46d2015-07-30 20:28:07 +00001508}
1509
1510ScriptInterpreterCreateInstance
Kate Stoneb9c1b512016-09-06 20:57:50 +00001511PluginManager::GetScriptInterpreterCreateCallbackAtIndex(uint32_t idx) {
1512 std::lock_guard<std::recursive_mutex> guard(GetScriptInterpreterMutex());
1513 ScriptInterpreterInstances &instances = GetScriptInterpreterInstances();
1514 if (idx < instances.size())
1515 return instances[idx].create_callback;
1516 return nullptr;
Zachary Turner2c1f46d2015-07-30 20:28:07 +00001517}
1518
Jonas Devlieghere8d1fb842019-04-26 17:58:19 +00001519lldb::ScriptInterpreterSP
1520PluginManager::GetScriptInterpreterForLanguage(lldb::ScriptLanguage script_lang,
1521 Debugger &debugger) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00001522 std::lock_guard<std::recursive_mutex> guard(GetScriptInterpreterMutex());
1523 ScriptInterpreterInstances &instances = GetScriptInterpreterInstances();
Zachary Turner2c1f46d2015-07-30 20:28:07 +00001524
Kate Stoneb9c1b512016-09-06 20:57:50 +00001525 ScriptInterpreterInstances::iterator pos, end = instances.end();
1526 ScriptInterpreterCreateInstance none_instance = nullptr;
1527 for (pos = instances.begin(); pos != end; ++pos) {
1528 if (pos->language == lldb::eScriptLanguageNone)
1529 none_instance = pos->create_callback;
Zachary Turner2c1f46d2015-07-30 20:28:07 +00001530
Kate Stoneb9c1b512016-09-06 20:57:50 +00001531 if (script_lang == pos->language)
Jonas Devlieghere8d1fb842019-04-26 17:58:19 +00001532 return pos->create_callback(debugger);
Kate Stoneb9c1b512016-09-06 20:57:50 +00001533 }
Zachary Turner2c1f46d2015-07-30 20:28:07 +00001534
Kate Stoneb9c1b512016-09-06 20:57:50 +00001535 // If we didn't find one, return the ScriptInterpreter for the null language.
1536 assert(none_instance != nullptr);
Jonas Devlieghere8d1fb842019-04-26 17:58:19 +00001537 return none_instance(debugger);
Zachary Turner2c1f46d2015-07-30 20:28:07 +00001538}
1539
Todd Fiala75930012016-08-19 04:21:48 +00001540#pragma mark -
1541#pragma mark StructuredDataPlugin
1542
Todd Fiala75930012016-08-19 04:21:48 +00001543// StructuredDataPlugin
Todd Fiala75930012016-08-19 04:21:48 +00001544
Kate Stoneb9c1b512016-09-06 20:57:50 +00001545struct StructuredDataPluginInstance {
1546 StructuredDataPluginInstance()
1547 : name(), description(), create_callback(nullptr),
1548 debugger_init_callback(nullptr), filter_callback(nullptr) {}
Todd Fiala75930012016-08-19 04:21:48 +00001549
Kate Stoneb9c1b512016-09-06 20:57:50 +00001550 ConstString name;
1551 std::string description;
1552 StructuredDataPluginCreateInstance create_callback;
1553 DebuggerInitializeCallback debugger_init_callback;
1554 StructuredDataFilterLaunchInfo filter_callback;
Todd Fiala75930012016-08-19 04:21:48 +00001555};
1556
1557typedef std::vector<StructuredDataPluginInstance> StructuredDataPluginInstances;
1558
Kate Stoneb9c1b512016-09-06 20:57:50 +00001559static std::recursive_mutex &GetStructuredDataPluginMutex() {
1560 static std::recursive_mutex g_instances_mutex;
1561 return g_instances_mutex;
Todd Fiala75930012016-08-19 04:21:48 +00001562}
1563
Kate Stoneb9c1b512016-09-06 20:57:50 +00001564static StructuredDataPluginInstances &GetStructuredDataPluginInstances() {
1565 static StructuredDataPluginInstances g_instances;
1566 return g_instances;
Todd Fiala75930012016-08-19 04:21:48 +00001567}
1568
Kate Stoneb9c1b512016-09-06 20:57:50 +00001569bool PluginManager::RegisterPlugin(
Adrian Prantl0e4c4822019-03-06 21:22:25 +00001570 ConstString name, const char *description,
Kate Stoneb9c1b512016-09-06 20:57:50 +00001571 StructuredDataPluginCreateInstance create_callback,
1572 DebuggerInitializeCallback debugger_init_callback,
1573 StructuredDataFilterLaunchInfo filter_callback) {
1574 if (create_callback) {
1575 StructuredDataPluginInstance instance;
1576 assert((bool)name);
1577 instance.name = name;
1578 if (description && description[0])
1579 instance.description = description;
1580 instance.create_callback = create_callback;
1581 instance.debugger_init_callback = debugger_init_callback;
1582 instance.filter_callback = filter_callback;
1583 std::lock_guard<std::recursive_mutex> guard(GetStructuredDataPluginMutex());
1584 GetStructuredDataPluginInstances().push_back(instance);
1585 }
1586 return false;
Todd Fiala75930012016-08-19 04:21:48 +00001587}
1588
Kate Stoneb9c1b512016-09-06 20:57:50 +00001589bool PluginManager::UnregisterPlugin(
1590 StructuredDataPluginCreateInstance create_callback) {
1591 if (create_callback) {
Todd Fiala75930012016-08-19 04:21:48 +00001592 std::lock_guard<std::recursive_mutex> guard(GetStructuredDataPluginMutex());
1593 StructuredDataPluginInstances &instances =
1594 GetStructuredDataPluginInstances();
Kate Stoneb9c1b512016-09-06 20:57:50 +00001595
1596 StructuredDataPluginInstances::iterator pos, end = instances.end();
1597 for (pos = instances.begin(); pos != end; ++pos) {
1598 if (pos->create_callback == create_callback) {
1599 instances.erase(pos);
1600 return true;
1601 }
1602 }
1603 }
1604 return false;
1605}
1606
1607StructuredDataPluginCreateInstance
1608PluginManager::GetStructuredDataPluginCreateCallbackAtIndex(uint32_t idx) {
1609 std::lock_guard<std::recursive_mutex> guard(GetStructuredDataPluginMutex());
1610 StructuredDataPluginInstances &instances = GetStructuredDataPluginInstances();
1611 if (idx < instances.size())
1612 return instances[idx].create_callback;
1613 return nullptr;
Todd Fiala75930012016-08-19 04:21:48 +00001614}
1615
1616StructuredDataPluginCreateInstance
1617PluginManager::GetStructuredDataPluginCreateCallbackForPluginName(
Adrian Prantl0e4c4822019-03-06 21:22:25 +00001618 ConstString name) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00001619 if (name) {
Todd Fiala75930012016-08-19 04:21:48 +00001620 std::lock_guard<std::recursive_mutex> guard(GetStructuredDataPluginMutex());
1621 StructuredDataPluginInstances &instances =
1622 GetStructuredDataPluginInstances();
Kate Stoneb9c1b512016-09-06 20:57:50 +00001623
1624 StructuredDataPluginInstances::iterator pos, end = instances.end();
1625 for (pos = instances.begin(); pos != end; ++pos) {
1626 if (name == pos->name)
1627 return pos->create_callback;
Todd Fiala75930012016-08-19 04:21:48 +00001628 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00001629 }
1630 return nullptr;
1631}
1632
1633StructuredDataFilterLaunchInfo
1634PluginManager::GetStructuredDataFilterCallbackAtIndex(
1635 uint32_t idx, bool &iteration_complete) {
1636 std::lock_guard<std::recursive_mutex> guard(GetStructuredDataPluginMutex());
1637 StructuredDataPluginInstances &instances = GetStructuredDataPluginInstances();
1638 if (idx < instances.size()) {
1639 iteration_complete = false;
1640 return instances[idx].filter_callback;
1641 } else {
1642 iteration_complete = true;
1643 }
1644 return nullptr;
Todd Fiala75930012016-08-19 04:21:48 +00001645}
1646
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001647#pragma mark SymbolFile
1648
Kate Stoneb9c1b512016-09-06 20:57:50 +00001649struct SymbolFileInstance {
1650 SymbolFileInstance()
1651 : name(), description(), create_callback(nullptr),
1652 debugger_init_callback(nullptr) {}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001653
Kate Stoneb9c1b512016-09-06 20:57:50 +00001654 ConstString name;
1655 std::string description;
1656 SymbolFileCreateInstance create_callback;
1657 DebuggerInitializeCallback debugger_init_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001658};
1659
1660typedef std::vector<SymbolFileInstance> SymbolFileInstances;
1661
Kate Stoneb9c1b512016-09-06 20:57:50 +00001662static std::recursive_mutex &GetSymbolFileMutex() {
1663 static std::recursive_mutex g_instances_mutex;
1664 return g_instances_mutex;
Greg Claytonab65b342011-04-13 22:47:15 +00001665}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001666
Kate Stoneb9c1b512016-09-06 20:57:50 +00001667static SymbolFileInstances &GetSymbolFileInstances() {
1668 static SymbolFileInstances g_instances;
1669 return g_instances;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001670}
1671
Kate Stoneb9c1b512016-09-06 20:57:50 +00001672bool PluginManager::RegisterPlugin(
Adrian Prantl0e4c4822019-03-06 21:22:25 +00001673 ConstString name, const char *description,
Kate Stoneb9c1b512016-09-06 20:57:50 +00001674 SymbolFileCreateInstance create_callback,
1675 DebuggerInitializeCallback debugger_init_callback) {
1676 if (create_callback) {
1677 SymbolFileInstance instance;
1678 assert((bool)name);
1679 instance.name = name;
1680 if (description && description[0])
1681 instance.description = description;
1682 instance.create_callback = create_callback;
1683 instance.debugger_init_callback = debugger_init_callback;
Saleem Abdulrasool16ff8602016-05-18 01:59:10 +00001684 std::lock_guard<std::recursive_mutex> guard(GetSymbolFileMutex());
Kate Stoneb9c1b512016-09-06 20:57:50 +00001685 GetSymbolFileInstances().push_back(instance);
1686 }
1687 return false;
1688}
1689
1690bool PluginManager::UnregisterPlugin(SymbolFileCreateInstance create_callback) {
1691 if (create_callback) {
1692 std::lock_guard<std::recursive_mutex> guard(GetSymbolFileMutex());
1693 SymbolFileInstances &instances = GetSymbolFileInstances();
1694
1695 SymbolFileInstances::iterator pos, end = instances.end();
1696 for (pos = instances.begin(); pos != end; ++pos) {
1697 if (pos->create_callback == create_callback) {
1698 instances.erase(pos);
1699 return true;
1700 }
1701 }
1702 }
1703 return false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001704}
Greg Claytonab65b342011-04-13 22:47:15 +00001705
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001706SymbolFileCreateInstance
Kate Stoneb9c1b512016-09-06 20:57:50 +00001707PluginManager::GetSymbolFileCreateCallbackAtIndex(uint32_t idx) {
1708 std::lock_guard<std::recursive_mutex> guard(GetSymbolFileMutex());
1709 SymbolFileInstances &instances = GetSymbolFileInstances();
1710 if (idx < instances.size())
1711 return instances[idx].create_callback;
1712 return nullptr;
1713}
1714
1715SymbolFileCreateInstance
1716PluginManager::GetSymbolFileCreateCallbackForPluginName(
Adrian Prantl0e4c4822019-03-06 21:22:25 +00001717 ConstString name) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00001718 if (name) {
1719 std::lock_guard<std::recursive_mutex> guard(GetSymbolFileMutex());
1720 SymbolFileInstances &instances = GetSymbolFileInstances();
1721
1722 SymbolFileInstances::iterator pos, end = instances.end();
1723 for (pos = instances.begin(); pos != end; ++pos) {
1724 if (name == pos->name)
1725 return pos->create_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001726 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00001727 }
1728 return nullptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001729}
1730
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001731#pragma mark SymbolVendor
1732
Kate Stoneb9c1b512016-09-06 20:57:50 +00001733struct SymbolVendorInstance {
1734 SymbolVendorInstance() : name(), description(), create_callback(nullptr) {}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001735
Kate Stoneb9c1b512016-09-06 20:57:50 +00001736 ConstString name;
1737 std::string description;
1738 SymbolVendorCreateInstance create_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001739};
1740
1741typedef std::vector<SymbolVendorInstance> SymbolVendorInstances;
1742
Kate Stoneb9c1b512016-09-06 20:57:50 +00001743static std::recursive_mutex &GetSymbolVendorMutex() {
1744 static std::recursive_mutex g_instances_mutex;
1745 return g_instances_mutex;
Greg Claytonab65b342011-04-13 22:47:15 +00001746}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001747
Kate Stoneb9c1b512016-09-06 20:57:50 +00001748static SymbolVendorInstances &GetSymbolVendorInstances() {
1749 static SymbolVendorInstances g_instances;
1750 return g_instances;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001751}
1752
Adrian Prantl0e4c4822019-03-06 21:22:25 +00001753bool PluginManager::RegisterPlugin(ConstString name,
Kate Stoneb9c1b512016-09-06 20:57:50 +00001754 const char *description,
1755 SymbolVendorCreateInstance create_callback) {
1756 if (create_callback) {
1757 SymbolVendorInstance instance;
1758 assert((bool)name);
1759 instance.name = name;
1760 if (description && description[0])
1761 instance.description = description;
1762 instance.create_callback = create_callback;
Saleem Abdulrasool16ff8602016-05-18 01:59:10 +00001763 std::lock_guard<std::recursive_mutex> guard(GetSymbolVendorMutex());
Kate Stoneb9c1b512016-09-06 20:57:50 +00001764 GetSymbolVendorInstances().push_back(instance);
1765 }
1766 return false;
1767}
1768
1769bool PluginManager::UnregisterPlugin(
1770 SymbolVendorCreateInstance create_callback) {
1771 if (create_callback) {
1772 std::lock_guard<std::recursive_mutex> guard(GetSymbolVendorMutex());
1773 SymbolVendorInstances &instances = GetSymbolVendorInstances();
1774
1775 SymbolVendorInstances::iterator pos, end = instances.end();
1776 for (pos = instances.begin(); pos != end; ++pos) {
1777 if (pos->create_callback == create_callback) {
1778 instances.erase(pos);
1779 return true;
1780 }
1781 }
1782 }
1783 return false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001784}
1785
1786SymbolVendorCreateInstance
Kate Stoneb9c1b512016-09-06 20:57:50 +00001787PluginManager::GetSymbolVendorCreateCallbackAtIndex(uint32_t idx) {
1788 std::lock_guard<std::recursive_mutex> guard(GetSymbolVendorMutex());
1789 SymbolVendorInstances &instances = GetSymbolVendorInstances();
1790 if (idx < instances.size())
1791 return instances[idx].create_callback;
1792 return nullptr;
1793}
1794
1795SymbolVendorCreateInstance
1796PluginManager::GetSymbolVendorCreateCallbackForPluginName(
Adrian Prantl0e4c4822019-03-06 21:22:25 +00001797 ConstString name) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00001798 if (name) {
1799 std::lock_guard<std::recursive_mutex> guard(GetSymbolVendorMutex());
1800 SymbolVendorInstances &instances = GetSymbolVendorInstances();
1801
1802 SymbolVendorInstances::iterator pos, end = instances.end();
1803 for (pos = instances.begin(); pos != end; ++pos) {
1804 if (name == pos->name)
1805 return pos->create_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001806 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00001807 }
1808 return nullptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001809}
1810
Greg Clayton7be25422011-04-25 21:14:26 +00001811#pragma mark UnwindAssembly
Jason Molendafbcb7f22010-09-10 07:49:16 +00001812
Kate Stoneb9c1b512016-09-06 20:57:50 +00001813struct UnwindAssemblyInstance {
1814 UnwindAssemblyInstance() : name(), description(), create_callback(nullptr) {}
Jason Molendafbcb7f22010-09-10 07:49:16 +00001815
Kate Stoneb9c1b512016-09-06 20:57:50 +00001816 ConstString name;
1817 std::string description;
1818 UnwindAssemblyCreateInstance create_callback;
Jason Molendafbcb7f22010-09-10 07:49:16 +00001819};
1820
Greg Clayton7be25422011-04-25 21:14:26 +00001821typedef std::vector<UnwindAssemblyInstance> UnwindAssemblyInstances;
Jason Molendafbcb7f22010-09-10 07:49:16 +00001822
Kate Stoneb9c1b512016-09-06 20:57:50 +00001823static std::recursive_mutex &GetUnwindAssemblyMutex() {
1824 static std::recursive_mutex g_instances_mutex;
1825 return g_instances_mutex;
Greg Claytonab65b342011-04-13 22:47:15 +00001826}
Jason Molendafbcb7f22010-09-10 07:49:16 +00001827
Kate Stoneb9c1b512016-09-06 20:57:50 +00001828static UnwindAssemblyInstances &GetUnwindAssemblyInstances() {
1829 static UnwindAssemblyInstances g_instances;
1830 return g_instances;
Jason Molendafbcb7f22010-09-10 07:49:16 +00001831}
1832
Kate Stoneb9c1b512016-09-06 20:57:50 +00001833bool PluginManager::RegisterPlugin(
Adrian Prantl0e4c4822019-03-06 21:22:25 +00001834 ConstString name, const char *description,
Kate Stoneb9c1b512016-09-06 20:57:50 +00001835 UnwindAssemblyCreateInstance create_callback) {
1836 if (create_callback) {
1837 UnwindAssemblyInstance instance;
1838 assert((bool)name);
1839 instance.name = name;
1840 if (description && description[0])
1841 instance.description = description;
1842 instance.create_callback = create_callback;
Saleem Abdulrasool16ff8602016-05-18 01:59:10 +00001843 std::lock_guard<std::recursive_mutex> guard(GetUnwindAssemblyMutex());
Kate Stoneb9c1b512016-09-06 20:57:50 +00001844 GetUnwindAssemblyInstances().push_back(instance);
1845 }
1846 return false;
1847}
1848
1849bool PluginManager::UnregisterPlugin(
1850 UnwindAssemblyCreateInstance create_callback) {
1851 if (create_callback) {
1852 std::lock_guard<std::recursive_mutex> guard(GetUnwindAssemblyMutex());
1853 UnwindAssemblyInstances &instances = GetUnwindAssemblyInstances();
1854
1855 UnwindAssemblyInstances::iterator pos, end = instances.end();
1856 for (pos = instances.begin(); pos != end; ++pos) {
1857 if (pos->create_callback == create_callback) {
1858 instances.erase(pos);
1859 return true;
1860 }
1861 }
1862 }
1863 return false;
Jason Molendafbcb7f22010-09-10 07:49:16 +00001864}
1865
Greg Clayton7be25422011-04-25 21:14:26 +00001866UnwindAssemblyCreateInstance
Kate Stoneb9c1b512016-09-06 20:57:50 +00001867PluginManager::GetUnwindAssemblyCreateCallbackAtIndex(uint32_t idx) {
1868 std::lock_guard<std::recursive_mutex> guard(GetUnwindAssemblyMutex());
1869 UnwindAssemblyInstances &instances = GetUnwindAssemblyInstances();
1870 if (idx < instances.size())
1871 return instances[idx].create_callback;
1872 return nullptr;
1873}
1874
1875UnwindAssemblyCreateInstance
1876PluginManager::GetUnwindAssemblyCreateCallbackForPluginName(
Adrian Prantl0e4c4822019-03-06 21:22:25 +00001877 ConstString name) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00001878 if (name) {
1879 std::lock_guard<std::recursive_mutex> guard(GetUnwindAssemblyMutex());
1880 UnwindAssemblyInstances &instances = GetUnwindAssemblyInstances();
1881
1882 UnwindAssemblyInstances::iterator pos, end = instances.end();
1883 for (pos = instances.begin(); pos != end; ++pos) {
1884 if (name == pos->name)
1885 return pos->create_callback;
Jason Molendafbcb7f22010-09-10 07:49:16 +00001886 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00001887 }
1888 return nullptr;
Jason Molendafbcb7f22010-09-10 07:49:16 +00001889}
1890
Kuba Breckabeed8212014-09-04 01:03:18 +00001891#pragma mark MemoryHistory
1892
Kate Stoneb9c1b512016-09-06 20:57:50 +00001893struct MemoryHistoryInstance {
1894 MemoryHistoryInstance() : name(), description(), create_callback(nullptr) {}
1895
1896 ConstString name;
1897 std::string description;
1898 MemoryHistoryCreateInstance create_callback;
Kuba Breckabeed8212014-09-04 01:03:18 +00001899};
1900
1901typedef std::vector<MemoryHistoryInstance> MemoryHistoryInstances;
1902
Kate Stoneb9c1b512016-09-06 20:57:50 +00001903static std::recursive_mutex &GetMemoryHistoryMutex() {
1904 static std::recursive_mutex g_instances_mutex;
1905 return g_instances_mutex;
Kuba Breckabeed8212014-09-04 01:03:18 +00001906}
1907
Kate Stoneb9c1b512016-09-06 20:57:50 +00001908static MemoryHistoryInstances &GetMemoryHistoryInstances() {
1909 static MemoryHistoryInstances g_instances;
1910 return g_instances;
Kuba Breckabeed8212014-09-04 01:03:18 +00001911}
1912
Kate Stoneb9c1b512016-09-06 20:57:50 +00001913bool PluginManager::RegisterPlugin(
Adrian Prantl0e4c4822019-03-06 21:22:25 +00001914 ConstString name, const char *description,
Kate Stoneb9c1b512016-09-06 20:57:50 +00001915 MemoryHistoryCreateInstance create_callback) {
1916 if (create_callback) {
1917 MemoryHistoryInstance instance;
1918 assert((bool)name);
1919 instance.name = name;
1920 if (description && description[0])
1921 instance.description = description;
1922 instance.create_callback = create_callback;
Saleem Abdulrasool16ff8602016-05-18 01:59:10 +00001923 std::lock_guard<std::recursive_mutex> guard(GetMemoryHistoryMutex());
Kate Stoneb9c1b512016-09-06 20:57:50 +00001924 GetMemoryHistoryInstances().push_back(instance);
1925 }
1926 return false;
1927}
1928
1929bool PluginManager::UnregisterPlugin(
1930 MemoryHistoryCreateInstance create_callback) {
1931 if (create_callback) {
1932 std::lock_guard<std::recursive_mutex> guard(GetMemoryHistoryMutex());
1933 MemoryHistoryInstances &instances = GetMemoryHistoryInstances();
1934
1935 MemoryHistoryInstances::iterator pos, end = instances.end();
1936 for (pos = instances.begin(); pos != end; ++pos) {
1937 if (pos->create_callback == create_callback) {
1938 instances.erase(pos);
1939 return true;
1940 }
1941 }
1942 }
1943 return false;
Kuba Breckabeed8212014-09-04 01:03:18 +00001944}
1945
Kuba Breckabeed8212014-09-04 01:03:18 +00001946MemoryHistoryCreateInstance
Kate Stoneb9c1b512016-09-06 20:57:50 +00001947PluginManager::GetMemoryHistoryCreateCallbackAtIndex(uint32_t idx) {
1948 std::lock_guard<std::recursive_mutex> guard(GetMemoryHistoryMutex());
1949 MemoryHistoryInstances &instances = GetMemoryHistoryInstances();
1950 if (idx < instances.size())
1951 return instances[idx].create_callback;
1952 return nullptr;
1953}
1954
1955MemoryHistoryCreateInstance
1956PluginManager::GetMemoryHistoryCreateCallbackForPluginName(
Adrian Prantl0e4c4822019-03-06 21:22:25 +00001957 ConstString name) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00001958 if (name) {
1959 std::lock_guard<std::recursive_mutex> guard(GetMemoryHistoryMutex());
1960 MemoryHistoryInstances &instances = GetMemoryHistoryInstances();
1961
1962 MemoryHistoryInstances::iterator pos, end = instances.end();
1963 for (pos = instances.begin(); pos != end; ++pos) {
1964 if (name == pos->name)
1965 return pos->create_callback;
Kuba Breckabeed8212014-09-04 01:03:18 +00001966 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00001967 }
1968 return nullptr;
Kuba Breckabeed8212014-09-04 01:03:18 +00001969}
1970
Kuba Breckaafdf8422014-10-10 23:43:03 +00001971#pragma mark InstrumentationRuntime
1972
Kate Stoneb9c1b512016-09-06 20:57:50 +00001973struct InstrumentationRuntimeInstance {
1974 InstrumentationRuntimeInstance()
1975 : name(), description(), create_callback(nullptr) {}
1976
1977 ConstString name;
1978 std::string description;
1979 InstrumentationRuntimeCreateInstance create_callback;
1980 InstrumentationRuntimeGetType get_type_callback;
Kuba Breckaafdf8422014-10-10 23:43:03 +00001981};
1982
Kate Stoneb9c1b512016-09-06 20:57:50 +00001983typedef std::vector<InstrumentationRuntimeInstance>
1984 InstrumentationRuntimeInstances;
Kuba Breckaafdf8422014-10-10 23:43:03 +00001985
Kate Stoneb9c1b512016-09-06 20:57:50 +00001986static std::recursive_mutex &GetInstrumentationRuntimeMutex() {
1987 static std::recursive_mutex g_instances_mutex;
1988 return g_instances_mutex;
Kuba Breckaafdf8422014-10-10 23:43:03 +00001989}
1990
Kate Stoneb9c1b512016-09-06 20:57:50 +00001991static InstrumentationRuntimeInstances &GetInstrumentationRuntimeInstances() {
1992 static InstrumentationRuntimeInstances g_instances;
1993 return g_instances;
Kuba Breckaafdf8422014-10-10 23:43:03 +00001994}
1995
Kate Stoneb9c1b512016-09-06 20:57:50 +00001996bool PluginManager::RegisterPlugin(
Adrian Prantl0e4c4822019-03-06 21:22:25 +00001997 ConstString name, const char *description,
Kate Stoneb9c1b512016-09-06 20:57:50 +00001998 InstrumentationRuntimeCreateInstance create_callback,
1999 InstrumentationRuntimeGetType get_type_callback) {
2000 if (create_callback) {
2001 InstrumentationRuntimeInstance instance;
2002 assert((bool)name);
2003 instance.name = name;
2004 if (description && description[0])
2005 instance.description = description;
2006 instance.create_callback = create_callback;
2007 instance.get_type_callback = get_type_callback;
2008 std::lock_guard<std::recursive_mutex> guard(
2009 GetInstrumentationRuntimeMutex());
2010 GetInstrumentationRuntimeInstances().push_back(instance);
2011 }
2012 return false;
2013}
2014
2015bool PluginManager::UnregisterPlugin(
2016 InstrumentationRuntimeCreateInstance create_callback) {
2017 if (create_callback) {
2018 std::lock_guard<std::recursive_mutex> guard(
2019 GetInstrumentationRuntimeMutex());
2020 InstrumentationRuntimeInstances &instances =
2021 GetInstrumentationRuntimeInstances();
2022
2023 InstrumentationRuntimeInstances::iterator pos, end = instances.end();
2024 for (pos = instances.begin(); pos != end; ++pos) {
2025 if (pos->create_callback == create_callback) {
2026 instances.erase(pos);
2027 return true;
2028 }
Kuba Breckaafdf8422014-10-10 23:43:03 +00002029 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00002030 }
2031 return false;
Kuba Breckaafdf8422014-10-10 23:43:03 +00002032}
2033
2034InstrumentationRuntimeGetType
Kate Stoneb9c1b512016-09-06 20:57:50 +00002035PluginManager::GetInstrumentationRuntimeGetTypeCallbackAtIndex(uint32_t idx) {
2036 std::lock_guard<std::recursive_mutex> guard(GetInstrumentationRuntimeMutex());
2037 InstrumentationRuntimeInstances &instances =
2038 GetInstrumentationRuntimeInstances();
2039 if (idx < instances.size())
2040 return instances[idx].get_type_callback;
2041 return nullptr;
Kuba Breckaafdf8422014-10-10 23:43:03 +00002042}
2043
2044InstrumentationRuntimeCreateInstance
Kate Stoneb9c1b512016-09-06 20:57:50 +00002045PluginManager::GetInstrumentationRuntimeCreateCallbackAtIndex(uint32_t idx) {
2046 std::lock_guard<std::recursive_mutex> guard(GetInstrumentationRuntimeMutex());
2047 InstrumentationRuntimeInstances &instances =
2048 GetInstrumentationRuntimeInstances();
2049 if (idx < instances.size())
2050 return instances[idx].create_callback;
2051 return nullptr;
Kuba Breckaafdf8422014-10-10 23:43:03 +00002052}
2053
Kuba Breckaafdf8422014-10-10 23:43:03 +00002054InstrumentationRuntimeCreateInstance
Kate Stoneb9c1b512016-09-06 20:57:50 +00002055PluginManager::GetInstrumentationRuntimeCreateCallbackForPluginName(
Adrian Prantl0e4c4822019-03-06 21:22:25 +00002056 ConstString name) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00002057 if (name) {
2058 std::lock_guard<std::recursive_mutex> guard(
2059 GetInstrumentationRuntimeMutex());
2060 InstrumentationRuntimeInstances &instances =
2061 GetInstrumentationRuntimeInstances();
2062
2063 InstrumentationRuntimeInstances::iterator pos, end = instances.end();
2064 for (pos = instances.begin(); pos != end; ++pos) {
2065 if (name == pos->name)
2066 return pos->create_callback;
Kuba Breckaafdf8422014-10-10 23:43:03 +00002067 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00002068 }
2069 return nullptr;
Kuba Breckaafdf8422014-10-10 23:43:03 +00002070}
2071
Greg Clayton56939cb2015-09-17 22:23:34 +00002072#pragma mark TypeSystem
2073
Kate Stoneb9c1b512016-09-06 20:57:50 +00002074struct TypeSystemInstance {
2075 TypeSystemInstance() : name(), description(), create_callback(nullptr) {}
Greg Clayton56939cb2015-09-17 22:23:34 +00002076
Kate Stoneb9c1b512016-09-06 20:57:50 +00002077 ConstString name;
2078 std::string description;
2079 TypeSystemCreateInstance create_callback;
2080 TypeSystemEnumerateSupportedLanguages enumerate_callback;
Greg Clayton56939cb2015-09-17 22:23:34 +00002081};
2082
2083typedef std::vector<TypeSystemInstance> TypeSystemInstances;
2084
Kate Stoneb9c1b512016-09-06 20:57:50 +00002085static std::recursive_mutex &GetTypeSystemMutex() {
2086 static std::recursive_mutex g_instances_mutex;
2087 return g_instances_mutex;
Greg Clayton56939cb2015-09-17 22:23:34 +00002088}
2089
Kate Stoneb9c1b512016-09-06 20:57:50 +00002090static TypeSystemInstances &GetTypeSystemInstances() {
2091 static TypeSystemInstances g_instances;
2092 return g_instances;
Greg Clayton56939cb2015-09-17 22:23:34 +00002093}
2094
Adrian Prantl0e4c4822019-03-06 21:22:25 +00002095bool PluginManager::RegisterPlugin(ConstString name,
Kate Stoneb9c1b512016-09-06 20:57:50 +00002096 const char *description,
2097 TypeSystemCreateInstance create_callback,
2098 TypeSystemEnumerateSupportedLanguages
2099 enumerate_supported_languages_callback) {
2100 if (create_callback) {
2101 TypeSystemInstance instance;
2102 assert((bool)name);
2103 instance.name = name;
2104 if (description && description[0])
2105 instance.description = description;
2106 instance.create_callback = create_callback;
2107 instance.enumerate_callback = enumerate_supported_languages_callback;
2108 std::lock_guard<std::recursive_mutex> guard(GetTypeSystemMutex());
2109 GetTypeSystemInstances().push_back(instance);
2110 }
2111 return false;
2112}
2113
2114bool PluginManager::UnregisterPlugin(TypeSystemCreateInstance create_callback) {
2115 if (create_callback) {
2116 std::lock_guard<std::recursive_mutex> guard(GetTypeSystemMutex());
2117 TypeSystemInstances &instances = GetTypeSystemInstances();
2118
2119 TypeSystemInstances::iterator pos, end = instances.end();
2120 for (pos = instances.begin(); pos != end; ++pos) {
2121 if (pos->create_callback == create_callback) {
2122 instances.erase(pos);
2123 return true;
2124 }
Greg Clayton56939cb2015-09-17 22:23:34 +00002125 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00002126 }
2127 return false;
Greg Clayton56939cb2015-09-17 22:23:34 +00002128}
2129
2130TypeSystemCreateInstance
Kate Stoneb9c1b512016-09-06 20:57:50 +00002131PluginManager::GetTypeSystemCreateCallbackAtIndex(uint32_t idx) {
2132 std::lock_guard<std::recursive_mutex> guard(GetTypeSystemMutex());
2133 TypeSystemInstances &instances = GetTypeSystemInstances();
2134 if (idx < instances.size())
2135 return instances[idx].create_callback;
2136 return nullptr;
Greg Clayton56939cb2015-09-17 22:23:34 +00002137}
2138
2139TypeSystemCreateInstance
Kate Stoneb9c1b512016-09-06 20:57:50 +00002140PluginManager::GetTypeSystemCreateCallbackForPluginName(
Adrian Prantl0e4c4822019-03-06 21:22:25 +00002141 ConstString name) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00002142 if (name) {
Saleem Abdulrasool16ff8602016-05-18 01:59:10 +00002143 std::lock_guard<std::recursive_mutex> guard(GetTypeSystemMutex());
Kate Stoneb9c1b512016-09-06 20:57:50 +00002144 TypeSystemInstances &instances = GetTypeSystemInstances();
2145
2146 TypeSystemInstances::iterator pos, end = instances.end();
2147 for (pos = instances.begin(); pos != end; ++pos) {
2148 if (name == pos->name)
2149 return pos->create_callback;
2150 }
2151 }
2152 return nullptr;
Sean Callananfe38c852015-10-08 23:07:53 +00002153}
2154
2155TypeSystemEnumerateSupportedLanguages
Kate Stoneb9c1b512016-09-06 20:57:50 +00002156PluginManager::GetTypeSystemEnumerateSupportedLanguagesCallbackAtIndex(
2157 uint32_t idx) {
2158 std::lock_guard<std::recursive_mutex> guard(GetTypeSystemMutex());
2159 TypeSystemInstances &instances = GetTypeSystemInstances();
2160 if (idx < instances.size())
2161 return instances[idx].enumerate_callback;
2162 return nullptr;
2163}
2164
2165TypeSystemEnumerateSupportedLanguages
2166PluginManager::GetTypeSystemEnumerateSupportedLanguagesCallbackForPluginName(
Adrian Prantl0e4c4822019-03-06 21:22:25 +00002167 ConstString name) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00002168 if (name) {
2169 std::lock_guard<std::recursive_mutex> guard(GetTypeSystemMutex());
2170 TypeSystemInstances &instances = GetTypeSystemInstances();
2171
2172 TypeSystemInstances::iterator pos, end = instances.end();
2173 for (pos = instances.begin(); pos != end; ++pos) {
2174 if (name == pos->name)
2175 return pos->enumerate_callback;
Sean Callananfe38c852015-10-08 23:07:53 +00002176 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00002177 }
2178 return nullptr;
Sean Callananfe38c852015-10-08 23:07:53 +00002179}
Greg Clayton56939cb2015-09-17 22:23:34 +00002180
Sean Callanan66810412015-10-19 23:11:07 +00002181#pragma mark REPL
2182
Kate Stoneb9c1b512016-09-06 20:57:50 +00002183struct REPLInstance {
2184 REPLInstance() : name(), description(), create_callback(nullptr) {}
2185
2186 ConstString name;
2187 std::string description;
2188 REPLCreateInstance create_callback;
2189 REPLEnumerateSupportedLanguages enumerate_languages_callback;
Sean Callanan66810412015-10-19 23:11:07 +00002190};
2191
2192typedef std::vector<REPLInstance> REPLInstances;
2193
Kate Stoneb9c1b512016-09-06 20:57:50 +00002194static std::recursive_mutex &GetREPLMutex() {
2195 static std::recursive_mutex g_instances_mutex;
2196 return g_instances_mutex;
Sean Callanan66810412015-10-19 23:11:07 +00002197}
2198
Kate Stoneb9c1b512016-09-06 20:57:50 +00002199static REPLInstances &GetREPLInstances() {
2200 static REPLInstances g_instances;
2201 return g_instances;
Sean Callanan66810412015-10-19 23:11:07 +00002202}
2203
Kate Stoneb9c1b512016-09-06 20:57:50 +00002204bool PluginManager::RegisterPlugin(
Adrian Prantl0e4c4822019-03-06 21:22:25 +00002205 ConstString name, const char *description,
Kate Stoneb9c1b512016-09-06 20:57:50 +00002206 REPLCreateInstance create_callback,
2207 REPLEnumerateSupportedLanguages enumerate_languages_callback) {
2208 if (create_callback) {
2209 REPLInstance instance;
2210 assert((bool)name);
2211 instance.name = name;
2212 if (description && description[0])
2213 instance.description = description;
2214 instance.create_callback = create_callback;
2215 instance.enumerate_languages_callback = enumerate_languages_callback;
2216 std::lock_guard<std::recursive_mutex> guard(GetREPLMutex());
2217 GetREPLInstances().push_back(instance);
2218 }
2219 return false;
2220}
2221
2222bool PluginManager::UnregisterPlugin(REPLCreateInstance create_callback) {
2223 if (create_callback) {
2224 std::lock_guard<std::recursive_mutex> guard(GetREPLMutex());
2225 REPLInstances &instances = GetREPLInstances();
2226
2227 REPLInstances::iterator pos, end = instances.end();
2228 for (pos = instances.begin(); pos != end; ++pos) {
2229 if (pos->create_callback == create_callback) {
2230 instances.erase(pos);
2231 return true;
2232 }
Sean Callanan66810412015-10-19 23:11:07 +00002233 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00002234 }
2235 return false;
Sean Callanan66810412015-10-19 23:11:07 +00002236}
2237
Kate Stoneb9c1b512016-09-06 20:57:50 +00002238REPLCreateInstance PluginManager::GetREPLCreateCallbackAtIndex(uint32_t idx) {
2239 std::lock_guard<std::recursive_mutex> guard(GetREPLMutex());
2240 REPLInstances &instances = GetREPLInstances();
2241 if (idx < instances.size())
2242 return instances[idx].create_callback;
2243 return nullptr;
Sean Callanan66810412015-10-19 23:11:07 +00002244}
2245
2246REPLCreateInstance
Adrian Prantl0e4c4822019-03-06 21:22:25 +00002247PluginManager::GetREPLCreateCallbackForPluginName(ConstString name) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00002248 if (name) {
Saleem Abdulrasool16ff8602016-05-18 01:59:10 +00002249 std::lock_guard<std::recursive_mutex> guard(GetREPLMutex());
Kate Stoneb9c1b512016-09-06 20:57:50 +00002250 REPLInstances &instances = GetREPLInstances();
Sean Callanan66810412015-10-19 23:11:07 +00002251
Kate Stoneb9c1b512016-09-06 20:57:50 +00002252 REPLInstances::iterator pos, end = instances.end();
2253 for (pos = instances.begin(); pos != end; ++pos) {
2254 if (name == pos->name)
2255 return pos->create_callback;
Sean Callanan66810412015-10-19 23:11:07 +00002256 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00002257 }
2258 return nullptr;
Sean Callanan66810412015-10-19 23:11:07 +00002259}
2260
Sean Callanan93c0b002015-10-21 19:14:33 +00002261REPLEnumerateSupportedLanguages
Kate Stoneb9c1b512016-09-06 20:57:50 +00002262PluginManager::GetREPLEnumerateSupportedLanguagesCallbackAtIndex(uint32_t idx) {
2263 std::lock_guard<std::recursive_mutex> guard(GetREPLMutex());
2264 REPLInstances &instances = GetREPLInstances();
2265 if (idx < instances.size())
2266 return instances[idx].enumerate_languages_callback;
2267 return nullptr;
Sean Callanan93c0b002015-10-21 19:14:33 +00002268}
2269
Sean Callanan93c0b002015-10-21 19:14:33 +00002270REPLEnumerateSupportedLanguages
Kate Stoneb9c1b512016-09-06 20:57:50 +00002271PluginManager::GetREPLSystemEnumerateSupportedLanguagesCallbackForPluginName(
Adrian Prantl0e4c4822019-03-06 21:22:25 +00002272 ConstString name) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00002273 if (name) {
2274 std::lock_guard<std::recursive_mutex> guard(GetREPLMutex());
2275 REPLInstances &instances = GetREPLInstances();
2276
2277 REPLInstances::iterator pos, end = instances.end();
2278 for (pos = instances.begin(); pos != end; ++pos) {
2279 if (name == pos->name)
2280 return pos->enumerate_languages_callback;
Sean Callanan93c0b002015-10-21 19:14:33 +00002281 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00002282 }
2283 return nullptr;
Sean Callanan93c0b002015-10-21 19:14:33 +00002284}
2285
Kuba Breckaafdf8422014-10-10 23:43:03 +00002286#pragma mark PluginManager
2287
Kate Stoneb9c1b512016-09-06 20:57:50 +00002288void PluginManager::DebuggerInitialize(Debugger &debugger) {
2289 // Initialize the DynamicLoader plugins
2290 {
2291 std::lock_guard<std::recursive_mutex> guard(GetDynamicLoaderMutex());
2292 DynamicLoaderInstances &instances = GetDynamicLoaderInstances();
Jason Molenda9b837a12013-04-05 05:06:39 +00002293
Kate Stoneb9c1b512016-09-06 20:57:50 +00002294 DynamicLoaderInstances::iterator pos, end = instances.end();
2295 for (pos = instances.begin(); pos != end; ++pos) {
2296 if (pos->debugger_init_callback)
2297 pos->debugger_init_callback(debugger);
Andrew MacPherson17220c12014-03-05 10:12:43 +00002298 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00002299 }
Andrew MacPherson17220c12014-03-05 10:12:43 +00002300
Kate Stoneb9c1b512016-09-06 20:57:50 +00002301 // Initialize the JITLoader plugins
2302 {
2303 std::lock_guard<std::recursive_mutex> guard(GetJITLoaderMutex());
2304 JITLoaderInstances &instances = GetJITLoaderInstances();
Oleksiy Vyalovabb5a352015-07-29 22:18:16 +00002305
Kate Stoneb9c1b512016-09-06 20:57:50 +00002306 JITLoaderInstances::iterator pos, end = instances.end();
2307 for (pos = instances.begin(); pos != end; ++pos) {
2308 if (pos->debugger_init_callback)
2309 pos->debugger_init_callback(debugger);
Greg Clayton7f982402013-07-15 22:54:20 +00002310 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00002311 }
Greg Clayton7f982402013-07-15 22:54:20 +00002312
Kate Stoneb9c1b512016-09-06 20:57:50 +00002313 // Initialize the Platform plugins
2314 {
2315 std::lock_guard<std::recursive_mutex> guard(GetPlatformInstancesMutex());
2316 PlatformInstances &instances = GetPlatformInstances();
Ryan Brown65d4d5c2015-09-16 21:20:44 +00002317
Kate Stoneb9c1b512016-09-06 20:57:50 +00002318 PlatformInstances::iterator pos, end = instances.end();
2319 for (pos = instances.begin(); pos != end; ++pos) {
2320 if (pos->debugger_init_callback)
2321 pos->debugger_init_callback(debugger);
Ryan Brown65d4d5c2015-09-16 21:20:44 +00002322 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00002323 }
Todd Fiala75930012016-08-19 04:21:48 +00002324
Kate Stoneb9c1b512016-09-06 20:57:50 +00002325 // Initialize the Process plugins
2326 {
2327 std::lock_guard<std::recursive_mutex> guard(GetProcessMutex());
2328 ProcessInstances &instances = GetProcessInstances();
2329
2330 ProcessInstances::iterator pos, end = instances.end();
2331 for (pos = instances.begin(); pos != end; ++pos) {
2332 if (pos->debugger_init_callback)
2333 pos->debugger_init_callback(debugger);
Todd Fiala75930012016-08-19 04:21:48 +00002334 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00002335 }
2336
2337 // Initialize the SymbolFile plugins
2338 {
2339 std::lock_guard<std::recursive_mutex> guard(GetSymbolFileMutex());
2340 for (auto &sym_file : GetSymbolFileInstances()) {
2341 if (sym_file.debugger_init_callback)
2342 sym_file.debugger_init_callback(debugger);
2343 }
2344 }
2345
2346 // Initialize the OperatingSystem plugins
2347 {
2348 std::lock_guard<std::recursive_mutex> guard(GetOperatingSystemMutex());
2349 for (auto &os : GetOperatingSystemInstances()) {
2350 if (os.debugger_init_callback)
2351 os.debugger_init_callback(debugger);
2352 }
2353 }
2354
2355 // Initialize the StructuredDataPlugin plugins
2356 {
2357 std::lock_guard<std::recursive_mutex> guard(GetStructuredDataPluginMutex());
2358 for (auto &plugin : GetStructuredDataPluginInstances()) {
2359 if (plugin.debugger_init_callback)
2360 plugin.debugger_init_callback(debugger);
2361 }
2362 }
Greg Claytone8cd0c92012-10-19 18:02:49 +00002363}
2364
Greg Clayton7f982402013-07-15 22:54:20 +00002365// This is the preferred new way to register plugin specific settings. e.g.
Kate Stoneb9c1b512016-09-06 20:57:50 +00002366// This will put a plugin's settings under e.g.
2367// "plugin.<plugin_type_name>.<plugin_type_desc>.SETTINGNAME".
2368static lldb::OptionValuePropertiesSP GetDebuggerPropertyForPlugins(
Adrian Prantl0e4c4822019-03-06 21:22:25 +00002369 Debugger &debugger, ConstString plugin_type_name,
2370 ConstString plugin_type_desc, bool can_create) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00002371 lldb::OptionValuePropertiesSP parent_properties_sp(
2372 debugger.GetValueProperties());
2373 if (parent_properties_sp) {
2374 static ConstString g_property_name("plugin");
2375
2376 OptionValuePropertiesSP plugin_properties_sp =
2377 parent_properties_sp->GetSubProperty(nullptr, g_property_name);
2378 if (!plugin_properties_sp && can_create) {
Zachary Turner2f3df612017-04-06 21:28:29 +00002379 plugin_properties_sp =
2380 std::make_shared<OptionValueProperties>(g_property_name);
Kate Stoneb9c1b512016-09-06 20:57:50 +00002381 parent_properties_sp->AppendProperty(
2382 g_property_name, ConstString("Settings specify to plugins."), true,
2383 plugin_properties_sp);
Greg Claytone8cd0c92012-10-19 18:02:49 +00002384 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00002385
2386 if (plugin_properties_sp) {
2387 lldb::OptionValuePropertiesSP plugin_type_properties_sp =
2388 plugin_properties_sp->GetSubProperty(nullptr, plugin_type_name);
2389 if (!plugin_type_properties_sp && can_create) {
Zachary Turner2f3df612017-04-06 21:28:29 +00002390 plugin_type_properties_sp =
2391 std::make_shared<OptionValueProperties>(plugin_type_name);
Kate Stoneb9c1b512016-09-06 20:57:50 +00002392 plugin_properties_sp->AppendProperty(plugin_type_name, plugin_type_desc,
2393 true, plugin_type_properties_sp);
2394 }
2395 return plugin_type_properties_sp;
2396 }
2397 }
2398 return lldb::OptionValuePropertiesSP();
Greg Claytone8cd0c92012-10-19 18:02:49 +00002399}
2400
Greg Clayton7f982402013-07-15 22:54:20 +00002401// This is deprecated way to register plugin specific settings. e.g.
Adrian Prantl05097242018-04-30 16:49:04 +00002402// "<plugin_type_name>.plugin.<plugin_type_desc>.SETTINGNAME" and Platform
2403// generic settings would be under "platform.SETTINGNAME".
Kate Stoneb9c1b512016-09-06 20:57:50 +00002404static lldb::OptionValuePropertiesSP GetDebuggerPropertyForPluginsOldStyle(
Adrian Prantl0e4c4822019-03-06 21:22:25 +00002405 Debugger &debugger, ConstString plugin_type_name,
2406 ConstString plugin_type_desc, bool can_create) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00002407 static ConstString g_property_name("plugin");
2408 lldb::OptionValuePropertiesSP parent_properties_sp(
2409 debugger.GetValueProperties());
2410 if (parent_properties_sp) {
2411 OptionValuePropertiesSP plugin_properties_sp =
2412 parent_properties_sp->GetSubProperty(nullptr, plugin_type_name);
2413 if (!plugin_properties_sp && can_create) {
Zachary Turner2f3df612017-04-06 21:28:29 +00002414 plugin_properties_sp =
2415 std::make_shared<OptionValueProperties>(plugin_type_name);
Kate Stoneb9c1b512016-09-06 20:57:50 +00002416 parent_properties_sp->AppendProperty(plugin_type_name, plugin_type_desc,
2417 true, plugin_properties_sp);
Jason Molenda3b59f5c2013-04-05 22:40:42 +00002418 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00002419
2420 if (plugin_properties_sp) {
2421 lldb::OptionValuePropertiesSP plugin_type_properties_sp =
2422 plugin_properties_sp->GetSubProperty(nullptr, g_property_name);
2423 if (!plugin_type_properties_sp && can_create) {
Zachary Turner2f3df612017-04-06 21:28:29 +00002424 plugin_type_properties_sp =
2425 std::make_shared<OptionValueProperties>(g_property_name);
Kate Stoneb9c1b512016-09-06 20:57:50 +00002426 plugin_properties_sp->AppendProperty(
2427 g_property_name, ConstString("Settings specific to plugins"), true,
2428 plugin_type_properties_sp);
2429 }
2430 return plugin_type_properties_sp;
2431 }
2432 }
2433 return lldb::OptionValuePropertiesSP();
Jason Molenda3b59f5c2013-04-05 22:40:42 +00002434}
2435
Oleksiy Vyaloveff9ad22015-09-16 17:38:36 +00002436namespace {
2437
2438typedef lldb::OptionValuePropertiesSP
Adrian Prantl0e4c4822019-03-06 21:22:25 +00002439GetDebuggerPropertyForPluginsPtr(Debugger &, ConstString ,
2440 ConstString , bool can_create);
Jason Molenda3b59f5c2013-04-05 22:40:42 +00002441
Greg Claytone8cd0c92012-10-19 18:02:49 +00002442lldb::OptionValuePropertiesSP
Adrian Prantl0e4c4822019-03-06 21:22:25 +00002443GetSettingForPlugin(Debugger &debugger, ConstString setting_name,
2444 ConstString plugin_type_name,
Kate Stoneb9c1b512016-09-06 20:57:50 +00002445 GetDebuggerPropertyForPluginsPtr get_debugger_property =
2446 GetDebuggerPropertyForPlugins) {
2447 lldb::OptionValuePropertiesSP properties_sp;
2448 lldb::OptionValuePropertiesSP plugin_type_properties_sp(get_debugger_property(
2449 debugger, plugin_type_name,
2450 ConstString(), // not creating to so we don't need the description
2451 false));
2452 if (plugin_type_properties_sp)
2453 properties_sp =
2454 plugin_type_properties_sp->GetSubProperty(nullptr, setting_name);
2455 return properties_sp;
Greg Claytone8cd0c92012-10-19 18:02:49 +00002456}
2457
Kate Stoneb9c1b512016-09-06 20:57:50 +00002458bool CreateSettingForPlugin(
Adrian Prantl0e4c4822019-03-06 21:22:25 +00002459 Debugger &debugger, ConstString plugin_type_name,
2460 ConstString plugin_type_desc,
Kate Stoneb9c1b512016-09-06 20:57:50 +00002461 const lldb::OptionValuePropertiesSP &properties_sp,
Adrian Prantl0e4c4822019-03-06 21:22:25 +00002462 ConstString description, bool is_global_property,
Kate Stoneb9c1b512016-09-06 20:57:50 +00002463 GetDebuggerPropertyForPluginsPtr get_debugger_property =
2464 GetDebuggerPropertyForPlugins) {
2465 if (properties_sp) {
2466 lldb::OptionValuePropertiesSP plugin_type_properties_sp(
2467 get_debugger_property(debugger, plugin_type_name, plugin_type_desc,
2468 true));
2469 if (plugin_type_properties_sp) {
2470 plugin_type_properties_sp->AppendProperty(properties_sp->GetName(),
2471 description, is_global_property,
2472 properties_sp);
2473 return true;
Oleksiy Vyaloveff9ad22015-09-16 17:38:36 +00002474 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00002475 }
2476 return false;
Oleksiy Vyaloveff9ad22015-09-16 17:38:36 +00002477}
2478
Kate Stoneb9c1b512016-09-06 20:57:50 +00002479const char *kDynamicLoaderPluginName("dynamic-loader");
2480const char *kPlatformPluginName("platform");
2481const char *kProcessPluginName("process");
2482const char *kSymbolFilePluginName("symbol-file");
2483const char *kJITLoaderPluginName("jit-loader");
2484const char *kStructuredDataPluginName("structured-data");
Oleksiy Vyaloveff9ad22015-09-16 17:38:36 +00002485
Eugene Zelenko89183722016-03-11 21:55:47 +00002486} // anonymous namespace
Oleksiy Vyaloveff9ad22015-09-16 17:38:36 +00002487
Kate Stoneb9c1b512016-09-06 20:57:50 +00002488lldb::OptionValuePropertiesSP PluginManager::GetSettingForDynamicLoaderPlugin(
Adrian Prantl0e4c4822019-03-06 21:22:25 +00002489 Debugger &debugger, ConstString setting_name) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00002490 return GetSettingForPlugin(debugger, setting_name,
2491 ConstString(kDynamicLoaderPluginName));
Oleksiy Vyaloveff9ad22015-09-16 17:38:36 +00002492}
2493
Kate Stoneb9c1b512016-09-06 20:57:50 +00002494bool PluginManager::CreateSettingForDynamicLoaderPlugin(
2495 Debugger &debugger, const lldb::OptionValuePropertiesSP &properties_sp,
Adrian Prantl0e4c4822019-03-06 21:22:25 +00002496 ConstString description, bool is_global_property) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00002497 return CreateSettingForPlugin(
2498 debugger, ConstString(kDynamicLoaderPluginName),
2499 ConstString("Settings for dynamic loader plug-ins"), properties_sp,
2500 description, is_global_property);
Greg Claytone8cd0c92012-10-19 18:02:49 +00002501}
2502
Jason Molenda9b837a12013-04-05 05:06:39 +00002503lldb::OptionValuePropertiesSP
Kate Stoneb9c1b512016-09-06 20:57:50 +00002504PluginManager::GetSettingForPlatformPlugin(Debugger &debugger,
Adrian Prantl0e4c4822019-03-06 21:22:25 +00002505 ConstString setting_name) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00002506 return GetSettingForPlugin(debugger, setting_name,
2507 ConstString(kPlatformPluginName),
2508 GetDebuggerPropertyForPluginsOldStyle);
Jason Molenda9b837a12013-04-05 05:06:39 +00002509}
2510
Kate Stoneb9c1b512016-09-06 20:57:50 +00002511bool PluginManager::CreateSettingForPlatformPlugin(
2512 Debugger &debugger, const lldb::OptionValuePropertiesSP &properties_sp,
Adrian Prantl0e4c4822019-03-06 21:22:25 +00002513 ConstString description, bool is_global_property) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00002514 return CreateSettingForPlugin(debugger, ConstString(kPlatformPluginName),
2515 ConstString("Settings for platform plug-ins"),
2516 properties_sp, description, is_global_property,
2517 GetDebuggerPropertyForPluginsOldStyle);
Greg Clayton7f982402013-07-15 22:54:20 +00002518}
2519
Greg Clayton7f982402013-07-15 22:54:20 +00002520lldb::OptionValuePropertiesSP
Kate Stoneb9c1b512016-09-06 20:57:50 +00002521PluginManager::GetSettingForProcessPlugin(Debugger &debugger,
Adrian Prantl0e4c4822019-03-06 21:22:25 +00002522 ConstString setting_name) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00002523 return GetSettingForPlugin(debugger, setting_name,
2524 ConstString(kProcessPluginName));
Greg Clayton7f982402013-07-15 22:54:20 +00002525}
2526
Kate Stoneb9c1b512016-09-06 20:57:50 +00002527bool PluginManager::CreateSettingForProcessPlugin(
2528 Debugger &debugger, const lldb::OptionValuePropertiesSP &properties_sp,
Adrian Prantl0e4c4822019-03-06 21:22:25 +00002529 ConstString description, bool is_global_property) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00002530 return CreateSettingForPlugin(debugger, ConstString(kProcessPluginName),
2531 ConstString("Settings for process plug-ins"),
2532 properties_sp, description, is_global_property);
Jason Molenda9b837a12013-04-05 05:06:39 +00002533}
2534
Oleksiy Vyalovabb5a352015-07-29 22:18:16 +00002535lldb::OptionValuePropertiesSP
Kate Stoneb9c1b512016-09-06 20:57:50 +00002536PluginManager::GetSettingForSymbolFilePlugin(Debugger &debugger,
Adrian Prantl0e4c4822019-03-06 21:22:25 +00002537 ConstString setting_name) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00002538 return GetSettingForPlugin(debugger, setting_name,
2539 ConstString(kSymbolFilePluginName));
Oleksiy Vyalovabb5a352015-07-29 22:18:16 +00002540}
2541
Kate Stoneb9c1b512016-09-06 20:57:50 +00002542bool PluginManager::CreateSettingForSymbolFilePlugin(
2543 Debugger &debugger, const lldb::OptionValuePropertiesSP &properties_sp,
Adrian Prantl0e4c4822019-03-06 21:22:25 +00002544 ConstString description, bool is_global_property) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00002545 return CreateSettingForPlugin(
2546 debugger, ConstString(kSymbolFilePluginName),
2547 ConstString("Settings for symbol file plug-ins"), properties_sp,
2548 description, is_global_property);
Oleksiy Vyaloveff9ad22015-09-16 17:38:36 +00002549}
2550
2551lldb::OptionValuePropertiesSP
Kate Stoneb9c1b512016-09-06 20:57:50 +00002552PluginManager::GetSettingForJITLoaderPlugin(Debugger &debugger,
Adrian Prantl0e4c4822019-03-06 21:22:25 +00002553 ConstString setting_name) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00002554 return GetSettingForPlugin(debugger, setting_name,
2555 ConstString(kJITLoaderPluginName));
Oleksiy Vyaloveff9ad22015-09-16 17:38:36 +00002556}
2557
Kate Stoneb9c1b512016-09-06 20:57:50 +00002558bool PluginManager::CreateSettingForJITLoaderPlugin(
2559 Debugger &debugger, const lldb::OptionValuePropertiesSP &properties_sp,
Adrian Prantl0e4c4822019-03-06 21:22:25 +00002560 ConstString description, bool is_global_property) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00002561 return CreateSettingForPlugin(debugger, ConstString(kJITLoaderPluginName),
2562 ConstString("Settings for JIT loader plug-ins"),
2563 properties_sp, description, is_global_property);
Oleksiy Vyalovabb5a352015-07-29 22:18:16 +00002564}
Ryan Brown65d4d5c2015-09-16 21:20:44 +00002565
2566static const char *kOperatingSystemPluginName("os");
2567
Kate Stoneb9c1b512016-09-06 20:57:50 +00002568lldb::OptionValuePropertiesSP PluginManager::GetSettingForOperatingSystemPlugin(
Adrian Prantl0e4c4822019-03-06 21:22:25 +00002569 Debugger &debugger, ConstString setting_name) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00002570 lldb::OptionValuePropertiesSP properties_sp;
2571 lldb::OptionValuePropertiesSP plugin_type_properties_sp(
2572 GetDebuggerPropertyForPlugins(
2573 debugger, ConstString(kOperatingSystemPluginName),
2574 ConstString(), // not creating to so we don't need the description
2575 false));
2576 if (plugin_type_properties_sp)
2577 properties_sp =
2578 plugin_type_properties_sp->GetSubProperty(nullptr, setting_name);
2579 return properties_sp;
2580}
2581
2582bool PluginManager::CreateSettingForOperatingSystemPlugin(
2583 Debugger &debugger, const lldb::OptionValuePropertiesSP &properties_sp,
Adrian Prantl0e4c4822019-03-06 21:22:25 +00002584 ConstString description, bool is_global_property) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00002585 if (properties_sp) {
Ryan Brown65d4d5c2015-09-16 21:20:44 +00002586 lldb::OptionValuePropertiesSP plugin_type_properties_sp(
Kate Stoneb9c1b512016-09-06 20:57:50 +00002587 GetDebuggerPropertyForPlugins(
2588 debugger, ConstString(kOperatingSystemPluginName),
2589 ConstString("Settings for operating system plug-ins"), true));
2590 if (plugin_type_properties_sp) {
2591 plugin_type_properties_sp->AppendProperty(properties_sp->GetName(),
2592 description, is_global_property,
2593 properties_sp);
2594 return true;
Ryan Brown65d4d5c2015-09-16 21:20:44 +00002595 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00002596 }
2597 return false;
Ryan Brown65d4d5c2015-09-16 21:20:44 +00002598}
Todd Fiala75930012016-08-19 04:21:48 +00002599
Kate Stoneb9c1b512016-09-06 20:57:50 +00002600lldb::OptionValuePropertiesSP PluginManager::GetSettingForStructuredDataPlugin(
Adrian Prantl0e4c4822019-03-06 21:22:25 +00002601 Debugger &debugger, ConstString setting_name) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00002602 return GetSettingForPlugin(debugger, setting_name,
2603 ConstString(kStructuredDataPluginName));
Todd Fiala75930012016-08-19 04:21:48 +00002604}
2605
Kate Stoneb9c1b512016-09-06 20:57:50 +00002606bool PluginManager::CreateSettingForStructuredDataPlugin(
2607 Debugger &debugger, const lldb::OptionValuePropertiesSP &properties_sp,
Adrian Prantl0e4c4822019-03-06 21:22:25 +00002608 ConstString description, bool is_global_property) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00002609 return CreateSettingForPlugin(
2610 debugger, ConstString(kStructuredDataPluginName),
2611 ConstString("Settings for structured data plug-ins"), properties_sp,
2612 description, is_global_property);
Todd Fiala75930012016-08-19 04:21:48 +00002613}