blob: b4ee07aa8ba36a9804e9fccb56acc589a61ca082 [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
Andrew MacPherson17220c12014-03-05 10:12:43 +0000547#pragma mark JITLoader
548
549
550struct JITLoaderInstance
551{
552 JITLoaderInstance() :
553 name(),
554 description(),
555 create_callback(NULL),
556 debugger_init_callback (NULL)
557 {
558 }
559
560 ConstString name;
561 std::string description;
562 JITLoaderCreateInstance create_callback;
563 DebuggerInitializeCallback debugger_init_callback;
564};
565
566typedef std::vector<JITLoaderInstance> JITLoaderInstances;
567
568
569static Mutex &
570GetJITLoaderMutex ()
571{
572 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
573 return g_instances_mutex;
574}
575
576static JITLoaderInstances &
577GetJITLoaderInstances ()
578{
579 static JITLoaderInstances g_instances;
580 return g_instances;
581}
582
583
584bool
585PluginManager::RegisterPlugin
586(
587 const ConstString &name,
588 const char *description,
589 JITLoaderCreateInstance create_callback,
590 DebuggerInitializeCallback debugger_init_callback
591)
592{
593 if (create_callback)
594 {
595 JITLoaderInstance instance;
596 assert ((bool)name);
597 instance.name = name;
598 if (description && description[0])
599 instance.description = description;
600 instance.create_callback = create_callback;
601 instance.debugger_init_callback = debugger_init_callback;
602 Mutex::Locker locker (GetJITLoaderMutex ());
603 GetJITLoaderInstances ().push_back (instance);
604 }
605 return false;
606}
607
608bool
609PluginManager::UnregisterPlugin (JITLoaderCreateInstance create_callback)
610{
611 if (create_callback)
612 {
613 Mutex::Locker locker (GetJITLoaderMutex ());
614 JITLoaderInstances &instances = GetJITLoaderInstances ();
615
616 JITLoaderInstances::iterator pos, end = instances.end();
617 for (pos = instances.begin(); pos != end; ++ pos)
618 {
619 if (pos->create_callback == create_callback)
620 {
621 instances.erase(pos);
622 return true;
623 }
624 }
625 }
626 return false;
627}
628
629JITLoaderCreateInstance
630PluginManager::GetJITLoaderCreateCallbackAtIndex (uint32_t idx)
631{
632 Mutex::Locker locker (GetJITLoaderMutex ());
633 JITLoaderInstances &instances = GetJITLoaderInstances ();
634 if (idx < instances.size())
635 return instances[idx].create_callback;
636 return NULL;
637}
638
639JITLoaderCreateInstance
640PluginManager::GetJITLoaderCreateCallbackForPluginName (const ConstString &name)
641{
642 if (name)
643 {
644 Mutex::Locker locker (GetJITLoaderMutex ());
645 JITLoaderInstances &instances = GetJITLoaderInstances ();
646
647 JITLoaderInstances::iterator pos, end = instances.end();
648 for (pos = instances.begin(); pos != end; ++ pos)
649 {
650 if (name == pos->name)
651 return pos->create_callback;
652 }
653 }
654 return NULL;
655}
656
Greg Claytonf03bbe22011-02-01 01:37:45 +0000657#pragma mark EmulateInstruction
658
659
660struct EmulateInstructionInstance
661{
662 EmulateInstructionInstance() :
663 name(),
664 description(),
665 create_callback(NULL)
666 {
667 }
668
Greg Clayton57abc5d2013-05-10 21:47:16 +0000669 ConstString name;
Greg Claytonf03bbe22011-02-01 01:37:45 +0000670 std::string description;
671 EmulateInstructionCreateInstance create_callback;
672};
673
674typedef std::vector<EmulateInstructionInstance> EmulateInstructionInstances;
675
Greg Claytonab65b342011-04-13 22:47:15 +0000676static Mutex &
677GetEmulateInstructionMutex ()
Greg Claytonf03bbe22011-02-01 01:37:45 +0000678{
Greg Claytonab65b342011-04-13 22:47:15 +0000679 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
680 return g_instances_mutex;
681}
682
683static EmulateInstructionInstances &
684GetEmulateInstructionInstances ()
685{
686 static EmulateInstructionInstances g_instances;
687 return g_instances;
Greg Claytonf03bbe22011-02-01 01:37:45 +0000688}
689
690
691bool
692PluginManager::RegisterPlugin
693(
Greg Clayton57abc5d2013-05-10 21:47:16 +0000694 const ConstString &name,
Greg Clayton4272cc72011-02-02 02:24:04 +0000695 const char *description,
696 EmulateInstructionCreateInstance create_callback
697)
Greg Claytonf03bbe22011-02-01 01:37:45 +0000698{
699 if (create_callback)
700 {
701 EmulateInstructionInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +0000702 assert ((bool)name);
Greg Claytonf03bbe22011-02-01 01:37:45 +0000703 instance.name = name;
704 if (description && description[0])
705 instance.description = description;
706 instance.create_callback = create_callback;
Greg Claytonab65b342011-04-13 22:47:15 +0000707 Mutex::Locker locker (GetEmulateInstructionMutex ());
708 GetEmulateInstructionInstances ().push_back (instance);
Greg Claytonf03bbe22011-02-01 01:37:45 +0000709 }
710 return false;
711}
712
713bool
714PluginManager::UnregisterPlugin (EmulateInstructionCreateInstance create_callback)
715{
716 if (create_callback)
717 {
Greg Claytonab65b342011-04-13 22:47:15 +0000718 Mutex::Locker locker (GetEmulateInstructionMutex ());
719 EmulateInstructionInstances &instances = GetEmulateInstructionInstances ();
720
721 EmulateInstructionInstances::iterator pos, end = instances.end();
722 for (pos = instances.begin(); pos != end; ++ pos)
723 {
724 if (pos->create_callback == create_callback)
725 {
726 instances.erase(pos);
727 return true;
728 }
729 }
Greg Claytonf03bbe22011-02-01 01:37:45 +0000730 }
731 return false;
732}
733
734EmulateInstructionCreateInstance
735PluginManager::GetEmulateInstructionCreateCallbackAtIndex (uint32_t idx)
736{
Greg Claytonab65b342011-04-13 22:47:15 +0000737 Mutex::Locker locker (GetEmulateInstructionMutex ());
738 EmulateInstructionInstances &instances = GetEmulateInstructionInstances ();
739 if (idx < instances.size())
740 return instances[idx].create_callback;
Greg Claytonf03bbe22011-02-01 01:37:45 +0000741 return NULL;
742}
743
744EmulateInstructionCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +0000745PluginManager::GetEmulateInstructionCreateCallbackForPluginName (const ConstString &name)
Greg Claytonf03bbe22011-02-01 01:37:45 +0000746{
Greg Clayton57abc5d2013-05-10 21:47:16 +0000747 if (name)
Greg Claytonf03bbe22011-02-01 01:37:45 +0000748 {
Greg Claytonab65b342011-04-13 22:47:15 +0000749 Mutex::Locker locker (GetEmulateInstructionMutex ());
750 EmulateInstructionInstances &instances = GetEmulateInstructionInstances ();
751
752 EmulateInstructionInstances::iterator pos, end = instances.end();
753 for (pos = instances.begin(); pos != end; ++ pos)
Greg Claytonf03bbe22011-02-01 01:37:45 +0000754 {
Greg Clayton57abc5d2013-05-10 21:47:16 +0000755 if (name == pos->name)
Greg Claytonab65b342011-04-13 22:47:15 +0000756 return pos->create_callback;
Greg Claytonf03bbe22011-02-01 01:37:45 +0000757 }
758 }
759 return NULL;
760}
Greg Clayton56d9a1b2011-08-22 02:49:39 +0000761#pragma mark OperatingSystem
762
763
764struct OperatingSystemInstance
765{
766 OperatingSystemInstance() :
767 name(),
768 description(),
769 create_callback(NULL)
770 {
771 }
772
Greg Clayton57abc5d2013-05-10 21:47:16 +0000773 ConstString name;
Greg Clayton56d9a1b2011-08-22 02:49:39 +0000774 std::string description;
775 OperatingSystemCreateInstance create_callback;
776};
777
778typedef std::vector<OperatingSystemInstance> OperatingSystemInstances;
779
780static Mutex &
781GetOperatingSystemMutex ()
782{
783 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
784 return g_instances_mutex;
785}
786
787static OperatingSystemInstances &
788GetOperatingSystemInstances ()
789{
790 static OperatingSystemInstances g_instances;
791 return g_instances;
792}
793
794bool
Greg Clayton57abc5d2013-05-10 21:47:16 +0000795PluginManager::RegisterPlugin (const ConstString &name,
796 const char *description,
797 OperatingSystemCreateInstance create_callback)
Greg Clayton56d9a1b2011-08-22 02:49:39 +0000798{
799 if (create_callback)
800 {
801 OperatingSystemInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +0000802 assert ((bool)name);
Greg Clayton56d9a1b2011-08-22 02:49:39 +0000803 instance.name = name;
804 if (description && description[0])
805 instance.description = description;
806 instance.create_callback = create_callback;
807 Mutex::Locker locker (GetOperatingSystemMutex ());
808 GetOperatingSystemInstances ().push_back (instance);
809 }
810 return false;
811}
812
813bool
814PluginManager::UnregisterPlugin (OperatingSystemCreateInstance create_callback)
815{
816 if (create_callback)
817 {
818 Mutex::Locker locker (GetOperatingSystemMutex ());
819 OperatingSystemInstances &instances = GetOperatingSystemInstances ();
820
821 OperatingSystemInstances::iterator pos, end = instances.end();
822 for (pos = instances.begin(); pos != end; ++ pos)
823 {
824 if (pos->create_callback == create_callback)
825 {
826 instances.erase(pos);
827 return true;
828 }
829 }
830 }
831 return false;
832}
833
834OperatingSystemCreateInstance
835PluginManager::GetOperatingSystemCreateCallbackAtIndex (uint32_t idx)
836{
837 Mutex::Locker locker (GetOperatingSystemMutex ());
838 OperatingSystemInstances &instances = GetOperatingSystemInstances ();
839 if (idx < instances.size())
840 return instances[idx].create_callback;
841 return NULL;
842}
843
844OperatingSystemCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +0000845PluginManager::GetOperatingSystemCreateCallbackForPluginName (const ConstString &name)
Greg Clayton56d9a1b2011-08-22 02:49:39 +0000846{
Greg Clayton57abc5d2013-05-10 21:47:16 +0000847 if (name)
Greg Clayton56d9a1b2011-08-22 02:49:39 +0000848 {
Greg Clayton56d9a1b2011-08-22 02:49:39 +0000849 Mutex::Locker locker (GetOperatingSystemMutex ());
850 OperatingSystemInstances &instances = GetOperatingSystemInstances ();
851
852 OperatingSystemInstances::iterator pos, end = instances.end();
853 for (pos = instances.begin(); pos != end; ++ pos)
854 {
Greg Clayton57abc5d2013-05-10 21:47:16 +0000855 if (name == pos->name)
Greg Clayton56d9a1b2011-08-22 02:49:39 +0000856 return pos->create_callback;
857 }
858 }
859 return NULL;
860}
Greg Claytonf03bbe22011-02-01 01:37:45 +0000861
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000862
Jim Ingham22777012010-09-23 02:01:19 +0000863#pragma mark LanguageRuntime
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000864
865
Jim Ingham22777012010-09-23 02:01:19 +0000866struct LanguageRuntimeInstance
867{
868 LanguageRuntimeInstance() :
869 name(),
870 description(),
871 create_callback(NULL)
872 {
873 }
874
Greg Clayton57abc5d2013-05-10 21:47:16 +0000875 ConstString name;
Jim Ingham22777012010-09-23 02:01:19 +0000876 std::string description;
877 LanguageRuntimeCreateInstance create_callback;
878};
879
880typedef std::vector<LanguageRuntimeInstance> LanguageRuntimeInstances;
881
Greg Claytonab65b342011-04-13 22:47:15 +0000882static Mutex &
883GetLanguageRuntimeMutex ()
Jim Ingham22777012010-09-23 02:01:19 +0000884{
Greg Claytonab65b342011-04-13 22:47:15 +0000885 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
886 return g_instances_mutex;
Jim Ingham22777012010-09-23 02:01:19 +0000887}
888
Greg Claytonab65b342011-04-13 22:47:15 +0000889static LanguageRuntimeInstances &
890GetLanguageRuntimeInstances ()
891{
892 static LanguageRuntimeInstances g_instances;
893 return g_instances;
894}
Jim Ingham22777012010-09-23 02:01:19 +0000895
896bool
897PluginManager::RegisterPlugin
Greg Clayton4272cc72011-02-02 02:24:04 +0000898(
Greg Clayton57abc5d2013-05-10 21:47:16 +0000899 const ConstString &name,
Greg Clayton4272cc72011-02-02 02:24:04 +0000900 const char *description,
901 LanguageRuntimeCreateInstance create_callback
902)
Jim Ingham22777012010-09-23 02:01:19 +0000903{
904 if (create_callback)
905 {
906 LanguageRuntimeInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +0000907 assert ((bool)name);
Jim Ingham22777012010-09-23 02:01:19 +0000908 instance.name = name;
909 if (description && description[0])
910 instance.description = description;
911 instance.create_callback = create_callback;
Greg Claytonab65b342011-04-13 22:47:15 +0000912 Mutex::Locker locker (GetLanguageRuntimeMutex ());
913 GetLanguageRuntimeInstances ().push_back (instance);
Jim Ingham22777012010-09-23 02:01:19 +0000914 }
915 return false;
916}
917
918bool
919PluginManager::UnregisterPlugin (LanguageRuntimeCreateInstance create_callback)
920{
921 if (create_callback)
922 {
Greg Claytonab65b342011-04-13 22:47:15 +0000923 Mutex::Locker locker (GetLanguageRuntimeMutex ());
924 LanguageRuntimeInstances &instances = GetLanguageRuntimeInstances ();
925
926 LanguageRuntimeInstances::iterator pos, end = instances.end();
927 for (pos = instances.begin(); pos != end; ++ pos)
928 {
929 if (pos->create_callback == create_callback)
930 {
931 instances.erase(pos);
932 return true;
933 }
934 }
Jim Ingham22777012010-09-23 02:01:19 +0000935 }
936 return false;
937}
938
939LanguageRuntimeCreateInstance
940PluginManager::GetLanguageRuntimeCreateCallbackAtIndex (uint32_t idx)
941{
Greg Claytonab65b342011-04-13 22:47:15 +0000942 Mutex::Locker locker (GetLanguageRuntimeMutex ());
943 LanguageRuntimeInstances &instances = GetLanguageRuntimeInstances ();
944 if (idx < instances.size())
945 return instances[idx].create_callback;
Jim Ingham22777012010-09-23 02:01:19 +0000946 return NULL;
947}
948
949LanguageRuntimeCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +0000950PluginManager::GetLanguageRuntimeCreateCallbackForPluginName (const ConstString &name)
Jim Ingham22777012010-09-23 02:01:19 +0000951{
Greg Clayton57abc5d2013-05-10 21:47:16 +0000952 if (name)
Jim Ingham22777012010-09-23 02:01:19 +0000953 {
Greg Claytonab65b342011-04-13 22:47:15 +0000954 Mutex::Locker locker (GetLanguageRuntimeMutex ());
955 LanguageRuntimeInstances &instances = GetLanguageRuntimeInstances ();
956
957 LanguageRuntimeInstances::iterator pos, end = instances.end();
958 for (pos = instances.begin(); pos != end; ++ pos)
Jim Ingham22777012010-09-23 02:01:19 +0000959 {
Greg Clayton57abc5d2013-05-10 21:47:16 +0000960 if (name == pos->name)
Greg Claytonab65b342011-04-13 22:47:15 +0000961 return pos->create_callback;
Jim Ingham22777012010-09-23 02:01:19 +0000962 }
963 }
964 return NULL;
965}
966
Jason Molendaeef51062013-11-05 03:57:19 +0000967#pragma mark SystemRuntime
968
969
970struct SystemRuntimeInstance
971{
972 SystemRuntimeInstance() :
973 name(),
974 description(),
975 create_callback(NULL)
976 {
977 }
978
979 ConstString name;
980 std::string description;
981 SystemRuntimeCreateInstance create_callback;
982};
983
984typedef std::vector<SystemRuntimeInstance> SystemRuntimeInstances;
985
986static Mutex &
987GetSystemRuntimeMutex ()
988{
989 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
990 return g_instances_mutex;
991}
992
993static SystemRuntimeInstances &
994GetSystemRuntimeInstances ()
995{
996 static SystemRuntimeInstances g_instances;
997 return g_instances;
998}
999
1000bool
1001PluginManager::RegisterPlugin
1002(
1003 const ConstString &name,
1004 const char *description,
1005 SystemRuntimeCreateInstance create_callback
1006)
1007{
1008 if (create_callback)
1009 {
1010 SystemRuntimeInstance instance;
1011 assert ((bool)name);
1012 instance.name = name;
1013 if (description && description[0])
1014 instance.description = description;
1015 instance.create_callback = create_callback;
1016 Mutex::Locker locker (GetSystemRuntimeMutex ());
1017 GetSystemRuntimeInstances ().push_back (instance);
1018 }
1019 return false;
1020}
1021
1022bool
1023PluginManager::UnregisterPlugin (SystemRuntimeCreateInstance create_callback)
1024{
1025 if (create_callback)
1026 {
1027 Mutex::Locker locker (GetSystemRuntimeMutex ());
1028 SystemRuntimeInstances &instances = GetSystemRuntimeInstances ();
1029
1030 SystemRuntimeInstances::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 }
1039 }
1040 return false;
1041}
1042
1043SystemRuntimeCreateInstance
1044PluginManager::GetSystemRuntimeCreateCallbackAtIndex (uint32_t idx)
1045{
1046 Mutex::Locker locker (GetSystemRuntimeMutex ());
1047 SystemRuntimeInstances &instances = GetSystemRuntimeInstances ();
1048 if (idx < instances.size())
1049 return instances[idx].create_callback;
1050 return NULL;
1051}
1052
1053SystemRuntimeCreateInstance
1054PluginManager::GetSystemRuntimeCreateCallbackForPluginName (const ConstString &name)
1055{
1056 if (name)
1057 {
1058 Mutex::Locker locker (GetSystemRuntimeMutex ());
1059 SystemRuntimeInstances &instances = GetSystemRuntimeInstances ();
1060
1061 SystemRuntimeInstances::iterator pos, end = instances.end();
1062 for (pos = instances.begin(); pos != end; ++ pos)
1063 {
1064 if (name == pos->name)
1065 return pos->create_callback;
1066 }
1067 }
1068 return NULL;
1069}
1070
1071
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001072#pragma mark ObjectFile
1073
Jason Molenda743e86a2010-06-11 23:44:18 +00001074struct ObjectFileInstance
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001075{
1076 ObjectFileInstance() :
1077 name(),
1078 description(),
Greg Claytonf4d6de62013-04-24 22:29:28 +00001079 create_callback(NULL),
1080 create_memory_callback (NULL),
1081 get_module_specifications (NULL)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001082 {
1083 }
1084
Greg Clayton57abc5d2013-05-10 21:47:16 +00001085 ConstString name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001086 std::string description;
1087 ObjectFileCreateInstance create_callback;
Greg Claytonc9660542012-02-05 02:38:54 +00001088 ObjectFileCreateMemoryInstance create_memory_callback;
Greg Claytonf4d6de62013-04-24 22:29:28 +00001089 ObjectFileGetModuleSpecifications get_module_specifications;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001090};
1091
1092typedef std::vector<ObjectFileInstance> ObjectFileInstances;
1093
Greg Claytonab65b342011-04-13 22:47:15 +00001094static Mutex &
1095GetObjectFileMutex ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001096{
Greg Claytonab65b342011-04-13 22:47:15 +00001097 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
1098 return g_instances_mutex;
1099}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001100
Greg Claytonab65b342011-04-13 22:47:15 +00001101static ObjectFileInstances &
1102GetObjectFileInstances ()
1103{
1104 static ObjectFileInstances g_instances;
1105 return g_instances;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001106}
1107
1108
1109bool
Greg Clayton57abc5d2013-05-10 21:47:16 +00001110PluginManager::RegisterPlugin (const ConstString &name,
Greg Claytonf4d6de62013-04-24 22:29:28 +00001111 const char *description,
1112 ObjectFileCreateInstance create_callback,
1113 ObjectFileCreateMemoryInstance create_memory_callback,
1114 ObjectFileGetModuleSpecifications get_module_specifications)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001115{
1116 if (create_callback)
1117 {
1118 ObjectFileInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +00001119 assert ((bool)name);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001120 instance.name = name;
1121 if (description && description[0])
1122 instance.description = description;
1123 instance.create_callback = create_callback;
Greg Claytonc9660542012-02-05 02:38:54 +00001124 instance.create_memory_callback = create_memory_callback;
Greg Claytonf4d6de62013-04-24 22:29:28 +00001125 instance.get_module_specifications = get_module_specifications;
Greg Claytonab65b342011-04-13 22:47:15 +00001126 Mutex::Locker locker (GetObjectFileMutex ());
1127 GetObjectFileInstances ().push_back (instance);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001128 }
1129 return false;
1130}
1131
1132bool
1133PluginManager::UnregisterPlugin (ObjectFileCreateInstance create_callback)
1134{
1135 if (create_callback)
1136 {
Greg Claytonab65b342011-04-13 22:47:15 +00001137 Mutex::Locker locker (GetObjectFileMutex ());
1138 ObjectFileInstances &instances = GetObjectFileInstances ();
1139
1140 ObjectFileInstances::iterator pos, end = instances.end();
1141 for (pos = instances.begin(); pos != end; ++ pos)
1142 {
1143 if (pos->create_callback == create_callback)
1144 {
1145 instances.erase(pos);
1146 return true;
1147 }
1148 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001149 }
1150 return false;
1151}
1152
1153ObjectFileCreateInstance
1154PluginManager::GetObjectFileCreateCallbackAtIndex (uint32_t idx)
1155{
Greg Claytonab65b342011-04-13 22:47:15 +00001156 Mutex::Locker locker (GetObjectFileMutex ());
1157 ObjectFileInstances &instances = GetObjectFileInstances ();
1158 if (idx < instances.size())
1159 return instances[idx].create_callback;
Jason Molenda743e86a2010-06-11 23:44:18 +00001160 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001161}
Greg Claytonab65b342011-04-13 22:47:15 +00001162
Greg Claytonc9660542012-02-05 02:38:54 +00001163
1164ObjectFileCreateMemoryInstance
1165PluginManager::GetObjectFileCreateMemoryCallbackAtIndex (uint32_t idx)
1166{
1167 Mutex::Locker locker (GetObjectFileMutex ());
1168 ObjectFileInstances &instances = GetObjectFileInstances ();
1169 if (idx < instances.size())
1170 return instances[idx].create_memory_callback;
1171 return NULL;
1172}
1173
Greg Claytonf4d6de62013-04-24 22:29:28 +00001174ObjectFileGetModuleSpecifications
1175PluginManager::GetObjectFileGetModuleSpecificationsCallbackAtIndex (uint32_t idx)
1176{
1177 Mutex::Locker locker (GetObjectFileMutex ());
1178 ObjectFileInstances &instances = GetObjectFileInstances ();
1179 if (idx < instances.size())
1180 return instances[idx].get_module_specifications;
1181 return NULL;
1182}
1183
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001184ObjectFileCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +00001185PluginManager::GetObjectFileCreateCallbackForPluginName (const ConstString &name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001186{
Greg Clayton57abc5d2013-05-10 21:47:16 +00001187 if (name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001188 {
Greg Claytonab65b342011-04-13 22:47:15 +00001189 Mutex::Locker locker (GetObjectFileMutex ());
1190 ObjectFileInstances &instances = GetObjectFileInstances ();
1191
1192 ObjectFileInstances::iterator pos, end = instances.end();
1193 for (pos = instances.begin(); pos != end; ++ pos)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001194 {
Greg Clayton57abc5d2013-05-10 21:47:16 +00001195 if (name == pos->name)
Greg Claytonab65b342011-04-13 22:47:15 +00001196 return pos->create_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001197 }
1198 }
1199 return NULL;
1200}
1201
1202
Greg Claytonc9660542012-02-05 02:38:54 +00001203ObjectFileCreateMemoryInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +00001204PluginManager::GetObjectFileCreateMemoryCallbackForPluginName (const ConstString &name)
Greg Claytonc9660542012-02-05 02:38:54 +00001205{
Greg Clayton57abc5d2013-05-10 21:47:16 +00001206 if (name)
Greg Claytonc9660542012-02-05 02:38:54 +00001207 {
Greg Claytonc9660542012-02-05 02:38:54 +00001208 Mutex::Locker locker (GetObjectFileMutex ());
1209 ObjectFileInstances &instances = GetObjectFileInstances ();
1210
1211 ObjectFileInstances::iterator pos, end = instances.end();
1212 for (pos = instances.begin(); pos != end; ++ pos)
1213 {
Greg Clayton57abc5d2013-05-10 21:47:16 +00001214 if (name == pos->name)
Greg Claytonc9660542012-02-05 02:38:54 +00001215 return pos->create_memory_callback;
1216 }
1217 }
1218 return NULL;
1219}
1220
1221
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001222
1223#pragma mark ObjectContainer
1224
Jason Molenda743e86a2010-06-11 23:44:18 +00001225struct ObjectContainerInstance
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001226{
1227 ObjectContainerInstance() :
1228 name(),
1229 description(),
Greg Claytonf4d6de62013-04-24 22:29:28 +00001230 create_callback (NULL),
1231 get_module_specifications (NULL)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001232 {
1233 }
1234
Greg Clayton57abc5d2013-05-10 21:47:16 +00001235 ConstString name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001236 std::string description;
1237 ObjectContainerCreateInstance create_callback;
Greg Claytonf4d6de62013-04-24 22:29:28 +00001238 ObjectFileGetModuleSpecifications get_module_specifications;
1239
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001240};
1241
1242typedef std::vector<ObjectContainerInstance> ObjectContainerInstances;
1243
Greg Claytonab65b342011-04-13 22:47:15 +00001244static Mutex &
1245GetObjectContainerMutex ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001246{
Greg Claytonab65b342011-04-13 22:47:15 +00001247 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
1248 return g_instances_mutex;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001249}
1250
Greg Claytonab65b342011-04-13 22:47:15 +00001251static ObjectContainerInstances &
1252GetObjectContainerInstances ()
1253{
1254 static ObjectContainerInstances g_instances;
1255 return g_instances;
1256}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001257
1258bool
Greg Clayton57abc5d2013-05-10 21:47:16 +00001259PluginManager::RegisterPlugin (const ConstString &name,
Greg Claytonf4d6de62013-04-24 22:29:28 +00001260 const char *description,
1261 ObjectContainerCreateInstance create_callback,
1262 ObjectFileGetModuleSpecifications get_module_specifications)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001263{
1264 if (create_callback)
1265 {
1266 ObjectContainerInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +00001267 assert ((bool)name);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001268 instance.name = name;
1269 if (description && description[0])
1270 instance.description = description;
1271 instance.create_callback = create_callback;
Greg Claytonf4d6de62013-04-24 22:29:28 +00001272 instance.get_module_specifications = get_module_specifications;
Greg Claytonab65b342011-04-13 22:47:15 +00001273 Mutex::Locker locker (GetObjectContainerMutex ());
1274 GetObjectContainerInstances ().push_back (instance);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001275 }
1276 return false;
1277}
1278
1279bool
1280PluginManager::UnregisterPlugin (ObjectContainerCreateInstance create_callback)
1281{
1282 if (create_callback)
1283 {
Greg Claytonab65b342011-04-13 22:47:15 +00001284 Mutex::Locker locker (GetObjectContainerMutex ());
1285 ObjectContainerInstances &instances = GetObjectContainerInstances ();
1286
1287 ObjectContainerInstances::iterator pos, end = instances.end();
1288 for (pos = instances.begin(); pos != end; ++ pos)
1289 {
1290 if (pos->create_callback == create_callback)
1291 {
1292 instances.erase(pos);
1293 return true;
1294 }
1295 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001296 }
1297 return false;
1298}
1299
1300ObjectContainerCreateInstance
1301PluginManager::GetObjectContainerCreateCallbackAtIndex (uint32_t idx)
1302{
Greg Claytonab65b342011-04-13 22:47:15 +00001303 Mutex::Locker locker (GetObjectContainerMutex ());
1304 ObjectContainerInstances &instances = GetObjectContainerInstances ();
1305 if (idx < instances.size())
1306 return instances[idx].create_callback;
Jason Molenda743e86a2010-06-11 23:44:18 +00001307 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001308}
Greg Claytonab65b342011-04-13 22:47:15 +00001309
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001310ObjectContainerCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +00001311PluginManager::GetObjectContainerCreateCallbackForPluginName (const ConstString &name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001312{
Greg Clayton57abc5d2013-05-10 21:47:16 +00001313 if (name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001314 {
Greg Claytonab65b342011-04-13 22:47:15 +00001315 Mutex::Locker locker (GetObjectContainerMutex ());
1316 ObjectContainerInstances &instances = GetObjectContainerInstances ();
1317
1318 ObjectContainerInstances::iterator pos, end = instances.end();
1319 for (pos = instances.begin(); pos != end; ++ pos)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001320 {
Greg Clayton57abc5d2013-05-10 21:47:16 +00001321 if (name == pos->name)
Greg Claytonab65b342011-04-13 22:47:15 +00001322 return pos->create_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001323 }
1324 }
1325 return NULL;
1326}
1327
Greg Claytonf4d6de62013-04-24 22:29:28 +00001328ObjectFileGetModuleSpecifications
1329PluginManager::GetObjectContainerGetModuleSpecificationsCallbackAtIndex (uint32_t idx)
1330{
1331 Mutex::Locker locker (GetObjectContainerMutex ());
1332 ObjectContainerInstances &instances = GetObjectContainerInstances ();
1333 if (idx < instances.size())
1334 return instances[idx].get_module_specifications;
1335 return NULL;
1336}
1337
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001338#pragma mark LogChannel
1339
Greg Claytonab65b342011-04-13 22:47:15 +00001340struct LogInstance
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001341{
Greg Claytonab65b342011-04-13 22:47:15 +00001342 LogInstance() :
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001343 name(),
1344 description(),
1345 create_callback(NULL)
1346 {
1347 }
1348
Greg Clayton57abc5d2013-05-10 21:47:16 +00001349 ConstString name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001350 std::string description;
1351 LogChannelCreateInstance create_callback;
1352};
1353
Greg Claytonab65b342011-04-13 22:47:15 +00001354typedef std::vector<LogInstance> LogInstances;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001355
Greg Claytonab65b342011-04-13 22:47:15 +00001356static Mutex &
1357GetLogMutex ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001358{
Greg Claytonab65b342011-04-13 22:47:15 +00001359 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
1360 return g_instances_mutex;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001361}
1362
Greg Claytonab65b342011-04-13 22:47:15 +00001363static LogInstances &
1364GetLogInstances ()
1365{
1366 static LogInstances g_instances;
1367 return g_instances;
1368}
1369
1370
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001371
1372bool
1373PluginManager::RegisterPlugin
1374(
Greg Clayton57abc5d2013-05-10 21:47:16 +00001375 const ConstString &name,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001376 const char *description,
1377 LogChannelCreateInstance create_callback
1378)
1379{
1380 if (create_callback)
1381 {
Greg Claytonab65b342011-04-13 22:47:15 +00001382 LogInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +00001383 assert ((bool)name);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001384 instance.name = name;
1385 if (description && description[0])
1386 instance.description = description;
1387 instance.create_callback = create_callback;
Greg Claytonab65b342011-04-13 22:47:15 +00001388 Mutex::Locker locker (GetLogMutex ());
1389 GetLogInstances ().push_back (instance);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001390 }
1391 return false;
1392}
1393
1394bool
1395PluginManager::UnregisterPlugin (LogChannelCreateInstance create_callback)
1396{
1397 if (create_callback)
1398 {
Greg Claytonab65b342011-04-13 22:47:15 +00001399 Mutex::Locker locker (GetLogMutex ());
1400 LogInstances &instances = GetLogInstances ();
1401
1402 LogInstances::iterator pos, end = instances.end();
1403 for (pos = instances.begin(); pos != end; ++ pos)
1404 {
1405 if (pos->create_callback == create_callback)
1406 {
1407 instances.erase(pos);
1408 return true;
1409 }
1410 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001411 }
1412 return false;
1413}
1414
1415const char *
1416PluginManager::GetLogChannelCreateNameAtIndex (uint32_t idx)
1417{
Greg Claytonab65b342011-04-13 22:47:15 +00001418 Mutex::Locker locker (GetLogMutex ());
1419 LogInstances &instances = GetLogInstances ();
1420 if (idx < instances.size())
Greg Clayton57abc5d2013-05-10 21:47:16 +00001421 return instances[idx].name.GetCString();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001422 return NULL;
1423}
1424
1425
1426LogChannelCreateInstance
1427PluginManager::GetLogChannelCreateCallbackAtIndex (uint32_t idx)
1428{
Greg Claytonab65b342011-04-13 22:47:15 +00001429 Mutex::Locker locker (GetLogMutex ());
1430 LogInstances &instances = GetLogInstances ();
1431 if (idx < instances.size())
1432 return instances[idx].create_callback;
Jason Molenda743e86a2010-06-11 23:44:18 +00001433 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001434}
1435
1436LogChannelCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +00001437PluginManager::GetLogChannelCreateCallbackForPluginName (const ConstString &name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001438{
Greg Clayton57abc5d2013-05-10 21:47:16 +00001439 if (name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001440 {
Greg Claytonab65b342011-04-13 22:47:15 +00001441 Mutex::Locker locker (GetLogMutex ());
1442 LogInstances &instances = GetLogInstances ();
1443
1444 LogInstances::iterator pos, end = instances.end();
1445 for (pos = instances.begin(); pos != end; ++ pos)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001446 {
Greg Clayton57abc5d2013-05-10 21:47:16 +00001447 if (name == pos->name)
Greg Claytonab65b342011-04-13 22:47:15 +00001448 return pos->create_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001449 }
1450 }
1451 return NULL;
1452}
1453
Greg Claytone996fd32011-03-08 22:40:15 +00001454#pragma mark Platform
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001455
Greg Claytone996fd32011-03-08 22:40:15 +00001456struct PlatformInstance
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001457{
Greg Claytone996fd32011-03-08 22:40:15 +00001458 PlatformInstance() :
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001459 name(),
1460 description(),
Jason Molenda9b837a12013-04-05 05:06:39 +00001461 create_callback(NULL),
1462 debugger_init_callback (NULL)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001463 {
1464 }
Greg Claytone996fd32011-03-08 22:40:15 +00001465
Greg Clayton57abc5d2013-05-10 21:47:16 +00001466 ConstString name;
Greg Claytone996fd32011-03-08 22:40:15 +00001467 std::string description;
1468 PlatformCreateInstance create_callback;
Jason Molenda9b837a12013-04-05 05:06:39 +00001469 DebuggerInitializeCallback debugger_init_callback;
Greg Claytone996fd32011-03-08 22:40:15 +00001470};
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001471
Greg Claytone996fd32011-03-08 22:40:15 +00001472typedef std::vector<PlatformInstance> PlatformInstances;
1473
Greg Claytonded470d2011-03-19 01:12:21 +00001474static Mutex &
1475GetPlatformInstancesMutex ()
Greg Claytone996fd32011-03-08 22:40:15 +00001476{
Greg Claytonded470d2011-03-19 01:12:21 +00001477 static Mutex g_platform_instances_mutex (Mutex::eMutexTypeRecursive);
1478 return g_platform_instances_mutex;
Greg Claytone996fd32011-03-08 22:40:15 +00001479}
1480
Greg Claytonded470d2011-03-19 01:12:21 +00001481static PlatformInstances &
1482GetPlatformInstances ()
1483{
1484 static PlatformInstances g_platform_instances;
1485 return g_platform_instances;
1486}
Greg Claytone996fd32011-03-08 22:40:15 +00001487
Greg Claytonab65b342011-04-13 22:47:15 +00001488
Greg Claytone996fd32011-03-08 22:40:15 +00001489bool
Greg Clayton57abc5d2013-05-10 21:47:16 +00001490PluginManager::RegisterPlugin (const ConstString &name,
Greg Claytone996fd32011-03-08 22:40:15 +00001491 const char *description,
Jason Molenda9b837a12013-04-05 05:06:39 +00001492 PlatformCreateInstance create_callback,
1493 DebuggerInitializeCallback debugger_init_callback)
Greg Claytone996fd32011-03-08 22:40:15 +00001494{
1495 if (create_callback)
1496 {
Greg Claytonded470d2011-03-19 01:12:21 +00001497 Mutex::Locker locker (GetPlatformInstancesMutex ());
1498
Greg Claytone996fd32011-03-08 22:40:15 +00001499 PlatformInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +00001500 assert ((bool)name);
Greg Claytone996fd32011-03-08 22:40:15 +00001501 instance.name = name;
1502 if (description && description[0])
1503 instance.description = description;
1504 instance.create_callback = create_callback;
Jason Molenda9b837a12013-04-05 05:06:39 +00001505 instance.debugger_init_callback = debugger_init_callback;
Greg Claytonded470d2011-03-19 01:12:21 +00001506 GetPlatformInstances ().push_back (instance);
1507 return true;
Greg Claytone996fd32011-03-08 22:40:15 +00001508 }
1509 return false;
1510}
1511
Jason Molenda9b837a12013-04-05 05:06:39 +00001512
Greg Claytone996fd32011-03-08 22:40:15 +00001513const char *
1514PluginManager::GetPlatformPluginNameAtIndex (uint32_t idx)
1515{
Greg Claytonded470d2011-03-19 01:12:21 +00001516 Mutex::Locker locker (GetPlatformInstancesMutex ());
Greg Claytonab65b342011-04-13 22:47:15 +00001517 PlatformInstances &instances = GetPlatformInstances ();
1518 if (idx < instances.size())
Greg Clayton57abc5d2013-05-10 21:47:16 +00001519 return instances[idx].name.GetCString();
Greg Claytone996fd32011-03-08 22:40:15 +00001520 return NULL;
1521}
1522
1523const char *
1524PluginManager::GetPlatformPluginDescriptionAtIndex (uint32_t idx)
1525{
Greg Claytonded470d2011-03-19 01:12:21 +00001526 Mutex::Locker locker (GetPlatformInstancesMutex ());
Greg Claytonab65b342011-04-13 22:47:15 +00001527 PlatformInstances &instances = GetPlatformInstances ();
1528 if (idx < instances.size())
1529 return instances[idx].description.c_str();
Greg Claytone996fd32011-03-08 22:40:15 +00001530 return NULL;
1531}
1532
1533bool
1534PluginManager::UnregisterPlugin (PlatformCreateInstance create_callback)
1535{
1536 if (create_callback)
1537 {
Greg Claytonded470d2011-03-19 01:12:21 +00001538 Mutex::Locker locker (GetPlatformInstancesMutex ());
Greg Claytonab65b342011-04-13 22:47:15 +00001539 PlatformInstances &instances = GetPlatformInstances ();
Greg Claytonded470d2011-03-19 01:12:21 +00001540
Greg Claytonab65b342011-04-13 22:47:15 +00001541 PlatformInstances::iterator pos, end = instances.end();
1542 for (pos = instances.begin(); pos != end; ++ pos)
Greg Claytonded470d2011-03-19 01:12:21 +00001543 {
1544 if (pos->create_callback == create_callback)
1545 {
Greg Claytonab65b342011-04-13 22:47:15 +00001546 instances.erase(pos);
Greg Claytonded470d2011-03-19 01:12:21 +00001547 return true;
1548 }
1549 }
Greg Claytone996fd32011-03-08 22:40:15 +00001550 }
1551 return false;
1552}
1553
1554PlatformCreateInstance
1555PluginManager::GetPlatformCreateCallbackAtIndex (uint32_t idx)
1556{
Greg Claytonded470d2011-03-19 01:12:21 +00001557 Mutex::Locker locker (GetPlatformInstancesMutex ());
Greg Claytonab65b342011-04-13 22:47:15 +00001558 PlatformInstances &instances = GetPlatformInstances ();
1559 if (idx < instances.size())
1560 return instances[idx].create_callback;
Greg Claytone996fd32011-03-08 22:40:15 +00001561 return NULL;
1562}
1563
1564PlatformCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +00001565PluginManager::GetPlatformCreateCallbackForPluginName (const ConstString &name)
Greg Claytone996fd32011-03-08 22:40:15 +00001566{
Greg Clayton57abc5d2013-05-10 21:47:16 +00001567 if (name)
Greg Claytone996fd32011-03-08 22:40:15 +00001568 {
Greg Claytonded470d2011-03-19 01:12:21 +00001569 Mutex::Locker locker (GetPlatformInstancesMutex ());
Greg Claytonab65b342011-04-13 22:47:15 +00001570 PlatformInstances &instances = GetPlatformInstances ();
Greg Claytonded470d2011-03-19 01:12:21 +00001571
Greg Claytonab65b342011-04-13 22:47:15 +00001572 PlatformInstances::iterator pos, end = instances.end();
1573 for (pos = instances.begin(); pos != end; ++ pos)
Greg Claytone996fd32011-03-08 22:40:15 +00001574 {
Greg Clayton57abc5d2013-05-10 21:47:16 +00001575 if (name == pos->name)
Greg Claytonded470d2011-03-19 01:12:21 +00001576 return pos->create_callback;
Greg Claytone996fd32011-03-08 22:40:15 +00001577 }
1578 }
1579 return NULL;
1580}
1581
Greg Claytonc7bece562013-01-25 18:06:21 +00001582size_t
Greg Claytonab65b342011-04-13 22:47:15 +00001583PluginManager::AutoCompletePlatformName (const char *name, StringList &matches)
1584{
Greg Clayton57abc5d2013-05-10 21:47:16 +00001585 if (name)
Greg Claytonab65b342011-04-13 22:47:15 +00001586 {
1587 Mutex::Locker locker (GetPlatformInstancesMutex ());
1588 PlatformInstances &instances = GetPlatformInstances ();
1589 llvm::StringRef name_sref(name);
1590
1591 PlatformInstances::iterator pos, end = instances.end();
1592 for (pos = instances.begin(); pos != end; ++ pos)
1593 {
Greg Clayton57abc5d2013-05-10 21:47:16 +00001594 llvm::StringRef plugin_name (pos->name.GetCString());
Greg Clayton7260f622011-04-18 08:33:37 +00001595 if (plugin_name.startswith(name_sref))
1596 matches.AppendString (plugin_name.data());
Greg Claytonab65b342011-04-13 22:47:15 +00001597 }
1598 }
1599 return matches.GetSize();
1600}
Greg Claytone996fd32011-03-08 22:40:15 +00001601#pragma mark Process
1602
1603struct ProcessInstance
1604{
1605 ProcessInstance() :
Greg Clayton7f982402013-07-15 22:54:20 +00001606 name(),
1607 description(),
1608 create_callback(NULL),
1609 debugger_init_callback(NULL)
Greg Claytone996fd32011-03-08 22:40:15 +00001610 {
1611 }
1612
Greg Clayton57abc5d2013-05-10 21:47:16 +00001613 ConstString name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001614 std::string description;
1615 ProcessCreateInstance create_callback;
Greg Clayton7f982402013-07-15 22:54:20 +00001616 DebuggerInitializeCallback debugger_init_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001617};
1618
1619typedef std::vector<ProcessInstance> ProcessInstances;
1620
Greg Claytonab65b342011-04-13 22:47:15 +00001621static Mutex &
1622GetProcessMutex ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001623{
Greg Claytonab65b342011-04-13 22:47:15 +00001624 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
1625 return g_instances_mutex;
1626}
1627
1628static ProcessInstances &
1629GetProcessInstances ()
1630{
1631 static ProcessInstances g_instances;
1632 return g_instances;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001633}
1634
1635
1636bool
Greg Clayton7f982402013-07-15 22:54:20 +00001637PluginManager::RegisterPlugin (const ConstString &name,
1638 const char *description,
1639 ProcessCreateInstance create_callback,
1640 DebuggerInitializeCallback debugger_init_callback)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001641{
1642 if (create_callback)
1643 {
1644 ProcessInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +00001645 assert ((bool)name);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001646 instance.name = name;
1647 if (description && description[0])
1648 instance.description = description;
1649 instance.create_callback = create_callback;
Greg Clayton7f982402013-07-15 22:54:20 +00001650 instance.debugger_init_callback = debugger_init_callback;
Greg Claytonab65b342011-04-13 22:47:15 +00001651 Mutex::Locker locker (GetProcessMutex ());
1652 GetProcessInstances ().push_back (instance);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001653 }
1654 return false;
1655}
1656
Greg Claytonbfe5f3b2011-02-18 01:44:25 +00001657const char *
1658PluginManager::GetProcessPluginNameAtIndex (uint32_t idx)
1659{
Greg Claytonab65b342011-04-13 22:47:15 +00001660 Mutex::Locker locker (GetProcessMutex ());
1661 ProcessInstances &instances = GetProcessInstances ();
1662 if (idx < instances.size())
Greg Clayton57abc5d2013-05-10 21:47:16 +00001663 return instances[idx].name.GetCString();
Greg Claytonbfe5f3b2011-02-18 01:44:25 +00001664 return NULL;
1665}
1666
1667const char *
1668PluginManager::GetProcessPluginDescriptionAtIndex (uint32_t idx)
1669{
Greg Claytonab65b342011-04-13 22:47:15 +00001670 Mutex::Locker locker (GetProcessMutex ());
1671 ProcessInstances &instances = GetProcessInstances ();
1672 if (idx < instances.size())
1673 return instances[idx].description.c_str();
Greg Claytonbfe5f3b2011-02-18 01:44:25 +00001674 return NULL;
1675}
1676
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001677bool
1678PluginManager::UnregisterPlugin (ProcessCreateInstance create_callback)
1679{
1680 if (create_callback)
1681 {
Greg Claytonab65b342011-04-13 22:47:15 +00001682 Mutex::Locker locker (GetProcessMutex ());
1683 ProcessInstances &instances = GetProcessInstances ();
1684
1685 ProcessInstances::iterator pos, end = instances.end();
1686 for (pos = instances.begin(); pos != end; ++ pos)
1687 {
1688 if (pos->create_callback == create_callback)
1689 {
1690 instances.erase(pos);
1691 return true;
1692 }
1693 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001694 }
1695 return false;
1696}
1697
1698ProcessCreateInstance
1699PluginManager::GetProcessCreateCallbackAtIndex (uint32_t idx)
1700{
Greg Claytonab65b342011-04-13 22:47:15 +00001701 Mutex::Locker locker (GetProcessMutex ());
1702 ProcessInstances &instances = GetProcessInstances ();
1703 if (idx < instances.size())
1704 return instances[idx].create_callback;
Jason Molenda743e86a2010-06-11 23:44:18 +00001705 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001706}
1707
Greg Claytonab65b342011-04-13 22:47:15 +00001708
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001709ProcessCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +00001710PluginManager::GetProcessCreateCallbackForPluginName (const ConstString &name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001711{
Greg Clayton57abc5d2013-05-10 21:47:16 +00001712 if (name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001713 {
Greg Claytonab65b342011-04-13 22:47:15 +00001714 Mutex::Locker locker (GetProcessMutex ());
1715 ProcessInstances &instances = GetProcessInstances ();
1716
1717 ProcessInstances::iterator pos, end = instances.end();
1718 for (pos = instances.begin(); pos != end; ++ pos)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001719 {
Greg Clayton57abc5d2013-05-10 21:47:16 +00001720 if (name == pos->name)
Greg Claytonab65b342011-04-13 22:47:15 +00001721 return pos->create_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001722 }
1723 }
1724 return NULL;
1725}
1726
1727#pragma mark SymbolFile
1728
Jason Molenda743e86a2010-06-11 23:44:18 +00001729struct SymbolFileInstance
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001730{
1731 SymbolFileInstance() :
1732 name(),
1733 description(),
1734 create_callback(NULL)
1735 {
1736 }
1737
Greg Clayton57abc5d2013-05-10 21:47:16 +00001738 ConstString name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001739 std::string description;
1740 SymbolFileCreateInstance create_callback;
1741};
1742
1743typedef std::vector<SymbolFileInstance> SymbolFileInstances;
1744
Greg Claytonab65b342011-04-13 22:47:15 +00001745static Mutex &
1746GetSymbolFileMutex ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001747{
Greg Claytonab65b342011-04-13 22:47:15 +00001748 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
1749 return g_instances_mutex;
1750}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001751
Greg Claytonab65b342011-04-13 22:47:15 +00001752static SymbolFileInstances &
1753GetSymbolFileInstances ()
1754{
1755 static SymbolFileInstances g_instances;
1756 return g_instances;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001757}
1758
1759
1760bool
1761PluginManager::RegisterPlugin
1762(
Greg Clayton57abc5d2013-05-10 21:47:16 +00001763 const ConstString &name,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001764 const char *description,
1765 SymbolFileCreateInstance create_callback
1766)
1767{
1768 if (create_callback)
1769 {
1770 SymbolFileInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +00001771 assert ((bool)name);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001772 instance.name = name;
1773 if (description && description[0])
1774 instance.description = description;
1775 instance.create_callback = create_callback;
Greg Claytonab65b342011-04-13 22:47:15 +00001776 Mutex::Locker locker (GetSymbolFileMutex ());
1777 GetSymbolFileInstances ().push_back (instance);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001778 }
1779 return false;
1780}
1781
1782bool
1783PluginManager::UnregisterPlugin (SymbolFileCreateInstance create_callback)
1784{
1785 if (create_callback)
1786 {
Greg Claytonab65b342011-04-13 22:47:15 +00001787 Mutex::Locker locker (GetSymbolFileMutex ());
1788 SymbolFileInstances &instances = GetSymbolFileInstances ();
1789
1790 SymbolFileInstances::iterator pos, end = instances.end();
1791 for (pos = instances.begin(); pos != end; ++ pos)
1792 {
1793 if (pos->create_callback == create_callback)
1794 {
1795 instances.erase(pos);
1796 return true;
1797 }
1798 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001799 }
1800 return false;
1801}
1802
1803SymbolFileCreateInstance
1804PluginManager::GetSymbolFileCreateCallbackAtIndex (uint32_t idx)
1805{
Greg Claytonab65b342011-04-13 22:47:15 +00001806 Mutex::Locker locker (GetSymbolFileMutex ());
1807 SymbolFileInstances &instances = GetSymbolFileInstances ();
1808 if (idx < instances.size())
1809 return instances[idx].create_callback;
Jason Molenda743e86a2010-06-11 23:44:18 +00001810 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001811}
Greg Claytonab65b342011-04-13 22:47:15 +00001812
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001813SymbolFileCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +00001814PluginManager::GetSymbolFileCreateCallbackForPluginName (const ConstString &name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001815{
Greg Clayton57abc5d2013-05-10 21:47:16 +00001816 if (name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001817 {
Greg Claytonab65b342011-04-13 22:47:15 +00001818 Mutex::Locker locker (GetSymbolFileMutex ());
1819 SymbolFileInstances &instances = GetSymbolFileInstances ();
1820
1821 SymbolFileInstances::iterator pos, end = instances.end();
1822 for (pos = instances.begin(); pos != end; ++ pos)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001823 {
Greg Clayton57abc5d2013-05-10 21:47:16 +00001824 if (name == pos->name)
Greg Claytonab65b342011-04-13 22:47:15 +00001825 return pos->create_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001826 }
1827 }
1828 return NULL;
1829}
1830
1831
1832
1833#pragma mark SymbolVendor
1834
Jason Molenda743e86a2010-06-11 23:44:18 +00001835struct SymbolVendorInstance
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001836{
1837 SymbolVendorInstance() :
1838 name(),
1839 description(),
1840 create_callback(NULL)
1841 {
1842 }
1843
Greg Clayton57abc5d2013-05-10 21:47:16 +00001844 ConstString name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001845 std::string description;
1846 SymbolVendorCreateInstance create_callback;
1847};
1848
1849typedef std::vector<SymbolVendorInstance> SymbolVendorInstances;
1850
Greg Claytonab65b342011-04-13 22:47:15 +00001851static Mutex &
1852GetSymbolVendorMutex ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001853{
Greg Claytonab65b342011-04-13 22:47:15 +00001854 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
1855 return g_instances_mutex;
1856}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001857
Greg Claytonab65b342011-04-13 22:47:15 +00001858static SymbolVendorInstances &
1859GetSymbolVendorInstances ()
1860{
1861 static SymbolVendorInstances g_instances;
1862 return g_instances;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001863}
1864
1865bool
1866PluginManager::RegisterPlugin
1867(
Greg Clayton57abc5d2013-05-10 21:47:16 +00001868 const ConstString &name,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001869 const char *description,
1870 SymbolVendorCreateInstance create_callback
1871)
1872{
1873 if (create_callback)
1874 {
1875 SymbolVendorInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +00001876 assert ((bool)name);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001877 instance.name = name;
1878 if (description && description[0])
1879 instance.description = description;
1880 instance.create_callback = create_callback;
Greg Claytonab65b342011-04-13 22:47:15 +00001881 Mutex::Locker locker (GetSymbolVendorMutex ());
1882 GetSymbolVendorInstances ().push_back (instance);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001883 }
1884 return false;
1885}
1886
1887bool
1888PluginManager::UnregisterPlugin (SymbolVendorCreateInstance create_callback)
1889{
1890 if (create_callback)
1891 {
Greg Claytonab65b342011-04-13 22:47:15 +00001892 Mutex::Locker locker (GetSymbolVendorMutex ());
1893 SymbolVendorInstances &instances = GetSymbolVendorInstances ();
1894
1895 SymbolVendorInstances::iterator pos, end = instances.end();
1896 for (pos = instances.begin(); pos != end; ++ pos)
1897 {
1898 if (pos->create_callback == create_callback)
1899 {
1900 instances.erase(pos);
1901 return true;
1902 }
1903 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001904 }
1905 return false;
1906}
1907
1908SymbolVendorCreateInstance
1909PluginManager::GetSymbolVendorCreateCallbackAtIndex (uint32_t idx)
1910{
Greg Claytonab65b342011-04-13 22:47:15 +00001911 Mutex::Locker locker (GetSymbolVendorMutex ());
1912 SymbolVendorInstances &instances = GetSymbolVendorInstances ();
1913 if (idx < instances.size())
1914 return instances[idx].create_callback;
Jason Molenda743e86a2010-06-11 23:44:18 +00001915 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001916}
1917
Greg Claytonab65b342011-04-13 22:47:15 +00001918
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001919SymbolVendorCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +00001920PluginManager::GetSymbolVendorCreateCallbackForPluginName (const ConstString &name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001921{
Greg Clayton57abc5d2013-05-10 21:47:16 +00001922 if (name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001923 {
Greg Claytonab65b342011-04-13 22:47:15 +00001924 Mutex::Locker locker (GetSymbolVendorMutex ());
1925 SymbolVendorInstances &instances = GetSymbolVendorInstances ();
1926
1927 SymbolVendorInstances::iterator pos, end = instances.end();
1928 for (pos = instances.begin(); pos != end; ++ pos)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001929 {
Greg Clayton57abc5d2013-05-10 21:47:16 +00001930 if (name == pos->name)
Greg Claytonab65b342011-04-13 22:47:15 +00001931 return pos->create_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001932 }
1933 }
1934 return NULL;
1935}
1936
1937
Greg Clayton7be25422011-04-25 21:14:26 +00001938#pragma mark UnwindAssembly
Jason Molendafbcb7f22010-09-10 07:49:16 +00001939
Greg Clayton7be25422011-04-25 21:14:26 +00001940struct UnwindAssemblyInstance
Jason Molendafbcb7f22010-09-10 07:49:16 +00001941{
Greg Clayton7be25422011-04-25 21:14:26 +00001942 UnwindAssemblyInstance() :
Jason Molendafbcb7f22010-09-10 07:49:16 +00001943 name(),
1944 description(),
1945 create_callback(NULL)
1946 {
1947 }
1948
Greg Clayton57abc5d2013-05-10 21:47:16 +00001949 ConstString name;
Jason Molendafbcb7f22010-09-10 07:49:16 +00001950 std::string description;
Greg Clayton7be25422011-04-25 21:14:26 +00001951 UnwindAssemblyCreateInstance create_callback;
Jason Molendafbcb7f22010-09-10 07:49:16 +00001952};
1953
Greg Clayton7be25422011-04-25 21:14:26 +00001954typedef std::vector<UnwindAssemblyInstance> UnwindAssemblyInstances;
Jason Molendafbcb7f22010-09-10 07:49:16 +00001955
Greg Claytonab65b342011-04-13 22:47:15 +00001956static Mutex &
Greg Clayton7be25422011-04-25 21:14:26 +00001957GetUnwindAssemblyMutex ()
Jason Molendafbcb7f22010-09-10 07:49:16 +00001958{
Greg Claytonab65b342011-04-13 22:47:15 +00001959 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
1960 return g_instances_mutex;
1961}
Jason Molendafbcb7f22010-09-10 07:49:16 +00001962
Greg Clayton7be25422011-04-25 21:14:26 +00001963static UnwindAssemblyInstances &
1964GetUnwindAssemblyInstances ()
Greg Claytonab65b342011-04-13 22:47:15 +00001965{
Greg Clayton7be25422011-04-25 21:14:26 +00001966 static UnwindAssemblyInstances g_instances;
Greg Claytonab65b342011-04-13 22:47:15 +00001967 return g_instances;
Jason Molendafbcb7f22010-09-10 07:49:16 +00001968}
1969
1970bool
1971PluginManager::RegisterPlugin
1972(
Greg Clayton57abc5d2013-05-10 21:47:16 +00001973 const ConstString &name,
Jason Molendafbcb7f22010-09-10 07:49:16 +00001974 const char *description,
Greg Clayton7be25422011-04-25 21:14:26 +00001975 UnwindAssemblyCreateInstance create_callback
Jason Molendafbcb7f22010-09-10 07:49:16 +00001976)
1977{
1978 if (create_callback)
1979 {
Greg Clayton7be25422011-04-25 21:14:26 +00001980 UnwindAssemblyInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +00001981 assert ((bool)name);
Jason Molendafbcb7f22010-09-10 07:49:16 +00001982 instance.name = name;
1983 if (description && description[0])
1984 instance.description = description;
1985 instance.create_callback = create_callback;
Greg Clayton7be25422011-04-25 21:14:26 +00001986 Mutex::Locker locker (GetUnwindAssemblyMutex ());
1987 GetUnwindAssemblyInstances ().push_back (instance);
Jason Molendafbcb7f22010-09-10 07:49:16 +00001988 }
1989 return false;
1990}
1991
1992bool
Greg Clayton7be25422011-04-25 21:14:26 +00001993PluginManager::UnregisterPlugin (UnwindAssemblyCreateInstance create_callback)
Jason Molendafbcb7f22010-09-10 07:49:16 +00001994{
1995 if (create_callback)
1996 {
Greg Clayton7be25422011-04-25 21:14:26 +00001997 Mutex::Locker locker (GetUnwindAssemblyMutex ());
1998 UnwindAssemblyInstances &instances = GetUnwindAssemblyInstances ();
Greg Claytonab65b342011-04-13 22:47:15 +00001999
Greg Clayton7be25422011-04-25 21:14:26 +00002000 UnwindAssemblyInstances::iterator pos, end = instances.end();
Greg Claytonab65b342011-04-13 22:47:15 +00002001 for (pos = instances.begin(); pos != end; ++ pos)
2002 {
2003 if (pos->create_callback == create_callback)
2004 {
2005 instances.erase(pos);
2006 return true;
2007 }
2008 }
Jason Molendafbcb7f22010-09-10 07:49:16 +00002009 }
2010 return false;
2011}
2012
Greg Clayton7be25422011-04-25 21:14:26 +00002013UnwindAssemblyCreateInstance
2014PluginManager::GetUnwindAssemblyCreateCallbackAtIndex (uint32_t idx)
Jason Molendafbcb7f22010-09-10 07:49:16 +00002015{
Greg Clayton7be25422011-04-25 21:14:26 +00002016 Mutex::Locker locker (GetUnwindAssemblyMutex ());
2017 UnwindAssemblyInstances &instances = GetUnwindAssemblyInstances ();
Greg Claytonab65b342011-04-13 22:47:15 +00002018 if (idx < instances.size())
2019 return instances[idx].create_callback;
Jason Molendafbcb7f22010-09-10 07:49:16 +00002020 return NULL;
2021}
2022
Greg Claytonab65b342011-04-13 22:47:15 +00002023
Greg Clayton7be25422011-04-25 21:14:26 +00002024UnwindAssemblyCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +00002025PluginManager::GetUnwindAssemblyCreateCallbackForPluginName (const ConstString &name)
Jason Molendafbcb7f22010-09-10 07:49:16 +00002026{
Greg Clayton57abc5d2013-05-10 21:47:16 +00002027 if (name)
Jason Molendafbcb7f22010-09-10 07:49:16 +00002028 {
Greg Clayton7be25422011-04-25 21:14:26 +00002029 Mutex::Locker locker (GetUnwindAssemblyMutex ());
2030 UnwindAssemblyInstances &instances = GetUnwindAssemblyInstances ();
Greg Claytonab65b342011-04-13 22:47:15 +00002031
Greg Clayton7be25422011-04-25 21:14:26 +00002032 UnwindAssemblyInstances::iterator pos, end = instances.end();
Greg Claytonab65b342011-04-13 22:47:15 +00002033 for (pos = instances.begin(); pos != end; ++ pos)
Jason Molendafbcb7f22010-09-10 07:49:16 +00002034 {
Greg Clayton57abc5d2013-05-10 21:47:16 +00002035 if (name == pos->name)
Greg Claytonab65b342011-04-13 22:47:15 +00002036 return pos->create_callback;
Jason Molendafbcb7f22010-09-10 07:49:16 +00002037 }
2038 }
2039 return NULL;
2040}
2041
Greg Claytone8cd0c92012-10-19 18:02:49 +00002042void
2043PluginManager::DebuggerInitialize (Debugger &debugger)
2044{
Jason Molenda9b837a12013-04-05 05:06:39 +00002045 // Initialize the DynamicLoader plugins
Greg Claytone8cd0c92012-10-19 18:02:49 +00002046 {
Jason Molenda9b837a12013-04-05 05:06:39 +00002047 Mutex::Locker locker (GetDynamicLoaderMutex ());
2048 DynamicLoaderInstances &instances = GetDynamicLoaderInstances ();
2049
2050 DynamicLoaderInstances::iterator pos, end = instances.end();
2051 for (pos = instances.begin(); pos != end; ++ pos)
2052 {
2053 if (pos->debugger_init_callback)
2054 pos->debugger_init_callback (debugger);
2055 }
2056 }
2057
Andrew MacPherson17220c12014-03-05 10:12:43 +00002058 // Initialize the JITLoader plugins
2059 {
2060 Mutex::Locker locker (GetJITLoaderMutex ());
2061 JITLoaderInstances &instances = GetJITLoaderInstances ();
2062
2063 JITLoaderInstances::iterator pos, end = instances.end();
2064 for (pos = instances.begin(); pos != end; ++ pos)
2065 {
2066 if (pos->debugger_init_callback)
2067 pos->debugger_init_callback (debugger);
2068 }
2069 }
2070
Jason Molenda9b837a12013-04-05 05:06:39 +00002071 // Initialize the Platform plugins
2072 {
2073 Mutex::Locker locker (GetPlatformInstancesMutex ());
2074 PlatformInstances &instances = GetPlatformInstances ();
2075
2076 PlatformInstances::iterator pos, end = instances.end();
2077 for (pos = instances.begin(); pos != end; ++ pos)
2078 {
2079 if (pos->debugger_init_callback)
2080 pos->debugger_init_callback (debugger);
2081 }
Greg Claytone8cd0c92012-10-19 18:02:49 +00002082 }
Greg Clayton7f982402013-07-15 22:54:20 +00002083
2084 // Initialize the Process plugins
2085 {
2086 Mutex::Locker locker (GetProcessMutex());
2087 ProcessInstances &instances = GetProcessInstances();
2088
2089 ProcessInstances::iterator pos, end = instances.end();
2090 for (pos = instances.begin(); pos != end; ++ pos)
2091 {
2092 if (pos->debugger_init_callback)
2093 pos->debugger_init_callback (debugger);
2094 }
2095 }
2096
Greg Claytone8cd0c92012-10-19 18:02:49 +00002097}
2098
Greg Clayton7f982402013-07-15 22:54:20 +00002099// This is the preferred new way to register plugin specific settings. e.g.
2100// 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 +00002101static lldb::OptionValuePropertiesSP
Greg Clayton7f982402013-07-15 22:54:20 +00002102GetDebuggerPropertyForPlugins (Debugger &debugger,
Jason Molenda3b59f5c2013-04-05 22:40:42 +00002103 const ConstString &plugin_type_name,
2104 const ConstString &plugin_type_desc,
2105 bool can_create)
Greg Claytone8cd0c92012-10-19 18:02:49 +00002106{
2107 lldb::OptionValuePropertiesSP parent_properties_sp (debugger.GetValueProperties());
2108 if (parent_properties_sp)
2109 {
2110 static ConstString g_property_name("plugin");
2111
2112 OptionValuePropertiesSP plugin_properties_sp = parent_properties_sp->GetSubProperty (NULL, g_property_name);
2113 if (!plugin_properties_sp && can_create)
2114 {
2115 plugin_properties_sp.reset (new OptionValueProperties (g_property_name));
2116 parent_properties_sp->AppendProperty (g_property_name,
2117 ConstString("Settings specify to plugins."),
2118 true,
2119 plugin_properties_sp);
2120 }
2121
2122 if (plugin_properties_sp)
2123 {
2124 lldb::OptionValuePropertiesSP plugin_type_properties_sp = plugin_properties_sp->GetSubProperty (NULL, plugin_type_name);
2125 if (!plugin_type_properties_sp && can_create)
2126 {
2127 plugin_type_properties_sp.reset (new OptionValueProperties (plugin_type_name));
2128 plugin_properties_sp->AppendProperty (plugin_type_name,
2129 plugin_type_desc,
2130 true,
2131 plugin_type_properties_sp);
2132 }
2133 return plugin_type_properties_sp;
2134 }
2135 }
2136 return lldb::OptionValuePropertiesSP();
2137}
2138
Greg Clayton7f982402013-07-15 22:54:20 +00002139// This is deprecated way to register plugin specific settings. e.g.
2140// "<plugin_type_name>.plugin.<plugin_type_desc>.SETTINGNAME"
Jason Molenda3b59f5c2013-04-05 22:40:42 +00002141// and Platform generic settings would be under "platform.SETTINGNAME".
2142static lldb::OptionValuePropertiesSP
Greg Clayton7f982402013-07-15 22:54:20 +00002143GetDebuggerPropertyForPluginsOldStyle (Debugger &debugger,
2144 const ConstString &plugin_type_name,
2145 const ConstString &plugin_type_desc,
2146 bool can_create)
Jason Molenda3b59f5c2013-04-05 22:40:42 +00002147{
2148 static ConstString g_property_name("plugin");
2149 lldb::OptionValuePropertiesSP parent_properties_sp (debugger.GetValueProperties());
2150 if (parent_properties_sp)
2151 {
2152 OptionValuePropertiesSP plugin_properties_sp = parent_properties_sp->GetSubProperty (NULL, plugin_type_name);
2153 if (!plugin_properties_sp && can_create)
2154 {
2155 plugin_properties_sp.reset (new OptionValueProperties (plugin_type_name));
2156 parent_properties_sp->AppendProperty (plugin_type_name,
2157 plugin_type_desc,
2158 true,
2159 plugin_properties_sp);
2160 }
2161
2162 if (plugin_properties_sp)
2163 {
2164 lldb::OptionValuePropertiesSP plugin_type_properties_sp = plugin_properties_sp->GetSubProperty (NULL, g_property_name);
2165 if (!plugin_type_properties_sp && can_create)
2166 {
2167 plugin_type_properties_sp.reset (new OptionValueProperties (g_property_name));
2168 plugin_properties_sp->AppendProperty (g_property_name,
2169 ConstString("Settings specific to plugins"),
2170 true,
2171 plugin_type_properties_sp);
2172 }
2173 return plugin_type_properties_sp;
2174 }
2175 }
2176 return lldb::OptionValuePropertiesSP();
2177}
2178
2179
Greg Claytone8cd0c92012-10-19 18:02:49 +00002180lldb::OptionValuePropertiesSP
2181PluginManager::GetSettingForDynamicLoaderPlugin (Debugger &debugger, const ConstString &setting_name)
2182{
2183 lldb::OptionValuePropertiesSP properties_sp;
Greg Clayton7f982402013-07-15 22:54:20 +00002184 lldb::OptionValuePropertiesSP plugin_type_properties_sp (GetDebuggerPropertyForPlugins (debugger,
Greg Claytone8cd0c92012-10-19 18:02:49 +00002185 ConstString("dynamic-loader"),
2186 ConstString(), // not creating to so we don't need the description
2187 false));
2188 if (plugin_type_properties_sp)
2189 properties_sp = plugin_type_properties_sp->GetSubProperty (NULL, setting_name);
2190 return properties_sp;
2191}
2192
2193bool
2194PluginManager::CreateSettingForDynamicLoaderPlugin (Debugger &debugger,
2195 const lldb::OptionValuePropertiesSP &properties_sp,
2196 const ConstString &description,
2197 bool is_global_property)
2198{
2199 if (properties_sp)
2200 {
Greg Clayton7f982402013-07-15 22:54:20 +00002201 lldb::OptionValuePropertiesSP plugin_type_properties_sp (GetDebuggerPropertyForPlugins (debugger,
Greg Claytone8cd0c92012-10-19 18:02:49 +00002202 ConstString("dynamic-loader"),
2203 ConstString("Settings for dynamic loader plug-ins"),
2204 true));
2205 if (plugin_type_properties_sp)
2206 {
2207 plugin_type_properties_sp->AppendProperty (properties_sp->GetName(),
2208 description,
2209 is_global_property,
2210 properties_sp);
2211 return true;
2212 }
2213 }
2214 return false;
2215}
2216
Jason Molenda9b837a12013-04-05 05:06:39 +00002217
2218lldb::OptionValuePropertiesSP
2219PluginManager::GetSettingForPlatformPlugin (Debugger &debugger, const ConstString &setting_name)
2220{
2221 lldb::OptionValuePropertiesSP properties_sp;
Greg Clayton7f982402013-07-15 22:54:20 +00002222 lldb::OptionValuePropertiesSP plugin_type_properties_sp (GetDebuggerPropertyForPluginsOldStyle (debugger,
2223 ConstString("platform"),
2224 ConstString(), // not creating to so we don't need the description
2225 false));
Jason Molenda9b837a12013-04-05 05:06:39 +00002226 if (plugin_type_properties_sp)
2227 properties_sp = plugin_type_properties_sp->GetSubProperty (NULL, setting_name);
2228 return properties_sp;
2229}
2230
2231bool
2232PluginManager::CreateSettingForPlatformPlugin (Debugger &debugger,
2233 const lldb::OptionValuePropertiesSP &properties_sp,
2234 const ConstString &description,
2235 bool is_global_property)
2236{
2237 if (properties_sp)
2238 {
Greg Clayton7f982402013-07-15 22:54:20 +00002239 lldb::OptionValuePropertiesSP plugin_type_properties_sp (GetDebuggerPropertyForPluginsOldStyle (debugger,
2240 ConstString("platform"),
2241 ConstString("Settings for platform plug-ins"),
2242 true));
2243 if (plugin_type_properties_sp)
2244 {
2245 plugin_type_properties_sp->AppendProperty (properties_sp->GetName(),
2246 description,
2247 is_global_property,
2248 properties_sp);
2249 return true;
2250 }
2251 }
2252 return false;
2253}
2254
2255
2256lldb::OptionValuePropertiesSP
2257PluginManager::GetSettingForProcessPlugin (Debugger &debugger, const ConstString &setting_name)
2258{
2259 lldb::OptionValuePropertiesSP properties_sp;
2260 lldb::OptionValuePropertiesSP plugin_type_properties_sp (GetDebuggerPropertyForPlugins (debugger,
2261 ConstString("process"),
2262 ConstString(), // not creating to so we don't need the description
2263 false));
2264 if (plugin_type_properties_sp)
2265 properties_sp = plugin_type_properties_sp->GetSubProperty (NULL, setting_name);
2266 return properties_sp;
2267}
2268
2269bool
2270PluginManager::CreateSettingForProcessPlugin (Debugger &debugger,
2271 const lldb::OptionValuePropertiesSP &properties_sp,
2272 const ConstString &description,
2273 bool is_global_property)
2274{
2275 if (properties_sp)
2276 {
Jason Molenda9b837a12013-04-05 05:06:39 +00002277 lldb::OptionValuePropertiesSP plugin_type_properties_sp (GetDebuggerPropertyForPlugins (debugger,
Greg Clayton7f982402013-07-15 22:54:20 +00002278 ConstString("process"),
2279 ConstString("Settings for process plug-ins"),
Jason Molenda9b837a12013-04-05 05:06:39 +00002280 true));
2281 if (plugin_type_properties_sp)
2282 {
2283 plugin_type_properties_sp->AppendProperty (properties_sp->GetName(),
2284 description,
2285 is_global_property,
2286 properties_sp);
2287 return true;
2288 }
2289 }
2290 return false;
2291}
2292