blob: 8f1ab568ae223f2823d64339650649556e65dea8 [file] [log] [blame]
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001//===-- PluginManager.cpp ---------------------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "lldb/Core/PluginManager.h"
11
Eugene Zelenko89183722016-03-11 21:55:47 +000012// C Includes
13// C++ Includes
14#include <climits>
Chris Lattner30fdc8d2010-06-08 16:52:24 +000015#include <string>
16#include <vector>
17
Eugene Zelenko89183722016-03-11 21:55:47 +000018// Other libraries and framework includes
19#include "llvm/ADT/StringRef.h"
20#include "llvm/Support/DynamicLibrary.h"
21
22// Project includes
Greg Claytone8cd0c92012-10-19 18:02:49 +000023#include "lldb/Core/Debugger.h"
Greg Clayton4272cc72011-02-02 02:24:04 +000024#include "lldb/Core/Error.h"
Greg Clayton53239f02011-02-08 05:05:52 +000025#include "lldb/Host/FileSpec.h"
Greg Clayton4272cc72011-02-02 02:24:04 +000026#include "lldb/Host/Host.h"
Zachary Turner42ff0ad2014-08-21 17:29:12 +000027#include "lldb/Host/HostInfo.h"
Greg Clayton4272cc72011-02-02 02:24:04 +000028#include "lldb/Host/Mutex.h"
Greg Claytone8cd0c92012-10-19 18:02:49 +000029#include "lldb/Interpreter/OptionValueProperties.h"
Greg Clayton4272cc72011-02-02 02:24:04 +000030
31using namespace lldb;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000032using namespace lldb_private;
33
Jason Molenda743e86a2010-06-11 23:44:18 +000034enum PluginAction
Chris Lattner30fdc8d2010-06-08 16:52:24 +000035{
36 ePluginRegisterInstance,
37 ePluginUnregisterInstance,
38 ePluginGetInstanceAtIndex
39};
40
Eugene Zelenko89183722016-03-11 21:55:47 +000041typedef bool (*PluginInitCallback)();
42typedef void (*PluginTermCallback)();
Greg Clayton03da4cc2013-04-19 21:31:16 +000043
Greg Clayton4272cc72011-02-02 02:24:04 +000044struct PluginInfo
45{
Zachary Turner58a559c2014-08-27 20:15:09 +000046 PluginInfo()
47 : plugin_init_callback(nullptr), plugin_term_callback(nullptr)
48 {
49 }
50
51 llvm::sys::DynamicLibrary library;
Greg Clayton03da4cc2013-04-19 21:31:16 +000052 PluginInitCallback plugin_init_callback;
53 PluginTermCallback plugin_term_callback;
Greg Clayton4272cc72011-02-02 02:24:04 +000054};
55
56typedef std::map<FileSpec, PluginInfo> PluginTerminateMap;
57
58static Mutex &
59GetPluginMapMutex ()
60{
61 static Mutex g_plugin_map_mutex (Mutex::eMutexTypeRecursive);
62 return g_plugin_map_mutex;
63}
64
65static PluginTerminateMap &
66GetPluginMap ()
67{
68 static PluginTerminateMap g_plugin_map;
69 return g_plugin_map;
70}
71
72static bool
73PluginIsLoaded (const FileSpec &plugin_file_spec)
74{
75 Mutex::Locker locker (GetPluginMapMutex ());
76 PluginTerminateMap &plugin_map = GetPluginMap ();
77 return plugin_map.find (plugin_file_spec) != plugin_map.end();
78}
79
80static void
81SetPluginInfo (const FileSpec &plugin_file_spec, const PluginInfo &plugin_info)
82{
83 Mutex::Locker locker (GetPluginMapMutex ());
84 PluginTerminateMap &plugin_map = GetPluginMap ();
Michael Sartain3cf443d2013-07-17 00:26:30 +000085 assert (plugin_map.find (plugin_file_spec) == plugin_map.end());
Greg Clayton4272cc72011-02-02 02:24:04 +000086 plugin_map[plugin_file_spec] = plugin_info;
87}
88
David Majnemer5ff02782014-07-22 21:59:22 +000089template <typename FPtrTy>
90static FPtrTy
91CastToFPtr (void *VPtr)
92{
93 return reinterpret_cast<FPtrTy>(reinterpret_cast<intptr_t>(VPtr));
94}
Greg Clayton4272cc72011-02-02 02:24:04 +000095
96static FileSpec::EnumerateDirectoryResult
Eugene Zelenko89183722016-03-11 21:55:47 +000097LoadPluginCallback(void *baton,
98 FileSpec::FileType file_type,
99 const FileSpec &file_spec)
Greg Clayton4272cc72011-02-02 02:24:04 +0000100{
101// PluginManager *plugin_manager = (PluginManager *)baton;
102 Error error;
103
104 // If we have a regular file, a symbolic link or unknown file type, try
105 // and process the file. We must handle unknown as sometimes the directory
106 // enumeration might be enumerating a file system that doesn't have correct
107 // file type information.
108 if (file_type == FileSpec::eFileTypeRegular ||
109 file_type == FileSpec::eFileTypeSymbolicLink ||
110 file_type == FileSpec::eFileTypeUnknown )
111 {
112 FileSpec plugin_file_spec (file_spec);
113 plugin_file_spec.ResolvePath();
114
115 if (PluginIsLoaded (plugin_file_spec))
116 return FileSpec::eEnumerateDirectoryResultNext;
117 else
118 {
Zachary Turner58a559c2014-08-27 20:15:09 +0000119 PluginInfo plugin_info;
Greg Clayton45319462011-02-08 00:35:34 +0000120
Zachary Turner58a559c2014-08-27 20:15:09 +0000121 std::string pluginLoadError;
122 plugin_info.library = llvm::sys::DynamicLibrary::getPermanentLibrary (plugin_file_spec.GetPath().c_str(), &pluginLoadError);
123 if (plugin_info.library.isValid())
Greg Clayton4272cc72011-02-02 02:24:04 +0000124 {
125 bool success = false;
David Majnemer5ff02782014-07-22 21:59:22 +0000126 plugin_info.plugin_init_callback =
Zachary Turner58a559c2014-08-27 20:15:09 +0000127 CastToFPtr<PluginInitCallback>(plugin_info.library.getAddressOfSymbol("LLDBPluginInitialize"));
Greg Clayton4272cc72011-02-02 02:24:04 +0000128 if (plugin_info.plugin_init_callback)
129 {
130 // Call the plug-in "bool LLDBPluginInitialize(void)" function
Greg Clayton03da4cc2013-04-19 21:31:16 +0000131 success = plugin_info.plugin_init_callback();
Greg Clayton4272cc72011-02-02 02:24:04 +0000132 }
133
134 if (success)
135 {
Eugene Zelenko89183722016-03-11 21:55:47 +0000136 // It is ok for the "LLDBPluginTerminate" symbol to be nullptr
David Majnemer5ff02782014-07-22 21:59:22 +0000137 plugin_info.plugin_term_callback =
Zachary Turner58a559c2014-08-27 20:15:09 +0000138 CastToFPtr<PluginTermCallback>(plugin_info.library.getAddressOfSymbol("LLDBPluginTerminate"));
Greg Clayton4272cc72011-02-02 02:24:04 +0000139 }
140 else
141 {
Zachary Turner58a559c2014-08-27 20:15:09 +0000142 // The initialize function returned FALSE which means the plug-in might not be
143 // compatible, or might be too new or too old, or might not want to run on this
144 // machine. Set it to a default-constructed instance to invalidate it.
145 plugin_info = PluginInfo();
Greg Clayton4272cc72011-02-02 02:24:04 +0000146 }
147
148 // Regardless of success or failure, cache the plug-in load
149 // in our plug-in info so we don't try to load it again and
150 // again.
151 SetPluginInfo (plugin_file_spec, plugin_info);
152
153 return FileSpec::eEnumerateDirectoryResultNext;
154 }
155 }
156 }
157
158 if (file_type == FileSpec::eFileTypeUnknown ||
159 file_type == FileSpec::eFileTypeDirectory ||
160 file_type == FileSpec::eFileTypeSymbolicLink )
161 {
162 // Try and recurse into anything that a directory or symbolic link.
163 // We must also do this for unknown as sometimes the directory enumeration
Bruce Mitchener6a7f3332014-06-27 02:42:12 +0000164 // might be enumerating a file system that doesn't have correct file type
Greg Clayton4272cc72011-02-02 02:24:04 +0000165 // information.
166 return FileSpec::eEnumerateDirectoryResultEnter;
167 }
168
169 return FileSpec::eEnumerateDirectoryResultNext;
170}
171
Greg Clayton4272cc72011-02-02 02:24:04 +0000172void
173PluginManager::Initialize ()
174{
Greg Clayton1cb64962011-03-24 04:28:38 +0000175#if 1
Greg Clayton4272cc72011-02-02 02:24:04 +0000176 FileSpec dir_spec;
177 const bool find_directories = true;
178 const bool find_files = true;
179 const bool find_other = true;
180 char dir_path[PATH_MAX];
Zachary Turner42ff0ad2014-08-21 17:29:12 +0000181 if (HostInfo::GetLLDBPath(ePathTypeLLDBSystemPlugins, dir_spec))
Greg Clayton4272cc72011-02-02 02:24:04 +0000182 {
183 if (dir_spec.Exists() && dir_spec.GetPath(dir_path, sizeof(dir_path)))
184 {
Eugene Zelenko89183722016-03-11 21:55:47 +0000185 FileSpec::EnumerateDirectory(dir_path,
186 find_directories,
187 find_files,
188 find_other,
189 LoadPluginCallback,
190 nullptr);
Greg Clayton4272cc72011-02-02 02:24:04 +0000191 }
192 }
193
Zachary Turner42ff0ad2014-08-21 17:29:12 +0000194 if (HostInfo::GetLLDBPath(ePathTypeLLDBUserPlugins, dir_spec))
Greg Clayton4272cc72011-02-02 02:24:04 +0000195 {
196 if (dir_spec.Exists() && dir_spec.GetPath(dir_path, sizeof(dir_path)))
197 {
Eugene Zelenko89183722016-03-11 21:55:47 +0000198 FileSpec::EnumerateDirectory(dir_path,
199 find_directories,
200 find_files,
201 find_other,
202 LoadPluginCallback,
203 nullptr);
Greg Clayton4272cc72011-02-02 02:24:04 +0000204 }
205 }
Greg Clayton1cb64962011-03-24 04:28:38 +0000206#endif
Greg Clayton4272cc72011-02-02 02:24:04 +0000207}
208
209void
210PluginManager::Terminate ()
211{
212 Mutex::Locker locker (GetPluginMapMutex ());
213 PluginTerminateMap &plugin_map = GetPluginMap ();
214
215 PluginTerminateMap::const_iterator pos, end = plugin_map.end();
216 for (pos = plugin_map.begin(); pos != end; ++pos)
217 {
218 // Call the plug-in "void LLDBPluginTerminate (void)" function if there
Eugene Zelenko89183722016-03-11 21:55:47 +0000219 // is one (if the symbol was not nullptr).
Zachary Turner58a559c2014-08-27 20:15:09 +0000220 if (pos->second.library.isValid())
Greg Clayton4272cc72011-02-02 02:24:04 +0000221 {
222 if (pos->second.plugin_term_callback)
Greg Clayton03da4cc2013-04-19 21:31:16 +0000223 pos->second.plugin_term_callback();
Greg Clayton4272cc72011-02-02 02:24:04 +0000224 }
225 }
226 plugin_map.clear();
227}
228
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000229#pragma mark ABI
230
Jason Molenda743e86a2010-06-11 23:44:18 +0000231struct ABIInstance
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000232{
233 ABIInstance() :
234 name(),
235 description(),
Eugene Zelenko89183722016-03-11 21:55:47 +0000236 create_callback(nullptr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000237 {
238 }
239
Greg Clayton57abc5d2013-05-10 21:47:16 +0000240 ConstString name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000241 std::string description;
242 ABICreateInstance create_callback;
243};
244
245typedef std::vector<ABIInstance> ABIInstances;
246
Greg Claytonded470d2011-03-19 01:12:21 +0000247static Mutex &
248GetABIInstancesMutex ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000249{
Greg Claytonded470d2011-03-19 01:12:21 +0000250 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
251 return g_instances_mutex;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000252}
253
Greg Claytonded470d2011-03-19 01:12:21 +0000254static ABIInstances &
255GetABIInstances ()
256{
257 static ABIInstances g_instances;
258 return g_instances;
259}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000260
261bool
Eugene Zelenko89183722016-03-11 21:55:47 +0000262PluginManager::RegisterPlugin(const ConstString &name,
263 const char *description,
264 ABICreateInstance create_callback)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000265{
266 if (create_callback)
267 {
268 ABIInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +0000269 assert ((bool)name);
270 instance.name = name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000271 if (description && description[0])
272 instance.description = description;
273 instance.create_callback = create_callback;
Greg Claytonded470d2011-03-19 01:12:21 +0000274 Mutex::Locker locker (GetABIInstancesMutex ());
275 GetABIInstances ().push_back (instance);
276 return true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000277 }
278 return false;
279}
280
281bool
282PluginManager::UnregisterPlugin (ABICreateInstance create_callback)
283{
284 if (create_callback)
285 {
Greg Claytonded470d2011-03-19 01:12:21 +0000286 Mutex::Locker locker (GetABIInstancesMutex ());
287 ABIInstances &instances = GetABIInstances ();
288
289 ABIInstances::iterator pos, end = instances.end();
290 for (pos = instances.begin(); pos != end; ++ pos)
291 {
292 if (pos->create_callback == create_callback)
293 {
294 instances.erase(pos);
295 return true;
296 }
297 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000298 }
299 return false;
300}
301
302ABICreateInstance
303PluginManager::GetABICreateCallbackAtIndex (uint32_t idx)
304{
Greg Claytonded470d2011-03-19 01:12:21 +0000305 Mutex::Locker locker (GetABIInstancesMutex ());
306 ABIInstances &instances = GetABIInstances ();
Greg Claytonded470d2011-03-19 01:12:21 +0000307 if (idx < instances.size())
308 return instances[idx].create_callback;
Eugene Zelenko89183722016-03-11 21:55:47 +0000309 return nullptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000310}
311
312ABICreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +0000313PluginManager::GetABICreateCallbackForPluginName (const ConstString &name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000314{
Greg Clayton57abc5d2013-05-10 21:47:16 +0000315 if (name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000316 {
Greg Claytonded470d2011-03-19 01:12:21 +0000317 Mutex::Locker locker (GetABIInstancesMutex ());
Greg Claytonded470d2011-03-19 01:12:21 +0000318 ABIInstances &instances = GetABIInstances ();
319
320 ABIInstances::iterator pos, end = instances.end();
321 for (pos = instances.begin(); pos != end; ++ pos)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000322 {
Greg Clayton57abc5d2013-05-10 21:47:16 +0000323 if (name == pos->name)
Greg Claytonded470d2011-03-19 01:12:21 +0000324 return pos->create_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000325 }
326 }
Eugene Zelenko89183722016-03-11 21:55:47 +0000327 return nullptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000328}
329
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000330#pragma mark Disassembler
331
Jason Molenda743e86a2010-06-11 23:44:18 +0000332struct DisassemblerInstance
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000333{
334 DisassemblerInstance() :
335 name(),
336 description(),
Eugene Zelenko89183722016-03-11 21:55:47 +0000337 create_callback(nullptr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000338 {
339 }
340
Greg Clayton57abc5d2013-05-10 21:47:16 +0000341 ConstString name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000342 std::string description;
343 DisassemblerCreateInstance create_callback;
344};
345
346typedef std::vector<DisassemblerInstance> DisassemblerInstances;
347
Greg Claytonab65b342011-04-13 22:47:15 +0000348static Mutex &
349GetDisassemblerMutex ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000350{
Greg Claytonab65b342011-04-13 22:47:15 +0000351 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
352 return g_instances_mutex;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000353}
354
Greg Claytonab65b342011-04-13 22:47:15 +0000355static DisassemblerInstances &
356GetDisassemblerInstances ()
357{
358 static DisassemblerInstances g_instances;
359 return g_instances;
360}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000361
362bool
Eugene Zelenko89183722016-03-11 21:55:47 +0000363PluginManager::RegisterPlugin(const ConstString &name,
364 const char *description,
365 DisassemblerCreateInstance create_callback)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000366{
367 if (create_callback)
368 {
369 DisassemblerInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +0000370 assert ((bool)name);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000371 instance.name = name;
372 if (description && description[0])
373 instance.description = description;
374 instance.create_callback = create_callback;
Greg Claytonab65b342011-04-13 22:47:15 +0000375 Mutex::Locker locker (GetDisassemblerMutex ());
376 GetDisassemblerInstances ().push_back (instance);
377 return true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000378 }
379 return false;
380}
381
382bool
383PluginManager::UnregisterPlugin (DisassemblerCreateInstance create_callback)
384{
385 if (create_callback)
386 {
Greg Claytonab65b342011-04-13 22:47:15 +0000387 Mutex::Locker locker (GetDisassemblerMutex ());
388 DisassemblerInstances &instances = GetDisassemblerInstances ();
389
390 DisassemblerInstances::iterator pos, end = instances.end();
391 for (pos = instances.begin(); pos != end; ++ pos)
392 {
393 if (pos->create_callback == create_callback)
394 {
395 instances.erase(pos);
396 return true;
397 }
398 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000399 }
400 return false;
401}
402
403DisassemblerCreateInstance
404PluginManager::GetDisassemblerCreateCallbackAtIndex (uint32_t idx)
405{
Greg Claytonab65b342011-04-13 22:47:15 +0000406 Mutex::Locker locker (GetDisassemblerMutex ());
407 DisassemblerInstances &instances = GetDisassemblerInstances ();
408 if (idx < instances.size())
409 return instances[idx].create_callback;
Eugene Zelenko89183722016-03-11 21:55:47 +0000410 return nullptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000411}
412
413DisassemblerCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +0000414PluginManager::GetDisassemblerCreateCallbackForPluginName (const ConstString &name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000415{
Greg Clayton57abc5d2013-05-10 21:47:16 +0000416 if (name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000417 {
Greg Claytonab65b342011-04-13 22:47:15 +0000418 Mutex::Locker locker (GetDisassemblerMutex ());
419 DisassemblerInstances &instances = GetDisassemblerInstances ();
420
421 DisassemblerInstances::iterator pos, end = instances.end();
422 for (pos = instances.begin(); pos != end; ++ pos)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000423 {
Greg Clayton57abc5d2013-05-10 21:47:16 +0000424 if (name == pos->name)
Greg Claytonab65b342011-04-13 22:47:15 +0000425 return pos->create_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000426 }
427 }
Eugene Zelenko89183722016-03-11 21:55:47 +0000428 return nullptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000429}
430
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000431#pragma mark DynamicLoader
432
Jason Molenda743e86a2010-06-11 23:44:18 +0000433struct DynamicLoaderInstance
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000434{
435 DynamicLoaderInstance() :
436 name(),
437 description(),
Eugene Zelenko89183722016-03-11 21:55:47 +0000438 create_callback(nullptr),
439 debugger_init_callback(nullptr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000440 {
441 }
442
Greg Clayton57abc5d2013-05-10 21:47:16 +0000443 ConstString name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000444 std::string description;
445 DynamicLoaderCreateInstance create_callback;
Greg Claytone8cd0c92012-10-19 18:02:49 +0000446 DebuggerInitializeCallback debugger_init_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000447};
448
449typedef std::vector<DynamicLoaderInstance> DynamicLoaderInstances;
450
Greg Claytonab65b342011-04-13 22:47:15 +0000451static Mutex &
452GetDynamicLoaderMutex ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000453{
Greg Claytonab65b342011-04-13 22:47:15 +0000454 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
455 return g_instances_mutex;
456}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000457
Greg Claytonab65b342011-04-13 22:47:15 +0000458static DynamicLoaderInstances &
459GetDynamicLoaderInstances ()
460{
461 static DynamicLoaderInstances g_instances;
462 return g_instances;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000463}
464
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000465bool
Eugene Zelenko89183722016-03-11 21:55:47 +0000466PluginManager::RegisterPlugin(const ConstString &name,
467 const char *description,
468 DynamicLoaderCreateInstance create_callback,
469 DebuggerInitializeCallback debugger_init_callback)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000470{
471 if (create_callback)
472 {
473 DynamicLoaderInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +0000474 assert ((bool)name);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000475 instance.name = name;
476 if (description && description[0])
477 instance.description = description;
478 instance.create_callback = create_callback;
Greg Claytone8cd0c92012-10-19 18:02:49 +0000479 instance.debugger_init_callback = debugger_init_callback;
Greg Claytonab65b342011-04-13 22:47:15 +0000480 Mutex::Locker locker (GetDynamicLoaderMutex ());
481 GetDynamicLoaderInstances ().push_back (instance);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000482 }
483 return false;
484}
485
486bool
487PluginManager::UnregisterPlugin (DynamicLoaderCreateInstance create_callback)
488{
489 if (create_callback)
490 {
Greg Claytonab65b342011-04-13 22:47:15 +0000491 Mutex::Locker locker (GetDynamicLoaderMutex ());
492 DynamicLoaderInstances &instances = GetDynamicLoaderInstances ();
493
494 DynamicLoaderInstances::iterator pos, end = instances.end();
495 for (pos = instances.begin(); pos != end; ++ pos)
496 {
497 if (pos->create_callback == create_callback)
498 {
499 instances.erase(pos);
500 return true;
501 }
502 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000503 }
504 return false;
505}
506
507DynamicLoaderCreateInstance
508PluginManager::GetDynamicLoaderCreateCallbackAtIndex (uint32_t idx)
509{
Greg Claytonab65b342011-04-13 22:47:15 +0000510 Mutex::Locker locker (GetDynamicLoaderMutex ());
511 DynamicLoaderInstances &instances = GetDynamicLoaderInstances ();
512 if (idx < instances.size())
513 return instances[idx].create_callback;
Eugene Zelenko89183722016-03-11 21:55:47 +0000514 return nullptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000515}
516
517DynamicLoaderCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +0000518PluginManager::GetDynamicLoaderCreateCallbackForPluginName (const ConstString &name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000519{
Greg Clayton57abc5d2013-05-10 21:47:16 +0000520 if (name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000521 {
Greg Claytonab65b342011-04-13 22:47:15 +0000522 Mutex::Locker locker (GetDynamicLoaderMutex ());
523 DynamicLoaderInstances &instances = GetDynamicLoaderInstances ();
524
525 DynamicLoaderInstances::iterator pos, end = instances.end();
526 for (pos = instances.begin(); pos != end; ++ pos)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000527 {
Greg Clayton57abc5d2013-05-10 21:47:16 +0000528 if (name == pos->name)
Greg Claytonab65b342011-04-13 22:47:15 +0000529 return pos->create_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000530 }
531 }
Eugene Zelenko89183722016-03-11 21:55:47 +0000532 return nullptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000533}
534
Andrew MacPherson17220c12014-03-05 10:12:43 +0000535#pragma mark JITLoader
536
Andrew MacPherson17220c12014-03-05 10:12:43 +0000537struct JITLoaderInstance
538{
539 JITLoaderInstance() :
540 name(),
541 description(),
Eugene Zelenko89183722016-03-11 21:55:47 +0000542 create_callback(nullptr),
543 debugger_init_callback(nullptr)
Andrew MacPherson17220c12014-03-05 10:12:43 +0000544 {
545 }
546
547 ConstString name;
548 std::string description;
549 JITLoaderCreateInstance create_callback;
550 DebuggerInitializeCallback debugger_init_callback;
551};
552
553typedef std::vector<JITLoaderInstance> JITLoaderInstances;
554
Andrew MacPherson17220c12014-03-05 10:12:43 +0000555static Mutex &
556GetJITLoaderMutex ()
557{
558 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
559 return g_instances_mutex;
560}
561
562static JITLoaderInstances &
563GetJITLoaderInstances ()
564{
565 static JITLoaderInstances g_instances;
566 return g_instances;
567}
568
Andrew MacPherson17220c12014-03-05 10:12:43 +0000569bool
Eugene Zelenko89183722016-03-11 21:55:47 +0000570PluginManager::RegisterPlugin(const ConstString &name,
571 const char *description,
572 JITLoaderCreateInstance create_callback,
573 DebuggerInitializeCallback debugger_init_callback)
Andrew MacPherson17220c12014-03-05 10:12:43 +0000574{
575 if (create_callback)
576 {
577 JITLoaderInstance instance;
578 assert ((bool)name);
579 instance.name = name;
580 if (description && description[0])
581 instance.description = description;
582 instance.create_callback = create_callback;
583 instance.debugger_init_callback = debugger_init_callback;
584 Mutex::Locker locker (GetJITLoaderMutex ());
585 GetJITLoaderInstances ().push_back (instance);
586 }
587 return false;
588}
589
590bool
591PluginManager::UnregisterPlugin (JITLoaderCreateInstance create_callback)
592{
593 if (create_callback)
594 {
595 Mutex::Locker locker (GetJITLoaderMutex ());
596 JITLoaderInstances &instances = GetJITLoaderInstances ();
597
598 JITLoaderInstances::iterator pos, end = instances.end();
599 for (pos = instances.begin(); pos != end; ++ pos)
600 {
601 if (pos->create_callback == create_callback)
602 {
603 instances.erase(pos);
604 return true;
605 }
606 }
607 }
608 return false;
609}
610
611JITLoaderCreateInstance
612PluginManager::GetJITLoaderCreateCallbackAtIndex (uint32_t idx)
613{
614 Mutex::Locker locker (GetJITLoaderMutex ());
615 JITLoaderInstances &instances = GetJITLoaderInstances ();
616 if (idx < instances.size())
617 return instances[idx].create_callback;
Eugene Zelenko89183722016-03-11 21:55:47 +0000618 return nullptr;
Andrew MacPherson17220c12014-03-05 10:12:43 +0000619}
620
621JITLoaderCreateInstance
622PluginManager::GetJITLoaderCreateCallbackForPluginName (const ConstString &name)
623{
624 if (name)
625 {
626 Mutex::Locker locker (GetJITLoaderMutex ());
627 JITLoaderInstances &instances = GetJITLoaderInstances ();
628
629 JITLoaderInstances::iterator pos, end = instances.end();
630 for (pos = instances.begin(); pos != end; ++ pos)
631 {
632 if (name == pos->name)
633 return pos->create_callback;
634 }
635 }
Eugene Zelenko89183722016-03-11 21:55:47 +0000636 return nullptr;
Andrew MacPherson17220c12014-03-05 10:12:43 +0000637}
638
Greg Claytonf03bbe22011-02-01 01:37:45 +0000639#pragma mark EmulateInstruction
640
Greg Claytonf03bbe22011-02-01 01:37:45 +0000641struct EmulateInstructionInstance
642{
643 EmulateInstructionInstance() :
Eugene Zelenko89183722016-03-11 21:55:47 +0000644 name(),
645 description(),
646 create_callback(nullptr)
Greg Claytonf03bbe22011-02-01 01:37:45 +0000647 {
648 }
649
Greg Clayton57abc5d2013-05-10 21:47:16 +0000650 ConstString name;
Greg Claytonf03bbe22011-02-01 01:37:45 +0000651 std::string description;
652 EmulateInstructionCreateInstance create_callback;
653};
654
655typedef std::vector<EmulateInstructionInstance> EmulateInstructionInstances;
656
Greg Claytonab65b342011-04-13 22:47:15 +0000657static Mutex &
658GetEmulateInstructionMutex ()
Greg Claytonf03bbe22011-02-01 01:37:45 +0000659{
Greg Claytonab65b342011-04-13 22:47:15 +0000660 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
661 return g_instances_mutex;
662}
663
664static EmulateInstructionInstances &
665GetEmulateInstructionInstances ()
666{
667 static EmulateInstructionInstances g_instances;
668 return g_instances;
Greg Claytonf03bbe22011-02-01 01:37:45 +0000669}
670
Greg Claytonf03bbe22011-02-01 01:37:45 +0000671bool
Eugene Zelenko89183722016-03-11 21:55:47 +0000672PluginManager::RegisterPlugin(const ConstString &name,
673 const char *description,
674 EmulateInstructionCreateInstance create_callback)
Greg Claytonf03bbe22011-02-01 01:37:45 +0000675{
676 if (create_callback)
677 {
678 EmulateInstructionInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +0000679 assert ((bool)name);
Greg Claytonf03bbe22011-02-01 01:37:45 +0000680 instance.name = name;
681 if (description && description[0])
682 instance.description = description;
683 instance.create_callback = create_callback;
Greg Claytonab65b342011-04-13 22:47:15 +0000684 Mutex::Locker locker (GetEmulateInstructionMutex ());
685 GetEmulateInstructionInstances ().push_back (instance);
Greg Claytonf03bbe22011-02-01 01:37:45 +0000686 }
687 return false;
688}
689
690bool
691PluginManager::UnregisterPlugin (EmulateInstructionCreateInstance create_callback)
692{
693 if (create_callback)
694 {
Greg Claytonab65b342011-04-13 22:47:15 +0000695 Mutex::Locker locker (GetEmulateInstructionMutex ());
696 EmulateInstructionInstances &instances = GetEmulateInstructionInstances ();
697
698 EmulateInstructionInstances::iterator pos, end = instances.end();
699 for (pos = instances.begin(); pos != end; ++ pos)
700 {
701 if (pos->create_callback == create_callback)
702 {
703 instances.erase(pos);
704 return true;
705 }
706 }
Greg Claytonf03bbe22011-02-01 01:37:45 +0000707 }
708 return false;
709}
710
711EmulateInstructionCreateInstance
712PluginManager::GetEmulateInstructionCreateCallbackAtIndex (uint32_t idx)
713{
Greg Claytonab65b342011-04-13 22:47:15 +0000714 Mutex::Locker locker (GetEmulateInstructionMutex ());
715 EmulateInstructionInstances &instances = GetEmulateInstructionInstances ();
716 if (idx < instances.size())
717 return instances[idx].create_callback;
Eugene Zelenko89183722016-03-11 21:55:47 +0000718 return nullptr;
Greg Claytonf03bbe22011-02-01 01:37:45 +0000719}
720
721EmulateInstructionCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +0000722PluginManager::GetEmulateInstructionCreateCallbackForPluginName (const ConstString &name)
Greg Claytonf03bbe22011-02-01 01:37:45 +0000723{
Greg Clayton57abc5d2013-05-10 21:47:16 +0000724 if (name)
Greg Claytonf03bbe22011-02-01 01:37:45 +0000725 {
Greg Claytonab65b342011-04-13 22:47:15 +0000726 Mutex::Locker locker (GetEmulateInstructionMutex ());
727 EmulateInstructionInstances &instances = GetEmulateInstructionInstances ();
728
729 EmulateInstructionInstances::iterator pos, end = instances.end();
730 for (pos = instances.begin(); pos != end; ++ pos)
Greg Claytonf03bbe22011-02-01 01:37:45 +0000731 {
Greg Clayton57abc5d2013-05-10 21:47:16 +0000732 if (name == pos->name)
Greg Claytonab65b342011-04-13 22:47:15 +0000733 return pos->create_callback;
Greg Claytonf03bbe22011-02-01 01:37:45 +0000734 }
735 }
Eugene Zelenko89183722016-03-11 21:55:47 +0000736 return nullptr;
Greg Claytonf03bbe22011-02-01 01:37:45 +0000737}
Greg Clayton56d9a1b2011-08-22 02:49:39 +0000738
Eugene Zelenko89183722016-03-11 21:55:47 +0000739#pragma mark OperatingSystem
Greg Clayton56d9a1b2011-08-22 02:49:39 +0000740
741struct OperatingSystemInstance
742{
Ryan Brown65d4d5c2015-09-16 21:20:44 +0000743 OperatingSystemInstance () :
744 name (),
745 description (),
746 create_callback (nullptr),
747 debugger_init_callback (nullptr)
Greg Clayton56d9a1b2011-08-22 02:49:39 +0000748 {
749 }
750
Greg Clayton57abc5d2013-05-10 21:47:16 +0000751 ConstString name;
Greg Clayton56d9a1b2011-08-22 02:49:39 +0000752 std::string description;
753 OperatingSystemCreateInstance create_callback;
Ryan Brown65d4d5c2015-09-16 21:20:44 +0000754 DebuggerInitializeCallback debugger_init_callback;
Greg Clayton56d9a1b2011-08-22 02:49:39 +0000755};
756
757typedef std::vector<OperatingSystemInstance> OperatingSystemInstances;
758
759static Mutex &
760GetOperatingSystemMutex ()
761{
762 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
763 return g_instances_mutex;
764}
765
766static OperatingSystemInstances &
767GetOperatingSystemInstances ()
768{
769 static OperatingSystemInstances g_instances;
770 return g_instances;
771}
772
773bool
Ryan Brown65d4d5c2015-09-16 21:20:44 +0000774PluginManager::RegisterPlugin(const ConstString &name, const char *description,
775 OperatingSystemCreateInstance create_callback,
776 DebuggerInitializeCallback debugger_init_callback)
Greg Clayton56d9a1b2011-08-22 02:49:39 +0000777{
778 if (create_callback)
779 {
780 OperatingSystemInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +0000781 assert ((bool)name);
Greg Clayton56d9a1b2011-08-22 02:49:39 +0000782 instance.name = name;
783 if (description && description[0])
784 instance.description = description;
785 instance.create_callback = create_callback;
Ryan Brown65d4d5c2015-09-16 21:20:44 +0000786 instance.debugger_init_callback = debugger_init_callback;
Greg Clayton56d9a1b2011-08-22 02:49:39 +0000787 Mutex::Locker locker (GetOperatingSystemMutex ());
788 GetOperatingSystemInstances ().push_back (instance);
789 }
790 return false;
791}
792
793bool
794PluginManager::UnregisterPlugin (OperatingSystemCreateInstance create_callback)
795{
796 if (create_callback)
797 {
798 Mutex::Locker locker (GetOperatingSystemMutex ());
799 OperatingSystemInstances &instances = GetOperatingSystemInstances ();
800
801 OperatingSystemInstances::iterator pos, end = instances.end();
802 for (pos = instances.begin(); pos != end; ++ pos)
803 {
804 if (pos->create_callback == create_callback)
805 {
806 instances.erase(pos);
807 return true;
808 }
809 }
810 }
811 return false;
812}
813
814OperatingSystemCreateInstance
815PluginManager::GetOperatingSystemCreateCallbackAtIndex (uint32_t idx)
816{
817 Mutex::Locker locker (GetOperatingSystemMutex ());
818 OperatingSystemInstances &instances = GetOperatingSystemInstances ();
819 if (idx < instances.size())
820 return instances[idx].create_callback;
Eugene Zelenko89183722016-03-11 21:55:47 +0000821 return nullptr;
Greg Clayton56d9a1b2011-08-22 02:49:39 +0000822}
823
824OperatingSystemCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +0000825PluginManager::GetOperatingSystemCreateCallbackForPluginName (const ConstString &name)
Greg Clayton56d9a1b2011-08-22 02:49:39 +0000826{
Greg Clayton57abc5d2013-05-10 21:47:16 +0000827 if (name)
Greg Clayton56d9a1b2011-08-22 02:49:39 +0000828 {
Greg Clayton56d9a1b2011-08-22 02:49:39 +0000829 Mutex::Locker locker (GetOperatingSystemMutex ());
830 OperatingSystemInstances &instances = GetOperatingSystemInstances ();
831
832 OperatingSystemInstances::iterator pos, end = instances.end();
833 for (pos = instances.begin(); pos != end; ++ pos)
834 {
Greg Clayton57abc5d2013-05-10 21:47:16 +0000835 if (name == pos->name)
Greg Clayton56d9a1b2011-08-22 02:49:39 +0000836 return pos->create_callback;
837 }
838 }
Eugene Zelenko89183722016-03-11 21:55:47 +0000839 return nullptr;
Greg Clayton56d9a1b2011-08-22 02:49:39 +0000840}
Greg Claytonf03bbe22011-02-01 01:37:45 +0000841
Enrico Granata5f9d3102015-08-27 21:33:50 +0000842#pragma mark Language
843
Enrico Granata5f9d3102015-08-27 21:33:50 +0000844struct LanguageInstance
845{
846 LanguageInstance() :
847 name(),
848 description(),
Eugene Zelenko89183722016-03-11 21:55:47 +0000849 create_callback(nullptr)
Enrico Granata5f9d3102015-08-27 21:33:50 +0000850 {
851 }
852
853 ConstString name;
854 std::string description;
855 LanguageCreateInstance create_callback;
856};
857
858typedef std::vector<LanguageInstance> LanguageInstances;
859
860static Mutex &
861GetLanguageMutex ()
862{
863 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
864 return g_instances_mutex;
865}
866
867static LanguageInstances &
868GetLanguageInstances ()
869{
870 static LanguageInstances g_instances;
871 return g_instances;
872}
873
874bool
Eugene Zelenko89183722016-03-11 21:55:47 +0000875PluginManager::RegisterPlugin(const ConstString &name,
876 const char *description,
877 LanguageCreateInstance create_callback)
Enrico Granata5f9d3102015-08-27 21:33:50 +0000878{
879 if (create_callback)
880 {
881 LanguageInstance instance;
882 assert ((bool)name);
883 instance.name = name;
884 if (description && description[0])
885 instance.description = description;
886 instance.create_callback = create_callback;
887 Mutex::Locker locker (GetLanguageMutex ());
888 GetLanguageInstances ().push_back (instance);
889 }
890 return false;
891}
892
893bool
894PluginManager::UnregisterPlugin (LanguageCreateInstance create_callback)
895{
896 if (create_callback)
897 {
898 Mutex::Locker locker (GetLanguageMutex ());
899 LanguageInstances &instances = GetLanguageInstances ();
900
901 LanguageInstances::iterator pos, end = instances.end();
902 for (pos = instances.begin(); pos != end; ++ pos)
903 {
904 if (pos->create_callback == create_callback)
905 {
906 instances.erase(pos);
907 return true;
908 }
909 }
910 }
911 return false;
912}
913
914LanguageCreateInstance
915PluginManager::GetLanguageCreateCallbackAtIndex (uint32_t idx)
916{
917 Mutex::Locker locker (GetLanguageMutex ());
918 LanguageInstances &instances = GetLanguageInstances ();
919 if (idx < instances.size())
920 return instances[idx].create_callback;
Eugene Zelenko89183722016-03-11 21:55:47 +0000921 return nullptr;
Enrico Granata5f9d3102015-08-27 21:33:50 +0000922}
923
924LanguageCreateInstance
925PluginManager::GetLanguageCreateCallbackForPluginName (const ConstString &name)
926{
927 if (name)
928 {
929 Mutex::Locker locker (GetLanguageMutex ());
930 LanguageInstances &instances = GetLanguageInstances ();
931
932 LanguageInstances::iterator pos, end = instances.end();
933 for (pos = instances.begin(); pos != end; ++ pos)
934 {
935 if (name == pos->name)
936 return pos->create_callback;
937 }
938 }
Eugene Zelenko89183722016-03-11 21:55:47 +0000939 return nullptr;
Enrico Granata5f9d3102015-08-27 21:33:50 +0000940}
941
Jim Ingham22777012010-09-23 02:01:19 +0000942#pragma mark LanguageRuntime
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000943
Jim Ingham22777012010-09-23 02:01:19 +0000944struct LanguageRuntimeInstance
945{
946 LanguageRuntimeInstance() :
947 name(),
948 description(),
Eugene Zelenko89183722016-03-11 21:55:47 +0000949 create_callback(nullptr)
Jim Ingham22777012010-09-23 02:01:19 +0000950 {
951 }
952
Greg Clayton57abc5d2013-05-10 21:47:16 +0000953 ConstString name;
Jim Ingham22777012010-09-23 02:01:19 +0000954 std::string description;
955 LanguageRuntimeCreateInstance create_callback;
Colin Rileyc9c55a22015-05-04 18:39:38 +0000956 LanguageRuntimeGetCommandObject command_callback;
Jim Ingham22777012010-09-23 02:01:19 +0000957};
958
959typedef std::vector<LanguageRuntimeInstance> LanguageRuntimeInstances;
960
Greg Claytonab65b342011-04-13 22:47:15 +0000961static Mutex &
962GetLanguageRuntimeMutex ()
Jim Ingham22777012010-09-23 02:01:19 +0000963{
Greg Claytonab65b342011-04-13 22:47:15 +0000964 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
965 return g_instances_mutex;
Jim Ingham22777012010-09-23 02:01:19 +0000966}
967
Greg Claytonab65b342011-04-13 22:47:15 +0000968static LanguageRuntimeInstances &
969GetLanguageRuntimeInstances ()
970{
971 static LanguageRuntimeInstances g_instances;
972 return g_instances;
973}
Jim Ingham22777012010-09-23 02:01:19 +0000974
975bool
Eugene Zelenko89183722016-03-11 21:55:47 +0000976PluginManager::RegisterPlugin(const ConstString &name,
977 const char *description,
978 LanguageRuntimeCreateInstance create_callback,
979 LanguageRuntimeGetCommandObject command_callback)
Jim Ingham22777012010-09-23 02:01:19 +0000980{
981 if (create_callback)
982 {
983 LanguageRuntimeInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +0000984 assert ((bool)name);
Jim Ingham22777012010-09-23 02:01:19 +0000985 instance.name = name;
986 if (description && description[0])
987 instance.description = description;
988 instance.create_callback = create_callback;
Colin Rileyc9c55a22015-05-04 18:39:38 +0000989 instance.command_callback = command_callback;
Greg Claytonab65b342011-04-13 22:47:15 +0000990 Mutex::Locker locker (GetLanguageRuntimeMutex ());
991 GetLanguageRuntimeInstances ().push_back (instance);
Jim Ingham22777012010-09-23 02:01:19 +0000992 }
993 return false;
994}
995
996bool
997PluginManager::UnregisterPlugin (LanguageRuntimeCreateInstance create_callback)
998{
999 if (create_callback)
1000 {
Greg Claytonab65b342011-04-13 22:47:15 +00001001 Mutex::Locker locker (GetLanguageRuntimeMutex ());
1002 LanguageRuntimeInstances &instances = GetLanguageRuntimeInstances ();
1003
1004 LanguageRuntimeInstances::iterator pos, end = instances.end();
1005 for (pos = instances.begin(); pos != end; ++ pos)
1006 {
1007 if (pos->create_callback == create_callback)
1008 {
1009 instances.erase(pos);
1010 return true;
1011 }
1012 }
Jim Ingham22777012010-09-23 02:01:19 +00001013 }
1014 return false;
1015}
1016
1017LanguageRuntimeCreateInstance
1018PluginManager::GetLanguageRuntimeCreateCallbackAtIndex (uint32_t idx)
1019{
Greg Claytonab65b342011-04-13 22:47:15 +00001020 Mutex::Locker locker (GetLanguageRuntimeMutex ());
1021 LanguageRuntimeInstances &instances = GetLanguageRuntimeInstances ();
1022 if (idx < instances.size())
1023 return instances[idx].create_callback;
Eugene Zelenko89183722016-03-11 21:55:47 +00001024 return nullptr;
Jim Ingham22777012010-09-23 02:01:19 +00001025}
1026
Colin Rileyc9c55a22015-05-04 18:39:38 +00001027LanguageRuntimeGetCommandObject
1028PluginManager::GetLanguageRuntimeGetCommandObjectAtIndex (uint32_t idx)
1029{
1030 Mutex::Locker locker (GetLanguageRuntimeMutex ());
1031 LanguageRuntimeInstances &instances = GetLanguageRuntimeInstances ();
1032 if (idx < instances.size())
1033 return instances[idx].command_callback;
Eugene Zelenko89183722016-03-11 21:55:47 +00001034 return nullptr;
Colin Rileyc9c55a22015-05-04 18:39:38 +00001035}
1036
Jim Ingham22777012010-09-23 02:01:19 +00001037LanguageRuntimeCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +00001038PluginManager::GetLanguageRuntimeCreateCallbackForPluginName (const ConstString &name)
Jim Ingham22777012010-09-23 02:01:19 +00001039{
Greg Clayton57abc5d2013-05-10 21:47:16 +00001040 if (name)
Jim Ingham22777012010-09-23 02:01:19 +00001041 {
Greg Claytonab65b342011-04-13 22:47:15 +00001042 Mutex::Locker locker (GetLanguageRuntimeMutex ());
1043 LanguageRuntimeInstances &instances = GetLanguageRuntimeInstances ();
1044
1045 LanguageRuntimeInstances::iterator pos, end = instances.end();
1046 for (pos = instances.begin(); pos != end; ++ pos)
Jim Ingham22777012010-09-23 02:01:19 +00001047 {
Greg Clayton57abc5d2013-05-10 21:47:16 +00001048 if (name == pos->name)
Greg Claytonab65b342011-04-13 22:47:15 +00001049 return pos->create_callback;
Jim Ingham22777012010-09-23 02:01:19 +00001050 }
1051 }
Eugene Zelenko89183722016-03-11 21:55:47 +00001052 return nullptr;
Jim Ingham22777012010-09-23 02:01:19 +00001053}
1054
Jason Molendaeef51062013-11-05 03:57:19 +00001055#pragma mark SystemRuntime
1056
Jason Molendaeef51062013-11-05 03:57:19 +00001057struct SystemRuntimeInstance
1058{
1059 SystemRuntimeInstance() :
1060 name(),
1061 description(),
Eugene Zelenko89183722016-03-11 21:55:47 +00001062 create_callback(nullptr)
Jason Molendaeef51062013-11-05 03:57:19 +00001063 {
1064 }
1065
1066 ConstString name;
1067 std::string description;
1068 SystemRuntimeCreateInstance create_callback;
1069};
1070
1071typedef std::vector<SystemRuntimeInstance> SystemRuntimeInstances;
1072
1073static Mutex &
1074GetSystemRuntimeMutex ()
1075{
1076 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
1077 return g_instances_mutex;
1078}
1079
1080static SystemRuntimeInstances &
1081GetSystemRuntimeInstances ()
1082{
1083 static SystemRuntimeInstances g_instances;
1084 return g_instances;
1085}
1086
1087bool
Eugene Zelenko89183722016-03-11 21:55:47 +00001088PluginManager::RegisterPlugin(const ConstString &name,
1089 const char *description,
1090 SystemRuntimeCreateInstance create_callback)
Jason Molendaeef51062013-11-05 03:57:19 +00001091{
1092 if (create_callback)
1093 {
1094 SystemRuntimeInstance instance;
1095 assert ((bool)name);
1096 instance.name = name;
1097 if (description && description[0])
1098 instance.description = description;
1099 instance.create_callback = create_callback;
1100 Mutex::Locker locker (GetSystemRuntimeMutex ());
1101 GetSystemRuntimeInstances ().push_back (instance);
1102 }
1103 return false;
1104}
1105
1106bool
1107PluginManager::UnregisterPlugin (SystemRuntimeCreateInstance create_callback)
1108{
1109 if (create_callback)
1110 {
1111 Mutex::Locker locker (GetSystemRuntimeMutex ());
1112 SystemRuntimeInstances &instances = GetSystemRuntimeInstances ();
1113
1114 SystemRuntimeInstances::iterator pos, end = instances.end();
1115 for (pos = instances.begin(); pos != end; ++ pos)
1116 {
1117 if (pos->create_callback == create_callback)
1118 {
1119 instances.erase(pos);
1120 return true;
1121 }
1122 }
1123 }
1124 return false;
1125}
1126
1127SystemRuntimeCreateInstance
1128PluginManager::GetSystemRuntimeCreateCallbackAtIndex (uint32_t idx)
1129{
1130 Mutex::Locker locker (GetSystemRuntimeMutex ());
1131 SystemRuntimeInstances &instances = GetSystemRuntimeInstances ();
1132 if (idx < instances.size())
1133 return instances[idx].create_callback;
Eugene Zelenko89183722016-03-11 21:55:47 +00001134 return nullptr;
Jason Molendaeef51062013-11-05 03:57:19 +00001135}
1136
1137SystemRuntimeCreateInstance
1138PluginManager::GetSystemRuntimeCreateCallbackForPluginName (const ConstString &name)
1139{
1140 if (name)
1141 {
1142 Mutex::Locker locker (GetSystemRuntimeMutex ());
1143 SystemRuntimeInstances &instances = GetSystemRuntimeInstances ();
1144
1145 SystemRuntimeInstances::iterator pos, end = instances.end();
1146 for (pos = instances.begin(); pos != end; ++ pos)
1147 {
1148 if (name == pos->name)
1149 return pos->create_callback;
1150 }
1151 }
Eugene Zelenko89183722016-03-11 21:55:47 +00001152 return nullptr;
Jason Molendaeef51062013-11-05 03:57:19 +00001153}
1154
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001155#pragma mark ObjectFile
1156
Jason Molenda743e86a2010-06-11 23:44:18 +00001157struct ObjectFileInstance
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001158{
1159 ObjectFileInstance() :
1160 name(),
1161 description(),
Eugene Zelenko89183722016-03-11 21:55:47 +00001162 create_callback(nullptr),
1163 create_memory_callback(nullptr),
1164 get_module_specifications(nullptr),
1165 save_core(nullptr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001166 {
1167 }
1168
Greg Clayton57abc5d2013-05-10 21:47:16 +00001169 ConstString name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001170 std::string description;
1171 ObjectFileCreateInstance create_callback;
Greg Claytonc9660542012-02-05 02:38:54 +00001172 ObjectFileCreateMemoryInstance create_memory_callback;
Greg Claytonf4d6de62013-04-24 22:29:28 +00001173 ObjectFileGetModuleSpecifications get_module_specifications;
Greg Claytona2715cf2014-06-13 00:54:12 +00001174 ObjectFileSaveCore save_core;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001175};
1176
1177typedef std::vector<ObjectFileInstance> ObjectFileInstances;
1178
Greg Claytonab65b342011-04-13 22:47:15 +00001179static Mutex &
1180GetObjectFileMutex ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001181{
Greg Claytonab65b342011-04-13 22:47:15 +00001182 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
1183 return g_instances_mutex;
1184}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001185
Greg Claytonab65b342011-04-13 22:47:15 +00001186static ObjectFileInstances &
1187GetObjectFileInstances ()
1188{
1189 static ObjectFileInstances g_instances;
1190 return g_instances;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001191}
1192
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001193bool
Greg Clayton57abc5d2013-05-10 21:47:16 +00001194PluginManager::RegisterPlugin (const ConstString &name,
Greg Claytonf4d6de62013-04-24 22:29:28 +00001195 const char *description,
1196 ObjectFileCreateInstance create_callback,
1197 ObjectFileCreateMemoryInstance create_memory_callback,
Greg Claytona2715cf2014-06-13 00:54:12 +00001198 ObjectFileGetModuleSpecifications get_module_specifications,
1199 ObjectFileSaveCore save_core)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001200{
1201 if (create_callback)
1202 {
1203 ObjectFileInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +00001204 assert ((bool)name);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001205 instance.name = name;
1206 if (description && description[0])
1207 instance.description = description;
1208 instance.create_callback = create_callback;
Greg Claytonc9660542012-02-05 02:38:54 +00001209 instance.create_memory_callback = create_memory_callback;
Greg Claytona2715cf2014-06-13 00:54:12 +00001210 instance.save_core = save_core;
Greg Claytonf4d6de62013-04-24 22:29:28 +00001211 instance.get_module_specifications = get_module_specifications;
Greg Claytonab65b342011-04-13 22:47:15 +00001212 Mutex::Locker locker (GetObjectFileMutex ());
1213 GetObjectFileInstances ().push_back (instance);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001214 }
1215 return false;
1216}
1217
1218bool
1219PluginManager::UnregisterPlugin (ObjectFileCreateInstance create_callback)
1220{
1221 if (create_callback)
1222 {
Greg Claytonab65b342011-04-13 22:47:15 +00001223 Mutex::Locker locker (GetObjectFileMutex ());
1224 ObjectFileInstances &instances = GetObjectFileInstances ();
1225
1226 ObjectFileInstances::iterator pos, end = instances.end();
1227 for (pos = instances.begin(); pos != end; ++ pos)
1228 {
1229 if (pos->create_callback == create_callback)
1230 {
1231 instances.erase(pos);
1232 return true;
1233 }
1234 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001235 }
1236 return false;
1237}
1238
1239ObjectFileCreateInstance
1240PluginManager::GetObjectFileCreateCallbackAtIndex (uint32_t idx)
1241{
Greg Claytonab65b342011-04-13 22:47:15 +00001242 Mutex::Locker locker (GetObjectFileMutex ());
1243 ObjectFileInstances &instances = GetObjectFileInstances ();
1244 if (idx < instances.size())
1245 return instances[idx].create_callback;
Eugene Zelenko89183722016-03-11 21:55:47 +00001246 return nullptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001247}
Greg Claytonab65b342011-04-13 22:47:15 +00001248
Greg Claytonc9660542012-02-05 02:38:54 +00001249ObjectFileCreateMemoryInstance
1250PluginManager::GetObjectFileCreateMemoryCallbackAtIndex (uint32_t idx)
1251{
1252 Mutex::Locker locker (GetObjectFileMutex ());
1253 ObjectFileInstances &instances = GetObjectFileInstances ();
1254 if (idx < instances.size())
1255 return instances[idx].create_memory_callback;
Eugene Zelenko89183722016-03-11 21:55:47 +00001256 return nullptr;
Greg Claytonc9660542012-02-05 02:38:54 +00001257}
1258
Greg Claytonf4d6de62013-04-24 22:29:28 +00001259ObjectFileGetModuleSpecifications
1260PluginManager::GetObjectFileGetModuleSpecificationsCallbackAtIndex (uint32_t idx)
1261{
1262 Mutex::Locker locker (GetObjectFileMutex ());
1263 ObjectFileInstances &instances = GetObjectFileInstances ();
1264 if (idx < instances.size())
1265 return instances[idx].get_module_specifications;
Eugene Zelenko89183722016-03-11 21:55:47 +00001266 return nullptr;
Greg Claytonf4d6de62013-04-24 22:29:28 +00001267}
1268
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001269ObjectFileCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +00001270PluginManager::GetObjectFileCreateCallbackForPluginName (const ConstString &name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001271{
Greg Clayton57abc5d2013-05-10 21:47:16 +00001272 if (name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001273 {
Greg Claytonab65b342011-04-13 22:47:15 +00001274 Mutex::Locker locker (GetObjectFileMutex ());
1275 ObjectFileInstances &instances = GetObjectFileInstances ();
1276
1277 ObjectFileInstances::iterator pos, end = instances.end();
1278 for (pos = instances.begin(); pos != end; ++ pos)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001279 {
Greg Clayton57abc5d2013-05-10 21:47:16 +00001280 if (name == pos->name)
Greg Claytonab65b342011-04-13 22:47:15 +00001281 return pos->create_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001282 }
1283 }
Eugene Zelenko89183722016-03-11 21:55:47 +00001284 return nullptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001285}
1286
Greg Claytonc9660542012-02-05 02:38:54 +00001287ObjectFileCreateMemoryInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +00001288PluginManager::GetObjectFileCreateMemoryCallbackForPluginName (const ConstString &name)
Greg Claytonc9660542012-02-05 02:38:54 +00001289{
Greg Clayton57abc5d2013-05-10 21:47:16 +00001290 if (name)
Greg Claytonc9660542012-02-05 02:38:54 +00001291 {
Greg Claytonc9660542012-02-05 02:38:54 +00001292 Mutex::Locker locker (GetObjectFileMutex ());
1293 ObjectFileInstances &instances = GetObjectFileInstances ();
1294
1295 ObjectFileInstances::iterator pos, end = instances.end();
1296 for (pos = instances.begin(); pos != end; ++ pos)
1297 {
Greg Clayton57abc5d2013-05-10 21:47:16 +00001298 if (name == pos->name)
Greg Claytonc9660542012-02-05 02:38:54 +00001299 return pos->create_memory_callback;
1300 }
1301 }
Eugene Zelenko89183722016-03-11 21:55:47 +00001302 return nullptr;
Greg Claytonc9660542012-02-05 02:38:54 +00001303}
1304
Greg Claytona2715cf2014-06-13 00:54:12 +00001305Error
1306PluginManager::SaveCore (const lldb::ProcessSP &process_sp, const FileSpec &outfile)
1307{
1308 Error error;
1309 Mutex::Locker locker (GetObjectFileMutex ());
1310 ObjectFileInstances &instances = GetObjectFileInstances ();
1311
1312 ObjectFileInstances::iterator pos, end = instances.end();
1313 for (pos = instances.begin(); pos != end; ++ pos)
1314 {
1315 if (pos->save_core && pos->save_core (process_sp, outfile, error))
1316 return error;
1317 }
1318 error.SetErrorString("no ObjectFile plugins were able to save a core for this process");
1319 return error;
1320}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001321
1322#pragma mark ObjectContainer
1323
Jason Molenda743e86a2010-06-11 23:44:18 +00001324struct ObjectContainerInstance
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001325{
1326 ObjectContainerInstance() :
1327 name(),
1328 description(),
Eugene Zelenko89183722016-03-11 21:55:47 +00001329 create_callback(nullptr),
1330 get_module_specifications(nullptr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001331 {
1332 }
1333
Greg Clayton57abc5d2013-05-10 21:47:16 +00001334 ConstString name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001335 std::string description;
1336 ObjectContainerCreateInstance create_callback;
Greg Claytonf4d6de62013-04-24 22:29:28 +00001337 ObjectFileGetModuleSpecifications get_module_specifications;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001338};
1339
1340typedef std::vector<ObjectContainerInstance> ObjectContainerInstances;
1341
Greg Claytonab65b342011-04-13 22:47:15 +00001342static Mutex &
1343GetObjectContainerMutex ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001344{
Greg Claytonab65b342011-04-13 22:47:15 +00001345 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
1346 return g_instances_mutex;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001347}
1348
Greg Claytonab65b342011-04-13 22:47:15 +00001349static ObjectContainerInstances &
1350GetObjectContainerInstances ()
1351{
1352 static ObjectContainerInstances g_instances;
1353 return g_instances;
1354}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001355
1356bool
Greg Clayton57abc5d2013-05-10 21:47:16 +00001357PluginManager::RegisterPlugin (const ConstString &name,
Greg Claytonf4d6de62013-04-24 22:29:28 +00001358 const char *description,
1359 ObjectContainerCreateInstance create_callback,
1360 ObjectFileGetModuleSpecifications get_module_specifications)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001361{
1362 if (create_callback)
1363 {
1364 ObjectContainerInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +00001365 assert ((bool)name);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001366 instance.name = name;
1367 if (description && description[0])
1368 instance.description = description;
1369 instance.create_callback = create_callback;
Greg Claytonf4d6de62013-04-24 22:29:28 +00001370 instance.get_module_specifications = get_module_specifications;
Greg Claytonab65b342011-04-13 22:47:15 +00001371 Mutex::Locker locker (GetObjectContainerMutex ());
1372 GetObjectContainerInstances ().push_back (instance);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001373 }
1374 return false;
1375}
1376
1377bool
1378PluginManager::UnregisterPlugin (ObjectContainerCreateInstance create_callback)
1379{
1380 if (create_callback)
1381 {
Greg Claytonab65b342011-04-13 22:47:15 +00001382 Mutex::Locker locker (GetObjectContainerMutex ());
1383 ObjectContainerInstances &instances = GetObjectContainerInstances ();
1384
1385 ObjectContainerInstances::iterator pos, end = instances.end();
1386 for (pos = instances.begin(); pos != end; ++ pos)
1387 {
1388 if (pos->create_callback == create_callback)
1389 {
1390 instances.erase(pos);
1391 return true;
1392 }
1393 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001394 }
1395 return false;
1396}
1397
1398ObjectContainerCreateInstance
1399PluginManager::GetObjectContainerCreateCallbackAtIndex (uint32_t idx)
1400{
Greg Claytonab65b342011-04-13 22:47:15 +00001401 Mutex::Locker locker (GetObjectContainerMutex ());
1402 ObjectContainerInstances &instances = GetObjectContainerInstances ();
1403 if (idx < instances.size())
1404 return instances[idx].create_callback;
Eugene Zelenko89183722016-03-11 21:55:47 +00001405 return nullptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001406}
Greg Claytonab65b342011-04-13 22:47:15 +00001407
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001408ObjectContainerCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +00001409PluginManager::GetObjectContainerCreateCallbackForPluginName (const ConstString &name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001410{
Greg Clayton57abc5d2013-05-10 21:47:16 +00001411 if (name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001412 {
Greg Claytonab65b342011-04-13 22:47:15 +00001413 Mutex::Locker locker (GetObjectContainerMutex ());
1414 ObjectContainerInstances &instances = GetObjectContainerInstances ();
1415
1416 ObjectContainerInstances::iterator pos, end = instances.end();
1417 for (pos = instances.begin(); pos != end; ++ pos)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001418 {
Greg Clayton57abc5d2013-05-10 21:47:16 +00001419 if (name == pos->name)
Greg Claytonab65b342011-04-13 22:47:15 +00001420 return pos->create_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001421 }
1422 }
Eugene Zelenko89183722016-03-11 21:55:47 +00001423 return nullptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001424}
1425
Greg Claytonf4d6de62013-04-24 22:29:28 +00001426ObjectFileGetModuleSpecifications
1427PluginManager::GetObjectContainerGetModuleSpecificationsCallbackAtIndex (uint32_t idx)
1428{
1429 Mutex::Locker locker (GetObjectContainerMutex ());
1430 ObjectContainerInstances &instances = GetObjectContainerInstances ();
1431 if (idx < instances.size())
1432 return instances[idx].get_module_specifications;
Eugene Zelenko89183722016-03-11 21:55:47 +00001433 return nullptr;
Greg Claytonf4d6de62013-04-24 22:29:28 +00001434}
1435
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001436#pragma mark LogChannel
1437
Greg Claytonab65b342011-04-13 22:47:15 +00001438struct LogInstance
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001439{
Greg Claytonab65b342011-04-13 22:47:15 +00001440 LogInstance() :
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001441 name(),
1442 description(),
Eugene Zelenko89183722016-03-11 21:55:47 +00001443 create_callback(nullptr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001444 {
1445 }
1446
Greg Clayton57abc5d2013-05-10 21:47:16 +00001447 ConstString name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001448 std::string description;
1449 LogChannelCreateInstance create_callback;
1450};
1451
Greg Claytonab65b342011-04-13 22:47:15 +00001452typedef std::vector<LogInstance> LogInstances;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001453
Greg Claytonab65b342011-04-13 22:47:15 +00001454static Mutex &
1455GetLogMutex ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001456{
Greg Claytonab65b342011-04-13 22:47:15 +00001457 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
1458 return g_instances_mutex;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001459}
1460
Greg Claytonab65b342011-04-13 22:47:15 +00001461static LogInstances &
1462GetLogInstances ()
1463{
1464 static LogInstances g_instances;
1465 return g_instances;
1466}
1467
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001468bool
Eugene Zelenko89183722016-03-11 21:55:47 +00001469PluginManager::RegisterPlugin(const ConstString &name,
1470 const char *description,
1471 LogChannelCreateInstance create_callback)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001472{
1473 if (create_callback)
1474 {
Greg Claytonab65b342011-04-13 22:47:15 +00001475 LogInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +00001476 assert ((bool)name);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001477 instance.name = name;
1478 if (description && description[0])
1479 instance.description = description;
1480 instance.create_callback = create_callback;
Greg Claytonab65b342011-04-13 22:47:15 +00001481 Mutex::Locker locker (GetLogMutex ());
1482 GetLogInstances ().push_back (instance);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001483 }
1484 return false;
1485}
1486
1487bool
1488PluginManager::UnregisterPlugin (LogChannelCreateInstance create_callback)
1489{
1490 if (create_callback)
1491 {
Greg Claytonab65b342011-04-13 22:47:15 +00001492 Mutex::Locker locker (GetLogMutex ());
1493 LogInstances &instances = GetLogInstances ();
1494
1495 LogInstances::iterator pos, end = instances.end();
1496 for (pos = instances.begin(); pos != end; ++ pos)
1497 {
1498 if (pos->create_callback == create_callback)
1499 {
1500 instances.erase(pos);
1501 return true;
1502 }
1503 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001504 }
1505 return false;
1506}
1507
1508const char *
1509PluginManager::GetLogChannelCreateNameAtIndex (uint32_t idx)
1510{
Greg Claytonab65b342011-04-13 22:47:15 +00001511 Mutex::Locker locker (GetLogMutex ());
1512 LogInstances &instances = GetLogInstances ();
1513 if (idx < instances.size())
Greg Clayton57abc5d2013-05-10 21:47:16 +00001514 return instances[idx].name.GetCString();
Eugene Zelenko89183722016-03-11 21:55:47 +00001515 return nullptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001516}
1517
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001518LogChannelCreateInstance
1519PluginManager::GetLogChannelCreateCallbackAtIndex (uint32_t idx)
1520{
Greg Claytonab65b342011-04-13 22:47:15 +00001521 Mutex::Locker locker (GetLogMutex ());
1522 LogInstances &instances = GetLogInstances ();
1523 if (idx < instances.size())
1524 return instances[idx].create_callback;
Eugene Zelenko89183722016-03-11 21:55:47 +00001525 return nullptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001526}
1527
1528LogChannelCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +00001529PluginManager::GetLogChannelCreateCallbackForPluginName (const ConstString &name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001530{
Greg Clayton57abc5d2013-05-10 21:47:16 +00001531 if (name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001532 {
Greg Claytonab65b342011-04-13 22:47:15 +00001533 Mutex::Locker locker (GetLogMutex ());
1534 LogInstances &instances = GetLogInstances ();
1535
1536 LogInstances::iterator pos, end = instances.end();
1537 for (pos = instances.begin(); pos != end; ++ pos)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001538 {
Greg Clayton57abc5d2013-05-10 21:47:16 +00001539 if (name == pos->name)
Greg Claytonab65b342011-04-13 22:47:15 +00001540 return pos->create_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001541 }
1542 }
Eugene Zelenko89183722016-03-11 21:55:47 +00001543 return nullptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001544}
1545
Greg Claytone996fd32011-03-08 22:40:15 +00001546#pragma mark Platform
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001547
Greg Claytone996fd32011-03-08 22:40:15 +00001548struct PlatformInstance
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001549{
Greg Claytone996fd32011-03-08 22:40:15 +00001550 PlatformInstance() :
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001551 name(),
1552 description(),
Eugene Zelenko89183722016-03-11 21:55:47 +00001553 create_callback(nullptr),
1554 debugger_init_callback(nullptr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001555 {
1556 }
Greg Claytone996fd32011-03-08 22:40:15 +00001557
Greg Clayton57abc5d2013-05-10 21:47:16 +00001558 ConstString name;
Greg Claytone996fd32011-03-08 22:40:15 +00001559 std::string description;
1560 PlatformCreateInstance create_callback;
Jason Molenda9b837a12013-04-05 05:06:39 +00001561 DebuggerInitializeCallback debugger_init_callback;
Greg Claytone996fd32011-03-08 22:40:15 +00001562};
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001563
Greg Claytone996fd32011-03-08 22:40:15 +00001564typedef std::vector<PlatformInstance> PlatformInstances;
1565
Greg Claytonded470d2011-03-19 01:12:21 +00001566static Mutex &
1567GetPlatformInstancesMutex ()
Greg Claytone996fd32011-03-08 22:40:15 +00001568{
Greg Claytonded470d2011-03-19 01:12:21 +00001569 static Mutex g_platform_instances_mutex (Mutex::eMutexTypeRecursive);
1570 return g_platform_instances_mutex;
Greg Claytone996fd32011-03-08 22:40:15 +00001571}
1572
Greg Claytonded470d2011-03-19 01:12:21 +00001573static PlatformInstances &
1574GetPlatformInstances ()
1575{
1576 static PlatformInstances g_platform_instances;
1577 return g_platform_instances;
1578}
Greg Claytone996fd32011-03-08 22:40:15 +00001579
1580bool
Greg Clayton57abc5d2013-05-10 21:47:16 +00001581PluginManager::RegisterPlugin (const ConstString &name,
Greg Claytone996fd32011-03-08 22:40:15 +00001582 const char *description,
Jason Molenda9b837a12013-04-05 05:06:39 +00001583 PlatformCreateInstance create_callback,
1584 DebuggerInitializeCallback debugger_init_callback)
Greg Claytone996fd32011-03-08 22:40:15 +00001585{
1586 if (create_callback)
1587 {
Greg Claytonded470d2011-03-19 01:12:21 +00001588 Mutex::Locker locker (GetPlatformInstancesMutex ());
1589
Greg Claytone996fd32011-03-08 22:40:15 +00001590 PlatformInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +00001591 assert ((bool)name);
Greg Claytone996fd32011-03-08 22:40:15 +00001592 instance.name = name;
1593 if (description && description[0])
1594 instance.description = description;
1595 instance.create_callback = create_callback;
Jason Molenda9b837a12013-04-05 05:06:39 +00001596 instance.debugger_init_callback = debugger_init_callback;
Greg Claytonded470d2011-03-19 01:12:21 +00001597 GetPlatformInstances ().push_back (instance);
1598 return true;
Greg Claytone996fd32011-03-08 22:40:15 +00001599 }
1600 return false;
1601}
1602
1603const char *
1604PluginManager::GetPlatformPluginNameAtIndex (uint32_t idx)
1605{
Greg Claytonded470d2011-03-19 01:12:21 +00001606 Mutex::Locker locker (GetPlatformInstancesMutex ());
Greg Claytonab65b342011-04-13 22:47:15 +00001607 PlatformInstances &instances = GetPlatformInstances ();
1608 if (idx < instances.size())
Greg Clayton57abc5d2013-05-10 21:47:16 +00001609 return instances[idx].name.GetCString();
Eugene Zelenko89183722016-03-11 21:55:47 +00001610 return nullptr;
Greg Claytone996fd32011-03-08 22:40:15 +00001611}
1612
1613const char *
1614PluginManager::GetPlatformPluginDescriptionAtIndex (uint32_t idx)
1615{
Greg Claytonded470d2011-03-19 01:12:21 +00001616 Mutex::Locker locker (GetPlatformInstancesMutex ());
Greg Claytonab65b342011-04-13 22:47:15 +00001617 PlatformInstances &instances = GetPlatformInstances ();
1618 if (idx < instances.size())
1619 return instances[idx].description.c_str();
Eugene Zelenko89183722016-03-11 21:55:47 +00001620 return nullptr;
Greg Claytone996fd32011-03-08 22:40:15 +00001621}
1622
1623bool
1624PluginManager::UnregisterPlugin (PlatformCreateInstance create_callback)
1625{
1626 if (create_callback)
1627 {
Greg Claytonded470d2011-03-19 01:12:21 +00001628 Mutex::Locker locker (GetPlatformInstancesMutex ());
Greg Claytonab65b342011-04-13 22:47:15 +00001629 PlatformInstances &instances = GetPlatformInstances ();
Greg Claytonded470d2011-03-19 01:12:21 +00001630
Greg Claytonab65b342011-04-13 22:47:15 +00001631 PlatformInstances::iterator pos, end = instances.end();
1632 for (pos = instances.begin(); pos != end; ++ pos)
Greg Claytonded470d2011-03-19 01:12:21 +00001633 {
1634 if (pos->create_callback == create_callback)
1635 {
Greg Claytonab65b342011-04-13 22:47:15 +00001636 instances.erase(pos);
Greg Claytonded470d2011-03-19 01:12:21 +00001637 return true;
1638 }
1639 }
Greg Claytone996fd32011-03-08 22:40:15 +00001640 }
1641 return false;
1642}
1643
1644PlatformCreateInstance
1645PluginManager::GetPlatformCreateCallbackAtIndex (uint32_t idx)
1646{
Greg Claytonded470d2011-03-19 01:12:21 +00001647 Mutex::Locker locker (GetPlatformInstancesMutex ());
Greg Claytonab65b342011-04-13 22:47:15 +00001648 PlatformInstances &instances = GetPlatformInstances ();
1649 if (idx < instances.size())
1650 return instances[idx].create_callback;
Eugene Zelenko89183722016-03-11 21:55:47 +00001651 return nullptr;
Greg Claytone996fd32011-03-08 22:40:15 +00001652}
1653
1654PlatformCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +00001655PluginManager::GetPlatformCreateCallbackForPluginName (const ConstString &name)
Greg Claytone996fd32011-03-08 22:40:15 +00001656{
Greg Clayton57abc5d2013-05-10 21:47:16 +00001657 if (name)
Greg Claytone996fd32011-03-08 22:40:15 +00001658 {
Greg Claytonded470d2011-03-19 01:12:21 +00001659 Mutex::Locker locker (GetPlatformInstancesMutex ());
Greg Claytonab65b342011-04-13 22:47:15 +00001660 PlatformInstances &instances = GetPlatformInstances ();
Greg Claytonded470d2011-03-19 01:12:21 +00001661
Greg Claytonab65b342011-04-13 22:47:15 +00001662 PlatformInstances::iterator pos, end = instances.end();
1663 for (pos = instances.begin(); pos != end; ++ pos)
Greg Claytone996fd32011-03-08 22:40:15 +00001664 {
Greg Clayton57abc5d2013-05-10 21:47:16 +00001665 if (name == pos->name)
Greg Claytonded470d2011-03-19 01:12:21 +00001666 return pos->create_callback;
Greg Claytone996fd32011-03-08 22:40:15 +00001667 }
1668 }
Eugene Zelenko89183722016-03-11 21:55:47 +00001669 return nullptr;
Greg Claytone996fd32011-03-08 22:40:15 +00001670}
1671
Greg Claytonc7bece562013-01-25 18:06:21 +00001672size_t
Greg Claytonab65b342011-04-13 22:47:15 +00001673PluginManager::AutoCompletePlatformName (const char *name, StringList &matches)
1674{
Greg Clayton57abc5d2013-05-10 21:47:16 +00001675 if (name)
Greg Claytonab65b342011-04-13 22:47:15 +00001676 {
1677 Mutex::Locker locker (GetPlatformInstancesMutex ());
1678 PlatformInstances &instances = GetPlatformInstances ();
1679 llvm::StringRef name_sref(name);
1680
1681 PlatformInstances::iterator pos, end = instances.end();
1682 for (pos = instances.begin(); pos != end; ++ pos)
1683 {
Greg Clayton57abc5d2013-05-10 21:47:16 +00001684 llvm::StringRef plugin_name (pos->name.GetCString());
Greg Clayton7260f622011-04-18 08:33:37 +00001685 if (plugin_name.startswith(name_sref))
1686 matches.AppendString (plugin_name.data());
Greg Claytonab65b342011-04-13 22:47:15 +00001687 }
1688 }
1689 return matches.GetSize();
1690}
Eugene Zelenko89183722016-03-11 21:55:47 +00001691
Greg Claytone996fd32011-03-08 22:40:15 +00001692#pragma mark Process
1693
1694struct ProcessInstance
1695{
1696 ProcessInstance() :
Greg Clayton7f982402013-07-15 22:54:20 +00001697 name(),
1698 description(),
Eugene Zelenko89183722016-03-11 21:55:47 +00001699 create_callback(nullptr),
1700 debugger_init_callback(nullptr)
Greg Claytone996fd32011-03-08 22:40:15 +00001701 {
1702 }
1703
Greg Clayton57abc5d2013-05-10 21:47:16 +00001704 ConstString name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001705 std::string description;
1706 ProcessCreateInstance create_callback;
Greg Clayton7f982402013-07-15 22:54:20 +00001707 DebuggerInitializeCallback debugger_init_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001708};
1709
1710typedef std::vector<ProcessInstance> ProcessInstances;
1711
Greg Claytonab65b342011-04-13 22:47:15 +00001712static Mutex &
1713GetProcessMutex ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001714{
Greg Claytonab65b342011-04-13 22:47:15 +00001715 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
1716 return g_instances_mutex;
1717}
1718
1719static ProcessInstances &
1720GetProcessInstances ()
1721{
1722 static ProcessInstances g_instances;
1723 return g_instances;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001724}
1725
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001726bool
Greg Clayton7f982402013-07-15 22:54:20 +00001727PluginManager::RegisterPlugin (const ConstString &name,
1728 const char *description,
1729 ProcessCreateInstance create_callback,
1730 DebuggerInitializeCallback debugger_init_callback)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001731{
1732 if (create_callback)
1733 {
1734 ProcessInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +00001735 assert ((bool)name);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001736 instance.name = name;
1737 if (description && description[0])
1738 instance.description = description;
1739 instance.create_callback = create_callback;
Greg Clayton7f982402013-07-15 22:54:20 +00001740 instance.debugger_init_callback = debugger_init_callback;
Greg Claytonab65b342011-04-13 22:47:15 +00001741 Mutex::Locker locker (GetProcessMutex ());
1742 GetProcessInstances ().push_back (instance);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001743 }
1744 return false;
1745}
1746
Greg Claytonbfe5f3b2011-02-18 01:44:25 +00001747const char *
1748PluginManager::GetProcessPluginNameAtIndex (uint32_t idx)
1749{
Greg Claytonab65b342011-04-13 22:47:15 +00001750 Mutex::Locker locker (GetProcessMutex ());
1751 ProcessInstances &instances = GetProcessInstances ();
1752 if (idx < instances.size())
Greg Clayton57abc5d2013-05-10 21:47:16 +00001753 return instances[idx].name.GetCString();
Eugene Zelenko89183722016-03-11 21:55:47 +00001754 return nullptr;
Greg Claytonbfe5f3b2011-02-18 01:44:25 +00001755}
1756
1757const char *
1758PluginManager::GetProcessPluginDescriptionAtIndex (uint32_t idx)
1759{
Greg Claytonab65b342011-04-13 22:47:15 +00001760 Mutex::Locker locker (GetProcessMutex ());
1761 ProcessInstances &instances = GetProcessInstances ();
1762 if (idx < instances.size())
1763 return instances[idx].description.c_str();
Eugene Zelenko89183722016-03-11 21:55:47 +00001764 return nullptr;
Greg Claytonbfe5f3b2011-02-18 01:44:25 +00001765}
1766
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001767bool
1768PluginManager::UnregisterPlugin (ProcessCreateInstance create_callback)
1769{
1770 if (create_callback)
1771 {
Greg Claytonab65b342011-04-13 22:47:15 +00001772 Mutex::Locker locker (GetProcessMutex ());
1773 ProcessInstances &instances = GetProcessInstances ();
1774
1775 ProcessInstances::iterator pos, end = instances.end();
1776 for (pos = instances.begin(); pos != end; ++ pos)
1777 {
1778 if (pos->create_callback == create_callback)
1779 {
1780 instances.erase(pos);
1781 return true;
1782 }
1783 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001784 }
1785 return false;
1786}
1787
1788ProcessCreateInstance
1789PluginManager::GetProcessCreateCallbackAtIndex (uint32_t idx)
1790{
Greg Claytonab65b342011-04-13 22:47:15 +00001791 Mutex::Locker locker (GetProcessMutex ());
1792 ProcessInstances &instances = GetProcessInstances ();
1793 if (idx < instances.size())
1794 return instances[idx].create_callback;
Eugene Zelenko89183722016-03-11 21:55:47 +00001795 return nullptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001796}
1797
1798ProcessCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +00001799PluginManager::GetProcessCreateCallbackForPluginName (const ConstString &name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001800{
Greg Clayton57abc5d2013-05-10 21:47:16 +00001801 if (name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001802 {
Greg Claytonab65b342011-04-13 22:47:15 +00001803 Mutex::Locker locker (GetProcessMutex ());
1804 ProcessInstances &instances = GetProcessInstances ();
1805
1806 ProcessInstances::iterator pos, end = instances.end();
1807 for (pos = instances.begin(); pos != end; ++ pos)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001808 {
Greg Clayton57abc5d2013-05-10 21:47:16 +00001809 if (name == pos->name)
Greg Claytonab65b342011-04-13 22:47:15 +00001810 return pos->create_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001811 }
1812 }
Eugene Zelenko89183722016-03-11 21:55:47 +00001813 return nullptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001814}
1815
Zachary Turner2c1f46d2015-07-30 20:28:07 +00001816#pragma mark ScriptInterpreter
1817
1818struct ScriptInterpreterInstance
1819{
1820 ScriptInterpreterInstance()
1821 : name()
1822 , language(lldb::eScriptLanguageNone)
1823 , description()
Eugene Zelenko89183722016-03-11 21:55:47 +00001824 , create_callback(nullptr)
Zachary Turner2c1f46d2015-07-30 20:28:07 +00001825 {
1826 }
1827
1828 ConstString name;
1829 lldb::ScriptLanguage language;
1830 std::string description;
1831 ScriptInterpreterCreateInstance create_callback;
1832};
1833
1834typedef std::vector<ScriptInterpreterInstance> ScriptInterpreterInstances;
1835
1836static Mutex &
1837GetScriptInterpreterMutex()
1838{
1839 static Mutex g_instances_mutex(Mutex::eMutexTypeRecursive);
1840 return g_instances_mutex;
1841}
1842
1843static ScriptInterpreterInstances &
1844GetScriptInterpreterInstances()
1845{
1846 static ScriptInterpreterInstances g_instances;
1847 return g_instances;
1848}
1849
1850bool
1851PluginManager::RegisterPlugin(const ConstString &name, const char *description, lldb::ScriptLanguage script_language,
1852 ScriptInterpreterCreateInstance create_callback)
1853{
1854 if (!create_callback)
1855 return false;
1856 ScriptInterpreterInstance instance;
1857 assert((bool)name);
1858 instance.name = name;
1859 if (description && description[0])
1860 instance.description = description;
1861 instance.create_callback = create_callback;
1862 instance.language = script_language;
1863 Mutex::Locker locker(GetScriptInterpreterMutex());
1864 GetScriptInterpreterInstances().push_back(instance);
1865 return false;
1866}
1867
1868bool
1869PluginManager::UnregisterPlugin(ScriptInterpreterCreateInstance create_callback)
1870{
1871 if (!create_callback)
1872 return false;
1873 Mutex::Locker locker(GetScriptInterpreterMutex());
1874 ScriptInterpreterInstances &instances = GetScriptInterpreterInstances();
1875
1876 ScriptInterpreterInstances::iterator pos, end = instances.end();
1877 for (pos = instances.begin(); pos != end; ++pos)
1878 {
1879 if (pos->create_callback != create_callback)
1880 continue;
1881
1882 instances.erase(pos);
1883 return true;
1884 }
1885 return false;
1886}
1887
1888ScriptInterpreterCreateInstance
1889PluginManager::GetScriptInterpreterCreateCallbackAtIndex(uint32_t idx)
1890{
1891 Mutex::Locker locker(GetScriptInterpreterMutex());
1892 ScriptInterpreterInstances &instances = GetScriptInterpreterInstances();
1893 if (idx < instances.size())
1894 return instances[idx].create_callback;
1895 return nullptr;
1896}
1897
1898lldb::ScriptInterpreterSP
1899PluginManager::GetScriptInterpreterForLanguage(lldb::ScriptLanguage script_lang, CommandInterpreter &interpreter)
1900{
1901 Mutex::Locker locker(GetScriptInterpreterMutex());
1902 ScriptInterpreterInstances &instances = GetScriptInterpreterInstances();
1903
1904 ScriptInterpreterInstances::iterator pos, end = instances.end();
1905 ScriptInterpreterCreateInstance none_instance = nullptr;
1906 for (pos = instances.begin(); pos != end; ++pos)
1907 {
1908 if (pos->language == lldb::eScriptLanguageNone)
1909 none_instance = pos->create_callback;
1910
1911 if (script_lang == pos->language)
1912 return pos->create_callback(interpreter);
1913 }
1914
1915 // If we didn't find one, return the ScriptInterpreter for the null language.
1916 assert(none_instance != nullptr);
1917 return none_instance(interpreter);
1918}
1919
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001920#pragma mark SymbolFile
1921
Jason Molenda743e86a2010-06-11 23:44:18 +00001922struct SymbolFileInstance
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001923{
1924 SymbolFileInstance() :
1925 name(),
1926 description(),
Oleksiy Vyalovabb5a352015-07-29 22:18:16 +00001927 create_callback(nullptr),
1928 debugger_init_callback(nullptr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001929 {
1930 }
1931
Greg Clayton57abc5d2013-05-10 21:47:16 +00001932 ConstString name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001933 std::string description;
1934 SymbolFileCreateInstance create_callback;
Oleksiy Vyalovabb5a352015-07-29 22:18:16 +00001935 DebuggerInitializeCallback debugger_init_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001936};
1937
1938typedef std::vector<SymbolFileInstance> SymbolFileInstances;
1939
Greg Claytonab65b342011-04-13 22:47:15 +00001940static Mutex &
1941GetSymbolFileMutex ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001942{
Greg Claytonab65b342011-04-13 22:47:15 +00001943 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
1944 return g_instances_mutex;
1945}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001946
Greg Claytonab65b342011-04-13 22:47:15 +00001947static SymbolFileInstances &
1948GetSymbolFileInstances ()
1949{
1950 static SymbolFileInstances g_instances;
1951 return g_instances;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001952}
1953
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001954bool
Eugene Zelenko89183722016-03-11 21:55:47 +00001955PluginManager::RegisterPlugin(const ConstString &name,
1956 const char *description,
1957 SymbolFileCreateInstance create_callback,
1958 DebuggerInitializeCallback debugger_init_callback)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001959{
1960 if (create_callback)
1961 {
1962 SymbolFileInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +00001963 assert ((bool)name);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001964 instance.name = name;
1965 if (description && description[0])
1966 instance.description = description;
1967 instance.create_callback = create_callback;
Oleksiy Vyalovabb5a352015-07-29 22:18:16 +00001968 instance.debugger_init_callback = debugger_init_callback;
Greg Claytonab65b342011-04-13 22:47:15 +00001969 Mutex::Locker locker (GetSymbolFileMutex ());
1970 GetSymbolFileInstances ().push_back (instance);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001971 }
1972 return false;
1973}
1974
1975bool
1976PluginManager::UnregisterPlugin (SymbolFileCreateInstance create_callback)
1977{
1978 if (create_callback)
1979 {
Greg Claytonab65b342011-04-13 22:47:15 +00001980 Mutex::Locker locker (GetSymbolFileMutex ());
1981 SymbolFileInstances &instances = GetSymbolFileInstances ();
1982
1983 SymbolFileInstances::iterator pos, end = instances.end();
1984 for (pos = instances.begin(); pos != end; ++ pos)
1985 {
1986 if (pos->create_callback == create_callback)
1987 {
1988 instances.erase(pos);
1989 return true;
1990 }
1991 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001992 }
1993 return false;
1994}
1995
1996SymbolFileCreateInstance
1997PluginManager::GetSymbolFileCreateCallbackAtIndex (uint32_t idx)
1998{
Greg Claytonab65b342011-04-13 22:47:15 +00001999 Mutex::Locker locker (GetSymbolFileMutex ());
2000 SymbolFileInstances &instances = GetSymbolFileInstances ();
2001 if (idx < instances.size())
2002 return instances[idx].create_callback;
Eugene Zelenko89183722016-03-11 21:55:47 +00002003 return nullptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002004}
Greg Claytonab65b342011-04-13 22:47:15 +00002005
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002006SymbolFileCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +00002007PluginManager::GetSymbolFileCreateCallbackForPluginName (const ConstString &name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002008{
Greg Clayton57abc5d2013-05-10 21:47:16 +00002009 if (name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002010 {
Greg Claytonab65b342011-04-13 22:47:15 +00002011 Mutex::Locker locker (GetSymbolFileMutex ());
2012 SymbolFileInstances &instances = GetSymbolFileInstances ();
2013
2014 SymbolFileInstances::iterator pos, end = instances.end();
2015 for (pos = instances.begin(); pos != end; ++ pos)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002016 {
Greg Clayton57abc5d2013-05-10 21:47:16 +00002017 if (name == pos->name)
Greg Claytonab65b342011-04-13 22:47:15 +00002018 return pos->create_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002019 }
2020 }
Eugene Zelenko89183722016-03-11 21:55:47 +00002021 return nullptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002022}
2023
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002024#pragma mark SymbolVendor
2025
Jason Molenda743e86a2010-06-11 23:44:18 +00002026struct SymbolVendorInstance
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002027{
2028 SymbolVendorInstance() :
2029 name(),
2030 description(),
Eugene Zelenko89183722016-03-11 21:55:47 +00002031 create_callback(nullptr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002032 {
2033 }
2034
Greg Clayton57abc5d2013-05-10 21:47:16 +00002035 ConstString name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002036 std::string description;
2037 SymbolVendorCreateInstance create_callback;
2038};
2039
2040typedef std::vector<SymbolVendorInstance> SymbolVendorInstances;
2041
Greg Claytonab65b342011-04-13 22:47:15 +00002042static Mutex &
2043GetSymbolVendorMutex ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002044{
Greg Claytonab65b342011-04-13 22:47:15 +00002045 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
2046 return g_instances_mutex;
2047}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002048
Greg Claytonab65b342011-04-13 22:47:15 +00002049static SymbolVendorInstances &
2050GetSymbolVendorInstances ()
2051{
2052 static SymbolVendorInstances g_instances;
2053 return g_instances;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002054}
2055
2056bool
Eugene Zelenko89183722016-03-11 21:55:47 +00002057PluginManager::RegisterPlugin(const ConstString &name,
2058 const char *description,
2059 SymbolVendorCreateInstance create_callback)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002060{
2061 if (create_callback)
2062 {
2063 SymbolVendorInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +00002064 assert ((bool)name);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002065 instance.name = name;
2066 if (description && description[0])
2067 instance.description = description;
2068 instance.create_callback = create_callback;
Greg Claytonab65b342011-04-13 22:47:15 +00002069 Mutex::Locker locker (GetSymbolVendorMutex ());
2070 GetSymbolVendorInstances ().push_back (instance);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002071 }
2072 return false;
2073}
2074
2075bool
2076PluginManager::UnregisterPlugin (SymbolVendorCreateInstance create_callback)
2077{
2078 if (create_callback)
2079 {
Greg Claytonab65b342011-04-13 22:47:15 +00002080 Mutex::Locker locker (GetSymbolVendorMutex ());
2081 SymbolVendorInstances &instances = GetSymbolVendorInstances ();
2082
2083 SymbolVendorInstances::iterator pos, end = instances.end();
2084 for (pos = instances.begin(); pos != end; ++ pos)
2085 {
2086 if (pos->create_callback == create_callback)
2087 {
2088 instances.erase(pos);
2089 return true;
2090 }
2091 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002092 }
2093 return false;
2094}
2095
2096SymbolVendorCreateInstance
2097PluginManager::GetSymbolVendorCreateCallbackAtIndex (uint32_t idx)
2098{
Greg Claytonab65b342011-04-13 22:47:15 +00002099 Mutex::Locker locker (GetSymbolVendorMutex ());
2100 SymbolVendorInstances &instances = GetSymbolVendorInstances ();
2101 if (idx < instances.size())
2102 return instances[idx].create_callback;
Eugene Zelenko89183722016-03-11 21:55:47 +00002103 return nullptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002104}
2105
2106SymbolVendorCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +00002107PluginManager::GetSymbolVendorCreateCallbackForPluginName (const ConstString &name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002108{
Greg Clayton57abc5d2013-05-10 21:47:16 +00002109 if (name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002110 {
Greg Claytonab65b342011-04-13 22:47:15 +00002111 Mutex::Locker locker (GetSymbolVendorMutex ());
2112 SymbolVendorInstances &instances = GetSymbolVendorInstances ();
2113
2114 SymbolVendorInstances::iterator pos, end = instances.end();
2115 for (pos = instances.begin(); pos != end; ++ pos)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002116 {
Greg Clayton57abc5d2013-05-10 21:47:16 +00002117 if (name == pos->name)
Greg Claytonab65b342011-04-13 22:47:15 +00002118 return pos->create_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002119 }
2120 }
Eugene Zelenko89183722016-03-11 21:55:47 +00002121 return nullptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002122}
2123
Greg Clayton7be25422011-04-25 21:14:26 +00002124#pragma mark UnwindAssembly
Jason Molendafbcb7f22010-09-10 07:49:16 +00002125
Greg Clayton7be25422011-04-25 21:14:26 +00002126struct UnwindAssemblyInstance
Jason Molendafbcb7f22010-09-10 07:49:16 +00002127{
Greg Clayton7be25422011-04-25 21:14:26 +00002128 UnwindAssemblyInstance() :
Jason Molendafbcb7f22010-09-10 07:49:16 +00002129 name(),
2130 description(),
Eugene Zelenko89183722016-03-11 21:55:47 +00002131 create_callback(nullptr)
Jason Molendafbcb7f22010-09-10 07:49:16 +00002132 {
2133 }
2134
Greg Clayton57abc5d2013-05-10 21:47:16 +00002135 ConstString name;
Jason Molendafbcb7f22010-09-10 07:49:16 +00002136 std::string description;
Greg Clayton7be25422011-04-25 21:14:26 +00002137 UnwindAssemblyCreateInstance create_callback;
Jason Molendafbcb7f22010-09-10 07:49:16 +00002138};
2139
Greg Clayton7be25422011-04-25 21:14:26 +00002140typedef std::vector<UnwindAssemblyInstance> UnwindAssemblyInstances;
Jason Molendafbcb7f22010-09-10 07:49:16 +00002141
Greg Claytonab65b342011-04-13 22:47:15 +00002142static Mutex &
Greg Clayton7be25422011-04-25 21:14:26 +00002143GetUnwindAssemblyMutex ()
Jason Molendafbcb7f22010-09-10 07:49:16 +00002144{
Greg Claytonab65b342011-04-13 22:47:15 +00002145 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
2146 return g_instances_mutex;
2147}
Jason Molendafbcb7f22010-09-10 07:49:16 +00002148
Greg Clayton7be25422011-04-25 21:14:26 +00002149static UnwindAssemblyInstances &
2150GetUnwindAssemblyInstances ()
Greg Claytonab65b342011-04-13 22:47:15 +00002151{
Greg Clayton7be25422011-04-25 21:14:26 +00002152 static UnwindAssemblyInstances g_instances;
Greg Claytonab65b342011-04-13 22:47:15 +00002153 return g_instances;
Jason Molendafbcb7f22010-09-10 07:49:16 +00002154}
2155
2156bool
Eugene Zelenko89183722016-03-11 21:55:47 +00002157PluginManager::RegisterPlugin(const ConstString &name,
2158 const char *description,
2159 UnwindAssemblyCreateInstance create_callback)
Jason Molendafbcb7f22010-09-10 07:49:16 +00002160{
2161 if (create_callback)
2162 {
Greg Clayton7be25422011-04-25 21:14:26 +00002163 UnwindAssemblyInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +00002164 assert ((bool)name);
Jason Molendafbcb7f22010-09-10 07:49:16 +00002165 instance.name = name;
2166 if (description && description[0])
2167 instance.description = description;
2168 instance.create_callback = create_callback;
Greg Clayton7be25422011-04-25 21:14:26 +00002169 Mutex::Locker locker (GetUnwindAssemblyMutex ());
2170 GetUnwindAssemblyInstances ().push_back (instance);
Jason Molendafbcb7f22010-09-10 07:49:16 +00002171 }
2172 return false;
2173}
2174
2175bool
Greg Clayton7be25422011-04-25 21:14:26 +00002176PluginManager::UnregisterPlugin (UnwindAssemblyCreateInstance create_callback)
Jason Molendafbcb7f22010-09-10 07:49:16 +00002177{
2178 if (create_callback)
2179 {
Greg Clayton7be25422011-04-25 21:14:26 +00002180 Mutex::Locker locker (GetUnwindAssemblyMutex ());
2181 UnwindAssemblyInstances &instances = GetUnwindAssemblyInstances ();
Greg Claytonab65b342011-04-13 22:47:15 +00002182
Greg Clayton7be25422011-04-25 21:14:26 +00002183 UnwindAssemblyInstances::iterator pos, end = instances.end();
Greg Claytonab65b342011-04-13 22:47:15 +00002184 for (pos = instances.begin(); pos != end; ++ pos)
2185 {
2186 if (pos->create_callback == create_callback)
2187 {
2188 instances.erase(pos);
2189 return true;
2190 }
2191 }
Jason Molendafbcb7f22010-09-10 07:49:16 +00002192 }
2193 return false;
2194}
2195
Greg Clayton7be25422011-04-25 21:14:26 +00002196UnwindAssemblyCreateInstance
2197PluginManager::GetUnwindAssemblyCreateCallbackAtIndex (uint32_t idx)
Jason Molendafbcb7f22010-09-10 07:49:16 +00002198{
Greg Clayton7be25422011-04-25 21:14:26 +00002199 Mutex::Locker locker (GetUnwindAssemblyMutex ());
2200 UnwindAssemblyInstances &instances = GetUnwindAssemblyInstances ();
Greg Claytonab65b342011-04-13 22:47:15 +00002201 if (idx < instances.size())
2202 return instances[idx].create_callback;
Eugene Zelenko89183722016-03-11 21:55:47 +00002203 return nullptr;
Jason Molendafbcb7f22010-09-10 07:49:16 +00002204}
2205
Greg Clayton7be25422011-04-25 21:14:26 +00002206UnwindAssemblyCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +00002207PluginManager::GetUnwindAssemblyCreateCallbackForPluginName (const ConstString &name)
Jason Molendafbcb7f22010-09-10 07:49:16 +00002208{
Greg Clayton57abc5d2013-05-10 21:47:16 +00002209 if (name)
Jason Molendafbcb7f22010-09-10 07:49:16 +00002210 {
Greg Clayton7be25422011-04-25 21:14:26 +00002211 Mutex::Locker locker (GetUnwindAssemblyMutex ());
2212 UnwindAssemblyInstances &instances = GetUnwindAssemblyInstances ();
Greg Claytonab65b342011-04-13 22:47:15 +00002213
Greg Clayton7be25422011-04-25 21:14:26 +00002214 UnwindAssemblyInstances::iterator pos, end = instances.end();
Greg Claytonab65b342011-04-13 22:47:15 +00002215 for (pos = instances.begin(); pos != end; ++ pos)
Jason Molendafbcb7f22010-09-10 07:49:16 +00002216 {
Greg Clayton57abc5d2013-05-10 21:47:16 +00002217 if (name == pos->name)
Greg Claytonab65b342011-04-13 22:47:15 +00002218 return pos->create_callback;
Jason Molendafbcb7f22010-09-10 07:49:16 +00002219 }
2220 }
Eugene Zelenko89183722016-03-11 21:55:47 +00002221 return nullptr;
Jason Molendafbcb7f22010-09-10 07:49:16 +00002222}
2223
Kuba Breckabeed8212014-09-04 01:03:18 +00002224#pragma mark MemoryHistory
2225
2226struct MemoryHistoryInstance
2227{
2228 MemoryHistoryInstance() :
Eugene Zelenko89183722016-03-11 21:55:47 +00002229 name(),
2230 description(),
2231 create_callback(nullptr)
Kuba Breckabeed8212014-09-04 01:03:18 +00002232 {
2233 }
2234
2235 ConstString name;
2236 std::string description;
2237 MemoryHistoryCreateInstance create_callback;
2238};
2239
2240typedef std::vector<MemoryHistoryInstance> MemoryHistoryInstances;
2241
2242static Mutex &
2243GetMemoryHistoryMutex ()
2244{
2245 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
2246 return g_instances_mutex;
2247}
2248
2249static MemoryHistoryInstances &
2250GetMemoryHistoryInstances ()
2251{
2252 static MemoryHistoryInstances g_instances;
2253 return g_instances;
2254}
2255
2256bool
Eugene Zelenko89183722016-03-11 21:55:47 +00002257PluginManager::RegisterPlugin(const ConstString &name,
2258 const char *description,
2259 MemoryHistoryCreateInstance create_callback)
Kuba Breckabeed8212014-09-04 01:03:18 +00002260{
2261 if (create_callback)
2262 {
2263 MemoryHistoryInstance instance;
2264 assert ((bool)name);
2265 instance.name = name;
2266 if (description && description[0])
2267 instance.description = description;
2268 instance.create_callback = create_callback;
2269 Mutex::Locker locker (GetMemoryHistoryMutex ());
2270 GetMemoryHistoryInstances ().push_back (instance);
2271 }
2272 return false;
2273}
2274
2275bool
2276PluginManager::UnregisterPlugin (MemoryHistoryCreateInstance create_callback)
2277{
2278 if (create_callback)
2279 {
2280 Mutex::Locker locker (GetMemoryHistoryMutex ());
2281 MemoryHistoryInstances &instances = GetMemoryHistoryInstances ();
2282
2283 MemoryHistoryInstances::iterator pos, end = instances.end();
2284 for (pos = instances.begin(); pos != end; ++ pos)
2285 {
2286 if (pos->create_callback == create_callback)
2287 {
2288 instances.erase(pos);
2289 return true;
2290 }
2291 }
2292 }
2293 return false;
2294}
2295
2296MemoryHistoryCreateInstance
2297PluginManager::GetMemoryHistoryCreateCallbackAtIndex (uint32_t idx)
2298{
2299 Mutex::Locker locker (GetMemoryHistoryMutex ());
2300 MemoryHistoryInstances &instances = GetMemoryHistoryInstances ();
2301 if (idx < instances.size())
2302 return instances[idx].create_callback;
Eugene Zelenko89183722016-03-11 21:55:47 +00002303 return nullptr;
Kuba Breckabeed8212014-09-04 01:03:18 +00002304}
2305
Kuba Breckabeed8212014-09-04 01:03:18 +00002306MemoryHistoryCreateInstance
2307PluginManager::GetMemoryHistoryCreateCallbackForPluginName (const ConstString &name)
2308{
2309 if (name)
2310 {
2311 Mutex::Locker locker (GetMemoryHistoryMutex ());
2312 MemoryHistoryInstances &instances = GetMemoryHistoryInstances ();
2313
2314 MemoryHistoryInstances::iterator pos, end = instances.end();
2315 for (pos = instances.begin(); pos != end; ++ pos)
2316 {
2317 if (name == pos->name)
2318 return pos->create_callback;
2319 }
2320 }
Eugene Zelenko89183722016-03-11 21:55:47 +00002321 return nullptr;
Kuba Breckabeed8212014-09-04 01:03:18 +00002322}
2323
Kuba Breckaafdf8422014-10-10 23:43:03 +00002324#pragma mark InstrumentationRuntime
2325
2326struct InstrumentationRuntimeInstance
2327{
2328 InstrumentationRuntimeInstance() :
Eugene Zelenko89183722016-03-11 21:55:47 +00002329 name(),
2330 description(),
2331 create_callback(nullptr)
Kuba Breckaafdf8422014-10-10 23:43:03 +00002332 {
2333 }
2334
2335 ConstString name;
2336 std::string description;
2337 InstrumentationRuntimeCreateInstance create_callback;
2338 InstrumentationRuntimeGetType get_type_callback;
2339};
2340
2341typedef std::vector<InstrumentationRuntimeInstance> InstrumentationRuntimeInstances;
2342
2343static Mutex &
2344GetInstrumentationRuntimeMutex ()
2345{
2346 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
2347 return g_instances_mutex;
2348}
2349
2350static InstrumentationRuntimeInstances &
2351GetInstrumentationRuntimeInstances ()
2352{
2353 static InstrumentationRuntimeInstances g_instances;
2354 return g_instances;
2355}
2356
2357bool
Eugene Zelenko89183722016-03-11 21:55:47 +00002358PluginManager::RegisterPlugin(const ConstString &name,
2359 const char *description,
2360 InstrumentationRuntimeCreateInstance create_callback,
2361 InstrumentationRuntimeGetType get_type_callback)
Kuba Breckaafdf8422014-10-10 23:43:03 +00002362{
2363 if (create_callback)
2364 {
2365 InstrumentationRuntimeInstance instance;
2366 assert ((bool)name);
2367 instance.name = name;
2368 if (description && description[0])
2369 instance.description = description;
2370 instance.create_callback = create_callback;
2371 instance.get_type_callback = get_type_callback;
2372 Mutex::Locker locker (GetInstrumentationRuntimeMutex ());
2373 GetInstrumentationRuntimeInstances ().push_back (instance);
2374 }
2375 return false;
2376}
2377
2378bool
2379PluginManager::UnregisterPlugin (InstrumentationRuntimeCreateInstance create_callback)
2380{
2381 if (create_callback)
2382 {
2383 Mutex::Locker locker (GetInstrumentationRuntimeMutex ());
2384 InstrumentationRuntimeInstances &instances = GetInstrumentationRuntimeInstances ();
2385
2386 InstrumentationRuntimeInstances::iterator pos, end = instances.end();
2387 for (pos = instances.begin(); pos != end; ++ pos)
2388 {
2389 if (pos->create_callback == create_callback)
2390 {
2391 instances.erase(pos);
2392 return true;
2393 }
2394 }
2395 }
2396 return false;
2397}
2398
2399InstrumentationRuntimeGetType
2400PluginManager::GetInstrumentationRuntimeGetTypeCallbackAtIndex (uint32_t idx)
2401{
2402 Mutex::Locker locker (GetInstrumentationRuntimeMutex ());
2403 InstrumentationRuntimeInstances &instances = GetInstrumentationRuntimeInstances ();
2404 if (idx < instances.size())
2405 return instances[idx].get_type_callback;
Eugene Zelenko89183722016-03-11 21:55:47 +00002406 return nullptr;
Kuba Breckaafdf8422014-10-10 23:43:03 +00002407}
2408
2409InstrumentationRuntimeCreateInstance
2410PluginManager::GetInstrumentationRuntimeCreateCallbackAtIndex (uint32_t idx)
2411{
2412 Mutex::Locker locker (GetInstrumentationRuntimeMutex ());
2413 InstrumentationRuntimeInstances &instances = GetInstrumentationRuntimeInstances ();
2414 if (idx < instances.size())
2415 return instances[idx].create_callback;
Eugene Zelenko89183722016-03-11 21:55:47 +00002416 return nullptr;
Kuba Breckaafdf8422014-10-10 23:43:03 +00002417}
2418
Kuba Breckaafdf8422014-10-10 23:43:03 +00002419InstrumentationRuntimeCreateInstance
2420PluginManager::GetInstrumentationRuntimeCreateCallbackForPluginName (const ConstString &name)
2421{
2422 if (name)
2423 {
2424 Mutex::Locker locker (GetInstrumentationRuntimeMutex ());
2425 InstrumentationRuntimeInstances &instances = GetInstrumentationRuntimeInstances ();
2426
2427 InstrumentationRuntimeInstances::iterator pos, end = instances.end();
2428 for (pos = instances.begin(); pos != end; ++ pos)
2429 {
2430 if (name == pos->name)
2431 return pos->create_callback;
2432 }
2433 }
Eugene Zelenko89183722016-03-11 21:55:47 +00002434 return nullptr;
Kuba Breckaafdf8422014-10-10 23:43:03 +00002435}
2436
Greg Clayton56939cb2015-09-17 22:23:34 +00002437#pragma mark TypeSystem
2438
Greg Clayton56939cb2015-09-17 22:23:34 +00002439struct TypeSystemInstance
2440{
2441 TypeSystemInstance() :
Eugene Zelenko89183722016-03-11 21:55:47 +00002442 name(),
2443 description(),
2444 create_callback(nullptr)
Greg Clayton56939cb2015-09-17 22:23:34 +00002445 {
2446 }
2447
2448 ConstString name;
2449 std::string description;
2450 TypeSystemCreateInstance create_callback;
Sean Callananfe38c852015-10-08 23:07:53 +00002451 TypeSystemEnumerateSupportedLanguages enumerate_callback;
Greg Clayton56939cb2015-09-17 22:23:34 +00002452};
2453
2454typedef std::vector<TypeSystemInstance> TypeSystemInstances;
2455
2456static Mutex &
2457GetTypeSystemMutex ()
2458{
2459 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
2460 return g_instances_mutex;
2461}
2462
2463static TypeSystemInstances &
2464GetTypeSystemInstances ()
2465{
2466 static TypeSystemInstances g_instances;
2467 return g_instances;
2468}
2469
2470bool
2471PluginManager::RegisterPlugin (const ConstString &name,
2472 const char *description,
Sean Callananfe38c852015-10-08 23:07:53 +00002473 TypeSystemCreateInstance create_callback,
2474 TypeSystemEnumerateSupportedLanguages enumerate_supported_languages_callback)
Greg Clayton56939cb2015-09-17 22:23:34 +00002475{
2476 if (create_callback)
2477 {
2478 TypeSystemInstance instance;
2479 assert ((bool)name);
2480 instance.name = name;
2481 if (description && description[0])
2482 instance.description = description;
2483 instance.create_callback = create_callback;
Tamas Berghammer62a15142015-10-09 11:01:56 +00002484 instance.enumerate_callback = enumerate_supported_languages_callback;
Greg Clayton56939cb2015-09-17 22:23:34 +00002485 Mutex::Locker locker (GetTypeSystemMutex ());
2486 GetTypeSystemInstances ().push_back (instance);
2487 }
2488 return false;
2489}
2490
2491bool
2492PluginManager::UnregisterPlugin (TypeSystemCreateInstance create_callback)
2493{
2494 if (create_callback)
2495 {
2496 Mutex::Locker locker (GetTypeSystemMutex ());
2497 TypeSystemInstances &instances = GetTypeSystemInstances ();
2498
2499 TypeSystemInstances::iterator pos, end = instances.end();
2500 for (pos = instances.begin(); pos != end; ++ pos)
2501 {
2502 if (pos->create_callback == create_callback)
2503 {
2504 instances.erase(pos);
2505 return true;
2506 }
2507 }
2508 }
2509 return false;
2510}
2511
2512TypeSystemCreateInstance
2513PluginManager::GetTypeSystemCreateCallbackAtIndex (uint32_t idx)
2514{
2515 Mutex::Locker locker (GetTypeSystemMutex ());
2516 TypeSystemInstances &instances = GetTypeSystemInstances ();
2517 if (idx < instances.size())
2518 return instances[idx].create_callback;
Eugene Zelenko89183722016-03-11 21:55:47 +00002519 return nullptr;
Greg Clayton56939cb2015-09-17 22:23:34 +00002520}
2521
2522TypeSystemCreateInstance
2523PluginManager::GetTypeSystemCreateCallbackForPluginName (const ConstString &name)
2524{
2525 if (name)
2526 {
2527 Mutex::Locker locker (GetTypeSystemMutex ());
2528 TypeSystemInstances &instances = GetTypeSystemInstances ();
2529
2530 TypeSystemInstances::iterator pos, end = instances.end();
2531 for (pos = instances.begin(); pos != end; ++ pos)
2532 {
2533 if (name == pos->name)
2534 return pos->create_callback;
2535 }
2536 }
Eugene Zelenko89183722016-03-11 21:55:47 +00002537 return nullptr;
Greg Clayton56939cb2015-09-17 22:23:34 +00002538}
2539
Sean Callananfe38c852015-10-08 23:07:53 +00002540TypeSystemEnumerateSupportedLanguages
2541PluginManager::GetTypeSystemEnumerateSupportedLanguagesCallbackAtIndex (uint32_t idx)
2542{
2543 Mutex::Locker locker (GetTypeSystemMutex ());
2544 TypeSystemInstances &instances = GetTypeSystemInstances ();
2545 if (idx < instances.size())
2546 return instances[idx].enumerate_callback;
Eugene Zelenko89183722016-03-11 21:55:47 +00002547 return nullptr;
Sean Callananfe38c852015-10-08 23:07:53 +00002548}
2549
2550TypeSystemEnumerateSupportedLanguages
2551PluginManager::GetTypeSystemEnumerateSupportedLanguagesCallbackForPluginName (const ConstString &name)
2552{
2553 if (name)
2554 {
2555 Mutex::Locker locker (GetTypeSystemMutex ());
2556 TypeSystemInstances &instances = GetTypeSystemInstances ();
2557
2558 TypeSystemInstances::iterator pos, end = instances.end();
2559 for (pos = instances.begin(); pos != end; ++ pos)
2560 {
2561 if (name == pos->name)
2562 return pos->enumerate_callback;
2563 }
2564 }
Eugene Zelenko89183722016-03-11 21:55:47 +00002565 return nullptr;
Sean Callananfe38c852015-10-08 23:07:53 +00002566}
Greg Clayton56939cb2015-09-17 22:23:34 +00002567
Sean Callanan66810412015-10-19 23:11:07 +00002568#pragma mark REPL
2569
2570struct REPLInstance
2571{
2572 REPLInstance() :
Eugene Zelenko89183722016-03-11 21:55:47 +00002573 name(),
2574 description(),
2575 create_callback(nullptr)
Sean Callanan66810412015-10-19 23:11:07 +00002576 {
2577 }
2578
2579 ConstString name;
2580 std::string description;
2581 REPLCreateInstance create_callback;
Sean Callanan93c0b002015-10-21 19:14:33 +00002582 REPLEnumerateSupportedLanguages enumerate_languages_callback;
Sean Callanan66810412015-10-19 23:11:07 +00002583};
2584
2585typedef std::vector<REPLInstance> REPLInstances;
2586
2587static Mutex &
2588GetREPLMutex ()
2589{
2590 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
2591 return g_instances_mutex;
2592}
2593
2594static REPLInstances &
2595GetREPLInstances ()
2596{
2597 static REPLInstances g_instances;
2598 return g_instances;
2599}
2600
2601bool
2602PluginManager::RegisterPlugin (const ConstString &name,
2603 const char *description,
Sean Callanan93c0b002015-10-21 19:14:33 +00002604 REPLCreateInstance create_callback,
2605 REPLEnumerateSupportedLanguages enumerate_languages_callback)
Sean Callanan66810412015-10-19 23:11:07 +00002606{
2607 if (create_callback)
2608 {
2609 REPLInstance instance;
2610 assert ((bool)name);
2611 instance.name = name;
2612 if (description && description[0])
2613 instance.description = description;
2614 instance.create_callback = create_callback;
Sean Callanan93c0b002015-10-21 19:14:33 +00002615 instance.enumerate_languages_callback = enumerate_languages_callback;
Sean Callanan66810412015-10-19 23:11:07 +00002616 Mutex::Locker locker (GetREPLMutex ());
2617 GetREPLInstances ().push_back (instance);
2618 }
2619 return false;
2620}
2621
2622bool
2623PluginManager::UnregisterPlugin (REPLCreateInstance create_callback)
2624{
2625 if (create_callback)
2626 {
2627 Mutex::Locker locker (GetREPLMutex ());
2628 REPLInstances &instances = GetREPLInstances ();
2629
2630 REPLInstances::iterator pos, end = instances.end();
2631 for (pos = instances.begin(); pos != end; ++ pos)
2632 {
2633 if (pos->create_callback == create_callback)
2634 {
2635 instances.erase(pos);
2636 return true;
2637 }
2638 }
2639 }
2640 return false;
2641}
2642
2643REPLCreateInstance
2644PluginManager::GetREPLCreateCallbackAtIndex (uint32_t idx)
2645{
2646 Mutex::Locker locker (GetREPLMutex ());
2647 REPLInstances &instances = GetREPLInstances ();
2648 if (idx < instances.size())
2649 return instances[idx].create_callback;
Eugene Zelenko89183722016-03-11 21:55:47 +00002650 return nullptr;
Sean Callanan66810412015-10-19 23:11:07 +00002651}
2652
2653REPLCreateInstance
2654PluginManager::GetREPLCreateCallbackForPluginName (const ConstString &name)
2655{
2656 if (name)
2657 {
2658 Mutex::Locker locker (GetREPLMutex ());
2659 REPLInstances &instances = GetREPLInstances ();
2660
2661 REPLInstances::iterator pos, end = instances.end();
2662 for (pos = instances.begin(); pos != end; ++ pos)
2663 {
2664 if (name == pos->name)
2665 return pos->create_callback;
2666 }
2667 }
Eugene Zelenko89183722016-03-11 21:55:47 +00002668 return nullptr;
Sean Callanan66810412015-10-19 23:11:07 +00002669}
2670
Sean Callanan93c0b002015-10-21 19:14:33 +00002671REPLEnumerateSupportedLanguages
2672PluginManager::GetREPLEnumerateSupportedLanguagesCallbackAtIndex (uint32_t idx)
2673{
2674 Mutex::Locker locker (GetREPLMutex ());
2675 REPLInstances &instances = GetREPLInstances ();
2676 if (idx < instances.size())
2677 return instances[idx].enumerate_languages_callback;
Eugene Zelenko89183722016-03-11 21:55:47 +00002678 return nullptr;
Sean Callanan93c0b002015-10-21 19:14:33 +00002679}
2680
Sean Callanan93c0b002015-10-21 19:14:33 +00002681REPLEnumerateSupportedLanguages
2682PluginManager::GetREPLSystemEnumerateSupportedLanguagesCallbackForPluginName (const ConstString &name)
2683{
2684 if (name)
2685 {
2686 Mutex::Locker locker (GetREPLMutex ());
2687 REPLInstances &instances = GetREPLInstances ();
2688
2689 REPLInstances::iterator pos, end = instances.end();
2690 for (pos = instances.begin(); pos != end; ++ pos)
2691 {
2692 if (name == pos->name)
2693 return pos->enumerate_languages_callback;
2694 }
2695 }
Eugene Zelenko89183722016-03-11 21:55:47 +00002696 return nullptr;
Sean Callanan93c0b002015-10-21 19:14:33 +00002697}
2698
Kuba Breckaafdf8422014-10-10 23:43:03 +00002699#pragma mark PluginManager
2700
Greg Claytone8cd0c92012-10-19 18:02:49 +00002701void
2702PluginManager::DebuggerInitialize (Debugger &debugger)
2703{
Jason Molenda9b837a12013-04-05 05:06:39 +00002704 // Initialize the DynamicLoader plugins
Greg Claytone8cd0c92012-10-19 18:02:49 +00002705 {
Jason Molenda9b837a12013-04-05 05:06:39 +00002706 Mutex::Locker locker (GetDynamicLoaderMutex ());
2707 DynamicLoaderInstances &instances = GetDynamicLoaderInstances ();
2708
2709 DynamicLoaderInstances::iterator pos, end = instances.end();
2710 for (pos = instances.begin(); pos != end; ++ pos)
2711 {
2712 if (pos->debugger_init_callback)
2713 pos->debugger_init_callback (debugger);
2714 }
2715 }
2716
Andrew MacPherson17220c12014-03-05 10:12:43 +00002717 // Initialize the JITLoader plugins
2718 {
2719 Mutex::Locker locker (GetJITLoaderMutex ());
2720 JITLoaderInstances &instances = GetJITLoaderInstances ();
2721
2722 JITLoaderInstances::iterator pos, end = instances.end();
2723 for (pos = instances.begin(); pos != end; ++ pos)
2724 {
2725 if (pos->debugger_init_callback)
2726 pos->debugger_init_callback (debugger);
2727 }
2728 }
2729
Jason Molenda9b837a12013-04-05 05:06:39 +00002730 // Initialize the Platform plugins
2731 {
2732 Mutex::Locker locker (GetPlatformInstancesMutex ());
2733 PlatformInstances &instances = GetPlatformInstances ();
2734
2735 PlatformInstances::iterator pos, end = instances.end();
2736 for (pos = instances.begin(); pos != end; ++ pos)
2737 {
2738 if (pos->debugger_init_callback)
2739 pos->debugger_init_callback (debugger);
2740 }
Greg Claytone8cd0c92012-10-19 18:02:49 +00002741 }
Oleksiy Vyalovabb5a352015-07-29 22:18:16 +00002742
Greg Clayton7f982402013-07-15 22:54:20 +00002743 // Initialize the Process plugins
2744 {
2745 Mutex::Locker locker (GetProcessMutex());
2746 ProcessInstances &instances = GetProcessInstances();
2747
2748 ProcessInstances::iterator pos, end = instances.end();
2749 for (pos = instances.begin(); pos != end; ++ pos)
2750 {
2751 if (pos->debugger_init_callback)
2752 pos->debugger_init_callback (debugger);
2753 }
2754 }
2755
Oleksiy Vyalovabb5a352015-07-29 22:18:16 +00002756 // Initialize the SymbolFile plugins
2757 {
2758 Mutex::Locker locker (GetSymbolFileMutex());
2759 for (auto& sym_file: GetSymbolFileInstances())
2760 {
2761 if (sym_file.debugger_init_callback)
2762 sym_file.debugger_init_callback (debugger);
2763 }
2764 }
Ryan Brown65d4d5c2015-09-16 21:20:44 +00002765
2766 // Initialize the OperatingSystem plugins
2767 {
2768 Mutex::Locker locker(GetOperatingSystemMutex());
2769 for (auto &os : GetOperatingSystemInstances())
2770 {
2771 if (os.debugger_init_callback)
2772 os.debugger_init_callback(debugger);
2773 }
2774 }
Greg Claytone8cd0c92012-10-19 18:02:49 +00002775}
2776
Greg Clayton7f982402013-07-15 22:54:20 +00002777// This is the preferred new way to register plugin specific settings. e.g.
2778// This will put a plugin's settings under e.g. "plugin.<plugin_type_name>.<plugin_type_desc>.SETTINGNAME".
Greg Claytone8cd0c92012-10-19 18:02:49 +00002779static lldb::OptionValuePropertiesSP
Greg Clayton7f982402013-07-15 22:54:20 +00002780GetDebuggerPropertyForPlugins (Debugger &debugger,
Jason Molenda3b59f5c2013-04-05 22:40:42 +00002781 const ConstString &plugin_type_name,
2782 const ConstString &plugin_type_desc,
2783 bool can_create)
Greg Claytone8cd0c92012-10-19 18:02:49 +00002784{
2785 lldb::OptionValuePropertiesSP parent_properties_sp (debugger.GetValueProperties());
2786 if (parent_properties_sp)
2787 {
2788 static ConstString g_property_name("plugin");
2789
Eugene Zelenko89183722016-03-11 21:55:47 +00002790 OptionValuePropertiesSP plugin_properties_sp = parent_properties_sp->GetSubProperty(nullptr, g_property_name);
Greg Claytone8cd0c92012-10-19 18:02:49 +00002791 if (!plugin_properties_sp && can_create)
2792 {
2793 plugin_properties_sp.reset (new OptionValueProperties (g_property_name));
2794 parent_properties_sp->AppendProperty (g_property_name,
2795 ConstString("Settings specify to plugins."),
2796 true,
2797 plugin_properties_sp);
2798 }
2799
2800 if (plugin_properties_sp)
2801 {
Eugene Zelenko89183722016-03-11 21:55:47 +00002802 lldb::OptionValuePropertiesSP plugin_type_properties_sp = plugin_properties_sp->GetSubProperty(nullptr, plugin_type_name);
Greg Claytone8cd0c92012-10-19 18:02:49 +00002803 if (!plugin_type_properties_sp && can_create)
2804 {
2805 plugin_type_properties_sp.reset (new OptionValueProperties (plugin_type_name));
2806 plugin_properties_sp->AppendProperty (plugin_type_name,
2807 plugin_type_desc,
2808 true,
2809 plugin_type_properties_sp);
2810 }
2811 return plugin_type_properties_sp;
2812 }
2813 }
2814 return lldb::OptionValuePropertiesSP();
2815}
2816
Greg Clayton7f982402013-07-15 22:54:20 +00002817// This is deprecated way to register plugin specific settings. e.g.
2818// "<plugin_type_name>.plugin.<plugin_type_desc>.SETTINGNAME"
Jason Molenda3b59f5c2013-04-05 22:40:42 +00002819// and Platform generic settings would be under "platform.SETTINGNAME".
2820static lldb::OptionValuePropertiesSP
Greg Clayton7f982402013-07-15 22:54:20 +00002821GetDebuggerPropertyForPluginsOldStyle (Debugger &debugger,
2822 const ConstString &plugin_type_name,
2823 const ConstString &plugin_type_desc,
2824 bool can_create)
Jason Molenda3b59f5c2013-04-05 22:40:42 +00002825{
2826 static ConstString g_property_name("plugin");
2827 lldb::OptionValuePropertiesSP parent_properties_sp (debugger.GetValueProperties());
2828 if (parent_properties_sp)
2829 {
Eugene Zelenko89183722016-03-11 21:55:47 +00002830 OptionValuePropertiesSP plugin_properties_sp = parent_properties_sp->GetSubProperty(nullptr, plugin_type_name);
Jason Molenda3b59f5c2013-04-05 22:40:42 +00002831 if (!plugin_properties_sp && can_create)
2832 {
2833 plugin_properties_sp.reset (new OptionValueProperties (plugin_type_name));
2834 parent_properties_sp->AppendProperty (plugin_type_name,
2835 plugin_type_desc,
2836 true,
2837 plugin_properties_sp);
2838 }
2839
2840 if (plugin_properties_sp)
2841 {
Eugene Zelenko89183722016-03-11 21:55:47 +00002842 lldb::OptionValuePropertiesSP plugin_type_properties_sp = plugin_properties_sp->GetSubProperty(nullptr, g_property_name);
Jason Molenda3b59f5c2013-04-05 22:40:42 +00002843 if (!plugin_type_properties_sp && can_create)
2844 {
2845 plugin_type_properties_sp.reset (new OptionValueProperties (g_property_name));
2846 plugin_properties_sp->AppendProperty (g_property_name,
2847 ConstString("Settings specific to plugins"),
2848 true,
2849 plugin_type_properties_sp);
2850 }
2851 return plugin_type_properties_sp;
2852 }
2853 }
2854 return lldb::OptionValuePropertiesSP();
2855}
2856
Oleksiy Vyaloveff9ad22015-09-16 17:38:36 +00002857namespace {
2858
2859typedef lldb::OptionValuePropertiesSP
2860GetDebuggerPropertyForPluginsPtr (Debugger&, const ConstString&, const ConstString&, bool can_create);
Jason Molenda3b59f5c2013-04-05 22:40:42 +00002861
Greg Claytone8cd0c92012-10-19 18:02:49 +00002862lldb::OptionValuePropertiesSP
Oleksiy Vyaloveff9ad22015-09-16 17:38:36 +00002863GetSettingForPlugin (Debugger &debugger,
2864 const ConstString &setting_name,
2865 const ConstString &plugin_type_name,
2866 GetDebuggerPropertyForPluginsPtr get_debugger_property= GetDebuggerPropertyForPlugins)
Greg Claytone8cd0c92012-10-19 18:02:49 +00002867{
2868 lldb::OptionValuePropertiesSP properties_sp;
Oleksiy Vyaloveff9ad22015-09-16 17:38:36 +00002869 lldb::OptionValuePropertiesSP plugin_type_properties_sp (get_debugger_property (debugger,
2870 plugin_type_name,
2871 ConstString(), // not creating to so we don't need the description
2872 false));
Greg Claytone8cd0c92012-10-19 18:02:49 +00002873 if (plugin_type_properties_sp)
Oleksiy Vyaloveff9ad22015-09-16 17:38:36 +00002874 properties_sp = plugin_type_properties_sp->GetSubProperty (nullptr, setting_name);
Greg Claytone8cd0c92012-10-19 18:02:49 +00002875 return properties_sp;
2876}
2877
2878bool
Oleksiy Vyaloveff9ad22015-09-16 17:38:36 +00002879CreateSettingForPlugin (Debugger &debugger,
2880 const ConstString &plugin_type_name,
2881 const ConstString &plugin_type_desc,
2882 const lldb::OptionValuePropertiesSP &properties_sp,
2883 const ConstString &description,
2884 bool is_global_property,
2885 GetDebuggerPropertyForPluginsPtr get_debugger_property = GetDebuggerPropertyForPlugins)
2886{
2887 if (properties_sp)
2888 {
2889 lldb::OptionValuePropertiesSP plugin_type_properties_sp (get_debugger_property (
2890 debugger, plugin_type_name, plugin_type_desc, true));
2891 if (plugin_type_properties_sp)
2892 {
2893 plugin_type_properties_sp->AppendProperty (properties_sp->GetName(),
2894 description,
2895 is_global_property,
2896 properties_sp);
2897 return true;
2898 }
2899 }
2900 return false;
2901}
2902
2903const char* kDynamicLoaderPluginName("dynamic-loader");
2904const char* kPlatformPluginName("platform");
2905const char* kProcessPluginName("process");
2906const char* kSymbolFilePluginName("symbol-file");
2907const char* kJITLoaderPluginName("jit-loader");
2908
Eugene Zelenko89183722016-03-11 21:55:47 +00002909} // anonymous namespace
Oleksiy Vyaloveff9ad22015-09-16 17:38:36 +00002910
2911lldb::OptionValuePropertiesSP
2912PluginManager::GetSettingForDynamicLoaderPlugin (Debugger &debugger,
2913 const ConstString &setting_name)
2914{
2915 return GetSettingForPlugin(debugger, setting_name, ConstString(kDynamicLoaderPluginName));
2916}
2917
2918bool
Greg Claytone8cd0c92012-10-19 18:02:49 +00002919PluginManager::CreateSettingForDynamicLoaderPlugin (Debugger &debugger,
2920 const lldb::OptionValuePropertiesSP &properties_sp,
2921 const ConstString &description,
2922 bool is_global_property)
2923{
Oleksiy Vyaloveff9ad22015-09-16 17:38:36 +00002924 return CreateSettingForPlugin(debugger,
2925 ConstString(kDynamicLoaderPluginName),
2926 ConstString("Settings for dynamic loader plug-ins"),
2927 properties_sp,
2928 description,
2929 is_global_property);
Greg Claytone8cd0c92012-10-19 18:02:49 +00002930}
2931
Jason Molenda9b837a12013-04-05 05:06:39 +00002932lldb::OptionValuePropertiesSP
2933PluginManager::GetSettingForPlatformPlugin (Debugger &debugger, const ConstString &setting_name)
2934{
Oleksiy Vyaloveff9ad22015-09-16 17:38:36 +00002935 return GetSettingForPlugin(debugger,
2936 setting_name,
2937 ConstString(kPlatformPluginName),
2938 GetDebuggerPropertyForPluginsOldStyle);
Jason Molenda9b837a12013-04-05 05:06:39 +00002939}
2940
2941bool
2942PluginManager::CreateSettingForPlatformPlugin (Debugger &debugger,
Oleksiy Vyaloveff9ad22015-09-16 17:38:36 +00002943 const lldb::OptionValuePropertiesSP &properties_sp,
2944 const ConstString &description,
2945 bool is_global_property)
Jason Molenda9b837a12013-04-05 05:06:39 +00002946{
Oleksiy Vyaloveff9ad22015-09-16 17:38:36 +00002947 return CreateSettingForPlugin(debugger,
2948 ConstString(kPlatformPluginName),
2949 ConstString("Settings for platform plug-ins"),
2950 properties_sp,
2951 description,
2952 is_global_property,
2953 GetDebuggerPropertyForPluginsOldStyle);
Greg Clayton7f982402013-07-15 22:54:20 +00002954}
2955
Greg Clayton7f982402013-07-15 22:54:20 +00002956lldb::OptionValuePropertiesSP
2957PluginManager::GetSettingForProcessPlugin (Debugger &debugger, const ConstString &setting_name)
2958{
Oleksiy Vyaloveff9ad22015-09-16 17:38:36 +00002959 return GetSettingForPlugin(debugger, setting_name, ConstString(kProcessPluginName));
Greg Clayton7f982402013-07-15 22:54:20 +00002960}
2961
2962bool
2963PluginManager::CreateSettingForProcessPlugin (Debugger &debugger,
2964 const lldb::OptionValuePropertiesSP &properties_sp,
2965 const ConstString &description,
2966 bool is_global_property)
2967{
Oleksiy Vyaloveff9ad22015-09-16 17:38:36 +00002968 return CreateSettingForPlugin(debugger,
2969 ConstString(kProcessPluginName),
2970 ConstString("Settings for process plug-ins"),
2971 properties_sp,
2972 description,
2973 is_global_property);
Jason Molenda9b837a12013-04-05 05:06:39 +00002974}
2975
Oleksiy Vyalovabb5a352015-07-29 22:18:16 +00002976lldb::OptionValuePropertiesSP
2977PluginManager::GetSettingForSymbolFilePlugin (Debugger &debugger,
2978 const ConstString &setting_name)
2979{
Oleksiy Vyaloveff9ad22015-09-16 17:38:36 +00002980 return GetSettingForPlugin(debugger, setting_name, ConstString(kSymbolFilePluginName));
Oleksiy Vyalovabb5a352015-07-29 22:18:16 +00002981}
2982
2983bool
2984PluginManager::CreateSettingForSymbolFilePlugin (Debugger &debugger,
2985 const lldb::OptionValuePropertiesSP &properties_sp,
2986 const ConstString &description,
2987 bool is_global_property)
2988{
Oleksiy Vyaloveff9ad22015-09-16 17:38:36 +00002989 return CreateSettingForPlugin(debugger,
2990 ConstString(kSymbolFilePluginName),
2991 ConstString("Settings for symbol file plug-ins"),
2992 properties_sp,
2993 description,
2994 is_global_property);
2995}
2996
2997lldb::OptionValuePropertiesSP
2998PluginManager::GetSettingForJITLoaderPlugin (Debugger &debugger,
2999 const ConstString &setting_name)
3000{
3001 return GetSettingForPlugin(debugger, setting_name, ConstString(kJITLoaderPluginName));
3002}
3003
3004bool
3005PluginManager::CreateSettingForJITLoaderPlugin (Debugger &debugger,
3006 const lldb::OptionValuePropertiesSP &properties_sp,
3007 const ConstString &description,
3008 bool is_global_property)
3009{
3010 return CreateSettingForPlugin(debugger,
3011 ConstString(kJITLoaderPluginName),
3012 ConstString("Settings for JIT loader plug-ins"),
3013 properties_sp,
3014 description,
3015 is_global_property);
Oleksiy Vyalovabb5a352015-07-29 22:18:16 +00003016}
Ryan Brown65d4d5c2015-09-16 21:20:44 +00003017
3018static const char *kOperatingSystemPluginName("os");
3019
3020lldb::OptionValuePropertiesSP
3021PluginManager::GetSettingForOperatingSystemPlugin(Debugger &debugger, const ConstString &setting_name)
3022{
3023 lldb::OptionValuePropertiesSP properties_sp;
3024 lldb::OptionValuePropertiesSP plugin_type_properties_sp(
3025 GetDebuggerPropertyForPlugins(debugger, ConstString(kOperatingSystemPluginName),
3026 ConstString(), // not creating to so we don't need the description
3027 false));
3028 if (plugin_type_properties_sp)
3029 properties_sp = plugin_type_properties_sp->GetSubProperty(nullptr, setting_name);
3030 return properties_sp;
3031}
3032
3033bool
3034PluginManager::CreateSettingForOperatingSystemPlugin(Debugger &debugger,
3035 const lldb::OptionValuePropertiesSP &properties_sp,
3036 const ConstString &description, bool is_global_property)
3037{
3038 if (properties_sp)
3039 {
3040 lldb::OptionValuePropertiesSP plugin_type_properties_sp(
3041 GetDebuggerPropertyForPlugins(debugger, ConstString(kOperatingSystemPluginName),
3042 ConstString("Settings for operating system plug-ins"), true));
3043 if (plugin_type_properties_sp)
3044 {
3045 plugin_type_properties_sp->AppendProperty(properties_sp->GetName(), description, is_global_property,
3046 properties_sp);
3047 return true;
3048 }
3049 }
3050 return false;
3051}