blob: 813cec227525a62ec8dffe71fac38330b1ecce53 [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
Daniel Malea93a64302012-12-05 00:20:57 +000010#include "lldb/lldb-python.h"
11
Chris Lattner30fdc8d2010-06-08 16:52:24 +000012#include "lldb/Core/PluginManager.h"
13
Stephen Wilson8acdbb82011-04-08 13:36:44 +000014#include <limits.h>
15
Chris Lattner30fdc8d2010-06-08 16:52:24 +000016#include <string>
17#include <vector>
18
Greg Claytone8cd0c92012-10-19 18:02:49 +000019#include "lldb/Core/Debugger.h"
Greg Clayton4272cc72011-02-02 02:24:04 +000020#include "lldb/Core/Error.h"
Greg Clayton53239f02011-02-08 05:05:52 +000021#include "lldb/Host/FileSpec.h"
Greg Clayton4272cc72011-02-02 02:24:04 +000022#include "lldb/Host/Host.h"
23#include "lldb/Host/Mutex.h"
Greg Claytone8cd0c92012-10-19 18:02:49 +000024#include "lldb/Interpreter/OptionValueProperties.h"
Greg Clayton4272cc72011-02-02 02:24:04 +000025
Greg Claytonab65b342011-04-13 22:47:15 +000026#include "llvm/ADT/StringRef.h"
27
Greg Clayton4272cc72011-02-02 02:24:04 +000028using namespace lldb;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000029using namespace lldb_private;
30
Jason Molenda743e86a2010-06-11 23:44:18 +000031enum PluginAction
Chris Lattner30fdc8d2010-06-08 16:52:24 +000032{
33 ePluginRegisterInstance,
34 ePluginUnregisterInstance,
35 ePluginGetInstanceAtIndex
36};
37
Greg Clayton03da4cc2013-04-19 21:31:16 +000038
39typedef bool (*PluginInitCallback) (void);
40typedef void (*PluginTermCallback) (void);
41
Greg Clayton4272cc72011-02-02 02:24:04 +000042struct PluginInfo
43{
44 void *plugin_handle;
Greg Clayton03da4cc2013-04-19 21:31:16 +000045 PluginInitCallback plugin_init_callback;
46 PluginTermCallback plugin_term_callback;
Greg Clayton4272cc72011-02-02 02:24:04 +000047};
48
49typedef std::map<FileSpec, PluginInfo> PluginTerminateMap;
50
51static Mutex &
52GetPluginMapMutex ()
53{
54 static Mutex g_plugin_map_mutex (Mutex::eMutexTypeRecursive);
55 return g_plugin_map_mutex;
56}
57
58static PluginTerminateMap &
59GetPluginMap ()
60{
61 static PluginTerminateMap g_plugin_map;
62 return g_plugin_map;
63}
64
65static bool
66PluginIsLoaded (const FileSpec &plugin_file_spec)
67{
68 Mutex::Locker locker (GetPluginMapMutex ());
69 PluginTerminateMap &plugin_map = GetPluginMap ();
70 return plugin_map.find (plugin_file_spec) != plugin_map.end();
71}
72
73static void
74SetPluginInfo (const FileSpec &plugin_file_spec, const PluginInfo &plugin_info)
75{
76 Mutex::Locker locker (GetPluginMapMutex ());
77 PluginTerminateMap &plugin_map = GetPluginMap ();
Michael Sartain3cf443d2013-07-17 00:26:30 +000078 assert (plugin_map.find (plugin_file_spec) == plugin_map.end());
Greg Clayton4272cc72011-02-02 02:24:04 +000079 plugin_map[plugin_file_spec] = plugin_info;
80}
81
82
83static FileSpec::EnumerateDirectoryResult
84LoadPluginCallback
85(
86 void *baton,
87 FileSpec::FileType file_type,
88 const FileSpec &file_spec
89)
90{
91// PluginManager *plugin_manager = (PluginManager *)baton;
92 Error error;
93
94 // If we have a regular file, a symbolic link or unknown file type, try
95 // and process the file. We must handle unknown as sometimes the directory
96 // enumeration might be enumerating a file system that doesn't have correct
97 // file type information.
98 if (file_type == FileSpec::eFileTypeRegular ||
99 file_type == FileSpec::eFileTypeSymbolicLink ||
100 file_type == FileSpec::eFileTypeUnknown )
101 {
102 FileSpec plugin_file_spec (file_spec);
103 plugin_file_spec.ResolvePath();
104
105 if (PluginIsLoaded (plugin_file_spec))
106 return FileSpec::eEnumerateDirectoryResultNext;
107 else
108 {
109 PluginInfo plugin_info = { NULL, NULL, NULL };
Greg Clayton45319462011-02-08 00:35:34 +0000110 uint32_t flags = Host::eDynamicLibraryOpenOptionLazy |
111 Host::eDynamicLibraryOpenOptionLocal |
112 Host::eDynamicLibraryOpenOptionLimitGetSymbol;
113
114 plugin_info.plugin_handle = Host::DynamicLibraryOpen (plugin_file_spec, flags, error);
Greg Clayton4272cc72011-02-02 02:24:04 +0000115 if (plugin_info.plugin_handle)
116 {
117 bool success = false;
Greg Clayton03da4cc2013-04-19 21:31:16 +0000118 plugin_info.plugin_init_callback = (PluginInitCallback)Host::DynamicLibraryGetSymbol (plugin_info.plugin_handle, "LLDBPluginInitialize", error);
Greg Clayton4272cc72011-02-02 02:24:04 +0000119 if (plugin_info.plugin_init_callback)
120 {
121 // Call the plug-in "bool LLDBPluginInitialize(void)" function
Greg Clayton03da4cc2013-04-19 21:31:16 +0000122 success = plugin_info.plugin_init_callback();
Greg Clayton4272cc72011-02-02 02:24:04 +0000123 }
124
125 if (success)
126 {
127 // It is ok for the "LLDBPluginTerminate" symbol to be NULL
Greg Clayton03da4cc2013-04-19 21:31:16 +0000128 plugin_info.plugin_term_callback = (PluginTermCallback)Host::DynamicLibraryGetSymbol (plugin_info.plugin_handle, "LLDBPluginTerminate", error);
Greg Clayton4272cc72011-02-02 02:24:04 +0000129 }
130 else
131 {
132 // The initialize function returned FALSE which means the
133 // plug-in might not be compatible, or might be too new or
134 // too old, or might not want to run on this machine.
135 Host::DynamicLibraryClose (plugin_info.plugin_handle);
136 plugin_info.plugin_handle = NULL;
137 plugin_info.plugin_init_callback = NULL;
138 }
139
140 // Regardless of success or failure, cache the plug-in load
141 // in our plug-in info so we don't try to load it again and
142 // again.
143 SetPluginInfo (plugin_file_spec, plugin_info);
144
145 return FileSpec::eEnumerateDirectoryResultNext;
146 }
147 }
148 }
149
150 if (file_type == FileSpec::eFileTypeUnknown ||
151 file_type == FileSpec::eFileTypeDirectory ||
152 file_type == FileSpec::eFileTypeSymbolicLink )
153 {
154 // Try and recurse into anything that a directory or symbolic link.
155 // We must also do this for unknown as sometimes the directory enumeration
156 // might be enurating a file system that doesn't have correct file type
157 // information.
158 return FileSpec::eEnumerateDirectoryResultEnter;
159 }
160
161 return FileSpec::eEnumerateDirectoryResultNext;
162}
163
164
165void
166PluginManager::Initialize ()
167{
Greg Clayton1cb64962011-03-24 04:28:38 +0000168#if 1
Greg Clayton4272cc72011-02-02 02:24:04 +0000169 FileSpec dir_spec;
170 const bool find_directories = true;
171 const bool find_files = true;
172 const bool find_other = true;
173 char dir_path[PATH_MAX];
174 if (Host::GetLLDBPath (ePathTypeLLDBSystemPlugins, dir_spec))
175 {
176 if (dir_spec.Exists() && dir_spec.GetPath(dir_path, sizeof(dir_path)))
177 {
178 FileSpec::EnumerateDirectory (dir_path,
179 find_directories,
180 find_files,
181 find_other,
182 LoadPluginCallback,
183 NULL);
184 }
185 }
186
187 if (Host::GetLLDBPath (ePathTypeLLDBUserPlugins, dir_spec))
188 {
189 if (dir_spec.Exists() && dir_spec.GetPath(dir_path, sizeof(dir_path)))
190 {
191 FileSpec::EnumerateDirectory (dir_path,
192 find_directories,
193 find_files,
194 find_other,
195 LoadPluginCallback,
196 NULL);
197 }
198 }
Greg Clayton1cb64962011-03-24 04:28:38 +0000199#endif
Greg Clayton4272cc72011-02-02 02:24:04 +0000200}
201
202void
203PluginManager::Terminate ()
204{
205 Mutex::Locker locker (GetPluginMapMutex ());
206 PluginTerminateMap &plugin_map = GetPluginMap ();
207
208 PluginTerminateMap::const_iterator pos, end = plugin_map.end();
209 for (pos = plugin_map.begin(); pos != end; ++pos)
210 {
211 // Call the plug-in "void LLDBPluginTerminate (void)" function if there
212 // is one (if the symbol was not NULL).
213 if (pos->second.plugin_handle)
214 {
215 if (pos->second.plugin_term_callback)
Greg Clayton03da4cc2013-04-19 21:31:16 +0000216 pos->second.plugin_term_callback();
Greg Clayton4272cc72011-02-02 02:24:04 +0000217 Host::DynamicLibraryClose (pos->second.plugin_handle);
218 }
219 }
220 plugin_map.clear();
221}
222
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000223
224#pragma mark ABI
225
226
Jason Molenda743e86a2010-06-11 23:44:18 +0000227struct ABIInstance
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000228{
229 ABIInstance() :
230 name(),
231 description(),
232 create_callback(NULL)
233 {
234 }
235
Greg Clayton57abc5d2013-05-10 21:47:16 +0000236 ConstString name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000237 std::string description;
238 ABICreateInstance create_callback;
239};
240
241typedef std::vector<ABIInstance> ABIInstances;
242
Greg Claytonded470d2011-03-19 01:12:21 +0000243static Mutex &
244GetABIInstancesMutex ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000245{
Greg Claytonded470d2011-03-19 01:12:21 +0000246 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
247 return g_instances_mutex;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000248}
249
Greg Claytonded470d2011-03-19 01:12:21 +0000250static ABIInstances &
251GetABIInstances ()
252{
253 static ABIInstances g_instances;
254 return g_instances;
255}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000256
257bool
258PluginManager::RegisterPlugin
Greg Clayton4272cc72011-02-02 02:24:04 +0000259(
Greg Clayton57abc5d2013-05-10 21:47:16 +0000260 const ConstString &name,
Greg Clayton4272cc72011-02-02 02:24:04 +0000261 const char *description,
262 ABICreateInstance create_callback
263)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000264{
265 if (create_callback)
266 {
267 ABIInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +0000268 assert ((bool)name);
269 instance.name = name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000270 if (description && description[0])
271 instance.description = description;
272 instance.create_callback = create_callback;
Greg Claytonded470d2011-03-19 01:12:21 +0000273 Mutex::Locker locker (GetABIInstancesMutex ());
274 GetABIInstances ().push_back (instance);
275 return true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000276 }
277 return false;
278}
279
280bool
281PluginManager::UnregisterPlugin (ABICreateInstance create_callback)
282{
283 if (create_callback)
284 {
Greg Claytonded470d2011-03-19 01:12:21 +0000285 Mutex::Locker locker (GetABIInstancesMutex ());
286 ABIInstances &instances = GetABIInstances ();
287
288 ABIInstances::iterator pos, end = instances.end();
289 for (pos = instances.begin(); pos != end; ++ pos)
290 {
291 if (pos->create_callback == create_callback)
292 {
293 instances.erase(pos);
294 return true;
295 }
296 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000297 }
298 return false;
299}
300
301ABICreateInstance
302PluginManager::GetABICreateCallbackAtIndex (uint32_t idx)
303{
Greg Claytonded470d2011-03-19 01:12:21 +0000304 Mutex::Locker locker (GetABIInstancesMutex ());
305 ABIInstances &instances = GetABIInstances ();
Greg Claytonded470d2011-03-19 01:12:21 +0000306 if (idx < instances.size())
307 return instances[idx].create_callback;
Jason Molenda743e86a2010-06-11 23:44:18 +0000308 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000309}
310
311ABICreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +0000312PluginManager::GetABICreateCallbackForPluginName (const ConstString &name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000313{
Greg Clayton57abc5d2013-05-10 21:47:16 +0000314 if (name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000315 {
Greg Claytonded470d2011-03-19 01:12:21 +0000316 Mutex::Locker locker (GetABIInstancesMutex ());
Greg Claytonded470d2011-03-19 01:12:21 +0000317 ABIInstances &instances = GetABIInstances ();
318
319 ABIInstances::iterator pos, end = instances.end();
320 for (pos = instances.begin(); pos != end; ++ pos)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000321 {
Greg Clayton57abc5d2013-05-10 21:47:16 +0000322 if (name == pos->name)
Greg Claytonded470d2011-03-19 01:12:21 +0000323 return pos->create_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000324 }
325 }
326 return NULL;
327}
328
329
330#pragma mark Disassembler
331
332
Jason Molenda743e86a2010-06-11 23:44:18 +0000333struct DisassemblerInstance
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000334{
335 DisassemblerInstance() :
336 name(),
337 description(),
338 create_callback(NULL)
339 {
340 }
341
Greg Clayton57abc5d2013-05-10 21:47:16 +0000342 ConstString name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000343 std::string description;
344 DisassemblerCreateInstance create_callback;
345};
346
347typedef std::vector<DisassemblerInstance> DisassemblerInstances;
348
Greg Claytonab65b342011-04-13 22:47:15 +0000349static Mutex &
350GetDisassemblerMutex ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000351{
Greg Claytonab65b342011-04-13 22:47:15 +0000352 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
353 return g_instances_mutex;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000354}
355
Greg Claytonab65b342011-04-13 22:47:15 +0000356static DisassemblerInstances &
357GetDisassemblerInstances ()
358{
359 static DisassemblerInstances g_instances;
360 return g_instances;
361}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000362
363bool
364PluginManager::RegisterPlugin
365(
Greg Clayton57abc5d2013-05-10 21:47:16 +0000366 const ConstString &name,
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000367 const char *description,
368 DisassemblerCreateInstance create_callback
369)
370{
371 if (create_callback)
372 {
373 DisassemblerInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +0000374 assert ((bool)name);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000375 instance.name = name;
376 if (description && description[0])
377 instance.description = description;
378 instance.create_callback = create_callback;
Greg Claytonab65b342011-04-13 22:47:15 +0000379 Mutex::Locker locker (GetDisassemblerMutex ());
380 GetDisassemblerInstances ().push_back (instance);
381 return true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000382 }
383 return false;
384}
385
386bool
387PluginManager::UnregisterPlugin (DisassemblerCreateInstance create_callback)
388{
389 if (create_callback)
390 {
Greg Claytonab65b342011-04-13 22:47:15 +0000391 Mutex::Locker locker (GetDisassemblerMutex ());
392 DisassemblerInstances &instances = GetDisassemblerInstances ();
393
394 DisassemblerInstances::iterator pos, end = instances.end();
395 for (pos = instances.begin(); pos != end; ++ pos)
396 {
397 if (pos->create_callback == create_callback)
398 {
399 instances.erase(pos);
400 return true;
401 }
402 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000403 }
404 return false;
405}
406
407DisassemblerCreateInstance
408PluginManager::GetDisassemblerCreateCallbackAtIndex (uint32_t idx)
409{
Greg Claytonab65b342011-04-13 22:47:15 +0000410 Mutex::Locker locker (GetDisassemblerMutex ());
411 DisassemblerInstances &instances = GetDisassemblerInstances ();
412 if (idx < instances.size())
413 return instances[idx].create_callback;
Jason Molenda743e86a2010-06-11 23:44:18 +0000414 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000415}
416
417DisassemblerCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +0000418PluginManager::GetDisassemblerCreateCallbackForPluginName (const ConstString &name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000419{
Greg Clayton57abc5d2013-05-10 21:47:16 +0000420 if (name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000421 {
Greg Claytonab65b342011-04-13 22:47:15 +0000422 Mutex::Locker locker (GetDisassemblerMutex ());
423 DisassemblerInstances &instances = GetDisassemblerInstances ();
424
425 DisassemblerInstances::iterator pos, end = instances.end();
426 for (pos = instances.begin(); pos != end; ++ pos)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000427 {
Greg Clayton57abc5d2013-05-10 21:47:16 +0000428 if (name == pos->name)
Greg Claytonab65b342011-04-13 22:47:15 +0000429 return pos->create_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000430 }
431 }
432 return NULL;
433}
434
435
436
437#pragma mark DynamicLoader
438
439
Jason Molenda743e86a2010-06-11 23:44:18 +0000440struct DynamicLoaderInstance
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000441{
442 DynamicLoaderInstance() :
443 name(),
444 description(),
Greg Claytone8cd0c92012-10-19 18:02:49 +0000445 create_callback(NULL),
446 debugger_init_callback (NULL)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000447 {
448 }
449
Greg Clayton57abc5d2013-05-10 21:47:16 +0000450 ConstString name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000451 std::string description;
452 DynamicLoaderCreateInstance create_callback;
Greg Claytone8cd0c92012-10-19 18:02:49 +0000453 DebuggerInitializeCallback debugger_init_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000454};
455
456typedef std::vector<DynamicLoaderInstance> DynamicLoaderInstances;
457
Greg Claytonab65b342011-04-13 22:47:15 +0000458
459static Mutex &
460GetDynamicLoaderMutex ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000461{
Greg Claytonab65b342011-04-13 22:47:15 +0000462 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
463 return g_instances_mutex;
464}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000465
Greg Claytonab65b342011-04-13 22:47:15 +0000466static DynamicLoaderInstances &
467GetDynamicLoaderInstances ()
468{
469 static DynamicLoaderInstances g_instances;
470 return g_instances;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000471}
472
473
474bool
475PluginManager::RegisterPlugin
476(
Greg Clayton57abc5d2013-05-10 21:47:16 +0000477 const ConstString &name,
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000478 const char *description,
Greg Claytone8cd0c92012-10-19 18:02:49 +0000479 DynamicLoaderCreateInstance create_callback,
480 DebuggerInitializeCallback debugger_init_callback
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000481)
482{
483 if (create_callback)
484 {
485 DynamicLoaderInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +0000486 assert ((bool)name);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000487 instance.name = name;
488 if (description && description[0])
489 instance.description = description;
490 instance.create_callback = create_callback;
Greg Claytone8cd0c92012-10-19 18:02:49 +0000491 instance.debugger_init_callback = debugger_init_callback;
Greg Claytonab65b342011-04-13 22:47:15 +0000492 Mutex::Locker locker (GetDynamicLoaderMutex ());
493 GetDynamicLoaderInstances ().push_back (instance);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000494 }
495 return false;
496}
497
498bool
499PluginManager::UnregisterPlugin (DynamicLoaderCreateInstance create_callback)
500{
501 if (create_callback)
502 {
Greg Claytonab65b342011-04-13 22:47:15 +0000503 Mutex::Locker locker (GetDynamicLoaderMutex ());
504 DynamicLoaderInstances &instances = GetDynamicLoaderInstances ();
505
506 DynamicLoaderInstances::iterator pos, end = instances.end();
507 for (pos = instances.begin(); pos != end; ++ pos)
508 {
509 if (pos->create_callback == create_callback)
510 {
511 instances.erase(pos);
512 return true;
513 }
514 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000515 }
516 return false;
517}
518
519DynamicLoaderCreateInstance
520PluginManager::GetDynamicLoaderCreateCallbackAtIndex (uint32_t idx)
521{
Greg Claytonab65b342011-04-13 22:47:15 +0000522 Mutex::Locker locker (GetDynamicLoaderMutex ());
523 DynamicLoaderInstances &instances = GetDynamicLoaderInstances ();
524 if (idx < instances.size())
525 return instances[idx].create_callback;
Jason Molenda743e86a2010-06-11 23:44:18 +0000526 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000527}
528
529DynamicLoaderCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +0000530PluginManager::GetDynamicLoaderCreateCallbackForPluginName (const ConstString &name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000531{
Greg Clayton57abc5d2013-05-10 21:47:16 +0000532 if (name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000533 {
Greg Claytonab65b342011-04-13 22:47:15 +0000534 Mutex::Locker locker (GetDynamicLoaderMutex ());
535 DynamicLoaderInstances &instances = GetDynamicLoaderInstances ();
536
537 DynamicLoaderInstances::iterator pos, end = instances.end();
538 for (pos = instances.begin(); pos != end; ++ pos)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000539 {
Greg Clayton57abc5d2013-05-10 21:47:16 +0000540 if (name == pos->name)
Greg Claytonab65b342011-04-13 22:47:15 +0000541 return pos->create_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000542 }
543 }
544 return NULL;
545}
546
Greg Claytonf03bbe22011-02-01 01:37:45 +0000547#pragma mark EmulateInstruction
548
549
550struct EmulateInstructionInstance
551{
552 EmulateInstructionInstance() :
553 name(),
554 description(),
555 create_callback(NULL)
556 {
557 }
558
Greg Clayton57abc5d2013-05-10 21:47:16 +0000559 ConstString name;
Greg Claytonf03bbe22011-02-01 01:37:45 +0000560 std::string description;
561 EmulateInstructionCreateInstance create_callback;
562};
563
564typedef std::vector<EmulateInstructionInstance> EmulateInstructionInstances;
565
Greg Claytonab65b342011-04-13 22:47:15 +0000566static Mutex &
567GetEmulateInstructionMutex ()
Greg Claytonf03bbe22011-02-01 01:37:45 +0000568{
Greg Claytonab65b342011-04-13 22:47:15 +0000569 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
570 return g_instances_mutex;
571}
572
573static EmulateInstructionInstances &
574GetEmulateInstructionInstances ()
575{
576 static EmulateInstructionInstances g_instances;
577 return g_instances;
Greg Claytonf03bbe22011-02-01 01:37:45 +0000578}
579
580
581bool
582PluginManager::RegisterPlugin
583(
Greg Clayton57abc5d2013-05-10 21:47:16 +0000584 const ConstString &name,
Greg Clayton4272cc72011-02-02 02:24:04 +0000585 const char *description,
586 EmulateInstructionCreateInstance create_callback
587)
Greg Claytonf03bbe22011-02-01 01:37:45 +0000588{
589 if (create_callback)
590 {
591 EmulateInstructionInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +0000592 assert ((bool)name);
Greg Claytonf03bbe22011-02-01 01:37:45 +0000593 instance.name = name;
594 if (description && description[0])
595 instance.description = description;
596 instance.create_callback = create_callback;
Greg Claytonab65b342011-04-13 22:47:15 +0000597 Mutex::Locker locker (GetEmulateInstructionMutex ());
598 GetEmulateInstructionInstances ().push_back (instance);
Greg Claytonf03bbe22011-02-01 01:37:45 +0000599 }
600 return false;
601}
602
603bool
604PluginManager::UnregisterPlugin (EmulateInstructionCreateInstance create_callback)
605{
606 if (create_callback)
607 {
Greg Claytonab65b342011-04-13 22:47:15 +0000608 Mutex::Locker locker (GetEmulateInstructionMutex ());
609 EmulateInstructionInstances &instances = GetEmulateInstructionInstances ();
610
611 EmulateInstructionInstances::iterator pos, end = instances.end();
612 for (pos = instances.begin(); pos != end; ++ pos)
613 {
614 if (pos->create_callback == create_callback)
615 {
616 instances.erase(pos);
617 return true;
618 }
619 }
Greg Claytonf03bbe22011-02-01 01:37:45 +0000620 }
621 return false;
622}
623
624EmulateInstructionCreateInstance
625PluginManager::GetEmulateInstructionCreateCallbackAtIndex (uint32_t idx)
626{
Greg Claytonab65b342011-04-13 22:47:15 +0000627 Mutex::Locker locker (GetEmulateInstructionMutex ());
628 EmulateInstructionInstances &instances = GetEmulateInstructionInstances ();
629 if (idx < instances.size())
630 return instances[idx].create_callback;
Greg Claytonf03bbe22011-02-01 01:37:45 +0000631 return NULL;
632}
633
634EmulateInstructionCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +0000635PluginManager::GetEmulateInstructionCreateCallbackForPluginName (const ConstString &name)
Greg Claytonf03bbe22011-02-01 01:37:45 +0000636{
Greg Clayton57abc5d2013-05-10 21:47:16 +0000637 if (name)
Greg Claytonf03bbe22011-02-01 01:37:45 +0000638 {
Greg Claytonab65b342011-04-13 22:47:15 +0000639 Mutex::Locker locker (GetEmulateInstructionMutex ());
640 EmulateInstructionInstances &instances = GetEmulateInstructionInstances ();
641
642 EmulateInstructionInstances::iterator pos, end = instances.end();
643 for (pos = instances.begin(); pos != end; ++ pos)
Greg Claytonf03bbe22011-02-01 01:37:45 +0000644 {
Greg Clayton57abc5d2013-05-10 21:47:16 +0000645 if (name == pos->name)
Greg Claytonab65b342011-04-13 22:47:15 +0000646 return pos->create_callback;
Greg Claytonf03bbe22011-02-01 01:37:45 +0000647 }
648 }
649 return NULL;
650}
Greg Clayton56d9a1b2011-08-22 02:49:39 +0000651#pragma mark OperatingSystem
652
653
654struct OperatingSystemInstance
655{
656 OperatingSystemInstance() :
657 name(),
658 description(),
659 create_callback(NULL)
660 {
661 }
662
Greg Clayton57abc5d2013-05-10 21:47:16 +0000663 ConstString name;
Greg Clayton56d9a1b2011-08-22 02:49:39 +0000664 std::string description;
665 OperatingSystemCreateInstance create_callback;
666};
667
668typedef std::vector<OperatingSystemInstance> OperatingSystemInstances;
669
670static Mutex &
671GetOperatingSystemMutex ()
672{
673 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
674 return g_instances_mutex;
675}
676
677static OperatingSystemInstances &
678GetOperatingSystemInstances ()
679{
680 static OperatingSystemInstances g_instances;
681 return g_instances;
682}
683
684bool
Greg Clayton57abc5d2013-05-10 21:47:16 +0000685PluginManager::RegisterPlugin (const ConstString &name,
686 const char *description,
687 OperatingSystemCreateInstance create_callback)
Greg Clayton56d9a1b2011-08-22 02:49:39 +0000688{
689 if (create_callback)
690 {
691 OperatingSystemInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +0000692 assert ((bool)name);
Greg Clayton56d9a1b2011-08-22 02:49:39 +0000693 instance.name = name;
694 if (description && description[0])
695 instance.description = description;
696 instance.create_callback = create_callback;
697 Mutex::Locker locker (GetOperatingSystemMutex ());
698 GetOperatingSystemInstances ().push_back (instance);
699 }
700 return false;
701}
702
703bool
704PluginManager::UnregisterPlugin (OperatingSystemCreateInstance create_callback)
705{
706 if (create_callback)
707 {
708 Mutex::Locker locker (GetOperatingSystemMutex ());
709 OperatingSystemInstances &instances = GetOperatingSystemInstances ();
710
711 OperatingSystemInstances::iterator pos, end = instances.end();
712 for (pos = instances.begin(); pos != end; ++ pos)
713 {
714 if (pos->create_callback == create_callback)
715 {
716 instances.erase(pos);
717 return true;
718 }
719 }
720 }
721 return false;
722}
723
724OperatingSystemCreateInstance
725PluginManager::GetOperatingSystemCreateCallbackAtIndex (uint32_t idx)
726{
727 Mutex::Locker locker (GetOperatingSystemMutex ());
728 OperatingSystemInstances &instances = GetOperatingSystemInstances ();
729 if (idx < instances.size())
730 return instances[idx].create_callback;
731 return NULL;
732}
733
734OperatingSystemCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +0000735PluginManager::GetOperatingSystemCreateCallbackForPluginName (const ConstString &name)
Greg Clayton56d9a1b2011-08-22 02:49:39 +0000736{
Greg Clayton57abc5d2013-05-10 21:47:16 +0000737 if (name)
Greg Clayton56d9a1b2011-08-22 02:49:39 +0000738 {
Greg Clayton56d9a1b2011-08-22 02:49:39 +0000739 Mutex::Locker locker (GetOperatingSystemMutex ());
740 OperatingSystemInstances &instances = GetOperatingSystemInstances ();
741
742 OperatingSystemInstances::iterator pos, end = instances.end();
743 for (pos = instances.begin(); pos != end; ++ pos)
744 {
Greg Clayton57abc5d2013-05-10 21:47:16 +0000745 if (name == pos->name)
Greg Clayton56d9a1b2011-08-22 02:49:39 +0000746 return pos->create_callback;
747 }
748 }
749 return NULL;
750}
Greg Claytonf03bbe22011-02-01 01:37:45 +0000751
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000752
Jim Ingham22777012010-09-23 02:01:19 +0000753#pragma mark LanguageRuntime
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000754
755
Jim Ingham22777012010-09-23 02:01:19 +0000756struct LanguageRuntimeInstance
757{
758 LanguageRuntimeInstance() :
759 name(),
760 description(),
761 create_callback(NULL)
762 {
763 }
764
Greg Clayton57abc5d2013-05-10 21:47:16 +0000765 ConstString name;
Jim Ingham22777012010-09-23 02:01:19 +0000766 std::string description;
767 LanguageRuntimeCreateInstance create_callback;
768};
769
770typedef std::vector<LanguageRuntimeInstance> LanguageRuntimeInstances;
771
Greg Claytonab65b342011-04-13 22:47:15 +0000772static Mutex &
773GetLanguageRuntimeMutex ()
Jim Ingham22777012010-09-23 02:01:19 +0000774{
Greg Claytonab65b342011-04-13 22:47:15 +0000775 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
776 return g_instances_mutex;
Jim Ingham22777012010-09-23 02:01:19 +0000777}
778
Greg Claytonab65b342011-04-13 22:47:15 +0000779static LanguageRuntimeInstances &
780GetLanguageRuntimeInstances ()
781{
782 static LanguageRuntimeInstances g_instances;
783 return g_instances;
784}
Jim Ingham22777012010-09-23 02:01:19 +0000785
786bool
787PluginManager::RegisterPlugin
Greg Clayton4272cc72011-02-02 02:24:04 +0000788(
Greg Clayton57abc5d2013-05-10 21:47:16 +0000789 const ConstString &name,
Greg Clayton4272cc72011-02-02 02:24:04 +0000790 const char *description,
791 LanguageRuntimeCreateInstance create_callback
792)
Jim Ingham22777012010-09-23 02:01:19 +0000793{
794 if (create_callback)
795 {
796 LanguageRuntimeInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +0000797 assert ((bool)name);
Jim Ingham22777012010-09-23 02:01:19 +0000798 instance.name = name;
799 if (description && description[0])
800 instance.description = description;
801 instance.create_callback = create_callback;
Greg Claytonab65b342011-04-13 22:47:15 +0000802 Mutex::Locker locker (GetLanguageRuntimeMutex ());
803 GetLanguageRuntimeInstances ().push_back (instance);
Jim Ingham22777012010-09-23 02:01:19 +0000804 }
805 return false;
806}
807
808bool
809PluginManager::UnregisterPlugin (LanguageRuntimeCreateInstance create_callback)
810{
811 if (create_callback)
812 {
Greg Claytonab65b342011-04-13 22:47:15 +0000813 Mutex::Locker locker (GetLanguageRuntimeMutex ());
814 LanguageRuntimeInstances &instances = GetLanguageRuntimeInstances ();
815
816 LanguageRuntimeInstances::iterator pos, end = instances.end();
817 for (pos = instances.begin(); pos != end; ++ pos)
818 {
819 if (pos->create_callback == create_callback)
820 {
821 instances.erase(pos);
822 return true;
823 }
824 }
Jim Ingham22777012010-09-23 02:01:19 +0000825 }
826 return false;
827}
828
829LanguageRuntimeCreateInstance
830PluginManager::GetLanguageRuntimeCreateCallbackAtIndex (uint32_t idx)
831{
Greg Claytonab65b342011-04-13 22:47:15 +0000832 Mutex::Locker locker (GetLanguageRuntimeMutex ());
833 LanguageRuntimeInstances &instances = GetLanguageRuntimeInstances ();
834 if (idx < instances.size())
835 return instances[idx].create_callback;
Jim Ingham22777012010-09-23 02:01:19 +0000836 return NULL;
837}
838
839LanguageRuntimeCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +0000840PluginManager::GetLanguageRuntimeCreateCallbackForPluginName (const ConstString &name)
Jim Ingham22777012010-09-23 02:01:19 +0000841{
Greg Clayton57abc5d2013-05-10 21:47:16 +0000842 if (name)
Jim Ingham22777012010-09-23 02:01:19 +0000843 {
Greg Claytonab65b342011-04-13 22:47:15 +0000844 Mutex::Locker locker (GetLanguageRuntimeMutex ());
845 LanguageRuntimeInstances &instances = GetLanguageRuntimeInstances ();
846
847 LanguageRuntimeInstances::iterator pos, end = instances.end();
848 for (pos = instances.begin(); pos != end; ++ pos)
Jim Ingham22777012010-09-23 02:01:19 +0000849 {
Greg Clayton57abc5d2013-05-10 21:47:16 +0000850 if (name == pos->name)
Greg Claytonab65b342011-04-13 22:47:15 +0000851 return pos->create_callback;
Jim Ingham22777012010-09-23 02:01:19 +0000852 }
853 }
854 return NULL;
855}
856
Jason Molendaeef51062013-11-05 03:57:19 +0000857#pragma mark SystemRuntime
858
859
860struct SystemRuntimeInstance
861{
862 SystemRuntimeInstance() :
863 name(),
864 description(),
865 create_callback(NULL)
866 {
867 }
868
869 ConstString name;
870 std::string description;
871 SystemRuntimeCreateInstance create_callback;
872};
873
874typedef std::vector<SystemRuntimeInstance> SystemRuntimeInstances;
875
876static Mutex &
877GetSystemRuntimeMutex ()
878{
879 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
880 return g_instances_mutex;
881}
882
883static SystemRuntimeInstances &
884GetSystemRuntimeInstances ()
885{
886 static SystemRuntimeInstances g_instances;
887 return g_instances;
888}
889
890bool
891PluginManager::RegisterPlugin
892(
893 const ConstString &name,
894 const char *description,
895 SystemRuntimeCreateInstance create_callback
896)
897{
898 if (create_callback)
899 {
900 SystemRuntimeInstance instance;
901 assert ((bool)name);
902 instance.name = name;
903 if (description && description[0])
904 instance.description = description;
905 instance.create_callback = create_callback;
906 Mutex::Locker locker (GetSystemRuntimeMutex ());
907 GetSystemRuntimeInstances ().push_back (instance);
908 }
909 return false;
910}
911
912bool
913PluginManager::UnregisterPlugin (SystemRuntimeCreateInstance create_callback)
914{
915 if (create_callback)
916 {
917 Mutex::Locker locker (GetSystemRuntimeMutex ());
918 SystemRuntimeInstances &instances = GetSystemRuntimeInstances ();
919
920 SystemRuntimeInstances::iterator pos, end = instances.end();
921 for (pos = instances.begin(); pos != end; ++ pos)
922 {
923 if (pos->create_callback == create_callback)
924 {
925 instances.erase(pos);
926 return true;
927 }
928 }
929 }
930 return false;
931}
932
933SystemRuntimeCreateInstance
934PluginManager::GetSystemRuntimeCreateCallbackAtIndex (uint32_t idx)
935{
936 Mutex::Locker locker (GetSystemRuntimeMutex ());
937 SystemRuntimeInstances &instances = GetSystemRuntimeInstances ();
938 if (idx < instances.size())
939 return instances[idx].create_callback;
940 return NULL;
941}
942
943SystemRuntimeCreateInstance
944PluginManager::GetSystemRuntimeCreateCallbackForPluginName (const ConstString &name)
945{
946 if (name)
947 {
948 Mutex::Locker locker (GetSystemRuntimeMutex ());
949 SystemRuntimeInstances &instances = GetSystemRuntimeInstances ();
950
951 SystemRuntimeInstances::iterator pos, end = instances.end();
952 for (pos = instances.begin(); pos != end; ++ pos)
953 {
954 if (name == pos->name)
955 return pos->create_callback;
956 }
957 }
958 return NULL;
959}
960
961
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000962#pragma mark ObjectFile
963
Jason Molenda743e86a2010-06-11 23:44:18 +0000964struct ObjectFileInstance
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000965{
966 ObjectFileInstance() :
967 name(),
968 description(),
Greg Claytonf4d6de62013-04-24 22:29:28 +0000969 create_callback(NULL),
970 create_memory_callback (NULL),
971 get_module_specifications (NULL)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000972 {
973 }
974
Greg Clayton57abc5d2013-05-10 21:47:16 +0000975 ConstString name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000976 std::string description;
977 ObjectFileCreateInstance create_callback;
Greg Claytonc9660542012-02-05 02:38:54 +0000978 ObjectFileCreateMemoryInstance create_memory_callback;
Greg Claytonf4d6de62013-04-24 22:29:28 +0000979 ObjectFileGetModuleSpecifications get_module_specifications;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000980};
981
982typedef std::vector<ObjectFileInstance> ObjectFileInstances;
983
Greg Claytonab65b342011-04-13 22:47:15 +0000984static Mutex &
985GetObjectFileMutex ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000986{
Greg Claytonab65b342011-04-13 22:47:15 +0000987 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
988 return g_instances_mutex;
989}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000990
Greg Claytonab65b342011-04-13 22:47:15 +0000991static ObjectFileInstances &
992GetObjectFileInstances ()
993{
994 static ObjectFileInstances g_instances;
995 return g_instances;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000996}
997
998
999bool
Greg Clayton57abc5d2013-05-10 21:47:16 +00001000PluginManager::RegisterPlugin (const ConstString &name,
Greg Claytonf4d6de62013-04-24 22:29:28 +00001001 const char *description,
1002 ObjectFileCreateInstance create_callback,
1003 ObjectFileCreateMemoryInstance create_memory_callback,
1004 ObjectFileGetModuleSpecifications get_module_specifications)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001005{
1006 if (create_callback)
1007 {
1008 ObjectFileInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +00001009 assert ((bool)name);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001010 instance.name = name;
1011 if (description && description[0])
1012 instance.description = description;
1013 instance.create_callback = create_callback;
Greg Claytonc9660542012-02-05 02:38:54 +00001014 instance.create_memory_callback = create_memory_callback;
Greg Claytonf4d6de62013-04-24 22:29:28 +00001015 instance.get_module_specifications = get_module_specifications;
Greg Claytonab65b342011-04-13 22:47:15 +00001016 Mutex::Locker locker (GetObjectFileMutex ());
1017 GetObjectFileInstances ().push_back (instance);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001018 }
1019 return false;
1020}
1021
1022bool
1023PluginManager::UnregisterPlugin (ObjectFileCreateInstance create_callback)
1024{
1025 if (create_callback)
1026 {
Greg Claytonab65b342011-04-13 22:47:15 +00001027 Mutex::Locker locker (GetObjectFileMutex ());
1028 ObjectFileInstances &instances = GetObjectFileInstances ();
1029
1030 ObjectFileInstances::iterator pos, end = instances.end();
1031 for (pos = instances.begin(); pos != end; ++ pos)
1032 {
1033 if (pos->create_callback == create_callback)
1034 {
1035 instances.erase(pos);
1036 return true;
1037 }
1038 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001039 }
1040 return false;
1041}
1042
1043ObjectFileCreateInstance
1044PluginManager::GetObjectFileCreateCallbackAtIndex (uint32_t idx)
1045{
Greg Claytonab65b342011-04-13 22:47:15 +00001046 Mutex::Locker locker (GetObjectFileMutex ());
1047 ObjectFileInstances &instances = GetObjectFileInstances ();
1048 if (idx < instances.size())
1049 return instances[idx].create_callback;
Jason Molenda743e86a2010-06-11 23:44:18 +00001050 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001051}
Greg Claytonab65b342011-04-13 22:47:15 +00001052
Greg Claytonc9660542012-02-05 02:38:54 +00001053
1054ObjectFileCreateMemoryInstance
1055PluginManager::GetObjectFileCreateMemoryCallbackAtIndex (uint32_t idx)
1056{
1057 Mutex::Locker locker (GetObjectFileMutex ());
1058 ObjectFileInstances &instances = GetObjectFileInstances ();
1059 if (idx < instances.size())
1060 return instances[idx].create_memory_callback;
1061 return NULL;
1062}
1063
Greg Claytonf4d6de62013-04-24 22:29:28 +00001064ObjectFileGetModuleSpecifications
1065PluginManager::GetObjectFileGetModuleSpecificationsCallbackAtIndex (uint32_t idx)
1066{
1067 Mutex::Locker locker (GetObjectFileMutex ());
1068 ObjectFileInstances &instances = GetObjectFileInstances ();
1069 if (idx < instances.size())
1070 return instances[idx].get_module_specifications;
1071 return NULL;
1072}
1073
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001074ObjectFileCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +00001075PluginManager::GetObjectFileCreateCallbackForPluginName (const ConstString &name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001076{
Greg Clayton57abc5d2013-05-10 21:47:16 +00001077 if (name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001078 {
Greg Claytonab65b342011-04-13 22:47:15 +00001079 Mutex::Locker locker (GetObjectFileMutex ());
1080 ObjectFileInstances &instances = GetObjectFileInstances ();
1081
1082 ObjectFileInstances::iterator pos, end = instances.end();
1083 for (pos = instances.begin(); pos != end; ++ pos)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001084 {
Greg Clayton57abc5d2013-05-10 21:47:16 +00001085 if (name == pos->name)
Greg Claytonab65b342011-04-13 22:47:15 +00001086 return pos->create_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001087 }
1088 }
1089 return NULL;
1090}
1091
1092
Greg Claytonc9660542012-02-05 02:38:54 +00001093ObjectFileCreateMemoryInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +00001094PluginManager::GetObjectFileCreateMemoryCallbackForPluginName (const ConstString &name)
Greg Claytonc9660542012-02-05 02:38:54 +00001095{
Greg Clayton57abc5d2013-05-10 21:47:16 +00001096 if (name)
Greg Claytonc9660542012-02-05 02:38:54 +00001097 {
Greg Claytonc9660542012-02-05 02:38:54 +00001098 Mutex::Locker locker (GetObjectFileMutex ());
1099 ObjectFileInstances &instances = GetObjectFileInstances ();
1100
1101 ObjectFileInstances::iterator pos, end = instances.end();
1102 for (pos = instances.begin(); pos != end; ++ pos)
1103 {
Greg Clayton57abc5d2013-05-10 21:47:16 +00001104 if (name == pos->name)
Greg Claytonc9660542012-02-05 02:38:54 +00001105 return pos->create_memory_callback;
1106 }
1107 }
1108 return NULL;
1109}
1110
1111
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001112
1113#pragma mark ObjectContainer
1114
Jason Molenda743e86a2010-06-11 23:44:18 +00001115struct ObjectContainerInstance
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001116{
1117 ObjectContainerInstance() :
1118 name(),
1119 description(),
Greg Claytonf4d6de62013-04-24 22:29:28 +00001120 create_callback (NULL),
1121 get_module_specifications (NULL)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001122 {
1123 }
1124
Greg Clayton57abc5d2013-05-10 21:47:16 +00001125 ConstString name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001126 std::string description;
1127 ObjectContainerCreateInstance create_callback;
Greg Claytonf4d6de62013-04-24 22:29:28 +00001128 ObjectFileGetModuleSpecifications get_module_specifications;
1129
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001130};
1131
1132typedef std::vector<ObjectContainerInstance> ObjectContainerInstances;
1133
Greg Claytonab65b342011-04-13 22:47:15 +00001134static Mutex &
1135GetObjectContainerMutex ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001136{
Greg Claytonab65b342011-04-13 22:47:15 +00001137 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
1138 return g_instances_mutex;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001139}
1140
Greg Claytonab65b342011-04-13 22:47:15 +00001141static ObjectContainerInstances &
1142GetObjectContainerInstances ()
1143{
1144 static ObjectContainerInstances g_instances;
1145 return g_instances;
1146}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001147
1148bool
Greg Clayton57abc5d2013-05-10 21:47:16 +00001149PluginManager::RegisterPlugin (const ConstString &name,
Greg Claytonf4d6de62013-04-24 22:29:28 +00001150 const char *description,
1151 ObjectContainerCreateInstance create_callback,
1152 ObjectFileGetModuleSpecifications get_module_specifications)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001153{
1154 if (create_callback)
1155 {
1156 ObjectContainerInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +00001157 assert ((bool)name);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001158 instance.name = name;
1159 if (description && description[0])
1160 instance.description = description;
1161 instance.create_callback = create_callback;
Greg Claytonf4d6de62013-04-24 22:29:28 +00001162 instance.get_module_specifications = get_module_specifications;
Greg Claytonab65b342011-04-13 22:47:15 +00001163 Mutex::Locker locker (GetObjectContainerMutex ());
1164 GetObjectContainerInstances ().push_back (instance);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001165 }
1166 return false;
1167}
1168
1169bool
1170PluginManager::UnregisterPlugin (ObjectContainerCreateInstance create_callback)
1171{
1172 if (create_callback)
1173 {
Greg Claytonab65b342011-04-13 22:47:15 +00001174 Mutex::Locker locker (GetObjectContainerMutex ());
1175 ObjectContainerInstances &instances = GetObjectContainerInstances ();
1176
1177 ObjectContainerInstances::iterator pos, end = instances.end();
1178 for (pos = instances.begin(); pos != end; ++ pos)
1179 {
1180 if (pos->create_callback == create_callback)
1181 {
1182 instances.erase(pos);
1183 return true;
1184 }
1185 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001186 }
1187 return false;
1188}
1189
1190ObjectContainerCreateInstance
1191PluginManager::GetObjectContainerCreateCallbackAtIndex (uint32_t idx)
1192{
Greg Claytonab65b342011-04-13 22:47:15 +00001193 Mutex::Locker locker (GetObjectContainerMutex ());
1194 ObjectContainerInstances &instances = GetObjectContainerInstances ();
1195 if (idx < instances.size())
1196 return instances[idx].create_callback;
Jason Molenda743e86a2010-06-11 23:44:18 +00001197 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001198}
Greg Claytonab65b342011-04-13 22:47:15 +00001199
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001200ObjectContainerCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +00001201PluginManager::GetObjectContainerCreateCallbackForPluginName (const ConstString &name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001202{
Greg Clayton57abc5d2013-05-10 21:47:16 +00001203 if (name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001204 {
Greg Claytonab65b342011-04-13 22:47:15 +00001205 Mutex::Locker locker (GetObjectContainerMutex ());
1206 ObjectContainerInstances &instances = GetObjectContainerInstances ();
1207
1208 ObjectContainerInstances::iterator pos, end = instances.end();
1209 for (pos = instances.begin(); pos != end; ++ pos)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001210 {
Greg Clayton57abc5d2013-05-10 21:47:16 +00001211 if (name == pos->name)
Greg Claytonab65b342011-04-13 22:47:15 +00001212 return pos->create_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001213 }
1214 }
1215 return NULL;
1216}
1217
Greg Claytonf4d6de62013-04-24 22:29:28 +00001218ObjectFileGetModuleSpecifications
1219PluginManager::GetObjectContainerGetModuleSpecificationsCallbackAtIndex (uint32_t idx)
1220{
1221 Mutex::Locker locker (GetObjectContainerMutex ());
1222 ObjectContainerInstances &instances = GetObjectContainerInstances ();
1223 if (idx < instances.size())
1224 return instances[idx].get_module_specifications;
1225 return NULL;
1226}
1227
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001228#pragma mark LogChannel
1229
Greg Claytonab65b342011-04-13 22:47:15 +00001230struct LogInstance
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001231{
Greg Claytonab65b342011-04-13 22:47:15 +00001232 LogInstance() :
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001233 name(),
1234 description(),
1235 create_callback(NULL)
1236 {
1237 }
1238
Greg Clayton57abc5d2013-05-10 21:47:16 +00001239 ConstString name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001240 std::string description;
1241 LogChannelCreateInstance create_callback;
1242};
1243
Greg Claytonab65b342011-04-13 22:47:15 +00001244typedef std::vector<LogInstance> LogInstances;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001245
Greg Claytonab65b342011-04-13 22:47:15 +00001246static Mutex &
1247GetLogMutex ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001248{
Greg Claytonab65b342011-04-13 22:47:15 +00001249 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
1250 return g_instances_mutex;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001251}
1252
Greg Claytonab65b342011-04-13 22:47:15 +00001253static LogInstances &
1254GetLogInstances ()
1255{
1256 static LogInstances g_instances;
1257 return g_instances;
1258}
1259
1260
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001261
1262bool
1263PluginManager::RegisterPlugin
1264(
Greg Clayton57abc5d2013-05-10 21:47:16 +00001265 const ConstString &name,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001266 const char *description,
1267 LogChannelCreateInstance create_callback
1268)
1269{
1270 if (create_callback)
1271 {
Greg Claytonab65b342011-04-13 22:47:15 +00001272 LogInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +00001273 assert ((bool)name);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001274 instance.name = name;
1275 if (description && description[0])
1276 instance.description = description;
1277 instance.create_callback = create_callback;
Greg Claytonab65b342011-04-13 22:47:15 +00001278 Mutex::Locker locker (GetLogMutex ());
1279 GetLogInstances ().push_back (instance);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001280 }
1281 return false;
1282}
1283
1284bool
1285PluginManager::UnregisterPlugin (LogChannelCreateInstance create_callback)
1286{
1287 if (create_callback)
1288 {
Greg Claytonab65b342011-04-13 22:47:15 +00001289 Mutex::Locker locker (GetLogMutex ());
1290 LogInstances &instances = GetLogInstances ();
1291
1292 LogInstances::iterator pos, end = instances.end();
1293 for (pos = instances.begin(); pos != end; ++ pos)
1294 {
1295 if (pos->create_callback == create_callback)
1296 {
1297 instances.erase(pos);
1298 return true;
1299 }
1300 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001301 }
1302 return false;
1303}
1304
1305const char *
1306PluginManager::GetLogChannelCreateNameAtIndex (uint32_t idx)
1307{
Greg Claytonab65b342011-04-13 22:47:15 +00001308 Mutex::Locker locker (GetLogMutex ());
1309 LogInstances &instances = GetLogInstances ();
1310 if (idx < instances.size())
Greg Clayton57abc5d2013-05-10 21:47:16 +00001311 return instances[idx].name.GetCString();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001312 return NULL;
1313}
1314
1315
1316LogChannelCreateInstance
1317PluginManager::GetLogChannelCreateCallbackAtIndex (uint32_t idx)
1318{
Greg Claytonab65b342011-04-13 22:47:15 +00001319 Mutex::Locker locker (GetLogMutex ());
1320 LogInstances &instances = GetLogInstances ();
1321 if (idx < instances.size())
1322 return instances[idx].create_callback;
Jason Molenda743e86a2010-06-11 23:44:18 +00001323 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001324}
1325
1326LogChannelCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +00001327PluginManager::GetLogChannelCreateCallbackForPluginName (const ConstString &name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001328{
Greg Clayton57abc5d2013-05-10 21:47:16 +00001329 if (name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001330 {
Greg Claytonab65b342011-04-13 22:47:15 +00001331 Mutex::Locker locker (GetLogMutex ());
1332 LogInstances &instances = GetLogInstances ();
1333
1334 LogInstances::iterator pos, end = instances.end();
1335 for (pos = instances.begin(); pos != end; ++ pos)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001336 {
Greg Clayton57abc5d2013-05-10 21:47:16 +00001337 if (name == pos->name)
Greg Claytonab65b342011-04-13 22:47:15 +00001338 return pos->create_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001339 }
1340 }
1341 return NULL;
1342}
1343
Greg Claytone996fd32011-03-08 22:40:15 +00001344#pragma mark Platform
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001345
Greg Claytone996fd32011-03-08 22:40:15 +00001346struct PlatformInstance
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001347{
Greg Claytone996fd32011-03-08 22:40:15 +00001348 PlatformInstance() :
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001349 name(),
1350 description(),
Jason Molenda9b837a12013-04-05 05:06:39 +00001351 create_callback(NULL),
1352 debugger_init_callback (NULL)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001353 {
1354 }
Greg Claytone996fd32011-03-08 22:40:15 +00001355
Greg Clayton57abc5d2013-05-10 21:47:16 +00001356 ConstString name;
Greg Claytone996fd32011-03-08 22:40:15 +00001357 std::string description;
1358 PlatformCreateInstance create_callback;
Jason Molenda9b837a12013-04-05 05:06:39 +00001359 DebuggerInitializeCallback debugger_init_callback;
Greg Claytone996fd32011-03-08 22:40:15 +00001360};
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001361
Greg Claytone996fd32011-03-08 22:40:15 +00001362typedef std::vector<PlatformInstance> PlatformInstances;
1363
Greg Claytonded470d2011-03-19 01:12:21 +00001364static Mutex &
1365GetPlatformInstancesMutex ()
Greg Claytone996fd32011-03-08 22:40:15 +00001366{
Greg Claytonded470d2011-03-19 01:12:21 +00001367 static Mutex g_platform_instances_mutex (Mutex::eMutexTypeRecursive);
1368 return g_platform_instances_mutex;
Greg Claytone996fd32011-03-08 22:40:15 +00001369}
1370
Greg Claytonded470d2011-03-19 01:12:21 +00001371static PlatformInstances &
1372GetPlatformInstances ()
1373{
1374 static PlatformInstances g_platform_instances;
1375 return g_platform_instances;
1376}
Greg Claytone996fd32011-03-08 22:40:15 +00001377
Greg Claytonab65b342011-04-13 22:47:15 +00001378
Greg Claytone996fd32011-03-08 22:40:15 +00001379bool
Greg Clayton57abc5d2013-05-10 21:47:16 +00001380PluginManager::RegisterPlugin (const ConstString &name,
Greg Claytone996fd32011-03-08 22:40:15 +00001381 const char *description,
Jason Molenda9b837a12013-04-05 05:06:39 +00001382 PlatformCreateInstance create_callback,
1383 DebuggerInitializeCallback debugger_init_callback)
Greg Claytone996fd32011-03-08 22:40:15 +00001384{
1385 if (create_callback)
1386 {
Greg Claytonded470d2011-03-19 01:12:21 +00001387 Mutex::Locker locker (GetPlatformInstancesMutex ());
1388
Greg Claytone996fd32011-03-08 22:40:15 +00001389 PlatformInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +00001390 assert ((bool)name);
Greg Claytone996fd32011-03-08 22:40:15 +00001391 instance.name = name;
1392 if (description && description[0])
1393 instance.description = description;
1394 instance.create_callback = create_callback;
Jason Molenda9b837a12013-04-05 05:06:39 +00001395 instance.debugger_init_callback = debugger_init_callback;
Greg Claytonded470d2011-03-19 01:12:21 +00001396 GetPlatformInstances ().push_back (instance);
1397 return true;
Greg Claytone996fd32011-03-08 22:40:15 +00001398 }
1399 return false;
1400}
1401
Jason Molenda9b837a12013-04-05 05:06:39 +00001402
Greg Claytone996fd32011-03-08 22:40:15 +00001403const char *
1404PluginManager::GetPlatformPluginNameAtIndex (uint32_t idx)
1405{
Greg Claytonded470d2011-03-19 01:12:21 +00001406 Mutex::Locker locker (GetPlatformInstancesMutex ());
Greg Claytonab65b342011-04-13 22:47:15 +00001407 PlatformInstances &instances = GetPlatformInstances ();
1408 if (idx < instances.size())
Greg Clayton57abc5d2013-05-10 21:47:16 +00001409 return instances[idx].name.GetCString();
Greg Claytone996fd32011-03-08 22:40:15 +00001410 return NULL;
1411}
1412
1413const char *
1414PluginManager::GetPlatformPluginDescriptionAtIndex (uint32_t idx)
1415{
Greg Claytonded470d2011-03-19 01:12:21 +00001416 Mutex::Locker locker (GetPlatformInstancesMutex ());
Greg Claytonab65b342011-04-13 22:47:15 +00001417 PlatformInstances &instances = GetPlatformInstances ();
1418 if (idx < instances.size())
1419 return instances[idx].description.c_str();
Greg Claytone996fd32011-03-08 22:40:15 +00001420 return NULL;
1421}
1422
1423bool
1424PluginManager::UnregisterPlugin (PlatformCreateInstance create_callback)
1425{
1426 if (create_callback)
1427 {
Greg Claytonded470d2011-03-19 01:12:21 +00001428 Mutex::Locker locker (GetPlatformInstancesMutex ());
Greg Claytonab65b342011-04-13 22:47:15 +00001429 PlatformInstances &instances = GetPlatformInstances ();
Greg Claytonded470d2011-03-19 01:12:21 +00001430
Greg Claytonab65b342011-04-13 22:47:15 +00001431 PlatformInstances::iterator pos, end = instances.end();
1432 for (pos = instances.begin(); pos != end; ++ pos)
Greg Claytonded470d2011-03-19 01:12:21 +00001433 {
1434 if (pos->create_callback == create_callback)
1435 {
Greg Claytonab65b342011-04-13 22:47:15 +00001436 instances.erase(pos);
Greg Claytonded470d2011-03-19 01:12:21 +00001437 return true;
1438 }
1439 }
Greg Claytone996fd32011-03-08 22:40:15 +00001440 }
1441 return false;
1442}
1443
1444PlatformCreateInstance
1445PluginManager::GetPlatformCreateCallbackAtIndex (uint32_t idx)
1446{
Greg Claytonded470d2011-03-19 01:12:21 +00001447 Mutex::Locker locker (GetPlatformInstancesMutex ());
Greg Claytonab65b342011-04-13 22:47:15 +00001448 PlatformInstances &instances = GetPlatformInstances ();
1449 if (idx < instances.size())
1450 return instances[idx].create_callback;
Greg Claytone996fd32011-03-08 22:40:15 +00001451 return NULL;
1452}
1453
1454PlatformCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +00001455PluginManager::GetPlatformCreateCallbackForPluginName (const ConstString &name)
Greg Claytone996fd32011-03-08 22:40:15 +00001456{
Greg Clayton57abc5d2013-05-10 21:47:16 +00001457 if (name)
Greg Claytone996fd32011-03-08 22:40:15 +00001458 {
Greg Claytonded470d2011-03-19 01:12:21 +00001459 Mutex::Locker locker (GetPlatformInstancesMutex ());
Greg Claytonab65b342011-04-13 22:47:15 +00001460 PlatformInstances &instances = GetPlatformInstances ();
Greg Claytonded470d2011-03-19 01:12:21 +00001461
Greg Claytonab65b342011-04-13 22:47:15 +00001462 PlatformInstances::iterator pos, end = instances.end();
1463 for (pos = instances.begin(); pos != end; ++ pos)
Greg Claytone996fd32011-03-08 22:40:15 +00001464 {
Greg Clayton57abc5d2013-05-10 21:47:16 +00001465 if (name == pos->name)
Greg Claytonded470d2011-03-19 01:12:21 +00001466 return pos->create_callback;
Greg Claytone996fd32011-03-08 22:40:15 +00001467 }
1468 }
1469 return NULL;
1470}
1471
Greg Claytonc7bece562013-01-25 18:06:21 +00001472size_t
Greg Claytonab65b342011-04-13 22:47:15 +00001473PluginManager::AutoCompletePlatformName (const char *name, StringList &matches)
1474{
Greg Clayton57abc5d2013-05-10 21:47:16 +00001475 if (name)
Greg Claytonab65b342011-04-13 22:47:15 +00001476 {
1477 Mutex::Locker locker (GetPlatformInstancesMutex ());
1478 PlatformInstances &instances = GetPlatformInstances ();
1479 llvm::StringRef name_sref(name);
1480
1481 PlatformInstances::iterator pos, end = instances.end();
1482 for (pos = instances.begin(); pos != end; ++ pos)
1483 {
Greg Clayton57abc5d2013-05-10 21:47:16 +00001484 llvm::StringRef plugin_name (pos->name.GetCString());
Greg Clayton7260f622011-04-18 08:33:37 +00001485 if (plugin_name.startswith(name_sref))
1486 matches.AppendString (plugin_name.data());
Greg Claytonab65b342011-04-13 22:47:15 +00001487 }
1488 }
1489 return matches.GetSize();
1490}
Greg Claytone996fd32011-03-08 22:40:15 +00001491#pragma mark Process
1492
1493struct ProcessInstance
1494{
1495 ProcessInstance() :
Greg Clayton7f982402013-07-15 22:54:20 +00001496 name(),
1497 description(),
1498 create_callback(NULL),
1499 debugger_init_callback(NULL)
Greg Claytone996fd32011-03-08 22:40:15 +00001500 {
1501 }
1502
Greg Clayton57abc5d2013-05-10 21:47:16 +00001503 ConstString name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001504 std::string description;
1505 ProcessCreateInstance create_callback;
Greg Clayton7f982402013-07-15 22:54:20 +00001506 DebuggerInitializeCallback debugger_init_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001507};
1508
1509typedef std::vector<ProcessInstance> ProcessInstances;
1510
Greg Claytonab65b342011-04-13 22:47:15 +00001511static Mutex &
1512GetProcessMutex ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001513{
Greg Claytonab65b342011-04-13 22:47:15 +00001514 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
1515 return g_instances_mutex;
1516}
1517
1518static ProcessInstances &
1519GetProcessInstances ()
1520{
1521 static ProcessInstances g_instances;
1522 return g_instances;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001523}
1524
1525
1526bool
Greg Clayton7f982402013-07-15 22:54:20 +00001527PluginManager::RegisterPlugin (const ConstString &name,
1528 const char *description,
1529 ProcessCreateInstance create_callback,
1530 DebuggerInitializeCallback debugger_init_callback)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001531{
1532 if (create_callback)
1533 {
1534 ProcessInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +00001535 assert ((bool)name);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001536 instance.name = name;
1537 if (description && description[0])
1538 instance.description = description;
1539 instance.create_callback = create_callback;
Greg Clayton7f982402013-07-15 22:54:20 +00001540 instance.debugger_init_callback = debugger_init_callback;
Greg Claytonab65b342011-04-13 22:47:15 +00001541 Mutex::Locker locker (GetProcessMutex ());
1542 GetProcessInstances ().push_back (instance);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001543 }
1544 return false;
1545}
1546
Greg Claytonbfe5f3b2011-02-18 01:44:25 +00001547const char *
1548PluginManager::GetProcessPluginNameAtIndex (uint32_t idx)
1549{
Greg Claytonab65b342011-04-13 22:47:15 +00001550 Mutex::Locker locker (GetProcessMutex ());
1551 ProcessInstances &instances = GetProcessInstances ();
1552 if (idx < instances.size())
Greg Clayton57abc5d2013-05-10 21:47:16 +00001553 return instances[idx].name.GetCString();
Greg Claytonbfe5f3b2011-02-18 01:44:25 +00001554 return NULL;
1555}
1556
1557const char *
1558PluginManager::GetProcessPluginDescriptionAtIndex (uint32_t idx)
1559{
Greg Claytonab65b342011-04-13 22:47:15 +00001560 Mutex::Locker locker (GetProcessMutex ());
1561 ProcessInstances &instances = GetProcessInstances ();
1562 if (idx < instances.size())
1563 return instances[idx].description.c_str();
Greg Claytonbfe5f3b2011-02-18 01:44:25 +00001564 return NULL;
1565}
1566
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001567bool
1568PluginManager::UnregisterPlugin (ProcessCreateInstance create_callback)
1569{
1570 if (create_callback)
1571 {
Greg Claytonab65b342011-04-13 22:47:15 +00001572 Mutex::Locker locker (GetProcessMutex ());
1573 ProcessInstances &instances = GetProcessInstances ();
1574
1575 ProcessInstances::iterator pos, end = instances.end();
1576 for (pos = instances.begin(); pos != end; ++ pos)
1577 {
1578 if (pos->create_callback == create_callback)
1579 {
1580 instances.erase(pos);
1581 return true;
1582 }
1583 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001584 }
1585 return false;
1586}
1587
1588ProcessCreateInstance
1589PluginManager::GetProcessCreateCallbackAtIndex (uint32_t idx)
1590{
Greg Claytonab65b342011-04-13 22:47:15 +00001591 Mutex::Locker locker (GetProcessMutex ());
1592 ProcessInstances &instances = GetProcessInstances ();
1593 if (idx < instances.size())
1594 return instances[idx].create_callback;
Jason Molenda743e86a2010-06-11 23:44:18 +00001595 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001596}
1597
Greg Claytonab65b342011-04-13 22:47:15 +00001598
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001599ProcessCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +00001600PluginManager::GetProcessCreateCallbackForPluginName (const ConstString &name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001601{
Greg Clayton57abc5d2013-05-10 21:47:16 +00001602 if (name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001603 {
Greg Claytonab65b342011-04-13 22:47:15 +00001604 Mutex::Locker locker (GetProcessMutex ());
1605 ProcessInstances &instances = GetProcessInstances ();
1606
1607 ProcessInstances::iterator pos, end = instances.end();
1608 for (pos = instances.begin(); pos != end; ++ pos)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001609 {
Greg Clayton57abc5d2013-05-10 21:47:16 +00001610 if (name == pos->name)
Greg Claytonab65b342011-04-13 22:47:15 +00001611 return pos->create_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001612 }
1613 }
1614 return NULL;
1615}
1616
1617#pragma mark SymbolFile
1618
Jason Molenda743e86a2010-06-11 23:44:18 +00001619struct SymbolFileInstance
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001620{
1621 SymbolFileInstance() :
1622 name(),
1623 description(),
1624 create_callback(NULL)
1625 {
1626 }
1627
Greg Clayton57abc5d2013-05-10 21:47:16 +00001628 ConstString name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001629 std::string description;
1630 SymbolFileCreateInstance create_callback;
1631};
1632
1633typedef std::vector<SymbolFileInstance> SymbolFileInstances;
1634
Greg Claytonab65b342011-04-13 22:47:15 +00001635static Mutex &
1636GetSymbolFileMutex ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001637{
Greg Claytonab65b342011-04-13 22:47:15 +00001638 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
1639 return g_instances_mutex;
1640}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001641
Greg Claytonab65b342011-04-13 22:47:15 +00001642static SymbolFileInstances &
1643GetSymbolFileInstances ()
1644{
1645 static SymbolFileInstances g_instances;
1646 return g_instances;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001647}
1648
1649
1650bool
1651PluginManager::RegisterPlugin
1652(
Greg Clayton57abc5d2013-05-10 21:47:16 +00001653 const ConstString &name,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001654 const char *description,
1655 SymbolFileCreateInstance create_callback
1656)
1657{
1658 if (create_callback)
1659 {
1660 SymbolFileInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +00001661 assert ((bool)name);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001662 instance.name = name;
1663 if (description && description[0])
1664 instance.description = description;
1665 instance.create_callback = create_callback;
Greg Claytonab65b342011-04-13 22:47:15 +00001666 Mutex::Locker locker (GetSymbolFileMutex ());
1667 GetSymbolFileInstances ().push_back (instance);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001668 }
1669 return false;
1670}
1671
1672bool
1673PluginManager::UnregisterPlugin (SymbolFileCreateInstance create_callback)
1674{
1675 if (create_callback)
1676 {
Greg Claytonab65b342011-04-13 22:47:15 +00001677 Mutex::Locker locker (GetSymbolFileMutex ());
1678 SymbolFileInstances &instances = GetSymbolFileInstances ();
1679
1680 SymbolFileInstances::iterator pos, end = instances.end();
1681 for (pos = instances.begin(); pos != end; ++ pos)
1682 {
1683 if (pos->create_callback == create_callback)
1684 {
1685 instances.erase(pos);
1686 return true;
1687 }
1688 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001689 }
1690 return false;
1691}
1692
1693SymbolFileCreateInstance
1694PluginManager::GetSymbolFileCreateCallbackAtIndex (uint32_t idx)
1695{
Greg Claytonab65b342011-04-13 22:47:15 +00001696 Mutex::Locker locker (GetSymbolFileMutex ());
1697 SymbolFileInstances &instances = GetSymbolFileInstances ();
1698 if (idx < instances.size())
1699 return instances[idx].create_callback;
Jason Molenda743e86a2010-06-11 23:44:18 +00001700 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001701}
Greg Claytonab65b342011-04-13 22:47:15 +00001702
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001703SymbolFileCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +00001704PluginManager::GetSymbolFileCreateCallbackForPluginName (const ConstString &name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001705{
Greg Clayton57abc5d2013-05-10 21:47:16 +00001706 if (name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001707 {
Greg Claytonab65b342011-04-13 22:47:15 +00001708 Mutex::Locker locker (GetSymbolFileMutex ());
1709 SymbolFileInstances &instances = GetSymbolFileInstances ();
1710
1711 SymbolFileInstances::iterator pos, end = instances.end();
1712 for (pos = instances.begin(); pos != end; ++ pos)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001713 {
Greg Clayton57abc5d2013-05-10 21:47:16 +00001714 if (name == pos->name)
Greg Claytonab65b342011-04-13 22:47:15 +00001715 return pos->create_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001716 }
1717 }
1718 return NULL;
1719}
1720
1721
1722
1723#pragma mark SymbolVendor
1724
Jason Molenda743e86a2010-06-11 23:44:18 +00001725struct SymbolVendorInstance
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001726{
1727 SymbolVendorInstance() :
1728 name(),
1729 description(),
1730 create_callback(NULL)
1731 {
1732 }
1733
Greg Clayton57abc5d2013-05-10 21:47:16 +00001734 ConstString name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001735 std::string description;
1736 SymbolVendorCreateInstance create_callback;
1737};
1738
1739typedef std::vector<SymbolVendorInstance> SymbolVendorInstances;
1740
Greg Claytonab65b342011-04-13 22:47:15 +00001741static Mutex &
1742GetSymbolVendorMutex ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001743{
Greg Claytonab65b342011-04-13 22:47:15 +00001744 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
1745 return g_instances_mutex;
1746}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001747
Greg Claytonab65b342011-04-13 22:47:15 +00001748static SymbolVendorInstances &
1749GetSymbolVendorInstances ()
1750{
1751 static SymbolVendorInstances g_instances;
1752 return g_instances;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001753}
1754
1755bool
1756PluginManager::RegisterPlugin
1757(
Greg Clayton57abc5d2013-05-10 21:47:16 +00001758 const ConstString &name,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001759 const char *description,
1760 SymbolVendorCreateInstance create_callback
1761)
1762{
1763 if (create_callback)
1764 {
1765 SymbolVendorInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +00001766 assert ((bool)name);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001767 instance.name = name;
1768 if (description && description[0])
1769 instance.description = description;
1770 instance.create_callback = create_callback;
Greg Claytonab65b342011-04-13 22:47:15 +00001771 Mutex::Locker locker (GetSymbolVendorMutex ());
1772 GetSymbolVendorInstances ().push_back (instance);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001773 }
1774 return false;
1775}
1776
1777bool
1778PluginManager::UnregisterPlugin (SymbolVendorCreateInstance create_callback)
1779{
1780 if (create_callback)
1781 {
Greg Claytonab65b342011-04-13 22:47:15 +00001782 Mutex::Locker locker (GetSymbolVendorMutex ());
1783 SymbolVendorInstances &instances = GetSymbolVendorInstances ();
1784
1785 SymbolVendorInstances::iterator pos, end = instances.end();
1786 for (pos = instances.begin(); pos != end; ++ pos)
1787 {
1788 if (pos->create_callback == create_callback)
1789 {
1790 instances.erase(pos);
1791 return true;
1792 }
1793 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001794 }
1795 return false;
1796}
1797
1798SymbolVendorCreateInstance
1799PluginManager::GetSymbolVendorCreateCallbackAtIndex (uint32_t idx)
1800{
Greg Claytonab65b342011-04-13 22:47:15 +00001801 Mutex::Locker locker (GetSymbolVendorMutex ());
1802 SymbolVendorInstances &instances = GetSymbolVendorInstances ();
1803 if (idx < instances.size())
1804 return instances[idx].create_callback;
Jason Molenda743e86a2010-06-11 23:44:18 +00001805 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001806}
1807
Greg Claytonab65b342011-04-13 22:47:15 +00001808
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001809SymbolVendorCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +00001810PluginManager::GetSymbolVendorCreateCallbackForPluginName (const ConstString &name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001811{
Greg Clayton57abc5d2013-05-10 21:47:16 +00001812 if (name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001813 {
Greg Claytonab65b342011-04-13 22:47:15 +00001814 Mutex::Locker locker (GetSymbolVendorMutex ());
1815 SymbolVendorInstances &instances = GetSymbolVendorInstances ();
1816
1817 SymbolVendorInstances::iterator pos, end = instances.end();
1818 for (pos = instances.begin(); pos != end; ++ pos)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001819 {
Greg Clayton57abc5d2013-05-10 21:47:16 +00001820 if (name == pos->name)
Greg Claytonab65b342011-04-13 22:47:15 +00001821 return pos->create_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001822 }
1823 }
1824 return NULL;
1825}
1826
1827
Greg Clayton7be25422011-04-25 21:14:26 +00001828#pragma mark UnwindAssembly
Jason Molendafbcb7f22010-09-10 07:49:16 +00001829
Greg Clayton7be25422011-04-25 21:14:26 +00001830struct UnwindAssemblyInstance
Jason Molendafbcb7f22010-09-10 07:49:16 +00001831{
Greg Clayton7be25422011-04-25 21:14:26 +00001832 UnwindAssemblyInstance() :
Jason Molendafbcb7f22010-09-10 07:49:16 +00001833 name(),
1834 description(),
1835 create_callback(NULL)
1836 {
1837 }
1838
Greg Clayton57abc5d2013-05-10 21:47:16 +00001839 ConstString name;
Jason Molendafbcb7f22010-09-10 07:49:16 +00001840 std::string description;
Greg Clayton7be25422011-04-25 21:14:26 +00001841 UnwindAssemblyCreateInstance create_callback;
Jason Molendafbcb7f22010-09-10 07:49:16 +00001842};
1843
Greg Clayton7be25422011-04-25 21:14:26 +00001844typedef std::vector<UnwindAssemblyInstance> UnwindAssemblyInstances;
Jason Molendafbcb7f22010-09-10 07:49:16 +00001845
Greg Claytonab65b342011-04-13 22:47:15 +00001846static Mutex &
Greg Clayton7be25422011-04-25 21:14:26 +00001847GetUnwindAssemblyMutex ()
Jason Molendafbcb7f22010-09-10 07:49:16 +00001848{
Greg Claytonab65b342011-04-13 22:47:15 +00001849 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
1850 return g_instances_mutex;
1851}
Jason Molendafbcb7f22010-09-10 07:49:16 +00001852
Greg Clayton7be25422011-04-25 21:14:26 +00001853static UnwindAssemblyInstances &
1854GetUnwindAssemblyInstances ()
Greg Claytonab65b342011-04-13 22:47:15 +00001855{
Greg Clayton7be25422011-04-25 21:14:26 +00001856 static UnwindAssemblyInstances g_instances;
Greg Claytonab65b342011-04-13 22:47:15 +00001857 return g_instances;
Jason Molendafbcb7f22010-09-10 07:49:16 +00001858}
1859
1860bool
1861PluginManager::RegisterPlugin
1862(
Greg Clayton57abc5d2013-05-10 21:47:16 +00001863 const ConstString &name,
Jason Molendafbcb7f22010-09-10 07:49:16 +00001864 const char *description,
Greg Clayton7be25422011-04-25 21:14:26 +00001865 UnwindAssemblyCreateInstance create_callback
Jason Molendafbcb7f22010-09-10 07:49:16 +00001866)
1867{
1868 if (create_callback)
1869 {
Greg Clayton7be25422011-04-25 21:14:26 +00001870 UnwindAssemblyInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +00001871 assert ((bool)name);
Jason Molendafbcb7f22010-09-10 07:49:16 +00001872 instance.name = name;
1873 if (description && description[0])
1874 instance.description = description;
1875 instance.create_callback = create_callback;
Greg Clayton7be25422011-04-25 21:14:26 +00001876 Mutex::Locker locker (GetUnwindAssemblyMutex ());
1877 GetUnwindAssemblyInstances ().push_back (instance);
Jason Molendafbcb7f22010-09-10 07:49:16 +00001878 }
1879 return false;
1880}
1881
1882bool
Greg Clayton7be25422011-04-25 21:14:26 +00001883PluginManager::UnregisterPlugin (UnwindAssemblyCreateInstance create_callback)
Jason Molendafbcb7f22010-09-10 07:49:16 +00001884{
1885 if (create_callback)
1886 {
Greg Clayton7be25422011-04-25 21:14:26 +00001887 Mutex::Locker locker (GetUnwindAssemblyMutex ());
1888 UnwindAssemblyInstances &instances = GetUnwindAssemblyInstances ();
Greg Claytonab65b342011-04-13 22:47:15 +00001889
Greg Clayton7be25422011-04-25 21:14:26 +00001890 UnwindAssemblyInstances::iterator pos, end = instances.end();
Greg Claytonab65b342011-04-13 22:47:15 +00001891 for (pos = instances.begin(); pos != end; ++ pos)
1892 {
1893 if (pos->create_callback == create_callback)
1894 {
1895 instances.erase(pos);
1896 return true;
1897 }
1898 }
Jason Molendafbcb7f22010-09-10 07:49:16 +00001899 }
1900 return false;
1901}
1902
Greg Clayton7be25422011-04-25 21:14:26 +00001903UnwindAssemblyCreateInstance
1904PluginManager::GetUnwindAssemblyCreateCallbackAtIndex (uint32_t idx)
Jason Molendafbcb7f22010-09-10 07:49:16 +00001905{
Greg Clayton7be25422011-04-25 21:14:26 +00001906 Mutex::Locker locker (GetUnwindAssemblyMutex ());
1907 UnwindAssemblyInstances &instances = GetUnwindAssemblyInstances ();
Greg Claytonab65b342011-04-13 22:47:15 +00001908 if (idx < instances.size())
1909 return instances[idx].create_callback;
Jason Molendafbcb7f22010-09-10 07:49:16 +00001910 return NULL;
1911}
1912
Greg Claytonab65b342011-04-13 22:47:15 +00001913
Greg Clayton7be25422011-04-25 21:14:26 +00001914UnwindAssemblyCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +00001915PluginManager::GetUnwindAssemblyCreateCallbackForPluginName (const ConstString &name)
Jason Molendafbcb7f22010-09-10 07:49:16 +00001916{
Greg Clayton57abc5d2013-05-10 21:47:16 +00001917 if (name)
Jason Molendafbcb7f22010-09-10 07:49:16 +00001918 {
Greg Clayton7be25422011-04-25 21:14:26 +00001919 Mutex::Locker locker (GetUnwindAssemblyMutex ());
1920 UnwindAssemblyInstances &instances = GetUnwindAssemblyInstances ();
Greg Claytonab65b342011-04-13 22:47:15 +00001921
Greg Clayton7be25422011-04-25 21:14:26 +00001922 UnwindAssemblyInstances::iterator pos, end = instances.end();
Greg Claytonab65b342011-04-13 22:47:15 +00001923 for (pos = instances.begin(); pos != end; ++ pos)
Jason Molendafbcb7f22010-09-10 07:49:16 +00001924 {
Greg Clayton57abc5d2013-05-10 21:47:16 +00001925 if (name == pos->name)
Greg Claytonab65b342011-04-13 22:47:15 +00001926 return pos->create_callback;
Jason Molendafbcb7f22010-09-10 07:49:16 +00001927 }
1928 }
1929 return NULL;
1930}
1931
Greg Claytone8cd0c92012-10-19 18:02:49 +00001932void
1933PluginManager::DebuggerInitialize (Debugger &debugger)
1934{
Jason Molenda9b837a12013-04-05 05:06:39 +00001935 // Initialize the DynamicLoader plugins
Greg Claytone8cd0c92012-10-19 18:02:49 +00001936 {
Jason Molenda9b837a12013-04-05 05:06:39 +00001937 Mutex::Locker locker (GetDynamicLoaderMutex ());
1938 DynamicLoaderInstances &instances = GetDynamicLoaderInstances ();
1939
1940 DynamicLoaderInstances::iterator pos, end = instances.end();
1941 for (pos = instances.begin(); pos != end; ++ pos)
1942 {
1943 if (pos->debugger_init_callback)
1944 pos->debugger_init_callback (debugger);
1945 }
1946 }
1947
1948 // Initialize the Platform plugins
1949 {
1950 Mutex::Locker locker (GetPlatformInstancesMutex ());
1951 PlatformInstances &instances = GetPlatformInstances ();
1952
1953 PlatformInstances::iterator pos, end = instances.end();
1954 for (pos = instances.begin(); pos != end; ++ pos)
1955 {
1956 if (pos->debugger_init_callback)
1957 pos->debugger_init_callback (debugger);
1958 }
Greg Claytone8cd0c92012-10-19 18:02:49 +00001959 }
Greg Clayton7f982402013-07-15 22:54:20 +00001960
1961 // Initialize the Process plugins
1962 {
1963 Mutex::Locker locker (GetProcessMutex());
1964 ProcessInstances &instances = GetProcessInstances();
1965
1966 ProcessInstances::iterator pos, end = instances.end();
1967 for (pos = instances.begin(); pos != end; ++ pos)
1968 {
1969 if (pos->debugger_init_callback)
1970 pos->debugger_init_callback (debugger);
1971 }
1972 }
1973
Greg Claytone8cd0c92012-10-19 18:02:49 +00001974}
1975
Greg Clayton7f982402013-07-15 22:54:20 +00001976// This is the preferred new way to register plugin specific settings. e.g.
1977// 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 +00001978static lldb::OptionValuePropertiesSP
Greg Clayton7f982402013-07-15 22:54:20 +00001979GetDebuggerPropertyForPlugins (Debugger &debugger,
Jason Molenda3b59f5c2013-04-05 22:40:42 +00001980 const ConstString &plugin_type_name,
1981 const ConstString &plugin_type_desc,
1982 bool can_create)
Greg Claytone8cd0c92012-10-19 18:02:49 +00001983{
1984 lldb::OptionValuePropertiesSP parent_properties_sp (debugger.GetValueProperties());
1985 if (parent_properties_sp)
1986 {
1987 static ConstString g_property_name("plugin");
1988
1989 OptionValuePropertiesSP plugin_properties_sp = parent_properties_sp->GetSubProperty (NULL, g_property_name);
1990 if (!plugin_properties_sp && can_create)
1991 {
1992 plugin_properties_sp.reset (new OptionValueProperties (g_property_name));
1993 parent_properties_sp->AppendProperty (g_property_name,
1994 ConstString("Settings specify to plugins."),
1995 true,
1996 plugin_properties_sp);
1997 }
1998
1999 if (plugin_properties_sp)
2000 {
2001 lldb::OptionValuePropertiesSP plugin_type_properties_sp = plugin_properties_sp->GetSubProperty (NULL, plugin_type_name);
2002 if (!plugin_type_properties_sp && can_create)
2003 {
2004 plugin_type_properties_sp.reset (new OptionValueProperties (plugin_type_name));
2005 plugin_properties_sp->AppendProperty (plugin_type_name,
2006 plugin_type_desc,
2007 true,
2008 plugin_type_properties_sp);
2009 }
2010 return plugin_type_properties_sp;
2011 }
2012 }
2013 return lldb::OptionValuePropertiesSP();
2014}
2015
Greg Clayton7f982402013-07-15 22:54:20 +00002016// This is deprecated way to register plugin specific settings. e.g.
2017// "<plugin_type_name>.plugin.<plugin_type_desc>.SETTINGNAME"
Jason Molenda3b59f5c2013-04-05 22:40:42 +00002018// and Platform generic settings would be under "platform.SETTINGNAME".
2019static lldb::OptionValuePropertiesSP
Greg Clayton7f982402013-07-15 22:54:20 +00002020GetDebuggerPropertyForPluginsOldStyle (Debugger &debugger,
2021 const ConstString &plugin_type_name,
2022 const ConstString &plugin_type_desc,
2023 bool can_create)
Jason Molenda3b59f5c2013-04-05 22:40:42 +00002024{
2025 static ConstString g_property_name("plugin");
2026 lldb::OptionValuePropertiesSP parent_properties_sp (debugger.GetValueProperties());
2027 if (parent_properties_sp)
2028 {
2029 OptionValuePropertiesSP plugin_properties_sp = parent_properties_sp->GetSubProperty (NULL, plugin_type_name);
2030 if (!plugin_properties_sp && can_create)
2031 {
2032 plugin_properties_sp.reset (new OptionValueProperties (plugin_type_name));
2033 parent_properties_sp->AppendProperty (plugin_type_name,
2034 plugin_type_desc,
2035 true,
2036 plugin_properties_sp);
2037 }
2038
2039 if (plugin_properties_sp)
2040 {
2041 lldb::OptionValuePropertiesSP plugin_type_properties_sp = plugin_properties_sp->GetSubProperty (NULL, g_property_name);
2042 if (!plugin_type_properties_sp && can_create)
2043 {
2044 plugin_type_properties_sp.reset (new OptionValueProperties (g_property_name));
2045 plugin_properties_sp->AppendProperty (g_property_name,
2046 ConstString("Settings specific to plugins"),
2047 true,
2048 plugin_type_properties_sp);
2049 }
2050 return plugin_type_properties_sp;
2051 }
2052 }
2053 return lldb::OptionValuePropertiesSP();
2054}
2055
2056
Greg Claytone8cd0c92012-10-19 18:02:49 +00002057lldb::OptionValuePropertiesSP
2058PluginManager::GetSettingForDynamicLoaderPlugin (Debugger &debugger, const ConstString &setting_name)
2059{
2060 lldb::OptionValuePropertiesSP properties_sp;
Greg Clayton7f982402013-07-15 22:54:20 +00002061 lldb::OptionValuePropertiesSP plugin_type_properties_sp (GetDebuggerPropertyForPlugins (debugger,
Greg Claytone8cd0c92012-10-19 18:02:49 +00002062 ConstString("dynamic-loader"),
2063 ConstString(), // not creating to so we don't need the description
2064 false));
2065 if (plugin_type_properties_sp)
2066 properties_sp = plugin_type_properties_sp->GetSubProperty (NULL, setting_name);
2067 return properties_sp;
2068}
2069
2070bool
2071PluginManager::CreateSettingForDynamicLoaderPlugin (Debugger &debugger,
2072 const lldb::OptionValuePropertiesSP &properties_sp,
2073 const ConstString &description,
2074 bool is_global_property)
2075{
2076 if (properties_sp)
2077 {
Greg Clayton7f982402013-07-15 22:54:20 +00002078 lldb::OptionValuePropertiesSP plugin_type_properties_sp (GetDebuggerPropertyForPlugins (debugger,
Greg Claytone8cd0c92012-10-19 18:02:49 +00002079 ConstString("dynamic-loader"),
2080 ConstString("Settings for dynamic loader plug-ins"),
2081 true));
2082 if (plugin_type_properties_sp)
2083 {
2084 plugin_type_properties_sp->AppendProperty (properties_sp->GetName(),
2085 description,
2086 is_global_property,
2087 properties_sp);
2088 return true;
2089 }
2090 }
2091 return false;
2092}
2093
Jason Molenda9b837a12013-04-05 05:06:39 +00002094
2095lldb::OptionValuePropertiesSP
2096PluginManager::GetSettingForPlatformPlugin (Debugger &debugger, const ConstString &setting_name)
2097{
2098 lldb::OptionValuePropertiesSP properties_sp;
Greg Clayton7f982402013-07-15 22:54:20 +00002099 lldb::OptionValuePropertiesSP plugin_type_properties_sp (GetDebuggerPropertyForPluginsOldStyle (debugger,
2100 ConstString("platform"),
2101 ConstString(), // not creating to so we don't need the description
2102 false));
Jason Molenda9b837a12013-04-05 05:06:39 +00002103 if (plugin_type_properties_sp)
2104 properties_sp = plugin_type_properties_sp->GetSubProperty (NULL, setting_name);
2105 return properties_sp;
2106}
2107
2108bool
2109PluginManager::CreateSettingForPlatformPlugin (Debugger &debugger,
2110 const lldb::OptionValuePropertiesSP &properties_sp,
2111 const ConstString &description,
2112 bool is_global_property)
2113{
2114 if (properties_sp)
2115 {
Greg Clayton7f982402013-07-15 22:54:20 +00002116 lldb::OptionValuePropertiesSP plugin_type_properties_sp (GetDebuggerPropertyForPluginsOldStyle (debugger,
2117 ConstString("platform"),
2118 ConstString("Settings for platform plug-ins"),
2119 true));
2120 if (plugin_type_properties_sp)
2121 {
2122 plugin_type_properties_sp->AppendProperty (properties_sp->GetName(),
2123 description,
2124 is_global_property,
2125 properties_sp);
2126 return true;
2127 }
2128 }
2129 return false;
2130}
2131
2132
2133lldb::OptionValuePropertiesSP
2134PluginManager::GetSettingForProcessPlugin (Debugger &debugger, const ConstString &setting_name)
2135{
2136 lldb::OptionValuePropertiesSP properties_sp;
2137 lldb::OptionValuePropertiesSP plugin_type_properties_sp (GetDebuggerPropertyForPlugins (debugger,
2138 ConstString("process"),
2139 ConstString(), // not creating to so we don't need the description
2140 false));
2141 if (plugin_type_properties_sp)
2142 properties_sp = plugin_type_properties_sp->GetSubProperty (NULL, setting_name);
2143 return properties_sp;
2144}
2145
2146bool
2147PluginManager::CreateSettingForProcessPlugin (Debugger &debugger,
2148 const lldb::OptionValuePropertiesSP &properties_sp,
2149 const ConstString &description,
2150 bool is_global_property)
2151{
2152 if (properties_sp)
2153 {
Jason Molenda9b837a12013-04-05 05:06:39 +00002154 lldb::OptionValuePropertiesSP plugin_type_properties_sp (GetDebuggerPropertyForPlugins (debugger,
Greg Clayton7f982402013-07-15 22:54:20 +00002155 ConstString("process"),
2156 ConstString("Settings for process plug-ins"),
Jason Molenda9b837a12013-04-05 05:06:39 +00002157 true));
2158 if (plugin_type_properties_sp)
2159 {
2160 plugin_type_properties_sp->AppendProperty (properties_sp->GetName(),
2161 description,
2162 is_global_property,
2163 properties_sp);
2164 return true;
2165 }
2166 }
2167 return false;
2168}
2169