blob: 5bbdbcdf615ca177b90f6d1bf4aa7238961d869c [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
David Majnemer5ff02782014-07-22 21:59:22 +000082template <typename FPtrTy>
83static FPtrTy
84CastToFPtr (void *VPtr)
85{
86 return reinterpret_cast<FPtrTy>(reinterpret_cast<intptr_t>(VPtr));
87}
Greg Clayton4272cc72011-02-02 02:24:04 +000088
89static FileSpec::EnumerateDirectoryResult
90LoadPluginCallback
91(
92 void *baton,
93 FileSpec::FileType file_type,
94 const FileSpec &file_spec
95)
96{
97// PluginManager *plugin_manager = (PluginManager *)baton;
98 Error error;
99
100 // If we have a regular file, a symbolic link or unknown file type, try
101 // and process the file. We must handle unknown as sometimes the directory
102 // enumeration might be enumerating a file system that doesn't have correct
103 // file type information.
104 if (file_type == FileSpec::eFileTypeRegular ||
105 file_type == FileSpec::eFileTypeSymbolicLink ||
106 file_type == FileSpec::eFileTypeUnknown )
107 {
108 FileSpec plugin_file_spec (file_spec);
109 plugin_file_spec.ResolvePath();
110
111 if (PluginIsLoaded (plugin_file_spec))
112 return FileSpec::eEnumerateDirectoryResultNext;
113 else
114 {
115 PluginInfo plugin_info = { NULL, NULL, NULL };
Greg Clayton45319462011-02-08 00:35:34 +0000116 uint32_t flags = Host::eDynamicLibraryOpenOptionLazy |
117 Host::eDynamicLibraryOpenOptionLocal |
118 Host::eDynamicLibraryOpenOptionLimitGetSymbol;
119
120 plugin_info.plugin_handle = Host::DynamicLibraryOpen (plugin_file_spec, flags, error);
Greg Clayton4272cc72011-02-02 02:24:04 +0000121 if (plugin_info.plugin_handle)
122 {
123 bool success = false;
David Majnemer5ff02782014-07-22 21:59:22 +0000124 plugin_info.plugin_init_callback =
125 CastToFPtr<PluginInitCallback>(
126 Host::DynamicLibraryGetSymbol(plugin_info.plugin_handle,
127 "LLDBPluginInitialize",
128 error));
Greg Clayton4272cc72011-02-02 02:24:04 +0000129 if (plugin_info.plugin_init_callback)
130 {
131 // Call the plug-in "bool LLDBPluginInitialize(void)" function
Greg Clayton03da4cc2013-04-19 21:31:16 +0000132 success = plugin_info.plugin_init_callback();
Greg Clayton4272cc72011-02-02 02:24:04 +0000133 }
134
135 if (success)
136 {
137 // It is ok for the "LLDBPluginTerminate" symbol to be NULL
David Majnemer5ff02782014-07-22 21:59:22 +0000138 plugin_info.plugin_term_callback =
139 CastToFPtr<PluginTermCallback>(
140 Host::DynamicLibraryGetSymbol(
141 plugin_info.plugin_handle, "LLDBPluginTerminate",
142 error));
Greg Clayton4272cc72011-02-02 02:24:04 +0000143 }
144 else
145 {
146 // The initialize function returned FALSE which means the
147 // plug-in might not be compatible, or might be too new or
148 // too old, or might not want to run on this machine.
149 Host::DynamicLibraryClose (plugin_info.plugin_handle);
150 plugin_info.plugin_handle = NULL;
151 plugin_info.plugin_init_callback = NULL;
152 }
153
154 // Regardless of success or failure, cache the plug-in load
155 // in our plug-in info so we don't try to load it again and
156 // again.
157 SetPluginInfo (plugin_file_spec, plugin_info);
158
159 return FileSpec::eEnumerateDirectoryResultNext;
160 }
161 }
162 }
163
164 if (file_type == FileSpec::eFileTypeUnknown ||
165 file_type == FileSpec::eFileTypeDirectory ||
166 file_type == FileSpec::eFileTypeSymbolicLink )
167 {
168 // Try and recurse into anything that a directory or symbolic link.
169 // We must also do this for unknown as sometimes the directory enumeration
Bruce Mitchener6a7f3332014-06-27 02:42:12 +0000170 // might be enumerating a file system that doesn't have correct file type
Greg Clayton4272cc72011-02-02 02:24:04 +0000171 // information.
172 return FileSpec::eEnumerateDirectoryResultEnter;
173 }
174
175 return FileSpec::eEnumerateDirectoryResultNext;
176}
177
178
179void
180PluginManager::Initialize ()
181{
Greg Clayton1cb64962011-03-24 04:28:38 +0000182#if 1
Greg Clayton4272cc72011-02-02 02:24:04 +0000183 FileSpec dir_spec;
184 const bool find_directories = true;
185 const bool find_files = true;
186 const bool find_other = true;
187 char dir_path[PATH_MAX];
188 if (Host::GetLLDBPath (ePathTypeLLDBSystemPlugins, dir_spec))
189 {
190 if (dir_spec.Exists() && dir_spec.GetPath(dir_path, sizeof(dir_path)))
191 {
192 FileSpec::EnumerateDirectory (dir_path,
193 find_directories,
194 find_files,
195 find_other,
196 LoadPluginCallback,
197 NULL);
198 }
199 }
200
201 if (Host::GetLLDBPath (ePathTypeLLDBUserPlugins, dir_spec))
202 {
203 if (dir_spec.Exists() && dir_spec.GetPath(dir_path, sizeof(dir_path)))
204 {
205 FileSpec::EnumerateDirectory (dir_path,
206 find_directories,
207 find_files,
208 find_other,
209 LoadPluginCallback,
210 NULL);
211 }
212 }
Greg Clayton1cb64962011-03-24 04:28:38 +0000213#endif
Greg Clayton4272cc72011-02-02 02:24:04 +0000214}
215
216void
217PluginManager::Terminate ()
218{
219 Mutex::Locker locker (GetPluginMapMutex ());
220 PluginTerminateMap &plugin_map = GetPluginMap ();
221
222 PluginTerminateMap::const_iterator pos, end = plugin_map.end();
223 for (pos = plugin_map.begin(); pos != end; ++pos)
224 {
225 // Call the plug-in "void LLDBPluginTerminate (void)" function if there
226 // is one (if the symbol was not NULL).
227 if (pos->second.plugin_handle)
228 {
229 if (pos->second.plugin_term_callback)
Greg Clayton03da4cc2013-04-19 21:31:16 +0000230 pos->second.plugin_term_callback();
Greg Clayton4272cc72011-02-02 02:24:04 +0000231 Host::DynamicLibraryClose (pos->second.plugin_handle);
232 }
233 }
234 plugin_map.clear();
235}
236
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000237
238#pragma mark ABI
239
240
Jason Molenda743e86a2010-06-11 23:44:18 +0000241struct ABIInstance
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000242{
243 ABIInstance() :
244 name(),
245 description(),
246 create_callback(NULL)
247 {
248 }
249
Greg Clayton57abc5d2013-05-10 21:47:16 +0000250 ConstString name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000251 std::string description;
252 ABICreateInstance create_callback;
253};
254
255typedef std::vector<ABIInstance> ABIInstances;
256
Greg Claytonded470d2011-03-19 01:12:21 +0000257static Mutex &
258GetABIInstancesMutex ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000259{
Greg Claytonded470d2011-03-19 01:12:21 +0000260 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
261 return g_instances_mutex;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000262}
263
Greg Claytonded470d2011-03-19 01:12:21 +0000264static ABIInstances &
265GetABIInstances ()
266{
267 static ABIInstances g_instances;
268 return g_instances;
269}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000270
271bool
272PluginManager::RegisterPlugin
Greg Clayton4272cc72011-02-02 02:24:04 +0000273(
Greg Clayton57abc5d2013-05-10 21:47:16 +0000274 const ConstString &name,
Greg Clayton4272cc72011-02-02 02:24:04 +0000275 const char *description,
276 ABICreateInstance create_callback
277)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000278{
279 if (create_callback)
280 {
281 ABIInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +0000282 assert ((bool)name);
283 instance.name = name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000284 if (description && description[0])
285 instance.description = description;
286 instance.create_callback = create_callback;
Greg Claytonded470d2011-03-19 01:12:21 +0000287 Mutex::Locker locker (GetABIInstancesMutex ());
288 GetABIInstances ().push_back (instance);
289 return true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000290 }
291 return false;
292}
293
294bool
295PluginManager::UnregisterPlugin (ABICreateInstance create_callback)
296{
297 if (create_callback)
298 {
Greg Claytonded470d2011-03-19 01:12:21 +0000299 Mutex::Locker locker (GetABIInstancesMutex ());
300 ABIInstances &instances = GetABIInstances ();
301
302 ABIInstances::iterator pos, end = instances.end();
303 for (pos = instances.begin(); pos != end; ++ pos)
304 {
305 if (pos->create_callback == create_callback)
306 {
307 instances.erase(pos);
308 return true;
309 }
310 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000311 }
312 return false;
313}
314
315ABICreateInstance
316PluginManager::GetABICreateCallbackAtIndex (uint32_t idx)
317{
Greg Claytonded470d2011-03-19 01:12:21 +0000318 Mutex::Locker locker (GetABIInstancesMutex ());
319 ABIInstances &instances = GetABIInstances ();
Greg Claytonded470d2011-03-19 01:12:21 +0000320 if (idx < instances.size())
321 return instances[idx].create_callback;
Jason Molenda743e86a2010-06-11 23:44:18 +0000322 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000323}
324
325ABICreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +0000326PluginManager::GetABICreateCallbackForPluginName (const ConstString &name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000327{
Greg Clayton57abc5d2013-05-10 21:47:16 +0000328 if (name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000329 {
Greg Claytonded470d2011-03-19 01:12:21 +0000330 Mutex::Locker locker (GetABIInstancesMutex ());
Greg Claytonded470d2011-03-19 01:12:21 +0000331 ABIInstances &instances = GetABIInstances ();
332
333 ABIInstances::iterator pos, end = instances.end();
334 for (pos = instances.begin(); pos != end; ++ pos)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000335 {
Greg Clayton57abc5d2013-05-10 21:47:16 +0000336 if (name == pos->name)
Greg Claytonded470d2011-03-19 01:12:21 +0000337 return pos->create_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000338 }
339 }
340 return NULL;
341}
342
343
344#pragma mark Disassembler
345
346
Jason Molenda743e86a2010-06-11 23:44:18 +0000347struct DisassemblerInstance
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000348{
349 DisassemblerInstance() :
350 name(),
351 description(),
352 create_callback(NULL)
353 {
354 }
355
Greg Clayton57abc5d2013-05-10 21:47:16 +0000356 ConstString name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000357 std::string description;
358 DisassemblerCreateInstance create_callback;
359};
360
361typedef std::vector<DisassemblerInstance> DisassemblerInstances;
362
Greg Claytonab65b342011-04-13 22:47:15 +0000363static Mutex &
364GetDisassemblerMutex ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000365{
Greg Claytonab65b342011-04-13 22:47:15 +0000366 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
367 return g_instances_mutex;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000368}
369
Greg Claytonab65b342011-04-13 22:47:15 +0000370static DisassemblerInstances &
371GetDisassemblerInstances ()
372{
373 static DisassemblerInstances g_instances;
374 return g_instances;
375}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000376
377bool
378PluginManager::RegisterPlugin
379(
Greg Clayton57abc5d2013-05-10 21:47:16 +0000380 const ConstString &name,
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000381 const char *description,
382 DisassemblerCreateInstance create_callback
383)
384{
385 if (create_callback)
386 {
387 DisassemblerInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +0000388 assert ((bool)name);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000389 instance.name = name;
390 if (description && description[0])
391 instance.description = description;
392 instance.create_callback = create_callback;
Greg Claytonab65b342011-04-13 22:47:15 +0000393 Mutex::Locker locker (GetDisassemblerMutex ());
394 GetDisassemblerInstances ().push_back (instance);
395 return true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000396 }
397 return false;
398}
399
400bool
401PluginManager::UnregisterPlugin (DisassemblerCreateInstance create_callback)
402{
403 if (create_callback)
404 {
Greg Claytonab65b342011-04-13 22:47:15 +0000405 Mutex::Locker locker (GetDisassemblerMutex ());
406 DisassemblerInstances &instances = GetDisassemblerInstances ();
407
408 DisassemblerInstances::iterator pos, end = instances.end();
409 for (pos = instances.begin(); pos != end; ++ pos)
410 {
411 if (pos->create_callback == create_callback)
412 {
413 instances.erase(pos);
414 return true;
415 }
416 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000417 }
418 return false;
419}
420
421DisassemblerCreateInstance
422PluginManager::GetDisassemblerCreateCallbackAtIndex (uint32_t idx)
423{
Greg Claytonab65b342011-04-13 22:47:15 +0000424 Mutex::Locker locker (GetDisassemblerMutex ());
425 DisassemblerInstances &instances = GetDisassemblerInstances ();
426 if (idx < instances.size())
427 return instances[idx].create_callback;
Jason Molenda743e86a2010-06-11 23:44:18 +0000428 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000429}
430
431DisassemblerCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +0000432PluginManager::GetDisassemblerCreateCallbackForPluginName (const ConstString &name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000433{
Greg Clayton57abc5d2013-05-10 21:47:16 +0000434 if (name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000435 {
Greg Claytonab65b342011-04-13 22:47:15 +0000436 Mutex::Locker locker (GetDisassemblerMutex ());
437 DisassemblerInstances &instances = GetDisassemblerInstances ();
438
439 DisassemblerInstances::iterator pos, end = instances.end();
440 for (pos = instances.begin(); pos != end; ++ pos)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000441 {
Greg Clayton57abc5d2013-05-10 21:47:16 +0000442 if (name == pos->name)
Greg Claytonab65b342011-04-13 22:47:15 +0000443 return pos->create_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000444 }
445 }
446 return NULL;
447}
448
449
450
451#pragma mark DynamicLoader
452
453
Jason Molenda743e86a2010-06-11 23:44:18 +0000454struct DynamicLoaderInstance
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000455{
456 DynamicLoaderInstance() :
457 name(),
458 description(),
Greg Claytone8cd0c92012-10-19 18:02:49 +0000459 create_callback(NULL),
460 debugger_init_callback (NULL)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000461 {
462 }
463
Greg Clayton57abc5d2013-05-10 21:47:16 +0000464 ConstString name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000465 std::string description;
466 DynamicLoaderCreateInstance create_callback;
Greg Claytone8cd0c92012-10-19 18:02:49 +0000467 DebuggerInitializeCallback debugger_init_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000468};
469
470typedef std::vector<DynamicLoaderInstance> DynamicLoaderInstances;
471
Greg Claytonab65b342011-04-13 22:47:15 +0000472
473static Mutex &
474GetDynamicLoaderMutex ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000475{
Greg Claytonab65b342011-04-13 22:47:15 +0000476 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
477 return g_instances_mutex;
478}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000479
Greg Claytonab65b342011-04-13 22:47:15 +0000480static DynamicLoaderInstances &
481GetDynamicLoaderInstances ()
482{
483 static DynamicLoaderInstances g_instances;
484 return g_instances;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000485}
486
487
488bool
489PluginManager::RegisterPlugin
490(
Greg Clayton57abc5d2013-05-10 21:47:16 +0000491 const ConstString &name,
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000492 const char *description,
Greg Claytone8cd0c92012-10-19 18:02:49 +0000493 DynamicLoaderCreateInstance create_callback,
494 DebuggerInitializeCallback debugger_init_callback
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000495)
496{
497 if (create_callback)
498 {
499 DynamicLoaderInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +0000500 assert ((bool)name);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000501 instance.name = name;
502 if (description && description[0])
503 instance.description = description;
504 instance.create_callback = create_callback;
Greg Claytone8cd0c92012-10-19 18:02:49 +0000505 instance.debugger_init_callback = debugger_init_callback;
Greg Claytonab65b342011-04-13 22:47:15 +0000506 Mutex::Locker locker (GetDynamicLoaderMutex ());
507 GetDynamicLoaderInstances ().push_back (instance);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000508 }
509 return false;
510}
511
512bool
513PluginManager::UnregisterPlugin (DynamicLoaderCreateInstance create_callback)
514{
515 if (create_callback)
516 {
Greg Claytonab65b342011-04-13 22:47:15 +0000517 Mutex::Locker locker (GetDynamicLoaderMutex ());
518 DynamicLoaderInstances &instances = GetDynamicLoaderInstances ();
519
520 DynamicLoaderInstances::iterator pos, end = instances.end();
521 for (pos = instances.begin(); pos != end; ++ pos)
522 {
523 if (pos->create_callback == create_callback)
524 {
525 instances.erase(pos);
526 return true;
527 }
528 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000529 }
530 return false;
531}
532
533DynamicLoaderCreateInstance
534PluginManager::GetDynamicLoaderCreateCallbackAtIndex (uint32_t idx)
535{
Greg Claytonab65b342011-04-13 22:47:15 +0000536 Mutex::Locker locker (GetDynamicLoaderMutex ());
537 DynamicLoaderInstances &instances = GetDynamicLoaderInstances ();
538 if (idx < instances.size())
539 return instances[idx].create_callback;
Jason Molenda743e86a2010-06-11 23:44:18 +0000540 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000541}
542
543DynamicLoaderCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +0000544PluginManager::GetDynamicLoaderCreateCallbackForPluginName (const ConstString &name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000545{
Greg Clayton57abc5d2013-05-10 21:47:16 +0000546 if (name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000547 {
Greg Claytonab65b342011-04-13 22:47:15 +0000548 Mutex::Locker locker (GetDynamicLoaderMutex ());
549 DynamicLoaderInstances &instances = GetDynamicLoaderInstances ();
550
551 DynamicLoaderInstances::iterator pos, end = instances.end();
552 for (pos = instances.begin(); pos != end; ++ pos)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000553 {
Greg Clayton57abc5d2013-05-10 21:47:16 +0000554 if (name == pos->name)
Greg Claytonab65b342011-04-13 22:47:15 +0000555 return pos->create_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000556 }
557 }
558 return NULL;
559}
560
Andrew MacPherson17220c12014-03-05 10:12:43 +0000561#pragma mark JITLoader
562
563
564struct JITLoaderInstance
565{
566 JITLoaderInstance() :
567 name(),
568 description(),
569 create_callback(NULL),
570 debugger_init_callback (NULL)
571 {
572 }
573
574 ConstString name;
575 std::string description;
576 JITLoaderCreateInstance create_callback;
577 DebuggerInitializeCallback debugger_init_callback;
578};
579
580typedef std::vector<JITLoaderInstance> JITLoaderInstances;
581
582
583static Mutex &
584GetJITLoaderMutex ()
585{
586 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
587 return g_instances_mutex;
588}
589
590static JITLoaderInstances &
591GetJITLoaderInstances ()
592{
593 static JITLoaderInstances g_instances;
594 return g_instances;
595}
596
597
598bool
599PluginManager::RegisterPlugin
600(
601 const ConstString &name,
602 const char *description,
603 JITLoaderCreateInstance create_callback,
604 DebuggerInitializeCallback debugger_init_callback
605)
606{
607 if (create_callback)
608 {
609 JITLoaderInstance instance;
610 assert ((bool)name);
611 instance.name = name;
612 if (description && description[0])
613 instance.description = description;
614 instance.create_callback = create_callback;
615 instance.debugger_init_callback = debugger_init_callback;
616 Mutex::Locker locker (GetJITLoaderMutex ());
617 GetJITLoaderInstances ().push_back (instance);
618 }
619 return false;
620}
621
622bool
623PluginManager::UnregisterPlugin (JITLoaderCreateInstance create_callback)
624{
625 if (create_callback)
626 {
627 Mutex::Locker locker (GetJITLoaderMutex ());
628 JITLoaderInstances &instances = GetJITLoaderInstances ();
629
630 JITLoaderInstances::iterator pos, end = instances.end();
631 for (pos = instances.begin(); pos != end; ++ pos)
632 {
633 if (pos->create_callback == create_callback)
634 {
635 instances.erase(pos);
636 return true;
637 }
638 }
639 }
640 return false;
641}
642
643JITLoaderCreateInstance
644PluginManager::GetJITLoaderCreateCallbackAtIndex (uint32_t idx)
645{
646 Mutex::Locker locker (GetJITLoaderMutex ());
647 JITLoaderInstances &instances = GetJITLoaderInstances ();
648 if (idx < instances.size())
649 return instances[idx].create_callback;
650 return NULL;
651}
652
653JITLoaderCreateInstance
654PluginManager::GetJITLoaderCreateCallbackForPluginName (const ConstString &name)
655{
656 if (name)
657 {
658 Mutex::Locker locker (GetJITLoaderMutex ());
659 JITLoaderInstances &instances = GetJITLoaderInstances ();
660
661 JITLoaderInstances::iterator pos, end = instances.end();
662 for (pos = instances.begin(); pos != end; ++ pos)
663 {
664 if (name == pos->name)
665 return pos->create_callback;
666 }
667 }
668 return NULL;
669}
670
Greg Claytonf03bbe22011-02-01 01:37:45 +0000671#pragma mark EmulateInstruction
672
673
674struct EmulateInstructionInstance
675{
676 EmulateInstructionInstance() :
677 name(),
678 description(),
679 create_callback(NULL)
680 {
681 }
682
Greg Clayton57abc5d2013-05-10 21:47:16 +0000683 ConstString name;
Greg Claytonf03bbe22011-02-01 01:37:45 +0000684 std::string description;
685 EmulateInstructionCreateInstance create_callback;
686};
687
688typedef std::vector<EmulateInstructionInstance> EmulateInstructionInstances;
689
Greg Claytonab65b342011-04-13 22:47:15 +0000690static Mutex &
691GetEmulateInstructionMutex ()
Greg Claytonf03bbe22011-02-01 01:37:45 +0000692{
Greg Claytonab65b342011-04-13 22:47:15 +0000693 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
694 return g_instances_mutex;
695}
696
697static EmulateInstructionInstances &
698GetEmulateInstructionInstances ()
699{
700 static EmulateInstructionInstances g_instances;
701 return g_instances;
Greg Claytonf03bbe22011-02-01 01:37:45 +0000702}
703
704
705bool
706PluginManager::RegisterPlugin
707(
Greg Clayton57abc5d2013-05-10 21:47:16 +0000708 const ConstString &name,
Greg Clayton4272cc72011-02-02 02:24:04 +0000709 const char *description,
710 EmulateInstructionCreateInstance create_callback
711)
Greg Claytonf03bbe22011-02-01 01:37:45 +0000712{
713 if (create_callback)
714 {
715 EmulateInstructionInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +0000716 assert ((bool)name);
Greg Claytonf03bbe22011-02-01 01:37:45 +0000717 instance.name = name;
718 if (description && description[0])
719 instance.description = description;
720 instance.create_callback = create_callback;
Greg Claytonab65b342011-04-13 22:47:15 +0000721 Mutex::Locker locker (GetEmulateInstructionMutex ());
722 GetEmulateInstructionInstances ().push_back (instance);
Greg Claytonf03bbe22011-02-01 01:37:45 +0000723 }
724 return false;
725}
726
727bool
728PluginManager::UnregisterPlugin (EmulateInstructionCreateInstance create_callback)
729{
730 if (create_callback)
731 {
Greg Claytonab65b342011-04-13 22:47:15 +0000732 Mutex::Locker locker (GetEmulateInstructionMutex ());
733 EmulateInstructionInstances &instances = GetEmulateInstructionInstances ();
734
735 EmulateInstructionInstances::iterator pos, end = instances.end();
736 for (pos = instances.begin(); pos != end; ++ pos)
737 {
738 if (pos->create_callback == create_callback)
739 {
740 instances.erase(pos);
741 return true;
742 }
743 }
Greg Claytonf03bbe22011-02-01 01:37:45 +0000744 }
745 return false;
746}
747
748EmulateInstructionCreateInstance
749PluginManager::GetEmulateInstructionCreateCallbackAtIndex (uint32_t idx)
750{
Greg Claytonab65b342011-04-13 22:47:15 +0000751 Mutex::Locker locker (GetEmulateInstructionMutex ());
752 EmulateInstructionInstances &instances = GetEmulateInstructionInstances ();
753 if (idx < instances.size())
754 return instances[idx].create_callback;
Greg Claytonf03bbe22011-02-01 01:37:45 +0000755 return NULL;
756}
757
758EmulateInstructionCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +0000759PluginManager::GetEmulateInstructionCreateCallbackForPluginName (const ConstString &name)
Greg Claytonf03bbe22011-02-01 01:37:45 +0000760{
Greg Clayton57abc5d2013-05-10 21:47:16 +0000761 if (name)
Greg Claytonf03bbe22011-02-01 01:37:45 +0000762 {
Greg Claytonab65b342011-04-13 22:47:15 +0000763 Mutex::Locker locker (GetEmulateInstructionMutex ());
764 EmulateInstructionInstances &instances = GetEmulateInstructionInstances ();
765
766 EmulateInstructionInstances::iterator pos, end = instances.end();
767 for (pos = instances.begin(); pos != end; ++ pos)
Greg Claytonf03bbe22011-02-01 01:37:45 +0000768 {
Greg Clayton57abc5d2013-05-10 21:47:16 +0000769 if (name == pos->name)
Greg Claytonab65b342011-04-13 22:47:15 +0000770 return pos->create_callback;
Greg Claytonf03bbe22011-02-01 01:37:45 +0000771 }
772 }
773 return NULL;
774}
Greg Clayton56d9a1b2011-08-22 02:49:39 +0000775#pragma mark OperatingSystem
776
777
778struct OperatingSystemInstance
779{
780 OperatingSystemInstance() :
781 name(),
782 description(),
783 create_callback(NULL)
784 {
785 }
786
Greg Clayton57abc5d2013-05-10 21:47:16 +0000787 ConstString name;
Greg Clayton56d9a1b2011-08-22 02:49:39 +0000788 std::string description;
789 OperatingSystemCreateInstance create_callback;
790};
791
792typedef std::vector<OperatingSystemInstance> OperatingSystemInstances;
793
794static Mutex &
795GetOperatingSystemMutex ()
796{
797 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
798 return g_instances_mutex;
799}
800
801static OperatingSystemInstances &
802GetOperatingSystemInstances ()
803{
804 static OperatingSystemInstances g_instances;
805 return g_instances;
806}
807
808bool
Greg Clayton57abc5d2013-05-10 21:47:16 +0000809PluginManager::RegisterPlugin (const ConstString &name,
810 const char *description,
811 OperatingSystemCreateInstance create_callback)
Greg Clayton56d9a1b2011-08-22 02:49:39 +0000812{
813 if (create_callback)
814 {
815 OperatingSystemInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +0000816 assert ((bool)name);
Greg Clayton56d9a1b2011-08-22 02:49:39 +0000817 instance.name = name;
818 if (description && description[0])
819 instance.description = description;
820 instance.create_callback = create_callback;
821 Mutex::Locker locker (GetOperatingSystemMutex ());
822 GetOperatingSystemInstances ().push_back (instance);
823 }
824 return false;
825}
826
827bool
828PluginManager::UnregisterPlugin (OperatingSystemCreateInstance create_callback)
829{
830 if (create_callback)
831 {
832 Mutex::Locker locker (GetOperatingSystemMutex ());
833 OperatingSystemInstances &instances = GetOperatingSystemInstances ();
834
835 OperatingSystemInstances::iterator pos, end = instances.end();
836 for (pos = instances.begin(); pos != end; ++ pos)
837 {
838 if (pos->create_callback == create_callback)
839 {
840 instances.erase(pos);
841 return true;
842 }
843 }
844 }
845 return false;
846}
847
848OperatingSystemCreateInstance
849PluginManager::GetOperatingSystemCreateCallbackAtIndex (uint32_t idx)
850{
851 Mutex::Locker locker (GetOperatingSystemMutex ());
852 OperatingSystemInstances &instances = GetOperatingSystemInstances ();
853 if (idx < instances.size())
854 return instances[idx].create_callback;
855 return NULL;
856}
857
858OperatingSystemCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +0000859PluginManager::GetOperatingSystemCreateCallbackForPluginName (const ConstString &name)
Greg Clayton56d9a1b2011-08-22 02:49:39 +0000860{
Greg Clayton57abc5d2013-05-10 21:47:16 +0000861 if (name)
Greg Clayton56d9a1b2011-08-22 02:49:39 +0000862 {
Greg Clayton56d9a1b2011-08-22 02:49:39 +0000863 Mutex::Locker locker (GetOperatingSystemMutex ());
864 OperatingSystemInstances &instances = GetOperatingSystemInstances ();
865
866 OperatingSystemInstances::iterator pos, end = instances.end();
867 for (pos = instances.begin(); pos != end; ++ pos)
868 {
Greg Clayton57abc5d2013-05-10 21:47:16 +0000869 if (name == pos->name)
Greg Clayton56d9a1b2011-08-22 02:49:39 +0000870 return pos->create_callback;
871 }
872 }
873 return NULL;
874}
Greg Claytonf03bbe22011-02-01 01:37:45 +0000875
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000876
Jim Ingham22777012010-09-23 02:01:19 +0000877#pragma mark LanguageRuntime
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000878
879
Jim Ingham22777012010-09-23 02:01:19 +0000880struct LanguageRuntimeInstance
881{
882 LanguageRuntimeInstance() :
883 name(),
884 description(),
885 create_callback(NULL)
886 {
887 }
888
Greg Clayton57abc5d2013-05-10 21:47:16 +0000889 ConstString name;
Jim Ingham22777012010-09-23 02:01:19 +0000890 std::string description;
891 LanguageRuntimeCreateInstance create_callback;
892};
893
894typedef std::vector<LanguageRuntimeInstance> LanguageRuntimeInstances;
895
Greg Claytonab65b342011-04-13 22:47:15 +0000896static Mutex &
897GetLanguageRuntimeMutex ()
Jim Ingham22777012010-09-23 02:01:19 +0000898{
Greg Claytonab65b342011-04-13 22:47:15 +0000899 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
900 return g_instances_mutex;
Jim Ingham22777012010-09-23 02:01:19 +0000901}
902
Greg Claytonab65b342011-04-13 22:47:15 +0000903static LanguageRuntimeInstances &
904GetLanguageRuntimeInstances ()
905{
906 static LanguageRuntimeInstances g_instances;
907 return g_instances;
908}
Jim Ingham22777012010-09-23 02:01:19 +0000909
910bool
911PluginManager::RegisterPlugin
Greg Clayton4272cc72011-02-02 02:24:04 +0000912(
Greg Clayton57abc5d2013-05-10 21:47:16 +0000913 const ConstString &name,
Greg Clayton4272cc72011-02-02 02:24:04 +0000914 const char *description,
915 LanguageRuntimeCreateInstance create_callback
916)
Jim Ingham22777012010-09-23 02:01:19 +0000917{
918 if (create_callback)
919 {
920 LanguageRuntimeInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +0000921 assert ((bool)name);
Jim Ingham22777012010-09-23 02:01:19 +0000922 instance.name = name;
923 if (description && description[0])
924 instance.description = description;
925 instance.create_callback = create_callback;
Greg Claytonab65b342011-04-13 22:47:15 +0000926 Mutex::Locker locker (GetLanguageRuntimeMutex ());
927 GetLanguageRuntimeInstances ().push_back (instance);
Jim Ingham22777012010-09-23 02:01:19 +0000928 }
929 return false;
930}
931
932bool
933PluginManager::UnregisterPlugin (LanguageRuntimeCreateInstance create_callback)
934{
935 if (create_callback)
936 {
Greg Claytonab65b342011-04-13 22:47:15 +0000937 Mutex::Locker locker (GetLanguageRuntimeMutex ());
938 LanguageRuntimeInstances &instances = GetLanguageRuntimeInstances ();
939
940 LanguageRuntimeInstances::iterator pos, end = instances.end();
941 for (pos = instances.begin(); pos != end; ++ pos)
942 {
943 if (pos->create_callback == create_callback)
944 {
945 instances.erase(pos);
946 return true;
947 }
948 }
Jim Ingham22777012010-09-23 02:01:19 +0000949 }
950 return false;
951}
952
953LanguageRuntimeCreateInstance
954PluginManager::GetLanguageRuntimeCreateCallbackAtIndex (uint32_t idx)
955{
Greg Claytonab65b342011-04-13 22:47:15 +0000956 Mutex::Locker locker (GetLanguageRuntimeMutex ());
957 LanguageRuntimeInstances &instances = GetLanguageRuntimeInstances ();
958 if (idx < instances.size())
959 return instances[idx].create_callback;
Jim Ingham22777012010-09-23 02:01:19 +0000960 return NULL;
961}
962
963LanguageRuntimeCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +0000964PluginManager::GetLanguageRuntimeCreateCallbackForPluginName (const ConstString &name)
Jim Ingham22777012010-09-23 02:01:19 +0000965{
Greg Clayton57abc5d2013-05-10 21:47:16 +0000966 if (name)
Jim Ingham22777012010-09-23 02:01:19 +0000967 {
Greg Claytonab65b342011-04-13 22:47:15 +0000968 Mutex::Locker locker (GetLanguageRuntimeMutex ());
969 LanguageRuntimeInstances &instances = GetLanguageRuntimeInstances ();
970
971 LanguageRuntimeInstances::iterator pos, end = instances.end();
972 for (pos = instances.begin(); pos != end; ++ pos)
Jim Ingham22777012010-09-23 02:01:19 +0000973 {
Greg Clayton57abc5d2013-05-10 21:47:16 +0000974 if (name == pos->name)
Greg Claytonab65b342011-04-13 22:47:15 +0000975 return pos->create_callback;
Jim Ingham22777012010-09-23 02:01:19 +0000976 }
977 }
978 return NULL;
979}
980
Jason Molendaeef51062013-11-05 03:57:19 +0000981#pragma mark SystemRuntime
982
983
984struct SystemRuntimeInstance
985{
986 SystemRuntimeInstance() :
987 name(),
988 description(),
989 create_callback(NULL)
990 {
991 }
992
993 ConstString name;
994 std::string description;
995 SystemRuntimeCreateInstance create_callback;
996};
997
998typedef std::vector<SystemRuntimeInstance> SystemRuntimeInstances;
999
1000static Mutex &
1001GetSystemRuntimeMutex ()
1002{
1003 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
1004 return g_instances_mutex;
1005}
1006
1007static SystemRuntimeInstances &
1008GetSystemRuntimeInstances ()
1009{
1010 static SystemRuntimeInstances g_instances;
1011 return g_instances;
1012}
1013
1014bool
1015PluginManager::RegisterPlugin
1016(
1017 const ConstString &name,
1018 const char *description,
1019 SystemRuntimeCreateInstance create_callback
1020)
1021{
1022 if (create_callback)
1023 {
1024 SystemRuntimeInstance instance;
1025 assert ((bool)name);
1026 instance.name = name;
1027 if (description && description[0])
1028 instance.description = description;
1029 instance.create_callback = create_callback;
1030 Mutex::Locker locker (GetSystemRuntimeMutex ());
1031 GetSystemRuntimeInstances ().push_back (instance);
1032 }
1033 return false;
1034}
1035
1036bool
1037PluginManager::UnregisterPlugin (SystemRuntimeCreateInstance create_callback)
1038{
1039 if (create_callback)
1040 {
1041 Mutex::Locker locker (GetSystemRuntimeMutex ());
1042 SystemRuntimeInstances &instances = GetSystemRuntimeInstances ();
1043
1044 SystemRuntimeInstances::iterator pos, end = instances.end();
1045 for (pos = instances.begin(); pos != end; ++ pos)
1046 {
1047 if (pos->create_callback == create_callback)
1048 {
1049 instances.erase(pos);
1050 return true;
1051 }
1052 }
1053 }
1054 return false;
1055}
1056
1057SystemRuntimeCreateInstance
1058PluginManager::GetSystemRuntimeCreateCallbackAtIndex (uint32_t idx)
1059{
1060 Mutex::Locker locker (GetSystemRuntimeMutex ());
1061 SystemRuntimeInstances &instances = GetSystemRuntimeInstances ();
1062 if (idx < instances.size())
1063 return instances[idx].create_callback;
1064 return NULL;
1065}
1066
1067SystemRuntimeCreateInstance
1068PluginManager::GetSystemRuntimeCreateCallbackForPluginName (const ConstString &name)
1069{
1070 if (name)
1071 {
1072 Mutex::Locker locker (GetSystemRuntimeMutex ());
1073 SystemRuntimeInstances &instances = GetSystemRuntimeInstances ();
1074
1075 SystemRuntimeInstances::iterator pos, end = instances.end();
1076 for (pos = instances.begin(); pos != end; ++ pos)
1077 {
1078 if (name == pos->name)
1079 return pos->create_callback;
1080 }
1081 }
1082 return NULL;
1083}
1084
1085
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001086#pragma mark ObjectFile
1087
Jason Molenda743e86a2010-06-11 23:44:18 +00001088struct ObjectFileInstance
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001089{
1090 ObjectFileInstance() :
1091 name(),
1092 description(),
Greg Claytonf4d6de62013-04-24 22:29:28 +00001093 create_callback(NULL),
1094 create_memory_callback (NULL),
Greg Claytona2715cf2014-06-13 00:54:12 +00001095 get_module_specifications (NULL),
1096 save_core (NULL)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001097 {
1098 }
1099
Greg Clayton57abc5d2013-05-10 21:47:16 +00001100 ConstString name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001101 std::string description;
1102 ObjectFileCreateInstance create_callback;
Greg Claytonc9660542012-02-05 02:38:54 +00001103 ObjectFileCreateMemoryInstance create_memory_callback;
Greg Claytonf4d6de62013-04-24 22:29:28 +00001104 ObjectFileGetModuleSpecifications get_module_specifications;
Greg Claytona2715cf2014-06-13 00:54:12 +00001105 ObjectFileSaveCore save_core;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001106};
1107
1108typedef std::vector<ObjectFileInstance> ObjectFileInstances;
1109
Greg Claytonab65b342011-04-13 22:47:15 +00001110static Mutex &
1111GetObjectFileMutex ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001112{
Greg Claytonab65b342011-04-13 22:47:15 +00001113 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
1114 return g_instances_mutex;
1115}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001116
Greg Claytonab65b342011-04-13 22:47:15 +00001117static ObjectFileInstances &
1118GetObjectFileInstances ()
1119{
1120 static ObjectFileInstances g_instances;
1121 return g_instances;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001122}
1123
1124
1125bool
Greg Clayton57abc5d2013-05-10 21:47:16 +00001126PluginManager::RegisterPlugin (const ConstString &name,
Greg Claytonf4d6de62013-04-24 22:29:28 +00001127 const char *description,
1128 ObjectFileCreateInstance create_callback,
1129 ObjectFileCreateMemoryInstance create_memory_callback,
Greg Claytona2715cf2014-06-13 00:54:12 +00001130 ObjectFileGetModuleSpecifications get_module_specifications,
1131 ObjectFileSaveCore save_core)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001132{
1133 if (create_callback)
1134 {
1135 ObjectFileInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +00001136 assert ((bool)name);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001137 instance.name = name;
1138 if (description && description[0])
1139 instance.description = description;
1140 instance.create_callback = create_callback;
Greg Claytonc9660542012-02-05 02:38:54 +00001141 instance.create_memory_callback = create_memory_callback;
Greg Claytona2715cf2014-06-13 00:54:12 +00001142 instance.save_core = save_core;
Greg Claytonf4d6de62013-04-24 22:29:28 +00001143 instance.get_module_specifications = get_module_specifications;
Greg Claytonab65b342011-04-13 22:47:15 +00001144 Mutex::Locker locker (GetObjectFileMutex ());
1145 GetObjectFileInstances ().push_back (instance);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001146 }
1147 return false;
1148}
1149
1150bool
1151PluginManager::UnregisterPlugin (ObjectFileCreateInstance create_callback)
1152{
1153 if (create_callback)
1154 {
Greg Claytonab65b342011-04-13 22:47:15 +00001155 Mutex::Locker locker (GetObjectFileMutex ());
1156 ObjectFileInstances &instances = GetObjectFileInstances ();
1157
1158 ObjectFileInstances::iterator pos, end = instances.end();
1159 for (pos = instances.begin(); pos != end; ++ pos)
1160 {
1161 if (pos->create_callback == create_callback)
1162 {
1163 instances.erase(pos);
1164 return true;
1165 }
1166 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001167 }
1168 return false;
1169}
1170
1171ObjectFileCreateInstance
1172PluginManager::GetObjectFileCreateCallbackAtIndex (uint32_t idx)
1173{
Greg Claytonab65b342011-04-13 22:47:15 +00001174 Mutex::Locker locker (GetObjectFileMutex ());
1175 ObjectFileInstances &instances = GetObjectFileInstances ();
1176 if (idx < instances.size())
1177 return instances[idx].create_callback;
Jason Molenda743e86a2010-06-11 23:44:18 +00001178 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001179}
Greg Claytonab65b342011-04-13 22:47:15 +00001180
Greg Claytonc9660542012-02-05 02:38:54 +00001181
1182ObjectFileCreateMemoryInstance
1183PluginManager::GetObjectFileCreateMemoryCallbackAtIndex (uint32_t idx)
1184{
1185 Mutex::Locker locker (GetObjectFileMutex ());
1186 ObjectFileInstances &instances = GetObjectFileInstances ();
1187 if (idx < instances.size())
1188 return instances[idx].create_memory_callback;
1189 return NULL;
1190}
1191
Greg Claytonf4d6de62013-04-24 22:29:28 +00001192ObjectFileGetModuleSpecifications
1193PluginManager::GetObjectFileGetModuleSpecificationsCallbackAtIndex (uint32_t idx)
1194{
1195 Mutex::Locker locker (GetObjectFileMutex ());
1196 ObjectFileInstances &instances = GetObjectFileInstances ();
1197 if (idx < instances.size())
1198 return instances[idx].get_module_specifications;
1199 return NULL;
1200}
1201
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001202ObjectFileCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +00001203PluginManager::GetObjectFileCreateCallbackForPluginName (const ConstString &name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001204{
Greg Clayton57abc5d2013-05-10 21:47:16 +00001205 if (name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001206 {
Greg Claytonab65b342011-04-13 22:47:15 +00001207 Mutex::Locker locker (GetObjectFileMutex ());
1208 ObjectFileInstances &instances = GetObjectFileInstances ();
1209
1210 ObjectFileInstances::iterator pos, end = instances.end();
1211 for (pos = instances.begin(); pos != end; ++ pos)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001212 {
Greg Clayton57abc5d2013-05-10 21:47:16 +00001213 if (name == pos->name)
Greg Claytonab65b342011-04-13 22:47:15 +00001214 return pos->create_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001215 }
1216 }
1217 return NULL;
1218}
1219
1220
Greg Claytonc9660542012-02-05 02:38:54 +00001221ObjectFileCreateMemoryInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +00001222PluginManager::GetObjectFileCreateMemoryCallbackForPluginName (const ConstString &name)
Greg Claytonc9660542012-02-05 02:38:54 +00001223{
Greg Clayton57abc5d2013-05-10 21:47:16 +00001224 if (name)
Greg Claytonc9660542012-02-05 02:38:54 +00001225 {
Greg Claytonc9660542012-02-05 02:38:54 +00001226 Mutex::Locker locker (GetObjectFileMutex ());
1227 ObjectFileInstances &instances = GetObjectFileInstances ();
1228
1229 ObjectFileInstances::iterator pos, end = instances.end();
1230 for (pos = instances.begin(); pos != end; ++ pos)
1231 {
Greg Clayton57abc5d2013-05-10 21:47:16 +00001232 if (name == pos->name)
Greg Claytonc9660542012-02-05 02:38:54 +00001233 return pos->create_memory_callback;
1234 }
1235 }
1236 return NULL;
1237}
1238
Greg Claytona2715cf2014-06-13 00:54:12 +00001239Error
1240PluginManager::SaveCore (const lldb::ProcessSP &process_sp, const FileSpec &outfile)
1241{
1242 Error error;
1243 Mutex::Locker locker (GetObjectFileMutex ());
1244 ObjectFileInstances &instances = GetObjectFileInstances ();
1245
1246 ObjectFileInstances::iterator pos, end = instances.end();
1247 for (pos = instances.begin(); pos != end; ++ pos)
1248 {
1249 if (pos->save_core && pos->save_core (process_sp, outfile, error))
1250 return error;
1251 }
1252 error.SetErrorString("no ObjectFile plugins were able to save a core for this process");
1253 return error;
1254}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001255
1256#pragma mark ObjectContainer
1257
Jason Molenda743e86a2010-06-11 23:44:18 +00001258struct ObjectContainerInstance
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001259{
1260 ObjectContainerInstance() :
1261 name(),
1262 description(),
Greg Claytonf4d6de62013-04-24 22:29:28 +00001263 create_callback (NULL),
1264 get_module_specifications (NULL)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001265 {
1266 }
1267
Greg Clayton57abc5d2013-05-10 21:47:16 +00001268 ConstString name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001269 std::string description;
1270 ObjectContainerCreateInstance create_callback;
Greg Claytonf4d6de62013-04-24 22:29:28 +00001271 ObjectFileGetModuleSpecifications get_module_specifications;
1272
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001273};
1274
1275typedef std::vector<ObjectContainerInstance> ObjectContainerInstances;
1276
Greg Claytonab65b342011-04-13 22:47:15 +00001277static Mutex &
1278GetObjectContainerMutex ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001279{
Greg Claytonab65b342011-04-13 22:47:15 +00001280 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
1281 return g_instances_mutex;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001282}
1283
Greg Claytonab65b342011-04-13 22:47:15 +00001284static ObjectContainerInstances &
1285GetObjectContainerInstances ()
1286{
1287 static ObjectContainerInstances g_instances;
1288 return g_instances;
1289}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001290
1291bool
Greg Clayton57abc5d2013-05-10 21:47:16 +00001292PluginManager::RegisterPlugin (const ConstString &name,
Greg Claytonf4d6de62013-04-24 22:29:28 +00001293 const char *description,
1294 ObjectContainerCreateInstance create_callback,
1295 ObjectFileGetModuleSpecifications get_module_specifications)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001296{
1297 if (create_callback)
1298 {
1299 ObjectContainerInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +00001300 assert ((bool)name);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001301 instance.name = name;
1302 if (description && description[0])
1303 instance.description = description;
1304 instance.create_callback = create_callback;
Greg Claytonf4d6de62013-04-24 22:29:28 +00001305 instance.get_module_specifications = get_module_specifications;
Greg Claytonab65b342011-04-13 22:47:15 +00001306 Mutex::Locker locker (GetObjectContainerMutex ());
1307 GetObjectContainerInstances ().push_back (instance);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001308 }
1309 return false;
1310}
1311
1312bool
1313PluginManager::UnregisterPlugin (ObjectContainerCreateInstance create_callback)
1314{
1315 if (create_callback)
1316 {
Greg Claytonab65b342011-04-13 22:47:15 +00001317 Mutex::Locker locker (GetObjectContainerMutex ());
1318 ObjectContainerInstances &instances = GetObjectContainerInstances ();
1319
1320 ObjectContainerInstances::iterator pos, end = instances.end();
1321 for (pos = instances.begin(); pos != end; ++ pos)
1322 {
1323 if (pos->create_callback == create_callback)
1324 {
1325 instances.erase(pos);
1326 return true;
1327 }
1328 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001329 }
1330 return false;
1331}
1332
1333ObjectContainerCreateInstance
1334PluginManager::GetObjectContainerCreateCallbackAtIndex (uint32_t idx)
1335{
Greg Claytonab65b342011-04-13 22:47:15 +00001336 Mutex::Locker locker (GetObjectContainerMutex ());
1337 ObjectContainerInstances &instances = GetObjectContainerInstances ();
1338 if (idx < instances.size())
1339 return instances[idx].create_callback;
Jason Molenda743e86a2010-06-11 23:44:18 +00001340 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001341}
Greg Claytonab65b342011-04-13 22:47:15 +00001342
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001343ObjectContainerCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +00001344PluginManager::GetObjectContainerCreateCallbackForPluginName (const ConstString &name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001345{
Greg Clayton57abc5d2013-05-10 21:47:16 +00001346 if (name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001347 {
Greg Claytonab65b342011-04-13 22:47:15 +00001348 Mutex::Locker locker (GetObjectContainerMutex ());
1349 ObjectContainerInstances &instances = GetObjectContainerInstances ();
1350
1351 ObjectContainerInstances::iterator pos, end = instances.end();
1352 for (pos = instances.begin(); pos != end; ++ pos)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001353 {
Greg Clayton57abc5d2013-05-10 21:47:16 +00001354 if (name == pos->name)
Greg Claytonab65b342011-04-13 22:47:15 +00001355 return pos->create_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001356 }
1357 }
1358 return NULL;
1359}
1360
Greg Claytonf4d6de62013-04-24 22:29:28 +00001361ObjectFileGetModuleSpecifications
1362PluginManager::GetObjectContainerGetModuleSpecificationsCallbackAtIndex (uint32_t idx)
1363{
1364 Mutex::Locker locker (GetObjectContainerMutex ());
1365 ObjectContainerInstances &instances = GetObjectContainerInstances ();
1366 if (idx < instances.size())
1367 return instances[idx].get_module_specifications;
1368 return NULL;
1369}
1370
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001371#pragma mark LogChannel
1372
Greg Claytonab65b342011-04-13 22:47:15 +00001373struct LogInstance
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001374{
Greg Claytonab65b342011-04-13 22:47:15 +00001375 LogInstance() :
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001376 name(),
1377 description(),
1378 create_callback(NULL)
1379 {
1380 }
1381
Greg Clayton57abc5d2013-05-10 21:47:16 +00001382 ConstString name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001383 std::string description;
1384 LogChannelCreateInstance create_callback;
1385};
1386
Greg Claytonab65b342011-04-13 22:47:15 +00001387typedef std::vector<LogInstance> LogInstances;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001388
Greg Claytonab65b342011-04-13 22:47:15 +00001389static Mutex &
1390GetLogMutex ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001391{
Greg Claytonab65b342011-04-13 22:47:15 +00001392 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
1393 return g_instances_mutex;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001394}
1395
Greg Claytonab65b342011-04-13 22:47:15 +00001396static LogInstances &
1397GetLogInstances ()
1398{
1399 static LogInstances g_instances;
1400 return g_instances;
1401}
1402
1403
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001404
1405bool
1406PluginManager::RegisterPlugin
1407(
Greg Clayton57abc5d2013-05-10 21:47:16 +00001408 const ConstString &name,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001409 const char *description,
1410 LogChannelCreateInstance create_callback
1411)
1412{
1413 if (create_callback)
1414 {
Greg Claytonab65b342011-04-13 22:47:15 +00001415 LogInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +00001416 assert ((bool)name);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001417 instance.name = name;
1418 if (description && description[0])
1419 instance.description = description;
1420 instance.create_callback = create_callback;
Greg Claytonab65b342011-04-13 22:47:15 +00001421 Mutex::Locker locker (GetLogMutex ());
1422 GetLogInstances ().push_back (instance);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001423 }
1424 return false;
1425}
1426
1427bool
1428PluginManager::UnregisterPlugin (LogChannelCreateInstance create_callback)
1429{
1430 if (create_callback)
1431 {
Greg Claytonab65b342011-04-13 22:47:15 +00001432 Mutex::Locker locker (GetLogMutex ());
1433 LogInstances &instances = GetLogInstances ();
1434
1435 LogInstances::iterator pos, end = instances.end();
1436 for (pos = instances.begin(); pos != end; ++ pos)
1437 {
1438 if (pos->create_callback == create_callback)
1439 {
1440 instances.erase(pos);
1441 return true;
1442 }
1443 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001444 }
1445 return false;
1446}
1447
1448const char *
1449PluginManager::GetLogChannelCreateNameAtIndex (uint32_t idx)
1450{
Greg Claytonab65b342011-04-13 22:47:15 +00001451 Mutex::Locker locker (GetLogMutex ());
1452 LogInstances &instances = GetLogInstances ();
1453 if (idx < instances.size())
Greg Clayton57abc5d2013-05-10 21:47:16 +00001454 return instances[idx].name.GetCString();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001455 return NULL;
1456}
1457
1458
1459LogChannelCreateInstance
1460PluginManager::GetLogChannelCreateCallbackAtIndex (uint32_t idx)
1461{
Greg Claytonab65b342011-04-13 22:47:15 +00001462 Mutex::Locker locker (GetLogMutex ());
1463 LogInstances &instances = GetLogInstances ();
1464 if (idx < instances.size())
1465 return instances[idx].create_callback;
Jason Molenda743e86a2010-06-11 23:44:18 +00001466 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001467}
1468
1469LogChannelCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +00001470PluginManager::GetLogChannelCreateCallbackForPluginName (const ConstString &name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001471{
Greg Clayton57abc5d2013-05-10 21:47:16 +00001472 if (name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001473 {
Greg Claytonab65b342011-04-13 22:47:15 +00001474 Mutex::Locker locker (GetLogMutex ());
1475 LogInstances &instances = GetLogInstances ();
1476
1477 LogInstances::iterator pos, end = instances.end();
1478 for (pos = instances.begin(); pos != end; ++ pos)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001479 {
Greg Clayton57abc5d2013-05-10 21:47:16 +00001480 if (name == pos->name)
Greg Claytonab65b342011-04-13 22:47:15 +00001481 return pos->create_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001482 }
1483 }
1484 return NULL;
1485}
1486
Greg Claytone996fd32011-03-08 22:40:15 +00001487#pragma mark Platform
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001488
Greg Claytone996fd32011-03-08 22:40:15 +00001489struct PlatformInstance
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001490{
Greg Claytone996fd32011-03-08 22:40:15 +00001491 PlatformInstance() :
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001492 name(),
1493 description(),
Jason Molenda9b837a12013-04-05 05:06:39 +00001494 create_callback(NULL),
1495 debugger_init_callback (NULL)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001496 {
1497 }
Greg Claytone996fd32011-03-08 22:40:15 +00001498
Greg Clayton57abc5d2013-05-10 21:47:16 +00001499 ConstString name;
Greg Claytone996fd32011-03-08 22:40:15 +00001500 std::string description;
1501 PlatformCreateInstance create_callback;
Jason Molenda9b837a12013-04-05 05:06:39 +00001502 DebuggerInitializeCallback debugger_init_callback;
Greg Claytone996fd32011-03-08 22:40:15 +00001503};
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001504
Greg Claytone996fd32011-03-08 22:40:15 +00001505typedef std::vector<PlatformInstance> PlatformInstances;
1506
Greg Claytonded470d2011-03-19 01:12:21 +00001507static Mutex &
1508GetPlatformInstancesMutex ()
Greg Claytone996fd32011-03-08 22:40:15 +00001509{
Greg Claytonded470d2011-03-19 01:12:21 +00001510 static Mutex g_platform_instances_mutex (Mutex::eMutexTypeRecursive);
1511 return g_platform_instances_mutex;
Greg Claytone996fd32011-03-08 22:40:15 +00001512}
1513
Greg Claytonded470d2011-03-19 01:12:21 +00001514static PlatformInstances &
1515GetPlatformInstances ()
1516{
1517 static PlatformInstances g_platform_instances;
1518 return g_platform_instances;
1519}
Greg Claytone996fd32011-03-08 22:40:15 +00001520
Greg Claytonab65b342011-04-13 22:47:15 +00001521
Greg Claytone996fd32011-03-08 22:40:15 +00001522bool
Greg Clayton57abc5d2013-05-10 21:47:16 +00001523PluginManager::RegisterPlugin (const ConstString &name,
Greg Claytone996fd32011-03-08 22:40:15 +00001524 const char *description,
Jason Molenda9b837a12013-04-05 05:06:39 +00001525 PlatformCreateInstance create_callback,
1526 DebuggerInitializeCallback debugger_init_callback)
Greg Claytone996fd32011-03-08 22:40:15 +00001527{
1528 if (create_callback)
1529 {
Greg Claytonded470d2011-03-19 01:12:21 +00001530 Mutex::Locker locker (GetPlatformInstancesMutex ());
1531
Greg Claytone996fd32011-03-08 22:40:15 +00001532 PlatformInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +00001533 assert ((bool)name);
Greg Claytone996fd32011-03-08 22:40:15 +00001534 instance.name = name;
1535 if (description && description[0])
1536 instance.description = description;
1537 instance.create_callback = create_callback;
Jason Molenda9b837a12013-04-05 05:06:39 +00001538 instance.debugger_init_callback = debugger_init_callback;
Greg Claytonded470d2011-03-19 01:12:21 +00001539 GetPlatformInstances ().push_back (instance);
1540 return true;
Greg Claytone996fd32011-03-08 22:40:15 +00001541 }
1542 return false;
1543}
1544
Jason Molenda9b837a12013-04-05 05:06:39 +00001545
Greg Claytone996fd32011-03-08 22:40:15 +00001546const char *
1547PluginManager::GetPlatformPluginNameAtIndex (uint32_t idx)
1548{
Greg Claytonded470d2011-03-19 01:12:21 +00001549 Mutex::Locker locker (GetPlatformInstancesMutex ());
Greg Claytonab65b342011-04-13 22:47:15 +00001550 PlatformInstances &instances = GetPlatformInstances ();
1551 if (idx < instances.size())
Greg Clayton57abc5d2013-05-10 21:47:16 +00001552 return instances[idx].name.GetCString();
Greg Claytone996fd32011-03-08 22:40:15 +00001553 return NULL;
1554}
1555
1556const char *
1557PluginManager::GetPlatformPluginDescriptionAtIndex (uint32_t idx)
1558{
Greg Claytonded470d2011-03-19 01:12:21 +00001559 Mutex::Locker locker (GetPlatformInstancesMutex ());
Greg Claytonab65b342011-04-13 22:47:15 +00001560 PlatformInstances &instances = GetPlatformInstances ();
1561 if (idx < instances.size())
1562 return instances[idx].description.c_str();
Greg Claytone996fd32011-03-08 22:40:15 +00001563 return NULL;
1564}
1565
1566bool
1567PluginManager::UnregisterPlugin (PlatformCreateInstance create_callback)
1568{
1569 if (create_callback)
1570 {
Greg Claytonded470d2011-03-19 01:12:21 +00001571 Mutex::Locker locker (GetPlatformInstancesMutex ());
Greg Claytonab65b342011-04-13 22:47:15 +00001572 PlatformInstances &instances = GetPlatformInstances ();
Greg Claytonded470d2011-03-19 01:12:21 +00001573
Greg Claytonab65b342011-04-13 22:47:15 +00001574 PlatformInstances::iterator pos, end = instances.end();
1575 for (pos = instances.begin(); pos != end; ++ pos)
Greg Claytonded470d2011-03-19 01:12:21 +00001576 {
1577 if (pos->create_callback == create_callback)
1578 {
Greg Claytonab65b342011-04-13 22:47:15 +00001579 instances.erase(pos);
Greg Claytonded470d2011-03-19 01:12:21 +00001580 return true;
1581 }
1582 }
Greg Claytone996fd32011-03-08 22:40:15 +00001583 }
1584 return false;
1585}
1586
1587PlatformCreateInstance
1588PluginManager::GetPlatformCreateCallbackAtIndex (uint32_t idx)
1589{
Greg Claytonded470d2011-03-19 01:12:21 +00001590 Mutex::Locker locker (GetPlatformInstancesMutex ());
Greg Claytonab65b342011-04-13 22:47:15 +00001591 PlatformInstances &instances = GetPlatformInstances ();
1592 if (idx < instances.size())
1593 return instances[idx].create_callback;
Greg Claytone996fd32011-03-08 22:40:15 +00001594 return NULL;
1595}
1596
1597PlatformCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +00001598PluginManager::GetPlatformCreateCallbackForPluginName (const ConstString &name)
Greg Claytone996fd32011-03-08 22:40:15 +00001599{
Greg Clayton57abc5d2013-05-10 21:47:16 +00001600 if (name)
Greg Claytone996fd32011-03-08 22:40:15 +00001601 {
Greg Claytonded470d2011-03-19 01:12:21 +00001602 Mutex::Locker locker (GetPlatformInstancesMutex ());
Greg Claytonab65b342011-04-13 22:47:15 +00001603 PlatformInstances &instances = GetPlatformInstances ();
Greg Claytonded470d2011-03-19 01:12:21 +00001604
Greg Claytonab65b342011-04-13 22:47:15 +00001605 PlatformInstances::iterator pos, end = instances.end();
1606 for (pos = instances.begin(); pos != end; ++ pos)
Greg Claytone996fd32011-03-08 22:40:15 +00001607 {
Greg Clayton57abc5d2013-05-10 21:47:16 +00001608 if (name == pos->name)
Greg Claytonded470d2011-03-19 01:12:21 +00001609 return pos->create_callback;
Greg Claytone996fd32011-03-08 22:40:15 +00001610 }
1611 }
1612 return NULL;
1613}
1614
Greg Claytonc7bece562013-01-25 18:06:21 +00001615size_t
Greg Claytonab65b342011-04-13 22:47:15 +00001616PluginManager::AutoCompletePlatformName (const char *name, StringList &matches)
1617{
Greg Clayton57abc5d2013-05-10 21:47:16 +00001618 if (name)
Greg Claytonab65b342011-04-13 22:47:15 +00001619 {
1620 Mutex::Locker locker (GetPlatformInstancesMutex ());
1621 PlatformInstances &instances = GetPlatformInstances ();
1622 llvm::StringRef name_sref(name);
1623
1624 PlatformInstances::iterator pos, end = instances.end();
1625 for (pos = instances.begin(); pos != end; ++ pos)
1626 {
Greg Clayton57abc5d2013-05-10 21:47:16 +00001627 llvm::StringRef plugin_name (pos->name.GetCString());
Greg Clayton7260f622011-04-18 08:33:37 +00001628 if (plugin_name.startswith(name_sref))
1629 matches.AppendString (plugin_name.data());
Greg Claytonab65b342011-04-13 22:47:15 +00001630 }
1631 }
1632 return matches.GetSize();
1633}
Greg Claytone996fd32011-03-08 22:40:15 +00001634#pragma mark Process
1635
1636struct ProcessInstance
1637{
1638 ProcessInstance() :
Greg Clayton7f982402013-07-15 22:54:20 +00001639 name(),
1640 description(),
1641 create_callback(NULL),
1642 debugger_init_callback(NULL)
Greg Claytone996fd32011-03-08 22:40:15 +00001643 {
1644 }
1645
Greg Clayton57abc5d2013-05-10 21:47:16 +00001646 ConstString name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001647 std::string description;
1648 ProcessCreateInstance create_callback;
Greg Clayton7f982402013-07-15 22:54:20 +00001649 DebuggerInitializeCallback debugger_init_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001650};
1651
1652typedef std::vector<ProcessInstance> ProcessInstances;
1653
Greg Claytonab65b342011-04-13 22:47:15 +00001654static Mutex &
1655GetProcessMutex ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001656{
Greg Claytonab65b342011-04-13 22:47:15 +00001657 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
1658 return g_instances_mutex;
1659}
1660
1661static ProcessInstances &
1662GetProcessInstances ()
1663{
1664 static ProcessInstances g_instances;
1665 return g_instances;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001666}
1667
1668
1669bool
Greg Clayton7f982402013-07-15 22:54:20 +00001670PluginManager::RegisterPlugin (const ConstString &name,
1671 const char *description,
1672 ProcessCreateInstance create_callback,
1673 DebuggerInitializeCallback debugger_init_callback)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001674{
1675 if (create_callback)
1676 {
1677 ProcessInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +00001678 assert ((bool)name);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001679 instance.name = name;
1680 if (description && description[0])
1681 instance.description = description;
1682 instance.create_callback = create_callback;
Greg Clayton7f982402013-07-15 22:54:20 +00001683 instance.debugger_init_callback = debugger_init_callback;
Greg Claytonab65b342011-04-13 22:47:15 +00001684 Mutex::Locker locker (GetProcessMutex ());
1685 GetProcessInstances ().push_back (instance);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001686 }
1687 return false;
1688}
1689
Greg Claytonbfe5f3b2011-02-18 01:44:25 +00001690const char *
1691PluginManager::GetProcessPluginNameAtIndex (uint32_t idx)
1692{
Greg Claytonab65b342011-04-13 22:47:15 +00001693 Mutex::Locker locker (GetProcessMutex ());
1694 ProcessInstances &instances = GetProcessInstances ();
1695 if (idx < instances.size())
Greg Clayton57abc5d2013-05-10 21:47:16 +00001696 return instances[idx].name.GetCString();
Greg Claytonbfe5f3b2011-02-18 01:44:25 +00001697 return NULL;
1698}
1699
1700const char *
1701PluginManager::GetProcessPluginDescriptionAtIndex (uint32_t idx)
1702{
Greg Claytonab65b342011-04-13 22:47:15 +00001703 Mutex::Locker locker (GetProcessMutex ());
1704 ProcessInstances &instances = GetProcessInstances ();
1705 if (idx < instances.size())
1706 return instances[idx].description.c_str();
Greg Claytonbfe5f3b2011-02-18 01:44:25 +00001707 return NULL;
1708}
1709
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001710bool
1711PluginManager::UnregisterPlugin (ProcessCreateInstance create_callback)
1712{
1713 if (create_callback)
1714 {
Greg Claytonab65b342011-04-13 22:47:15 +00001715 Mutex::Locker locker (GetProcessMutex ());
1716 ProcessInstances &instances = GetProcessInstances ();
1717
1718 ProcessInstances::iterator pos, end = instances.end();
1719 for (pos = instances.begin(); pos != end; ++ pos)
1720 {
1721 if (pos->create_callback == create_callback)
1722 {
1723 instances.erase(pos);
1724 return true;
1725 }
1726 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001727 }
1728 return false;
1729}
1730
1731ProcessCreateInstance
1732PluginManager::GetProcessCreateCallbackAtIndex (uint32_t idx)
1733{
Greg Claytonab65b342011-04-13 22:47:15 +00001734 Mutex::Locker locker (GetProcessMutex ());
1735 ProcessInstances &instances = GetProcessInstances ();
1736 if (idx < instances.size())
1737 return instances[idx].create_callback;
Jason Molenda743e86a2010-06-11 23:44:18 +00001738 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001739}
1740
Greg Claytonab65b342011-04-13 22:47:15 +00001741
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001742ProcessCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +00001743PluginManager::GetProcessCreateCallbackForPluginName (const ConstString &name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001744{
Greg Clayton57abc5d2013-05-10 21:47:16 +00001745 if (name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001746 {
Greg Claytonab65b342011-04-13 22:47:15 +00001747 Mutex::Locker locker (GetProcessMutex ());
1748 ProcessInstances &instances = GetProcessInstances ();
1749
1750 ProcessInstances::iterator pos, end = instances.end();
1751 for (pos = instances.begin(); pos != end; ++ pos)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001752 {
Greg Clayton57abc5d2013-05-10 21:47:16 +00001753 if (name == pos->name)
Greg Claytonab65b342011-04-13 22:47:15 +00001754 return pos->create_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001755 }
1756 }
1757 return NULL;
1758}
1759
1760#pragma mark SymbolFile
1761
Jason Molenda743e86a2010-06-11 23:44:18 +00001762struct SymbolFileInstance
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001763{
1764 SymbolFileInstance() :
1765 name(),
1766 description(),
1767 create_callback(NULL)
1768 {
1769 }
1770
Greg Clayton57abc5d2013-05-10 21:47:16 +00001771 ConstString name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001772 std::string description;
1773 SymbolFileCreateInstance create_callback;
1774};
1775
1776typedef std::vector<SymbolFileInstance> SymbolFileInstances;
1777
Greg Claytonab65b342011-04-13 22:47:15 +00001778static Mutex &
1779GetSymbolFileMutex ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001780{
Greg Claytonab65b342011-04-13 22:47:15 +00001781 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
1782 return g_instances_mutex;
1783}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001784
Greg Claytonab65b342011-04-13 22:47:15 +00001785static SymbolFileInstances &
1786GetSymbolFileInstances ()
1787{
1788 static SymbolFileInstances g_instances;
1789 return g_instances;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001790}
1791
1792
1793bool
1794PluginManager::RegisterPlugin
1795(
Greg Clayton57abc5d2013-05-10 21:47:16 +00001796 const ConstString &name,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001797 const char *description,
1798 SymbolFileCreateInstance create_callback
1799)
1800{
1801 if (create_callback)
1802 {
1803 SymbolFileInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +00001804 assert ((bool)name);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001805 instance.name = name;
1806 if (description && description[0])
1807 instance.description = description;
1808 instance.create_callback = create_callback;
Greg Claytonab65b342011-04-13 22:47:15 +00001809 Mutex::Locker locker (GetSymbolFileMutex ());
1810 GetSymbolFileInstances ().push_back (instance);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001811 }
1812 return false;
1813}
1814
1815bool
1816PluginManager::UnregisterPlugin (SymbolFileCreateInstance create_callback)
1817{
1818 if (create_callback)
1819 {
Greg Claytonab65b342011-04-13 22:47:15 +00001820 Mutex::Locker locker (GetSymbolFileMutex ());
1821 SymbolFileInstances &instances = GetSymbolFileInstances ();
1822
1823 SymbolFileInstances::iterator pos, end = instances.end();
1824 for (pos = instances.begin(); pos != end; ++ pos)
1825 {
1826 if (pos->create_callback == create_callback)
1827 {
1828 instances.erase(pos);
1829 return true;
1830 }
1831 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001832 }
1833 return false;
1834}
1835
1836SymbolFileCreateInstance
1837PluginManager::GetSymbolFileCreateCallbackAtIndex (uint32_t idx)
1838{
Greg Claytonab65b342011-04-13 22:47:15 +00001839 Mutex::Locker locker (GetSymbolFileMutex ());
1840 SymbolFileInstances &instances = GetSymbolFileInstances ();
1841 if (idx < instances.size())
1842 return instances[idx].create_callback;
Jason Molenda743e86a2010-06-11 23:44:18 +00001843 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001844}
Greg Claytonab65b342011-04-13 22:47:15 +00001845
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001846SymbolFileCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +00001847PluginManager::GetSymbolFileCreateCallbackForPluginName (const ConstString &name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001848{
Greg Clayton57abc5d2013-05-10 21:47:16 +00001849 if (name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001850 {
Greg Claytonab65b342011-04-13 22:47:15 +00001851 Mutex::Locker locker (GetSymbolFileMutex ());
1852 SymbolFileInstances &instances = GetSymbolFileInstances ();
1853
1854 SymbolFileInstances::iterator pos, end = instances.end();
1855 for (pos = instances.begin(); pos != end; ++ pos)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001856 {
Greg Clayton57abc5d2013-05-10 21:47:16 +00001857 if (name == pos->name)
Greg Claytonab65b342011-04-13 22:47:15 +00001858 return pos->create_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001859 }
1860 }
1861 return NULL;
1862}
1863
1864
1865
1866#pragma mark SymbolVendor
1867
Jason Molenda743e86a2010-06-11 23:44:18 +00001868struct SymbolVendorInstance
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001869{
1870 SymbolVendorInstance() :
1871 name(),
1872 description(),
1873 create_callback(NULL)
1874 {
1875 }
1876
Greg Clayton57abc5d2013-05-10 21:47:16 +00001877 ConstString name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001878 std::string description;
1879 SymbolVendorCreateInstance create_callback;
1880};
1881
1882typedef std::vector<SymbolVendorInstance> SymbolVendorInstances;
1883
Greg Claytonab65b342011-04-13 22:47:15 +00001884static Mutex &
1885GetSymbolVendorMutex ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001886{
Greg Claytonab65b342011-04-13 22:47:15 +00001887 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
1888 return g_instances_mutex;
1889}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001890
Greg Claytonab65b342011-04-13 22:47:15 +00001891static SymbolVendorInstances &
1892GetSymbolVendorInstances ()
1893{
1894 static SymbolVendorInstances g_instances;
1895 return g_instances;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001896}
1897
1898bool
1899PluginManager::RegisterPlugin
1900(
Greg Clayton57abc5d2013-05-10 21:47:16 +00001901 const ConstString &name,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001902 const char *description,
1903 SymbolVendorCreateInstance create_callback
1904)
1905{
1906 if (create_callback)
1907 {
1908 SymbolVendorInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +00001909 assert ((bool)name);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001910 instance.name = name;
1911 if (description && description[0])
1912 instance.description = description;
1913 instance.create_callback = create_callback;
Greg Claytonab65b342011-04-13 22:47:15 +00001914 Mutex::Locker locker (GetSymbolVendorMutex ());
1915 GetSymbolVendorInstances ().push_back (instance);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001916 }
1917 return false;
1918}
1919
1920bool
1921PluginManager::UnregisterPlugin (SymbolVendorCreateInstance create_callback)
1922{
1923 if (create_callback)
1924 {
Greg Claytonab65b342011-04-13 22:47:15 +00001925 Mutex::Locker locker (GetSymbolVendorMutex ());
1926 SymbolVendorInstances &instances = GetSymbolVendorInstances ();
1927
1928 SymbolVendorInstances::iterator pos, end = instances.end();
1929 for (pos = instances.begin(); pos != end; ++ pos)
1930 {
1931 if (pos->create_callback == create_callback)
1932 {
1933 instances.erase(pos);
1934 return true;
1935 }
1936 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001937 }
1938 return false;
1939}
1940
1941SymbolVendorCreateInstance
1942PluginManager::GetSymbolVendorCreateCallbackAtIndex (uint32_t idx)
1943{
Greg Claytonab65b342011-04-13 22:47:15 +00001944 Mutex::Locker locker (GetSymbolVendorMutex ());
1945 SymbolVendorInstances &instances = GetSymbolVendorInstances ();
1946 if (idx < instances.size())
1947 return instances[idx].create_callback;
Jason Molenda743e86a2010-06-11 23:44:18 +00001948 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001949}
1950
Greg Claytonab65b342011-04-13 22:47:15 +00001951
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001952SymbolVendorCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +00001953PluginManager::GetSymbolVendorCreateCallbackForPluginName (const ConstString &name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001954{
Greg Clayton57abc5d2013-05-10 21:47:16 +00001955 if (name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001956 {
Greg Claytonab65b342011-04-13 22:47:15 +00001957 Mutex::Locker locker (GetSymbolVendorMutex ());
1958 SymbolVendorInstances &instances = GetSymbolVendorInstances ();
1959
1960 SymbolVendorInstances::iterator pos, end = instances.end();
1961 for (pos = instances.begin(); pos != end; ++ pos)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001962 {
Greg Clayton57abc5d2013-05-10 21:47:16 +00001963 if (name == pos->name)
Greg Claytonab65b342011-04-13 22:47:15 +00001964 return pos->create_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001965 }
1966 }
1967 return NULL;
1968}
1969
1970
Greg Clayton7be25422011-04-25 21:14:26 +00001971#pragma mark UnwindAssembly
Jason Molendafbcb7f22010-09-10 07:49:16 +00001972
Greg Clayton7be25422011-04-25 21:14:26 +00001973struct UnwindAssemblyInstance
Jason Molendafbcb7f22010-09-10 07:49:16 +00001974{
Greg Clayton7be25422011-04-25 21:14:26 +00001975 UnwindAssemblyInstance() :
Jason Molendafbcb7f22010-09-10 07:49:16 +00001976 name(),
1977 description(),
1978 create_callback(NULL)
1979 {
1980 }
1981
Greg Clayton57abc5d2013-05-10 21:47:16 +00001982 ConstString name;
Jason Molendafbcb7f22010-09-10 07:49:16 +00001983 std::string description;
Greg Clayton7be25422011-04-25 21:14:26 +00001984 UnwindAssemblyCreateInstance create_callback;
Jason Molendafbcb7f22010-09-10 07:49:16 +00001985};
1986
Greg Clayton7be25422011-04-25 21:14:26 +00001987typedef std::vector<UnwindAssemblyInstance> UnwindAssemblyInstances;
Jason Molendafbcb7f22010-09-10 07:49:16 +00001988
Greg Claytonab65b342011-04-13 22:47:15 +00001989static Mutex &
Greg Clayton7be25422011-04-25 21:14:26 +00001990GetUnwindAssemblyMutex ()
Jason Molendafbcb7f22010-09-10 07:49:16 +00001991{
Greg Claytonab65b342011-04-13 22:47:15 +00001992 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
1993 return g_instances_mutex;
1994}
Jason Molendafbcb7f22010-09-10 07:49:16 +00001995
Greg Clayton7be25422011-04-25 21:14:26 +00001996static UnwindAssemblyInstances &
1997GetUnwindAssemblyInstances ()
Greg Claytonab65b342011-04-13 22:47:15 +00001998{
Greg Clayton7be25422011-04-25 21:14:26 +00001999 static UnwindAssemblyInstances g_instances;
Greg Claytonab65b342011-04-13 22:47:15 +00002000 return g_instances;
Jason Molendafbcb7f22010-09-10 07:49:16 +00002001}
2002
2003bool
2004PluginManager::RegisterPlugin
2005(
Greg Clayton57abc5d2013-05-10 21:47:16 +00002006 const ConstString &name,
Jason Molendafbcb7f22010-09-10 07:49:16 +00002007 const char *description,
Greg Clayton7be25422011-04-25 21:14:26 +00002008 UnwindAssemblyCreateInstance create_callback
Jason Molendafbcb7f22010-09-10 07:49:16 +00002009)
2010{
2011 if (create_callback)
2012 {
Greg Clayton7be25422011-04-25 21:14:26 +00002013 UnwindAssemblyInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +00002014 assert ((bool)name);
Jason Molendafbcb7f22010-09-10 07:49:16 +00002015 instance.name = name;
2016 if (description && description[0])
2017 instance.description = description;
2018 instance.create_callback = create_callback;
Greg Clayton7be25422011-04-25 21:14:26 +00002019 Mutex::Locker locker (GetUnwindAssemblyMutex ());
2020 GetUnwindAssemblyInstances ().push_back (instance);
Jason Molendafbcb7f22010-09-10 07:49:16 +00002021 }
2022 return false;
2023}
2024
2025bool
Greg Clayton7be25422011-04-25 21:14:26 +00002026PluginManager::UnregisterPlugin (UnwindAssemblyCreateInstance create_callback)
Jason Molendafbcb7f22010-09-10 07:49:16 +00002027{
2028 if (create_callback)
2029 {
Greg Clayton7be25422011-04-25 21:14:26 +00002030 Mutex::Locker locker (GetUnwindAssemblyMutex ());
2031 UnwindAssemblyInstances &instances = GetUnwindAssemblyInstances ();
Greg Claytonab65b342011-04-13 22:47:15 +00002032
Greg Clayton7be25422011-04-25 21:14:26 +00002033 UnwindAssemblyInstances::iterator pos, end = instances.end();
Greg Claytonab65b342011-04-13 22:47:15 +00002034 for (pos = instances.begin(); pos != end; ++ pos)
2035 {
2036 if (pos->create_callback == create_callback)
2037 {
2038 instances.erase(pos);
2039 return true;
2040 }
2041 }
Jason Molendafbcb7f22010-09-10 07:49:16 +00002042 }
2043 return false;
2044}
2045
Greg Clayton7be25422011-04-25 21:14:26 +00002046UnwindAssemblyCreateInstance
2047PluginManager::GetUnwindAssemblyCreateCallbackAtIndex (uint32_t idx)
Jason Molendafbcb7f22010-09-10 07:49:16 +00002048{
Greg Clayton7be25422011-04-25 21:14:26 +00002049 Mutex::Locker locker (GetUnwindAssemblyMutex ());
2050 UnwindAssemblyInstances &instances = GetUnwindAssemblyInstances ();
Greg Claytonab65b342011-04-13 22:47:15 +00002051 if (idx < instances.size())
2052 return instances[idx].create_callback;
Jason Molendafbcb7f22010-09-10 07:49:16 +00002053 return NULL;
2054}
2055
Greg Claytonab65b342011-04-13 22:47:15 +00002056
Greg Clayton7be25422011-04-25 21:14:26 +00002057UnwindAssemblyCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +00002058PluginManager::GetUnwindAssemblyCreateCallbackForPluginName (const ConstString &name)
Jason Molendafbcb7f22010-09-10 07:49:16 +00002059{
Greg Clayton57abc5d2013-05-10 21:47:16 +00002060 if (name)
Jason Molendafbcb7f22010-09-10 07:49:16 +00002061 {
Greg Clayton7be25422011-04-25 21:14:26 +00002062 Mutex::Locker locker (GetUnwindAssemblyMutex ());
2063 UnwindAssemblyInstances &instances = GetUnwindAssemblyInstances ();
Greg Claytonab65b342011-04-13 22:47:15 +00002064
Greg Clayton7be25422011-04-25 21:14:26 +00002065 UnwindAssemblyInstances::iterator pos, end = instances.end();
Greg Claytonab65b342011-04-13 22:47:15 +00002066 for (pos = instances.begin(); pos != end; ++ pos)
Jason Molendafbcb7f22010-09-10 07:49:16 +00002067 {
Greg Clayton57abc5d2013-05-10 21:47:16 +00002068 if (name == pos->name)
Greg Claytonab65b342011-04-13 22:47:15 +00002069 return pos->create_callback;
Jason Molendafbcb7f22010-09-10 07:49:16 +00002070 }
2071 }
2072 return NULL;
2073}
2074
Greg Claytone8cd0c92012-10-19 18:02:49 +00002075void
2076PluginManager::DebuggerInitialize (Debugger &debugger)
2077{
Jason Molenda9b837a12013-04-05 05:06:39 +00002078 // Initialize the DynamicLoader plugins
Greg Claytone8cd0c92012-10-19 18:02:49 +00002079 {
Jason Molenda9b837a12013-04-05 05:06:39 +00002080 Mutex::Locker locker (GetDynamicLoaderMutex ());
2081 DynamicLoaderInstances &instances = GetDynamicLoaderInstances ();
2082
2083 DynamicLoaderInstances::iterator pos, end = instances.end();
2084 for (pos = instances.begin(); pos != end; ++ pos)
2085 {
2086 if (pos->debugger_init_callback)
2087 pos->debugger_init_callback (debugger);
2088 }
2089 }
2090
Andrew MacPherson17220c12014-03-05 10:12:43 +00002091 // Initialize the JITLoader plugins
2092 {
2093 Mutex::Locker locker (GetJITLoaderMutex ());
2094 JITLoaderInstances &instances = GetJITLoaderInstances ();
2095
2096 JITLoaderInstances::iterator pos, end = instances.end();
2097 for (pos = instances.begin(); pos != end; ++ pos)
2098 {
2099 if (pos->debugger_init_callback)
2100 pos->debugger_init_callback (debugger);
2101 }
2102 }
2103
Jason Molenda9b837a12013-04-05 05:06:39 +00002104 // Initialize the Platform plugins
2105 {
2106 Mutex::Locker locker (GetPlatformInstancesMutex ());
2107 PlatformInstances &instances = GetPlatformInstances ();
2108
2109 PlatformInstances::iterator pos, end = instances.end();
2110 for (pos = instances.begin(); pos != end; ++ pos)
2111 {
2112 if (pos->debugger_init_callback)
2113 pos->debugger_init_callback (debugger);
2114 }
Greg Claytone8cd0c92012-10-19 18:02:49 +00002115 }
Greg Clayton7f982402013-07-15 22:54:20 +00002116
2117 // Initialize the Process plugins
2118 {
2119 Mutex::Locker locker (GetProcessMutex());
2120 ProcessInstances &instances = GetProcessInstances();
2121
2122 ProcessInstances::iterator pos, end = instances.end();
2123 for (pos = instances.begin(); pos != end; ++ pos)
2124 {
2125 if (pos->debugger_init_callback)
2126 pos->debugger_init_callback (debugger);
2127 }
2128 }
2129
Greg Claytone8cd0c92012-10-19 18:02:49 +00002130}
2131
Greg Clayton7f982402013-07-15 22:54:20 +00002132// This is the preferred new way to register plugin specific settings. e.g.
2133// 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 +00002134static lldb::OptionValuePropertiesSP
Greg Clayton7f982402013-07-15 22:54:20 +00002135GetDebuggerPropertyForPlugins (Debugger &debugger,
Jason Molenda3b59f5c2013-04-05 22:40:42 +00002136 const ConstString &plugin_type_name,
2137 const ConstString &plugin_type_desc,
2138 bool can_create)
Greg Claytone8cd0c92012-10-19 18:02:49 +00002139{
2140 lldb::OptionValuePropertiesSP parent_properties_sp (debugger.GetValueProperties());
2141 if (parent_properties_sp)
2142 {
2143 static ConstString g_property_name("plugin");
2144
2145 OptionValuePropertiesSP plugin_properties_sp = parent_properties_sp->GetSubProperty (NULL, g_property_name);
2146 if (!plugin_properties_sp && can_create)
2147 {
2148 plugin_properties_sp.reset (new OptionValueProperties (g_property_name));
2149 parent_properties_sp->AppendProperty (g_property_name,
2150 ConstString("Settings specify to plugins."),
2151 true,
2152 plugin_properties_sp);
2153 }
2154
2155 if (plugin_properties_sp)
2156 {
2157 lldb::OptionValuePropertiesSP plugin_type_properties_sp = plugin_properties_sp->GetSubProperty (NULL, plugin_type_name);
2158 if (!plugin_type_properties_sp && can_create)
2159 {
2160 plugin_type_properties_sp.reset (new OptionValueProperties (plugin_type_name));
2161 plugin_properties_sp->AppendProperty (plugin_type_name,
2162 plugin_type_desc,
2163 true,
2164 plugin_type_properties_sp);
2165 }
2166 return plugin_type_properties_sp;
2167 }
2168 }
2169 return lldb::OptionValuePropertiesSP();
2170}
2171
Greg Clayton7f982402013-07-15 22:54:20 +00002172// This is deprecated way to register plugin specific settings. e.g.
2173// "<plugin_type_name>.plugin.<plugin_type_desc>.SETTINGNAME"
Jason Molenda3b59f5c2013-04-05 22:40:42 +00002174// and Platform generic settings would be under "platform.SETTINGNAME".
2175static lldb::OptionValuePropertiesSP
Greg Clayton7f982402013-07-15 22:54:20 +00002176GetDebuggerPropertyForPluginsOldStyle (Debugger &debugger,
2177 const ConstString &plugin_type_name,
2178 const ConstString &plugin_type_desc,
2179 bool can_create)
Jason Molenda3b59f5c2013-04-05 22:40:42 +00002180{
2181 static ConstString g_property_name("plugin");
2182 lldb::OptionValuePropertiesSP parent_properties_sp (debugger.GetValueProperties());
2183 if (parent_properties_sp)
2184 {
2185 OptionValuePropertiesSP plugin_properties_sp = parent_properties_sp->GetSubProperty (NULL, plugin_type_name);
2186 if (!plugin_properties_sp && can_create)
2187 {
2188 plugin_properties_sp.reset (new OptionValueProperties (plugin_type_name));
2189 parent_properties_sp->AppendProperty (plugin_type_name,
2190 plugin_type_desc,
2191 true,
2192 plugin_properties_sp);
2193 }
2194
2195 if (plugin_properties_sp)
2196 {
2197 lldb::OptionValuePropertiesSP plugin_type_properties_sp = plugin_properties_sp->GetSubProperty (NULL, g_property_name);
2198 if (!plugin_type_properties_sp && can_create)
2199 {
2200 plugin_type_properties_sp.reset (new OptionValueProperties (g_property_name));
2201 plugin_properties_sp->AppendProperty (g_property_name,
2202 ConstString("Settings specific to plugins"),
2203 true,
2204 plugin_type_properties_sp);
2205 }
2206 return plugin_type_properties_sp;
2207 }
2208 }
2209 return lldb::OptionValuePropertiesSP();
2210}
2211
2212
Greg Claytone8cd0c92012-10-19 18:02:49 +00002213lldb::OptionValuePropertiesSP
2214PluginManager::GetSettingForDynamicLoaderPlugin (Debugger &debugger, const ConstString &setting_name)
2215{
2216 lldb::OptionValuePropertiesSP properties_sp;
Greg Clayton7f982402013-07-15 22:54:20 +00002217 lldb::OptionValuePropertiesSP plugin_type_properties_sp (GetDebuggerPropertyForPlugins (debugger,
Greg Claytone8cd0c92012-10-19 18:02:49 +00002218 ConstString("dynamic-loader"),
2219 ConstString(), // not creating to so we don't need the description
2220 false));
2221 if (plugin_type_properties_sp)
2222 properties_sp = plugin_type_properties_sp->GetSubProperty (NULL, setting_name);
2223 return properties_sp;
2224}
2225
2226bool
2227PluginManager::CreateSettingForDynamicLoaderPlugin (Debugger &debugger,
2228 const lldb::OptionValuePropertiesSP &properties_sp,
2229 const ConstString &description,
2230 bool is_global_property)
2231{
2232 if (properties_sp)
2233 {
Greg Clayton7f982402013-07-15 22:54:20 +00002234 lldb::OptionValuePropertiesSP plugin_type_properties_sp (GetDebuggerPropertyForPlugins (debugger,
Greg Claytone8cd0c92012-10-19 18:02:49 +00002235 ConstString("dynamic-loader"),
2236 ConstString("Settings for dynamic loader plug-ins"),
2237 true));
2238 if (plugin_type_properties_sp)
2239 {
2240 plugin_type_properties_sp->AppendProperty (properties_sp->GetName(),
2241 description,
2242 is_global_property,
2243 properties_sp);
2244 return true;
2245 }
2246 }
2247 return false;
2248}
2249
Jason Molenda9b837a12013-04-05 05:06:39 +00002250
2251lldb::OptionValuePropertiesSP
2252PluginManager::GetSettingForPlatformPlugin (Debugger &debugger, const ConstString &setting_name)
2253{
2254 lldb::OptionValuePropertiesSP properties_sp;
Greg Clayton7f982402013-07-15 22:54:20 +00002255 lldb::OptionValuePropertiesSP plugin_type_properties_sp (GetDebuggerPropertyForPluginsOldStyle (debugger,
2256 ConstString("platform"),
2257 ConstString(), // not creating to so we don't need the description
2258 false));
Jason Molenda9b837a12013-04-05 05:06:39 +00002259 if (plugin_type_properties_sp)
2260 properties_sp = plugin_type_properties_sp->GetSubProperty (NULL, setting_name);
2261 return properties_sp;
2262}
2263
2264bool
2265PluginManager::CreateSettingForPlatformPlugin (Debugger &debugger,
2266 const lldb::OptionValuePropertiesSP &properties_sp,
2267 const ConstString &description,
2268 bool is_global_property)
2269{
2270 if (properties_sp)
2271 {
Greg Clayton7f982402013-07-15 22:54:20 +00002272 lldb::OptionValuePropertiesSP plugin_type_properties_sp (GetDebuggerPropertyForPluginsOldStyle (debugger,
2273 ConstString("platform"),
2274 ConstString("Settings for platform plug-ins"),
2275 true));
2276 if (plugin_type_properties_sp)
2277 {
2278 plugin_type_properties_sp->AppendProperty (properties_sp->GetName(),
2279 description,
2280 is_global_property,
2281 properties_sp);
2282 return true;
2283 }
2284 }
2285 return false;
2286}
2287
2288
2289lldb::OptionValuePropertiesSP
2290PluginManager::GetSettingForProcessPlugin (Debugger &debugger, const ConstString &setting_name)
2291{
2292 lldb::OptionValuePropertiesSP properties_sp;
2293 lldb::OptionValuePropertiesSP plugin_type_properties_sp (GetDebuggerPropertyForPlugins (debugger,
2294 ConstString("process"),
2295 ConstString(), // not creating to so we don't need the description
2296 false));
2297 if (plugin_type_properties_sp)
2298 properties_sp = plugin_type_properties_sp->GetSubProperty (NULL, setting_name);
2299 return properties_sp;
2300}
2301
2302bool
2303PluginManager::CreateSettingForProcessPlugin (Debugger &debugger,
2304 const lldb::OptionValuePropertiesSP &properties_sp,
2305 const ConstString &description,
2306 bool is_global_property)
2307{
2308 if (properties_sp)
2309 {
Jason Molenda9b837a12013-04-05 05:06:39 +00002310 lldb::OptionValuePropertiesSP plugin_type_properties_sp (GetDebuggerPropertyForPlugins (debugger,
Greg Clayton7f982402013-07-15 22:54:20 +00002311 ConstString("process"),
2312 ConstString("Settings for process plug-ins"),
Jason Molenda9b837a12013-04-05 05:06:39 +00002313 true));
2314 if (plugin_type_properties_sp)
2315 {
2316 plugin_type_properties_sp->AppendProperty (properties_sp->GetName(),
2317 description,
2318 is_global_property,
2319 properties_sp);
2320 return true;
2321 }
2322 }
2323 return false;
2324}
2325