blob: cda55802fab864d378fc546f12b66e656887d683 [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"
Zachary Turner42ff0ad2014-08-21 17:29:12 +000023#include "lldb/Host/HostInfo.h"
Greg Clayton4272cc72011-02-02 02:24:04 +000024#include "lldb/Host/Mutex.h"
Greg Claytone8cd0c92012-10-19 18:02:49 +000025#include "lldb/Interpreter/OptionValueProperties.h"
Greg Clayton4272cc72011-02-02 02:24:04 +000026
Greg Claytonab65b342011-04-13 22:47:15 +000027#include "llvm/ADT/StringRef.h"
Zachary Turner58a559c2014-08-27 20:15:09 +000028#include "llvm/Support/DynamicLibrary.h"
Greg Claytonab65b342011-04-13 22:47:15 +000029
Greg Clayton4272cc72011-02-02 02:24:04 +000030using namespace lldb;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000031using namespace lldb_private;
32
Jason Molenda743e86a2010-06-11 23:44:18 +000033enum PluginAction
Chris Lattner30fdc8d2010-06-08 16:52:24 +000034{
35 ePluginRegisterInstance,
36 ePluginUnregisterInstance,
37 ePluginGetInstanceAtIndex
38};
39
Greg Clayton03da4cc2013-04-19 21:31:16 +000040
41typedef bool (*PluginInitCallback) (void);
42typedef void (*PluginTermCallback) (void);
43
Greg Clayton4272cc72011-02-02 02:24:04 +000044struct PluginInfo
45{
Zachary Turner58a559c2014-08-27 20:15:09 +000046 PluginInfo()
47 : plugin_init_callback(nullptr), plugin_term_callback(nullptr)
48 {
49 }
50
51 llvm::sys::DynamicLibrary library;
Greg Clayton03da4cc2013-04-19 21:31:16 +000052 PluginInitCallback plugin_init_callback;
53 PluginTermCallback plugin_term_callback;
Greg Clayton4272cc72011-02-02 02:24:04 +000054};
55
56typedef std::map<FileSpec, PluginInfo> PluginTerminateMap;
57
58static Mutex &
59GetPluginMapMutex ()
60{
61 static Mutex g_plugin_map_mutex (Mutex::eMutexTypeRecursive);
62 return g_plugin_map_mutex;
63}
64
65static PluginTerminateMap &
66GetPluginMap ()
67{
68 static PluginTerminateMap g_plugin_map;
69 return g_plugin_map;
70}
71
72static bool
73PluginIsLoaded (const FileSpec &plugin_file_spec)
74{
75 Mutex::Locker locker (GetPluginMapMutex ());
76 PluginTerminateMap &plugin_map = GetPluginMap ();
77 return plugin_map.find (plugin_file_spec) != plugin_map.end();
78}
79
80static void
81SetPluginInfo (const FileSpec &plugin_file_spec, const PluginInfo &plugin_info)
82{
83 Mutex::Locker locker (GetPluginMapMutex ());
84 PluginTerminateMap &plugin_map = GetPluginMap ();
Michael Sartain3cf443d2013-07-17 00:26:30 +000085 assert (plugin_map.find (plugin_file_spec) == plugin_map.end());
Greg Clayton4272cc72011-02-02 02:24:04 +000086 plugin_map[plugin_file_spec] = plugin_info;
87}
88
David Majnemer5ff02782014-07-22 21:59:22 +000089template <typename FPtrTy>
90static FPtrTy
91CastToFPtr (void *VPtr)
92{
93 return reinterpret_cast<FPtrTy>(reinterpret_cast<intptr_t>(VPtr));
94}
Greg Clayton4272cc72011-02-02 02:24:04 +000095
96static FileSpec::EnumerateDirectoryResult
97LoadPluginCallback
98(
99 void *baton,
100 FileSpec::FileType file_type,
101 const FileSpec &file_spec
102)
103{
104// PluginManager *plugin_manager = (PluginManager *)baton;
105 Error error;
106
107 // If we have a regular file, a symbolic link or unknown file type, try
108 // and process the file. We must handle unknown as sometimes the directory
109 // enumeration might be enumerating a file system that doesn't have correct
110 // file type information.
111 if (file_type == FileSpec::eFileTypeRegular ||
112 file_type == FileSpec::eFileTypeSymbolicLink ||
113 file_type == FileSpec::eFileTypeUnknown )
114 {
115 FileSpec plugin_file_spec (file_spec);
116 plugin_file_spec.ResolvePath();
117
118 if (PluginIsLoaded (plugin_file_spec))
119 return FileSpec::eEnumerateDirectoryResultNext;
120 else
121 {
Zachary Turner58a559c2014-08-27 20:15:09 +0000122 PluginInfo plugin_info;
Greg Clayton45319462011-02-08 00:35:34 +0000123
Zachary Turner58a559c2014-08-27 20:15:09 +0000124 std::string pluginLoadError;
125 plugin_info.library = llvm::sys::DynamicLibrary::getPermanentLibrary (plugin_file_spec.GetPath().c_str(), &pluginLoadError);
126 if (plugin_info.library.isValid())
Greg Clayton4272cc72011-02-02 02:24:04 +0000127 {
128 bool success = false;
David Majnemer5ff02782014-07-22 21:59:22 +0000129 plugin_info.plugin_init_callback =
Zachary Turner58a559c2014-08-27 20:15:09 +0000130 CastToFPtr<PluginInitCallback>(plugin_info.library.getAddressOfSymbol("LLDBPluginInitialize"));
Greg Clayton4272cc72011-02-02 02:24:04 +0000131 if (plugin_info.plugin_init_callback)
132 {
133 // Call the plug-in "bool LLDBPluginInitialize(void)" function
Greg Clayton03da4cc2013-04-19 21:31:16 +0000134 success = plugin_info.plugin_init_callback();
Greg Clayton4272cc72011-02-02 02:24:04 +0000135 }
136
137 if (success)
138 {
139 // It is ok for the "LLDBPluginTerminate" symbol to be NULL
David Majnemer5ff02782014-07-22 21:59:22 +0000140 plugin_info.plugin_term_callback =
Zachary Turner58a559c2014-08-27 20:15:09 +0000141 CastToFPtr<PluginTermCallback>(plugin_info.library.getAddressOfSymbol("LLDBPluginTerminate"));
Greg Clayton4272cc72011-02-02 02:24:04 +0000142 }
143 else
144 {
Zachary Turner58a559c2014-08-27 20:15:09 +0000145 // The initialize function returned FALSE which means the plug-in might not be
146 // compatible, or might be too new or too old, or might not want to run on this
147 // machine. Set it to a default-constructed instance to invalidate it.
148 plugin_info = PluginInfo();
Greg Clayton4272cc72011-02-02 02:24:04 +0000149 }
150
151 // Regardless of success or failure, cache the plug-in load
152 // in our plug-in info so we don't try to load it again and
153 // again.
154 SetPluginInfo (plugin_file_spec, plugin_info);
155
156 return FileSpec::eEnumerateDirectoryResultNext;
157 }
158 }
159 }
160
161 if (file_type == FileSpec::eFileTypeUnknown ||
162 file_type == FileSpec::eFileTypeDirectory ||
163 file_type == FileSpec::eFileTypeSymbolicLink )
164 {
165 // Try and recurse into anything that a directory or symbolic link.
166 // We must also do this for unknown as sometimes the directory enumeration
Bruce Mitchener6a7f3332014-06-27 02:42:12 +0000167 // might be enumerating a file system that doesn't have correct file type
Greg Clayton4272cc72011-02-02 02:24:04 +0000168 // information.
169 return FileSpec::eEnumerateDirectoryResultEnter;
170 }
171
172 return FileSpec::eEnumerateDirectoryResultNext;
173}
174
175
176void
177PluginManager::Initialize ()
178{
Greg Clayton1cb64962011-03-24 04:28:38 +0000179#if 1
Greg Clayton4272cc72011-02-02 02:24:04 +0000180 FileSpec dir_spec;
181 const bool find_directories = true;
182 const bool find_files = true;
183 const bool find_other = true;
184 char dir_path[PATH_MAX];
Zachary Turner42ff0ad2014-08-21 17:29:12 +0000185 if (HostInfo::GetLLDBPath(ePathTypeLLDBSystemPlugins, dir_spec))
Greg Clayton4272cc72011-02-02 02:24:04 +0000186 {
187 if (dir_spec.Exists() && dir_spec.GetPath(dir_path, sizeof(dir_path)))
188 {
189 FileSpec::EnumerateDirectory (dir_path,
190 find_directories,
191 find_files,
192 find_other,
193 LoadPluginCallback,
194 NULL);
195 }
196 }
197
Zachary Turner42ff0ad2014-08-21 17:29:12 +0000198 if (HostInfo::GetLLDBPath(ePathTypeLLDBUserPlugins, dir_spec))
Greg Clayton4272cc72011-02-02 02:24:04 +0000199 {
200 if (dir_spec.Exists() && dir_spec.GetPath(dir_path, sizeof(dir_path)))
201 {
202 FileSpec::EnumerateDirectory (dir_path,
203 find_directories,
204 find_files,
205 find_other,
206 LoadPluginCallback,
207 NULL);
208 }
209 }
Greg Clayton1cb64962011-03-24 04:28:38 +0000210#endif
Greg Clayton4272cc72011-02-02 02:24:04 +0000211}
212
213void
214PluginManager::Terminate ()
215{
216 Mutex::Locker locker (GetPluginMapMutex ());
217 PluginTerminateMap &plugin_map = GetPluginMap ();
218
219 PluginTerminateMap::const_iterator pos, end = plugin_map.end();
220 for (pos = plugin_map.begin(); pos != end; ++pos)
221 {
222 // Call the plug-in "void LLDBPluginTerminate (void)" function if there
223 // is one (if the symbol was not NULL).
Zachary Turner58a559c2014-08-27 20:15:09 +0000224 if (pos->second.library.isValid())
Greg Clayton4272cc72011-02-02 02:24:04 +0000225 {
226 if (pos->second.plugin_term_callback)
Greg Clayton03da4cc2013-04-19 21:31:16 +0000227 pos->second.plugin_term_callback();
Greg Clayton4272cc72011-02-02 02:24:04 +0000228 }
229 }
230 plugin_map.clear();
231}
232
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000233
234#pragma mark ABI
235
236
Jason Molenda743e86a2010-06-11 23:44:18 +0000237struct ABIInstance
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000238{
239 ABIInstance() :
240 name(),
241 description(),
242 create_callback(NULL)
243 {
244 }
245
Greg Clayton57abc5d2013-05-10 21:47:16 +0000246 ConstString name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000247 std::string description;
248 ABICreateInstance create_callback;
249};
250
251typedef std::vector<ABIInstance> ABIInstances;
252
Greg Claytonded470d2011-03-19 01:12:21 +0000253static Mutex &
254GetABIInstancesMutex ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000255{
Greg Claytonded470d2011-03-19 01:12:21 +0000256 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
257 return g_instances_mutex;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000258}
259
Greg Claytonded470d2011-03-19 01:12:21 +0000260static ABIInstances &
261GetABIInstances ()
262{
263 static ABIInstances g_instances;
264 return g_instances;
265}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000266
267bool
268PluginManager::RegisterPlugin
Greg Clayton4272cc72011-02-02 02:24:04 +0000269(
Greg Clayton57abc5d2013-05-10 21:47:16 +0000270 const ConstString &name,
Greg Clayton4272cc72011-02-02 02:24:04 +0000271 const char *description,
272 ABICreateInstance create_callback
273)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000274{
275 if (create_callback)
276 {
277 ABIInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +0000278 assert ((bool)name);
279 instance.name = name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000280 if (description && description[0])
281 instance.description = description;
282 instance.create_callback = create_callback;
Greg Claytonded470d2011-03-19 01:12:21 +0000283 Mutex::Locker locker (GetABIInstancesMutex ());
284 GetABIInstances ().push_back (instance);
285 return true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000286 }
287 return false;
288}
289
290bool
291PluginManager::UnregisterPlugin (ABICreateInstance create_callback)
292{
293 if (create_callback)
294 {
Greg Claytonded470d2011-03-19 01:12:21 +0000295 Mutex::Locker locker (GetABIInstancesMutex ());
296 ABIInstances &instances = GetABIInstances ();
297
298 ABIInstances::iterator pos, end = instances.end();
299 for (pos = instances.begin(); pos != end; ++ pos)
300 {
301 if (pos->create_callback == create_callback)
302 {
303 instances.erase(pos);
304 return true;
305 }
306 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000307 }
308 return false;
309}
310
311ABICreateInstance
312PluginManager::GetABICreateCallbackAtIndex (uint32_t idx)
313{
Greg Claytonded470d2011-03-19 01:12:21 +0000314 Mutex::Locker locker (GetABIInstancesMutex ());
315 ABIInstances &instances = GetABIInstances ();
Greg Claytonded470d2011-03-19 01:12:21 +0000316 if (idx < instances.size())
317 return instances[idx].create_callback;
Jason Molenda743e86a2010-06-11 23:44:18 +0000318 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000319}
320
321ABICreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +0000322PluginManager::GetABICreateCallbackForPluginName (const ConstString &name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000323{
Greg Clayton57abc5d2013-05-10 21:47:16 +0000324 if (name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000325 {
Greg Claytonded470d2011-03-19 01:12:21 +0000326 Mutex::Locker locker (GetABIInstancesMutex ());
Greg Claytonded470d2011-03-19 01:12:21 +0000327 ABIInstances &instances = GetABIInstances ();
328
329 ABIInstances::iterator pos, end = instances.end();
330 for (pos = instances.begin(); pos != end; ++ pos)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000331 {
Greg Clayton57abc5d2013-05-10 21:47:16 +0000332 if (name == pos->name)
Greg Claytonded470d2011-03-19 01:12:21 +0000333 return pos->create_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000334 }
335 }
336 return NULL;
337}
338
339
340#pragma mark Disassembler
341
342
Jason Molenda743e86a2010-06-11 23:44:18 +0000343struct DisassemblerInstance
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000344{
345 DisassemblerInstance() :
346 name(),
347 description(),
348 create_callback(NULL)
349 {
350 }
351
Greg Clayton57abc5d2013-05-10 21:47:16 +0000352 ConstString name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000353 std::string description;
354 DisassemblerCreateInstance create_callback;
355};
356
357typedef std::vector<DisassemblerInstance> DisassemblerInstances;
358
Greg Claytonab65b342011-04-13 22:47:15 +0000359static Mutex &
360GetDisassemblerMutex ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000361{
Greg Claytonab65b342011-04-13 22:47:15 +0000362 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
363 return g_instances_mutex;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000364}
365
Greg Claytonab65b342011-04-13 22:47:15 +0000366static DisassemblerInstances &
367GetDisassemblerInstances ()
368{
369 static DisassemblerInstances g_instances;
370 return g_instances;
371}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000372
373bool
374PluginManager::RegisterPlugin
375(
Greg Clayton57abc5d2013-05-10 21:47:16 +0000376 const ConstString &name,
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000377 const char *description,
378 DisassemblerCreateInstance create_callback
379)
380{
381 if (create_callback)
382 {
383 DisassemblerInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +0000384 assert ((bool)name);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000385 instance.name = name;
386 if (description && description[0])
387 instance.description = description;
388 instance.create_callback = create_callback;
Greg Claytonab65b342011-04-13 22:47:15 +0000389 Mutex::Locker locker (GetDisassemblerMutex ());
390 GetDisassemblerInstances ().push_back (instance);
391 return true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000392 }
393 return false;
394}
395
396bool
397PluginManager::UnregisterPlugin (DisassemblerCreateInstance create_callback)
398{
399 if (create_callback)
400 {
Greg Claytonab65b342011-04-13 22:47:15 +0000401 Mutex::Locker locker (GetDisassemblerMutex ());
402 DisassemblerInstances &instances = GetDisassemblerInstances ();
403
404 DisassemblerInstances::iterator pos, end = instances.end();
405 for (pos = instances.begin(); pos != end; ++ pos)
406 {
407 if (pos->create_callback == create_callback)
408 {
409 instances.erase(pos);
410 return true;
411 }
412 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000413 }
414 return false;
415}
416
417DisassemblerCreateInstance
418PluginManager::GetDisassemblerCreateCallbackAtIndex (uint32_t idx)
419{
Greg Claytonab65b342011-04-13 22:47:15 +0000420 Mutex::Locker locker (GetDisassemblerMutex ());
421 DisassemblerInstances &instances = GetDisassemblerInstances ();
422 if (idx < instances.size())
423 return instances[idx].create_callback;
Jason Molenda743e86a2010-06-11 23:44:18 +0000424 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000425}
426
427DisassemblerCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +0000428PluginManager::GetDisassemblerCreateCallbackForPluginName (const ConstString &name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000429{
Greg Clayton57abc5d2013-05-10 21:47:16 +0000430 if (name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000431 {
Greg Claytonab65b342011-04-13 22:47:15 +0000432 Mutex::Locker locker (GetDisassemblerMutex ());
433 DisassemblerInstances &instances = GetDisassemblerInstances ();
434
435 DisassemblerInstances::iterator pos, end = instances.end();
436 for (pos = instances.begin(); pos != end; ++ pos)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000437 {
Greg Clayton57abc5d2013-05-10 21:47:16 +0000438 if (name == pos->name)
Greg Claytonab65b342011-04-13 22:47:15 +0000439 return pos->create_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000440 }
441 }
442 return NULL;
443}
444
445
446
447#pragma mark DynamicLoader
448
449
Jason Molenda743e86a2010-06-11 23:44:18 +0000450struct DynamicLoaderInstance
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000451{
452 DynamicLoaderInstance() :
453 name(),
454 description(),
Greg Claytone8cd0c92012-10-19 18:02:49 +0000455 create_callback(NULL),
456 debugger_init_callback (NULL)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000457 {
458 }
459
Greg Clayton57abc5d2013-05-10 21:47:16 +0000460 ConstString name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000461 std::string description;
462 DynamicLoaderCreateInstance create_callback;
Greg Claytone8cd0c92012-10-19 18:02:49 +0000463 DebuggerInitializeCallback debugger_init_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000464};
465
466typedef std::vector<DynamicLoaderInstance> DynamicLoaderInstances;
467
Greg Claytonab65b342011-04-13 22:47:15 +0000468
469static Mutex &
470GetDynamicLoaderMutex ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000471{
Greg Claytonab65b342011-04-13 22:47:15 +0000472 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
473 return g_instances_mutex;
474}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000475
Greg Claytonab65b342011-04-13 22:47:15 +0000476static DynamicLoaderInstances &
477GetDynamicLoaderInstances ()
478{
479 static DynamicLoaderInstances g_instances;
480 return g_instances;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000481}
482
483
484bool
485PluginManager::RegisterPlugin
486(
Greg Clayton57abc5d2013-05-10 21:47:16 +0000487 const ConstString &name,
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000488 const char *description,
Greg Claytone8cd0c92012-10-19 18:02:49 +0000489 DynamicLoaderCreateInstance create_callback,
490 DebuggerInitializeCallback debugger_init_callback
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000491)
492{
493 if (create_callback)
494 {
495 DynamicLoaderInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +0000496 assert ((bool)name);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000497 instance.name = name;
498 if (description && description[0])
499 instance.description = description;
500 instance.create_callback = create_callback;
Greg Claytone8cd0c92012-10-19 18:02:49 +0000501 instance.debugger_init_callback = debugger_init_callback;
Greg Claytonab65b342011-04-13 22:47:15 +0000502 Mutex::Locker locker (GetDynamicLoaderMutex ());
503 GetDynamicLoaderInstances ().push_back (instance);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000504 }
505 return false;
506}
507
508bool
509PluginManager::UnregisterPlugin (DynamicLoaderCreateInstance create_callback)
510{
511 if (create_callback)
512 {
Greg Claytonab65b342011-04-13 22:47:15 +0000513 Mutex::Locker locker (GetDynamicLoaderMutex ());
514 DynamicLoaderInstances &instances = GetDynamicLoaderInstances ();
515
516 DynamicLoaderInstances::iterator pos, end = instances.end();
517 for (pos = instances.begin(); pos != end; ++ pos)
518 {
519 if (pos->create_callback == create_callback)
520 {
521 instances.erase(pos);
522 return true;
523 }
524 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000525 }
526 return false;
527}
528
529DynamicLoaderCreateInstance
530PluginManager::GetDynamicLoaderCreateCallbackAtIndex (uint32_t idx)
531{
Greg Claytonab65b342011-04-13 22:47:15 +0000532 Mutex::Locker locker (GetDynamicLoaderMutex ());
533 DynamicLoaderInstances &instances = GetDynamicLoaderInstances ();
534 if (idx < instances.size())
535 return instances[idx].create_callback;
Jason Molenda743e86a2010-06-11 23:44:18 +0000536 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000537}
538
539DynamicLoaderCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +0000540PluginManager::GetDynamicLoaderCreateCallbackForPluginName (const ConstString &name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000541{
Greg Clayton57abc5d2013-05-10 21:47:16 +0000542 if (name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000543 {
Greg Claytonab65b342011-04-13 22:47:15 +0000544 Mutex::Locker locker (GetDynamicLoaderMutex ());
545 DynamicLoaderInstances &instances = GetDynamicLoaderInstances ();
546
547 DynamicLoaderInstances::iterator pos, end = instances.end();
548 for (pos = instances.begin(); pos != end; ++ pos)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000549 {
Greg Clayton57abc5d2013-05-10 21:47:16 +0000550 if (name == pos->name)
Greg Claytonab65b342011-04-13 22:47:15 +0000551 return pos->create_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000552 }
553 }
554 return NULL;
555}
556
Andrew MacPherson17220c12014-03-05 10:12:43 +0000557#pragma mark JITLoader
558
559
560struct JITLoaderInstance
561{
562 JITLoaderInstance() :
563 name(),
564 description(),
565 create_callback(NULL),
566 debugger_init_callback (NULL)
567 {
568 }
569
570 ConstString name;
571 std::string description;
572 JITLoaderCreateInstance create_callback;
573 DebuggerInitializeCallback debugger_init_callback;
574};
575
576typedef std::vector<JITLoaderInstance> JITLoaderInstances;
577
578
579static Mutex &
580GetJITLoaderMutex ()
581{
582 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
583 return g_instances_mutex;
584}
585
586static JITLoaderInstances &
587GetJITLoaderInstances ()
588{
589 static JITLoaderInstances g_instances;
590 return g_instances;
591}
592
593
594bool
595PluginManager::RegisterPlugin
596(
597 const ConstString &name,
598 const char *description,
599 JITLoaderCreateInstance create_callback,
600 DebuggerInitializeCallback debugger_init_callback
601)
602{
603 if (create_callback)
604 {
605 JITLoaderInstance instance;
606 assert ((bool)name);
607 instance.name = name;
608 if (description && description[0])
609 instance.description = description;
610 instance.create_callback = create_callback;
611 instance.debugger_init_callback = debugger_init_callback;
612 Mutex::Locker locker (GetJITLoaderMutex ());
613 GetJITLoaderInstances ().push_back (instance);
614 }
615 return false;
616}
617
618bool
619PluginManager::UnregisterPlugin (JITLoaderCreateInstance create_callback)
620{
621 if (create_callback)
622 {
623 Mutex::Locker locker (GetJITLoaderMutex ());
624 JITLoaderInstances &instances = GetJITLoaderInstances ();
625
626 JITLoaderInstances::iterator pos, end = instances.end();
627 for (pos = instances.begin(); pos != end; ++ pos)
628 {
629 if (pos->create_callback == create_callback)
630 {
631 instances.erase(pos);
632 return true;
633 }
634 }
635 }
636 return false;
637}
638
639JITLoaderCreateInstance
640PluginManager::GetJITLoaderCreateCallbackAtIndex (uint32_t idx)
641{
642 Mutex::Locker locker (GetJITLoaderMutex ());
643 JITLoaderInstances &instances = GetJITLoaderInstances ();
644 if (idx < instances.size())
645 return instances[idx].create_callback;
646 return NULL;
647}
648
649JITLoaderCreateInstance
650PluginManager::GetJITLoaderCreateCallbackForPluginName (const ConstString &name)
651{
652 if (name)
653 {
654 Mutex::Locker locker (GetJITLoaderMutex ());
655 JITLoaderInstances &instances = GetJITLoaderInstances ();
656
657 JITLoaderInstances::iterator pos, end = instances.end();
658 for (pos = instances.begin(); pos != end; ++ pos)
659 {
660 if (name == pos->name)
661 return pos->create_callback;
662 }
663 }
664 return NULL;
665}
666
Greg Claytonf03bbe22011-02-01 01:37:45 +0000667#pragma mark EmulateInstruction
668
669
670struct EmulateInstructionInstance
671{
672 EmulateInstructionInstance() :
673 name(),
674 description(),
675 create_callback(NULL)
676 {
677 }
678
Greg Clayton57abc5d2013-05-10 21:47:16 +0000679 ConstString name;
Greg Claytonf03bbe22011-02-01 01:37:45 +0000680 std::string description;
681 EmulateInstructionCreateInstance create_callback;
682};
683
684typedef std::vector<EmulateInstructionInstance> EmulateInstructionInstances;
685
Greg Claytonab65b342011-04-13 22:47:15 +0000686static Mutex &
687GetEmulateInstructionMutex ()
Greg Claytonf03bbe22011-02-01 01:37:45 +0000688{
Greg Claytonab65b342011-04-13 22:47:15 +0000689 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
690 return g_instances_mutex;
691}
692
693static EmulateInstructionInstances &
694GetEmulateInstructionInstances ()
695{
696 static EmulateInstructionInstances g_instances;
697 return g_instances;
Greg Claytonf03bbe22011-02-01 01:37:45 +0000698}
699
700
701bool
702PluginManager::RegisterPlugin
703(
Greg Clayton57abc5d2013-05-10 21:47:16 +0000704 const ConstString &name,
Greg Clayton4272cc72011-02-02 02:24:04 +0000705 const char *description,
706 EmulateInstructionCreateInstance create_callback
707)
Greg Claytonf03bbe22011-02-01 01:37:45 +0000708{
709 if (create_callback)
710 {
711 EmulateInstructionInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +0000712 assert ((bool)name);
Greg Claytonf03bbe22011-02-01 01:37:45 +0000713 instance.name = name;
714 if (description && description[0])
715 instance.description = description;
716 instance.create_callback = create_callback;
Greg Claytonab65b342011-04-13 22:47:15 +0000717 Mutex::Locker locker (GetEmulateInstructionMutex ());
718 GetEmulateInstructionInstances ().push_back (instance);
Greg Claytonf03bbe22011-02-01 01:37:45 +0000719 }
720 return false;
721}
722
723bool
724PluginManager::UnregisterPlugin (EmulateInstructionCreateInstance create_callback)
725{
726 if (create_callback)
727 {
Greg Claytonab65b342011-04-13 22:47:15 +0000728 Mutex::Locker locker (GetEmulateInstructionMutex ());
729 EmulateInstructionInstances &instances = GetEmulateInstructionInstances ();
730
731 EmulateInstructionInstances::iterator pos, end = instances.end();
732 for (pos = instances.begin(); pos != end; ++ pos)
733 {
734 if (pos->create_callback == create_callback)
735 {
736 instances.erase(pos);
737 return true;
738 }
739 }
Greg Claytonf03bbe22011-02-01 01:37:45 +0000740 }
741 return false;
742}
743
744EmulateInstructionCreateInstance
745PluginManager::GetEmulateInstructionCreateCallbackAtIndex (uint32_t idx)
746{
Greg Claytonab65b342011-04-13 22:47:15 +0000747 Mutex::Locker locker (GetEmulateInstructionMutex ());
748 EmulateInstructionInstances &instances = GetEmulateInstructionInstances ();
749 if (idx < instances.size())
750 return instances[idx].create_callback;
Greg Claytonf03bbe22011-02-01 01:37:45 +0000751 return NULL;
752}
753
754EmulateInstructionCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +0000755PluginManager::GetEmulateInstructionCreateCallbackForPluginName (const ConstString &name)
Greg Claytonf03bbe22011-02-01 01:37:45 +0000756{
Greg Clayton57abc5d2013-05-10 21:47:16 +0000757 if (name)
Greg Claytonf03bbe22011-02-01 01:37:45 +0000758 {
Greg Claytonab65b342011-04-13 22:47:15 +0000759 Mutex::Locker locker (GetEmulateInstructionMutex ());
760 EmulateInstructionInstances &instances = GetEmulateInstructionInstances ();
761
762 EmulateInstructionInstances::iterator pos, end = instances.end();
763 for (pos = instances.begin(); pos != end; ++ pos)
Greg Claytonf03bbe22011-02-01 01:37:45 +0000764 {
Greg Clayton57abc5d2013-05-10 21:47:16 +0000765 if (name == pos->name)
Greg Claytonab65b342011-04-13 22:47:15 +0000766 return pos->create_callback;
Greg Claytonf03bbe22011-02-01 01:37:45 +0000767 }
768 }
769 return NULL;
770}
Greg Clayton56d9a1b2011-08-22 02:49:39 +0000771#pragma mark OperatingSystem
772
773
774struct OperatingSystemInstance
775{
776 OperatingSystemInstance() :
777 name(),
778 description(),
779 create_callback(NULL)
780 {
781 }
782
Greg Clayton57abc5d2013-05-10 21:47:16 +0000783 ConstString name;
Greg Clayton56d9a1b2011-08-22 02:49:39 +0000784 std::string description;
785 OperatingSystemCreateInstance create_callback;
786};
787
788typedef std::vector<OperatingSystemInstance> OperatingSystemInstances;
789
790static Mutex &
791GetOperatingSystemMutex ()
792{
793 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
794 return g_instances_mutex;
795}
796
797static OperatingSystemInstances &
798GetOperatingSystemInstances ()
799{
800 static OperatingSystemInstances g_instances;
801 return g_instances;
802}
803
804bool
Greg Clayton57abc5d2013-05-10 21:47:16 +0000805PluginManager::RegisterPlugin (const ConstString &name,
806 const char *description,
807 OperatingSystemCreateInstance create_callback)
Greg Clayton56d9a1b2011-08-22 02:49:39 +0000808{
809 if (create_callback)
810 {
811 OperatingSystemInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +0000812 assert ((bool)name);
Greg Clayton56d9a1b2011-08-22 02:49:39 +0000813 instance.name = name;
814 if (description && description[0])
815 instance.description = description;
816 instance.create_callback = create_callback;
817 Mutex::Locker locker (GetOperatingSystemMutex ());
818 GetOperatingSystemInstances ().push_back (instance);
819 }
820 return false;
821}
822
823bool
824PluginManager::UnregisterPlugin (OperatingSystemCreateInstance create_callback)
825{
826 if (create_callback)
827 {
828 Mutex::Locker locker (GetOperatingSystemMutex ());
829 OperatingSystemInstances &instances = GetOperatingSystemInstances ();
830
831 OperatingSystemInstances::iterator pos, end = instances.end();
832 for (pos = instances.begin(); pos != end; ++ pos)
833 {
834 if (pos->create_callback == create_callback)
835 {
836 instances.erase(pos);
837 return true;
838 }
839 }
840 }
841 return false;
842}
843
844OperatingSystemCreateInstance
845PluginManager::GetOperatingSystemCreateCallbackAtIndex (uint32_t idx)
846{
847 Mutex::Locker locker (GetOperatingSystemMutex ());
848 OperatingSystemInstances &instances = GetOperatingSystemInstances ();
849 if (idx < instances.size())
850 return instances[idx].create_callback;
851 return NULL;
852}
853
854OperatingSystemCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +0000855PluginManager::GetOperatingSystemCreateCallbackForPluginName (const ConstString &name)
Greg Clayton56d9a1b2011-08-22 02:49:39 +0000856{
Greg Clayton57abc5d2013-05-10 21:47:16 +0000857 if (name)
Greg Clayton56d9a1b2011-08-22 02:49:39 +0000858 {
Greg Clayton56d9a1b2011-08-22 02:49:39 +0000859 Mutex::Locker locker (GetOperatingSystemMutex ());
860 OperatingSystemInstances &instances = GetOperatingSystemInstances ();
861
862 OperatingSystemInstances::iterator pos, end = instances.end();
863 for (pos = instances.begin(); pos != end; ++ pos)
864 {
Greg Clayton57abc5d2013-05-10 21:47:16 +0000865 if (name == pos->name)
Greg Clayton56d9a1b2011-08-22 02:49:39 +0000866 return pos->create_callback;
867 }
868 }
869 return NULL;
870}
Greg Claytonf03bbe22011-02-01 01:37:45 +0000871
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000872
Jim Ingham22777012010-09-23 02:01:19 +0000873#pragma mark LanguageRuntime
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000874
875
Jim Ingham22777012010-09-23 02:01:19 +0000876struct LanguageRuntimeInstance
877{
878 LanguageRuntimeInstance() :
879 name(),
880 description(),
881 create_callback(NULL)
882 {
883 }
884
Greg Clayton57abc5d2013-05-10 21:47:16 +0000885 ConstString name;
Jim Ingham22777012010-09-23 02:01:19 +0000886 std::string description;
887 LanguageRuntimeCreateInstance create_callback;
888};
889
890typedef std::vector<LanguageRuntimeInstance> LanguageRuntimeInstances;
891
Greg Claytonab65b342011-04-13 22:47:15 +0000892static Mutex &
893GetLanguageRuntimeMutex ()
Jim Ingham22777012010-09-23 02:01:19 +0000894{
Greg Claytonab65b342011-04-13 22:47:15 +0000895 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
896 return g_instances_mutex;
Jim Ingham22777012010-09-23 02:01:19 +0000897}
898
Greg Claytonab65b342011-04-13 22:47:15 +0000899static LanguageRuntimeInstances &
900GetLanguageRuntimeInstances ()
901{
902 static LanguageRuntimeInstances g_instances;
903 return g_instances;
904}
Jim Ingham22777012010-09-23 02:01:19 +0000905
906bool
907PluginManager::RegisterPlugin
Greg Clayton4272cc72011-02-02 02:24:04 +0000908(
Greg Clayton57abc5d2013-05-10 21:47:16 +0000909 const ConstString &name,
Greg Clayton4272cc72011-02-02 02:24:04 +0000910 const char *description,
911 LanguageRuntimeCreateInstance create_callback
912)
Jim Ingham22777012010-09-23 02:01:19 +0000913{
914 if (create_callback)
915 {
916 LanguageRuntimeInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +0000917 assert ((bool)name);
Jim Ingham22777012010-09-23 02:01:19 +0000918 instance.name = name;
919 if (description && description[0])
920 instance.description = description;
921 instance.create_callback = create_callback;
Greg Claytonab65b342011-04-13 22:47:15 +0000922 Mutex::Locker locker (GetLanguageRuntimeMutex ());
923 GetLanguageRuntimeInstances ().push_back (instance);
Jim Ingham22777012010-09-23 02:01:19 +0000924 }
925 return false;
926}
927
928bool
929PluginManager::UnregisterPlugin (LanguageRuntimeCreateInstance create_callback)
930{
931 if (create_callback)
932 {
Greg Claytonab65b342011-04-13 22:47:15 +0000933 Mutex::Locker locker (GetLanguageRuntimeMutex ());
934 LanguageRuntimeInstances &instances = GetLanguageRuntimeInstances ();
935
936 LanguageRuntimeInstances::iterator pos, end = instances.end();
937 for (pos = instances.begin(); pos != end; ++ pos)
938 {
939 if (pos->create_callback == create_callback)
940 {
941 instances.erase(pos);
942 return true;
943 }
944 }
Jim Ingham22777012010-09-23 02:01:19 +0000945 }
946 return false;
947}
948
949LanguageRuntimeCreateInstance
950PluginManager::GetLanguageRuntimeCreateCallbackAtIndex (uint32_t idx)
951{
Greg Claytonab65b342011-04-13 22:47:15 +0000952 Mutex::Locker locker (GetLanguageRuntimeMutex ());
953 LanguageRuntimeInstances &instances = GetLanguageRuntimeInstances ();
954 if (idx < instances.size())
955 return instances[idx].create_callback;
Jim Ingham22777012010-09-23 02:01:19 +0000956 return NULL;
957}
958
959LanguageRuntimeCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +0000960PluginManager::GetLanguageRuntimeCreateCallbackForPluginName (const ConstString &name)
Jim Ingham22777012010-09-23 02:01:19 +0000961{
Greg Clayton57abc5d2013-05-10 21:47:16 +0000962 if (name)
Jim Ingham22777012010-09-23 02:01:19 +0000963 {
Greg Claytonab65b342011-04-13 22:47:15 +0000964 Mutex::Locker locker (GetLanguageRuntimeMutex ());
965 LanguageRuntimeInstances &instances = GetLanguageRuntimeInstances ();
966
967 LanguageRuntimeInstances::iterator pos, end = instances.end();
968 for (pos = instances.begin(); pos != end; ++ pos)
Jim Ingham22777012010-09-23 02:01:19 +0000969 {
Greg Clayton57abc5d2013-05-10 21:47:16 +0000970 if (name == pos->name)
Greg Claytonab65b342011-04-13 22:47:15 +0000971 return pos->create_callback;
Jim Ingham22777012010-09-23 02:01:19 +0000972 }
973 }
974 return NULL;
975}
976
Jason Molendaeef51062013-11-05 03:57:19 +0000977#pragma mark SystemRuntime
978
979
980struct SystemRuntimeInstance
981{
982 SystemRuntimeInstance() :
983 name(),
984 description(),
985 create_callback(NULL)
986 {
987 }
988
989 ConstString name;
990 std::string description;
991 SystemRuntimeCreateInstance create_callback;
992};
993
994typedef std::vector<SystemRuntimeInstance> SystemRuntimeInstances;
995
996static Mutex &
997GetSystemRuntimeMutex ()
998{
999 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
1000 return g_instances_mutex;
1001}
1002
1003static SystemRuntimeInstances &
1004GetSystemRuntimeInstances ()
1005{
1006 static SystemRuntimeInstances g_instances;
1007 return g_instances;
1008}
1009
1010bool
1011PluginManager::RegisterPlugin
1012(
1013 const ConstString &name,
1014 const char *description,
1015 SystemRuntimeCreateInstance create_callback
1016)
1017{
1018 if (create_callback)
1019 {
1020 SystemRuntimeInstance instance;
1021 assert ((bool)name);
1022 instance.name = name;
1023 if (description && description[0])
1024 instance.description = description;
1025 instance.create_callback = create_callback;
1026 Mutex::Locker locker (GetSystemRuntimeMutex ());
1027 GetSystemRuntimeInstances ().push_back (instance);
1028 }
1029 return false;
1030}
1031
1032bool
1033PluginManager::UnregisterPlugin (SystemRuntimeCreateInstance create_callback)
1034{
1035 if (create_callback)
1036 {
1037 Mutex::Locker locker (GetSystemRuntimeMutex ());
1038 SystemRuntimeInstances &instances = GetSystemRuntimeInstances ();
1039
1040 SystemRuntimeInstances::iterator pos, end = instances.end();
1041 for (pos = instances.begin(); pos != end; ++ pos)
1042 {
1043 if (pos->create_callback == create_callback)
1044 {
1045 instances.erase(pos);
1046 return true;
1047 }
1048 }
1049 }
1050 return false;
1051}
1052
1053SystemRuntimeCreateInstance
1054PluginManager::GetSystemRuntimeCreateCallbackAtIndex (uint32_t idx)
1055{
1056 Mutex::Locker locker (GetSystemRuntimeMutex ());
1057 SystemRuntimeInstances &instances = GetSystemRuntimeInstances ();
1058 if (idx < instances.size())
1059 return instances[idx].create_callback;
1060 return NULL;
1061}
1062
1063SystemRuntimeCreateInstance
1064PluginManager::GetSystemRuntimeCreateCallbackForPluginName (const ConstString &name)
1065{
1066 if (name)
1067 {
1068 Mutex::Locker locker (GetSystemRuntimeMutex ());
1069 SystemRuntimeInstances &instances = GetSystemRuntimeInstances ();
1070
1071 SystemRuntimeInstances::iterator pos, end = instances.end();
1072 for (pos = instances.begin(); pos != end; ++ pos)
1073 {
1074 if (name == pos->name)
1075 return pos->create_callback;
1076 }
1077 }
1078 return NULL;
1079}
1080
1081
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001082#pragma mark ObjectFile
1083
Jason Molenda743e86a2010-06-11 23:44:18 +00001084struct ObjectFileInstance
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001085{
1086 ObjectFileInstance() :
1087 name(),
1088 description(),
Greg Claytonf4d6de62013-04-24 22:29:28 +00001089 create_callback(NULL),
1090 create_memory_callback (NULL),
Greg Claytona2715cf2014-06-13 00:54:12 +00001091 get_module_specifications (NULL),
1092 save_core (NULL)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001093 {
1094 }
1095
Greg Clayton57abc5d2013-05-10 21:47:16 +00001096 ConstString name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001097 std::string description;
1098 ObjectFileCreateInstance create_callback;
Greg Claytonc9660542012-02-05 02:38:54 +00001099 ObjectFileCreateMemoryInstance create_memory_callback;
Greg Claytonf4d6de62013-04-24 22:29:28 +00001100 ObjectFileGetModuleSpecifications get_module_specifications;
Greg Claytona2715cf2014-06-13 00:54:12 +00001101 ObjectFileSaveCore save_core;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001102};
1103
1104typedef std::vector<ObjectFileInstance> ObjectFileInstances;
1105
Greg Claytonab65b342011-04-13 22:47:15 +00001106static Mutex &
1107GetObjectFileMutex ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001108{
Greg Claytonab65b342011-04-13 22:47:15 +00001109 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
1110 return g_instances_mutex;
1111}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001112
Greg Claytonab65b342011-04-13 22:47:15 +00001113static ObjectFileInstances &
1114GetObjectFileInstances ()
1115{
1116 static ObjectFileInstances g_instances;
1117 return g_instances;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001118}
1119
1120
1121bool
Greg Clayton57abc5d2013-05-10 21:47:16 +00001122PluginManager::RegisterPlugin (const ConstString &name,
Greg Claytonf4d6de62013-04-24 22:29:28 +00001123 const char *description,
1124 ObjectFileCreateInstance create_callback,
1125 ObjectFileCreateMemoryInstance create_memory_callback,
Greg Claytona2715cf2014-06-13 00:54:12 +00001126 ObjectFileGetModuleSpecifications get_module_specifications,
1127 ObjectFileSaveCore save_core)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001128{
1129 if (create_callback)
1130 {
1131 ObjectFileInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +00001132 assert ((bool)name);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001133 instance.name = name;
1134 if (description && description[0])
1135 instance.description = description;
1136 instance.create_callback = create_callback;
Greg Claytonc9660542012-02-05 02:38:54 +00001137 instance.create_memory_callback = create_memory_callback;
Greg Claytona2715cf2014-06-13 00:54:12 +00001138 instance.save_core = save_core;
Greg Claytonf4d6de62013-04-24 22:29:28 +00001139 instance.get_module_specifications = get_module_specifications;
Greg Claytonab65b342011-04-13 22:47:15 +00001140 Mutex::Locker locker (GetObjectFileMutex ());
1141 GetObjectFileInstances ().push_back (instance);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001142 }
1143 return false;
1144}
1145
1146bool
1147PluginManager::UnregisterPlugin (ObjectFileCreateInstance create_callback)
1148{
1149 if (create_callback)
1150 {
Greg Claytonab65b342011-04-13 22:47:15 +00001151 Mutex::Locker locker (GetObjectFileMutex ());
1152 ObjectFileInstances &instances = GetObjectFileInstances ();
1153
1154 ObjectFileInstances::iterator pos, end = instances.end();
1155 for (pos = instances.begin(); pos != end; ++ pos)
1156 {
1157 if (pos->create_callback == create_callback)
1158 {
1159 instances.erase(pos);
1160 return true;
1161 }
1162 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001163 }
1164 return false;
1165}
1166
1167ObjectFileCreateInstance
1168PluginManager::GetObjectFileCreateCallbackAtIndex (uint32_t idx)
1169{
Greg Claytonab65b342011-04-13 22:47:15 +00001170 Mutex::Locker locker (GetObjectFileMutex ());
1171 ObjectFileInstances &instances = GetObjectFileInstances ();
1172 if (idx < instances.size())
1173 return instances[idx].create_callback;
Jason Molenda743e86a2010-06-11 23:44:18 +00001174 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001175}
Greg Claytonab65b342011-04-13 22:47:15 +00001176
Greg Claytonc9660542012-02-05 02:38:54 +00001177
1178ObjectFileCreateMemoryInstance
1179PluginManager::GetObjectFileCreateMemoryCallbackAtIndex (uint32_t idx)
1180{
1181 Mutex::Locker locker (GetObjectFileMutex ());
1182 ObjectFileInstances &instances = GetObjectFileInstances ();
1183 if (idx < instances.size())
1184 return instances[idx].create_memory_callback;
1185 return NULL;
1186}
1187
Greg Claytonf4d6de62013-04-24 22:29:28 +00001188ObjectFileGetModuleSpecifications
1189PluginManager::GetObjectFileGetModuleSpecificationsCallbackAtIndex (uint32_t idx)
1190{
1191 Mutex::Locker locker (GetObjectFileMutex ());
1192 ObjectFileInstances &instances = GetObjectFileInstances ();
1193 if (idx < instances.size())
1194 return instances[idx].get_module_specifications;
1195 return NULL;
1196}
1197
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001198ObjectFileCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +00001199PluginManager::GetObjectFileCreateCallbackForPluginName (const ConstString &name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001200{
Greg Clayton57abc5d2013-05-10 21:47:16 +00001201 if (name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001202 {
Greg Claytonab65b342011-04-13 22:47:15 +00001203 Mutex::Locker locker (GetObjectFileMutex ());
1204 ObjectFileInstances &instances = GetObjectFileInstances ();
1205
1206 ObjectFileInstances::iterator pos, end = instances.end();
1207 for (pos = instances.begin(); pos != end; ++ pos)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001208 {
Greg Clayton57abc5d2013-05-10 21:47:16 +00001209 if (name == pos->name)
Greg Claytonab65b342011-04-13 22:47:15 +00001210 return pos->create_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001211 }
1212 }
1213 return NULL;
1214}
1215
1216
Greg Claytonc9660542012-02-05 02:38:54 +00001217ObjectFileCreateMemoryInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +00001218PluginManager::GetObjectFileCreateMemoryCallbackForPluginName (const ConstString &name)
Greg Claytonc9660542012-02-05 02:38:54 +00001219{
Greg Clayton57abc5d2013-05-10 21:47:16 +00001220 if (name)
Greg Claytonc9660542012-02-05 02:38:54 +00001221 {
Greg Claytonc9660542012-02-05 02:38:54 +00001222 Mutex::Locker locker (GetObjectFileMutex ());
1223 ObjectFileInstances &instances = GetObjectFileInstances ();
1224
1225 ObjectFileInstances::iterator pos, end = instances.end();
1226 for (pos = instances.begin(); pos != end; ++ pos)
1227 {
Greg Clayton57abc5d2013-05-10 21:47:16 +00001228 if (name == pos->name)
Greg Claytonc9660542012-02-05 02:38:54 +00001229 return pos->create_memory_callback;
1230 }
1231 }
1232 return NULL;
1233}
1234
Greg Claytona2715cf2014-06-13 00:54:12 +00001235Error
1236PluginManager::SaveCore (const lldb::ProcessSP &process_sp, const FileSpec &outfile)
1237{
1238 Error error;
1239 Mutex::Locker locker (GetObjectFileMutex ());
1240 ObjectFileInstances &instances = GetObjectFileInstances ();
1241
1242 ObjectFileInstances::iterator pos, end = instances.end();
1243 for (pos = instances.begin(); pos != end; ++ pos)
1244 {
1245 if (pos->save_core && pos->save_core (process_sp, outfile, error))
1246 return error;
1247 }
1248 error.SetErrorString("no ObjectFile plugins were able to save a core for this process");
1249 return error;
1250}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001251
1252#pragma mark ObjectContainer
1253
Jason Molenda743e86a2010-06-11 23:44:18 +00001254struct ObjectContainerInstance
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001255{
1256 ObjectContainerInstance() :
1257 name(),
1258 description(),
Greg Claytonf4d6de62013-04-24 22:29:28 +00001259 create_callback (NULL),
1260 get_module_specifications (NULL)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001261 {
1262 }
1263
Greg Clayton57abc5d2013-05-10 21:47:16 +00001264 ConstString name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001265 std::string description;
1266 ObjectContainerCreateInstance create_callback;
Greg Claytonf4d6de62013-04-24 22:29:28 +00001267 ObjectFileGetModuleSpecifications get_module_specifications;
1268
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001269};
1270
1271typedef std::vector<ObjectContainerInstance> ObjectContainerInstances;
1272
Greg Claytonab65b342011-04-13 22:47:15 +00001273static Mutex &
1274GetObjectContainerMutex ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001275{
Greg Claytonab65b342011-04-13 22:47:15 +00001276 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
1277 return g_instances_mutex;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001278}
1279
Greg Claytonab65b342011-04-13 22:47:15 +00001280static ObjectContainerInstances &
1281GetObjectContainerInstances ()
1282{
1283 static ObjectContainerInstances g_instances;
1284 return g_instances;
1285}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001286
1287bool
Greg Clayton57abc5d2013-05-10 21:47:16 +00001288PluginManager::RegisterPlugin (const ConstString &name,
Greg Claytonf4d6de62013-04-24 22:29:28 +00001289 const char *description,
1290 ObjectContainerCreateInstance create_callback,
1291 ObjectFileGetModuleSpecifications get_module_specifications)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001292{
1293 if (create_callback)
1294 {
1295 ObjectContainerInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +00001296 assert ((bool)name);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001297 instance.name = name;
1298 if (description && description[0])
1299 instance.description = description;
1300 instance.create_callback = create_callback;
Greg Claytonf4d6de62013-04-24 22:29:28 +00001301 instance.get_module_specifications = get_module_specifications;
Greg Claytonab65b342011-04-13 22:47:15 +00001302 Mutex::Locker locker (GetObjectContainerMutex ());
1303 GetObjectContainerInstances ().push_back (instance);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001304 }
1305 return false;
1306}
1307
1308bool
1309PluginManager::UnregisterPlugin (ObjectContainerCreateInstance create_callback)
1310{
1311 if (create_callback)
1312 {
Greg Claytonab65b342011-04-13 22:47:15 +00001313 Mutex::Locker locker (GetObjectContainerMutex ());
1314 ObjectContainerInstances &instances = GetObjectContainerInstances ();
1315
1316 ObjectContainerInstances::iterator pos, end = instances.end();
1317 for (pos = instances.begin(); pos != end; ++ pos)
1318 {
1319 if (pos->create_callback == create_callback)
1320 {
1321 instances.erase(pos);
1322 return true;
1323 }
1324 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001325 }
1326 return false;
1327}
1328
1329ObjectContainerCreateInstance
1330PluginManager::GetObjectContainerCreateCallbackAtIndex (uint32_t idx)
1331{
Greg Claytonab65b342011-04-13 22:47:15 +00001332 Mutex::Locker locker (GetObjectContainerMutex ());
1333 ObjectContainerInstances &instances = GetObjectContainerInstances ();
1334 if (idx < instances.size())
1335 return instances[idx].create_callback;
Jason Molenda743e86a2010-06-11 23:44:18 +00001336 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001337}
Greg Claytonab65b342011-04-13 22:47:15 +00001338
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001339ObjectContainerCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +00001340PluginManager::GetObjectContainerCreateCallbackForPluginName (const ConstString &name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001341{
Greg Clayton57abc5d2013-05-10 21:47:16 +00001342 if (name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001343 {
Greg Claytonab65b342011-04-13 22:47:15 +00001344 Mutex::Locker locker (GetObjectContainerMutex ());
1345 ObjectContainerInstances &instances = GetObjectContainerInstances ();
1346
1347 ObjectContainerInstances::iterator pos, end = instances.end();
1348 for (pos = instances.begin(); pos != end; ++ pos)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001349 {
Greg Clayton57abc5d2013-05-10 21:47:16 +00001350 if (name == pos->name)
Greg Claytonab65b342011-04-13 22:47:15 +00001351 return pos->create_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001352 }
1353 }
1354 return NULL;
1355}
1356
Greg Claytonf4d6de62013-04-24 22:29:28 +00001357ObjectFileGetModuleSpecifications
1358PluginManager::GetObjectContainerGetModuleSpecificationsCallbackAtIndex (uint32_t idx)
1359{
1360 Mutex::Locker locker (GetObjectContainerMutex ());
1361 ObjectContainerInstances &instances = GetObjectContainerInstances ();
1362 if (idx < instances.size())
1363 return instances[idx].get_module_specifications;
1364 return NULL;
1365}
1366
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001367#pragma mark LogChannel
1368
Greg Claytonab65b342011-04-13 22:47:15 +00001369struct LogInstance
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001370{
Greg Claytonab65b342011-04-13 22:47:15 +00001371 LogInstance() :
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001372 name(),
1373 description(),
1374 create_callback(NULL)
1375 {
1376 }
1377
Greg Clayton57abc5d2013-05-10 21:47:16 +00001378 ConstString name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001379 std::string description;
1380 LogChannelCreateInstance create_callback;
1381};
1382
Greg Claytonab65b342011-04-13 22:47:15 +00001383typedef std::vector<LogInstance> LogInstances;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001384
Greg Claytonab65b342011-04-13 22:47:15 +00001385static Mutex &
1386GetLogMutex ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001387{
Greg Claytonab65b342011-04-13 22:47:15 +00001388 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
1389 return g_instances_mutex;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001390}
1391
Greg Claytonab65b342011-04-13 22:47:15 +00001392static LogInstances &
1393GetLogInstances ()
1394{
1395 static LogInstances g_instances;
1396 return g_instances;
1397}
1398
1399
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001400
1401bool
1402PluginManager::RegisterPlugin
1403(
Greg Clayton57abc5d2013-05-10 21:47:16 +00001404 const ConstString &name,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001405 const char *description,
1406 LogChannelCreateInstance create_callback
1407)
1408{
1409 if (create_callback)
1410 {
Greg Claytonab65b342011-04-13 22:47:15 +00001411 LogInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +00001412 assert ((bool)name);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001413 instance.name = name;
1414 if (description && description[0])
1415 instance.description = description;
1416 instance.create_callback = create_callback;
Greg Claytonab65b342011-04-13 22:47:15 +00001417 Mutex::Locker locker (GetLogMutex ());
1418 GetLogInstances ().push_back (instance);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001419 }
1420 return false;
1421}
1422
1423bool
1424PluginManager::UnregisterPlugin (LogChannelCreateInstance create_callback)
1425{
1426 if (create_callback)
1427 {
Greg Claytonab65b342011-04-13 22:47:15 +00001428 Mutex::Locker locker (GetLogMutex ());
1429 LogInstances &instances = GetLogInstances ();
1430
1431 LogInstances::iterator pos, end = instances.end();
1432 for (pos = instances.begin(); pos != end; ++ pos)
1433 {
1434 if (pos->create_callback == create_callback)
1435 {
1436 instances.erase(pos);
1437 return true;
1438 }
1439 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001440 }
1441 return false;
1442}
1443
1444const char *
1445PluginManager::GetLogChannelCreateNameAtIndex (uint32_t idx)
1446{
Greg Claytonab65b342011-04-13 22:47:15 +00001447 Mutex::Locker locker (GetLogMutex ());
1448 LogInstances &instances = GetLogInstances ();
1449 if (idx < instances.size())
Greg Clayton57abc5d2013-05-10 21:47:16 +00001450 return instances[idx].name.GetCString();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001451 return NULL;
1452}
1453
1454
1455LogChannelCreateInstance
1456PluginManager::GetLogChannelCreateCallbackAtIndex (uint32_t idx)
1457{
Greg Claytonab65b342011-04-13 22:47:15 +00001458 Mutex::Locker locker (GetLogMutex ());
1459 LogInstances &instances = GetLogInstances ();
1460 if (idx < instances.size())
1461 return instances[idx].create_callback;
Jason Molenda743e86a2010-06-11 23:44:18 +00001462 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001463}
1464
1465LogChannelCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +00001466PluginManager::GetLogChannelCreateCallbackForPluginName (const ConstString &name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001467{
Greg Clayton57abc5d2013-05-10 21:47:16 +00001468 if (name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001469 {
Greg Claytonab65b342011-04-13 22:47:15 +00001470 Mutex::Locker locker (GetLogMutex ());
1471 LogInstances &instances = GetLogInstances ();
1472
1473 LogInstances::iterator pos, end = instances.end();
1474 for (pos = instances.begin(); pos != end; ++ pos)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001475 {
Greg Clayton57abc5d2013-05-10 21:47:16 +00001476 if (name == pos->name)
Greg Claytonab65b342011-04-13 22:47:15 +00001477 return pos->create_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001478 }
1479 }
1480 return NULL;
1481}
1482
Greg Claytone996fd32011-03-08 22:40:15 +00001483#pragma mark Platform
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001484
Greg Claytone996fd32011-03-08 22:40:15 +00001485struct PlatformInstance
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001486{
Greg Claytone996fd32011-03-08 22:40:15 +00001487 PlatformInstance() :
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001488 name(),
1489 description(),
Jason Molenda9b837a12013-04-05 05:06:39 +00001490 create_callback(NULL),
1491 debugger_init_callback (NULL)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001492 {
1493 }
Greg Claytone996fd32011-03-08 22:40:15 +00001494
Greg Clayton57abc5d2013-05-10 21:47:16 +00001495 ConstString name;
Greg Claytone996fd32011-03-08 22:40:15 +00001496 std::string description;
1497 PlatformCreateInstance create_callback;
Jason Molenda9b837a12013-04-05 05:06:39 +00001498 DebuggerInitializeCallback debugger_init_callback;
Greg Claytone996fd32011-03-08 22:40:15 +00001499};
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001500
Greg Claytone996fd32011-03-08 22:40:15 +00001501typedef std::vector<PlatformInstance> PlatformInstances;
1502
Greg Claytonded470d2011-03-19 01:12:21 +00001503static Mutex &
1504GetPlatformInstancesMutex ()
Greg Claytone996fd32011-03-08 22:40:15 +00001505{
Greg Claytonded470d2011-03-19 01:12:21 +00001506 static Mutex g_platform_instances_mutex (Mutex::eMutexTypeRecursive);
1507 return g_platform_instances_mutex;
Greg Claytone996fd32011-03-08 22:40:15 +00001508}
1509
Greg Claytonded470d2011-03-19 01:12:21 +00001510static PlatformInstances &
1511GetPlatformInstances ()
1512{
1513 static PlatformInstances g_platform_instances;
1514 return g_platform_instances;
1515}
Greg Claytone996fd32011-03-08 22:40:15 +00001516
Greg Claytonab65b342011-04-13 22:47:15 +00001517
Greg Claytone996fd32011-03-08 22:40:15 +00001518bool
Greg Clayton57abc5d2013-05-10 21:47:16 +00001519PluginManager::RegisterPlugin (const ConstString &name,
Greg Claytone996fd32011-03-08 22:40:15 +00001520 const char *description,
Jason Molenda9b837a12013-04-05 05:06:39 +00001521 PlatformCreateInstance create_callback,
1522 DebuggerInitializeCallback debugger_init_callback)
Greg Claytone996fd32011-03-08 22:40:15 +00001523{
1524 if (create_callback)
1525 {
Greg Claytonded470d2011-03-19 01:12:21 +00001526 Mutex::Locker locker (GetPlatformInstancesMutex ());
1527
Greg Claytone996fd32011-03-08 22:40:15 +00001528 PlatformInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +00001529 assert ((bool)name);
Greg Claytone996fd32011-03-08 22:40:15 +00001530 instance.name = name;
1531 if (description && description[0])
1532 instance.description = description;
1533 instance.create_callback = create_callback;
Jason Molenda9b837a12013-04-05 05:06:39 +00001534 instance.debugger_init_callback = debugger_init_callback;
Greg Claytonded470d2011-03-19 01:12:21 +00001535 GetPlatformInstances ().push_back (instance);
1536 return true;
Greg Claytone996fd32011-03-08 22:40:15 +00001537 }
1538 return false;
1539}
1540
Jason Molenda9b837a12013-04-05 05:06:39 +00001541
Greg Claytone996fd32011-03-08 22:40:15 +00001542const char *
1543PluginManager::GetPlatformPluginNameAtIndex (uint32_t idx)
1544{
Greg Claytonded470d2011-03-19 01:12:21 +00001545 Mutex::Locker locker (GetPlatformInstancesMutex ());
Greg Claytonab65b342011-04-13 22:47:15 +00001546 PlatformInstances &instances = GetPlatformInstances ();
1547 if (idx < instances.size())
Greg Clayton57abc5d2013-05-10 21:47:16 +00001548 return instances[idx].name.GetCString();
Greg Claytone996fd32011-03-08 22:40:15 +00001549 return NULL;
1550}
1551
1552const char *
1553PluginManager::GetPlatformPluginDescriptionAtIndex (uint32_t idx)
1554{
Greg Claytonded470d2011-03-19 01:12:21 +00001555 Mutex::Locker locker (GetPlatformInstancesMutex ());
Greg Claytonab65b342011-04-13 22:47:15 +00001556 PlatformInstances &instances = GetPlatformInstances ();
1557 if (idx < instances.size())
1558 return instances[idx].description.c_str();
Greg Claytone996fd32011-03-08 22:40:15 +00001559 return NULL;
1560}
1561
1562bool
1563PluginManager::UnregisterPlugin (PlatformCreateInstance create_callback)
1564{
1565 if (create_callback)
1566 {
Greg Claytonded470d2011-03-19 01:12:21 +00001567 Mutex::Locker locker (GetPlatformInstancesMutex ());
Greg Claytonab65b342011-04-13 22:47:15 +00001568 PlatformInstances &instances = GetPlatformInstances ();
Greg Claytonded470d2011-03-19 01:12:21 +00001569
Greg Claytonab65b342011-04-13 22:47:15 +00001570 PlatformInstances::iterator pos, end = instances.end();
1571 for (pos = instances.begin(); pos != end; ++ pos)
Greg Claytonded470d2011-03-19 01:12:21 +00001572 {
1573 if (pos->create_callback == create_callback)
1574 {
Greg Claytonab65b342011-04-13 22:47:15 +00001575 instances.erase(pos);
Greg Claytonded470d2011-03-19 01:12:21 +00001576 return true;
1577 }
1578 }
Greg Claytone996fd32011-03-08 22:40:15 +00001579 }
1580 return false;
1581}
1582
1583PlatformCreateInstance
1584PluginManager::GetPlatformCreateCallbackAtIndex (uint32_t idx)
1585{
Greg Claytonded470d2011-03-19 01:12:21 +00001586 Mutex::Locker locker (GetPlatformInstancesMutex ());
Greg Claytonab65b342011-04-13 22:47:15 +00001587 PlatformInstances &instances = GetPlatformInstances ();
1588 if (idx < instances.size())
1589 return instances[idx].create_callback;
Greg Claytone996fd32011-03-08 22:40:15 +00001590 return NULL;
1591}
1592
1593PlatformCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +00001594PluginManager::GetPlatformCreateCallbackForPluginName (const ConstString &name)
Greg Claytone996fd32011-03-08 22:40:15 +00001595{
Greg Clayton57abc5d2013-05-10 21:47:16 +00001596 if (name)
Greg Claytone996fd32011-03-08 22:40:15 +00001597 {
Greg Claytonded470d2011-03-19 01:12:21 +00001598 Mutex::Locker locker (GetPlatformInstancesMutex ());
Greg Claytonab65b342011-04-13 22:47:15 +00001599 PlatformInstances &instances = GetPlatformInstances ();
Greg Claytonded470d2011-03-19 01:12:21 +00001600
Greg Claytonab65b342011-04-13 22:47:15 +00001601 PlatformInstances::iterator pos, end = instances.end();
1602 for (pos = instances.begin(); pos != end; ++ pos)
Greg Claytone996fd32011-03-08 22:40:15 +00001603 {
Greg Clayton57abc5d2013-05-10 21:47:16 +00001604 if (name == pos->name)
Greg Claytonded470d2011-03-19 01:12:21 +00001605 return pos->create_callback;
Greg Claytone996fd32011-03-08 22:40:15 +00001606 }
1607 }
1608 return NULL;
1609}
1610
Greg Claytonc7bece562013-01-25 18:06:21 +00001611size_t
Greg Claytonab65b342011-04-13 22:47:15 +00001612PluginManager::AutoCompletePlatformName (const char *name, StringList &matches)
1613{
Greg Clayton57abc5d2013-05-10 21:47:16 +00001614 if (name)
Greg Claytonab65b342011-04-13 22:47:15 +00001615 {
1616 Mutex::Locker locker (GetPlatformInstancesMutex ());
1617 PlatformInstances &instances = GetPlatformInstances ();
1618 llvm::StringRef name_sref(name);
1619
1620 PlatformInstances::iterator pos, end = instances.end();
1621 for (pos = instances.begin(); pos != end; ++ pos)
1622 {
Greg Clayton57abc5d2013-05-10 21:47:16 +00001623 llvm::StringRef plugin_name (pos->name.GetCString());
Greg Clayton7260f622011-04-18 08:33:37 +00001624 if (plugin_name.startswith(name_sref))
1625 matches.AppendString (plugin_name.data());
Greg Claytonab65b342011-04-13 22:47:15 +00001626 }
1627 }
1628 return matches.GetSize();
1629}
Greg Claytone996fd32011-03-08 22:40:15 +00001630#pragma mark Process
1631
1632struct ProcessInstance
1633{
1634 ProcessInstance() :
Greg Clayton7f982402013-07-15 22:54:20 +00001635 name(),
1636 description(),
1637 create_callback(NULL),
1638 debugger_init_callback(NULL)
Greg Claytone996fd32011-03-08 22:40:15 +00001639 {
1640 }
1641
Greg Clayton57abc5d2013-05-10 21:47:16 +00001642 ConstString name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001643 std::string description;
1644 ProcessCreateInstance create_callback;
Greg Clayton7f982402013-07-15 22:54:20 +00001645 DebuggerInitializeCallback debugger_init_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001646};
1647
1648typedef std::vector<ProcessInstance> ProcessInstances;
1649
Greg Claytonab65b342011-04-13 22:47:15 +00001650static Mutex &
1651GetProcessMutex ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001652{
Greg Claytonab65b342011-04-13 22:47:15 +00001653 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
1654 return g_instances_mutex;
1655}
1656
1657static ProcessInstances &
1658GetProcessInstances ()
1659{
1660 static ProcessInstances g_instances;
1661 return g_instances;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001662}
1663
1664
1665bool
Greg Clayton7f982402013-07-15 22:54:20 +00001666PluginManager::RegisterPlugin (const ConstString &name,
1667 const char *description,
1668 ProcessCreateInstance create_callback,
1669 DebuggerInitializeCallback debugger_init_callback)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001670{
1671 if (create_callback)
1672 {
1673 ProcessInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +00001674 assert ((bool)name);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001675 instance.name = name;
1676 if (description && description[0])
1677 instance.description = description;
1678 instance.create_callback = create_callback;
Greg Clayton7f982402013-07-15 22:54:20 +00001679 instance.debugger_init_callback = debugger_init_callback;
Greg Claytonab65b342011-04-13 22:47:15 +00001680 Mutex::Locker locker (GetProcessMutex ());
1681 GetProcessInstances ().push_back (instance);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001682 }
1683 return false;
1684}
1685
Greg Claytonbfe5f3b2011-02-18 01:44:25 +00001686const char *
1687PluginManager::GetProcessPluginNameAtIndex (uint32_t idx)
1688{
Greg Claytonab65b342011-04-13 22:47:15 +00001689 Mutex::Locker locker (GetProcessMutex ());
1690 ProcessInstances &instances = GetProcessInstances ();
1691 if (idx < instances.size())
Greg Clayton57abc5d2013-05-10 21:47:16 +00001692 return instances[idx].name.GetCString();
Greg Claytonbfe5f3b2011-02-18 01:44:25 +00001693 return NULL;
1694}
1695
1696const char *
1697PluginManager::GetProcessPluginDescriptionAtIndex (uint32_t idx)
1698{
Greg Claytonab65b342011-04-13 22:47:15 +00001699 Mutex::Locker locker (GetProcessMutex ());
1700 ProcessInstances &instances = GetProcessInstances ();
1701 if (idx < instances.size())
1702 return instances[idx].description.c_str();
Greg Claytonbfe5f3b2011-02-18 01:44:25 +00001703 return NULL;
1704}
1705
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001706bool
1707PluginManager::UnregisterPlugin (ProcessCreateInstance create_callback)
1708{
1709 if (create_callback)
1710 {
Greg Claytonab65b342011-04-13 22:47:15 +00001711 Mutex::Locker locker (GetProcessMutex ());
1712 ProcessInstances &instances = GetProcessInstances ();
1713
1714 ProcessInstances::iterator pos, end = instances.end();
1715 for (pos = instances.begin(); pos != end; ++ pos)
1716 {
1717 if (pos->create_callback == create_callback)
1718 {
1719 instances.erase(pos);
1720 return true;
1721 }
1722 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001723 }
1724 return false;
1725}
1726
1727ProcessCreateInstance
1728PluginManager::GetProcessCreateCallbackAtIndex (uint32_t idx)
1729{
Greg Claytonab65b342011-04-13 22:47:15 +00001730 Mutex::Locker locker (GetProcessMutex ());
1731 ProcessInstances &instances = GetProcessInstances ();
1732 if (idx < instances.size())
1733 return instances[idx].create_callback;
Jason Molenda743e86a2010-06-11 23:44:18 +00001734 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001735}
1736
Greg Claytonab65b342011-04-13 22:47:15 +00001737
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001738ProcessCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +00001739PluginManager::GetProcessCreateCallbackForPluginName (const ConstString &name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001740{
Greg Clayton57abc5d2013-05-10 21:47:16 +00001741 if (name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001742 {
Greg Claytonab65b342011-04-13 22:47:15 +00001743 Mutex::Locker locker (GetProcessMutex ());
1744 ProcessInstances &instances = GetProcessInstances ();
1745
1746 ProcessInstances::iterator pos, end = instances.end();
1747 for (pos = instances.begin(); pos != end; ++ pos)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001748 {
Greg Clayton57abc5d2013-05-10 21:47:16 +00001749 if (name == pos->name)
Greg Claytonab65b342011-04-13 22:47:15 +00001750 return pos->create_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001751 }
1752 }
1753 return NULL;
1754}
1755
1756#pragma mark SymbolFile
1757
Jason Molenda743e86a2010-06-11 23:44:18 +00001758struct SymbolFileInstance
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001759{
1760 SymbolFileInstance() :
1761 name(),
1762 description(),
1763 create_callback(NULL)
1764 {
1765 }
1766
Greg Clayton57abc5d2013-05-10 21:47:16 +00001767 ConstString name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001768 std::string description;
1769 SymbolFileCreateInstance create_callback;
1770};
1771
1772typedef std::vector<SymbolFileInstance> SymbolFileInstances;
1773
Greg Claytonab65b342011-04-13 22:47:15 +00001774static Mutex &
1775GetSymbolFileMutex ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001776{
Greg Claytonab65b342011-04-13 22:47:15 +00001777 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
1778 return g_instances_mutex;
1779}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001780
Greg Claytonab65b342011-04-13 22:47:15 +00001781static SymbolFileInstances &
1782GetSymbolFileInstances ()
1783{
1784 static SymbolFileInstances g_instances;
1785 return g_instances;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001786}
1787
1788
1789bool
1790PluginManager::RegisterPlugin
1791(
Greg Clayton57abc5d2013-05-10 21:47:16 +00001792 const ConstString &name,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001793 const char *description,
1794 SymbolFileCreateInstance create_callback
1795)
1796{
1797 if (create_callback)
1798 {
1799 SymbolFileInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +00001800 assert ((bool)name);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001801 instance.name = name;
1802 if (description && description[0])
1803 instance.description = description;
1804 instance.create_callback = create_callback;
Greg Claytonab65b342011-04-13 22:47:15 +00001805 Mutex::Locker locker (GetSymbolFileMutex ());
1806 GetSymbolFileInstances ().push_back (instance);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001807 }
1808 return false;
1809}
1810
1811bool
1812PluginManager::UnregisterPlugin (SymbolFileCreateInstance create_callback)
1813{
1814 if (create_callback)
1815 {
Greg Claytonab65b342011-04-13 22:47:15 +00001816 Mutex::Locker locker (GetSymbolFileMutex ());
1817 SymbolFileInstances &instances = GetSymbolFileInstances ();
1818
1819 SymbolFileInstances::iterator pos, end = instances.end();
1820 for (pos = instances.begin(); pos != end; ++ pos)
1821 {
1822 if (pos->create_callback == create_callback)
1823 {
1824 instances.erase(pos);
1825 return true;
1826 }
1827 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001828 }
1829 return false;
1830}
1831
1832SymbolFileCreateInstance
1833PluginManager::GetSymbolFileCreateCallbackAtIndex (uint32_t idx)
1834{
Greg Claytonab65b342011-04-13 22:47:15 +00001835 Mutex::Locker locker (GetSymbolFileMutex ());
1836 SymbolFileInstances &instances = GetSymbolFileInstances ();
1837 if (idx < instances.size())
1838 return instances[idx].create_callback;
Jason Molenda743e86a2010-06-11 23:44:18 +00001839 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001840}
Greg Claytonab65b342011-04-13 22:47:15 +00001841
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001842SymbolFileCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +00001843PluginManager::GetSymbolFileCreateCallbackForPluginName (const ConstString &name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001844{
Greg Clayton57abc5d2013-05-10 21:47:16 +00001845 if (name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001846 {
Greg Claytonab65b342011-04-13 22:47:15 +00001847 Mutex::Locker locker (GetSymbolFileMutex ());
1848 SymbolFileInstances &instances = GetSymbolFileInstances ();
1849
1850 SymbolFileInstances::iterator pos, end = instances.end();
1851 for (pos = instances.begin(); pos != end; ++ pos)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001852 {
Greg Clayton57abc5d2013-05-10 21:47:16 +00001853 if (name == pos->name)
Greg Claytonab65b342011-04-13 22:47:15 +00001854 return pos->create_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001855 }
1856 }
1857 return NULL;
1858}
1859
1860
1861
1862#pragma mark SymbolVendor
1863
Jason Molenda743e86a2010-06-11 23:44:18 +00001864struct SymbolVendorInstance
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001865{
1866 SymbolVendorInstance() :
1867 name(),
1868 description(),
1869 create_callback(NULL)
1870 {
1871 }
1872
Greg Clayton57abc5d2013-05-10 21:47:16 +00001873 ConstString name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001874 std::string description;
1875 SymbolVendorCreateInstance create_callback;
1876};
1877
1878typedef std::vector<SymbolVendorInstance> SymbolVendorInstances;
1879
Greg Claytonab65b342011-04-13 22:47:15 +00001880static Mutex &
1881GetSymbolVendorMutex ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001882{
Greg Claytonab65b342011-04-13 22:47:15 +00001883 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
1884 return g_instances_mutex;
1885}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001886
Greg Claytonab65b342011-04-13 22:47:15 +00001887static SymbolVendorInstances &
1888GetSymbolVendorInstances ()
1889{
1890 static SymbolVendorInstances g_instances;
1891 return g_instances;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001892}
1893
1894bool
1895PluginManager::RegisterPlugin
1896(
Greg Clayton57abc5d2013-05-10 21:47:16 +00001897 const ConstString &name,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001898 const char *description,
1899 SymbolVendorCreateInstance create_callback
1900)
1901{
1902 if (create_callback)
1903 {
1904 SymbolVendorInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +00001905 assert ((bool)name);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001906 instance.name = name;
1907 if (description && description[0])
1908 instance.description = description;
1909 instance.create_callback = create_callback;
Greg Claytonab65b342011-04-13 22:47:15 +00001910 Mutex::Locker locker (GetSymbolVendorMutex ());
1911 GetSymbolVendorInstances ().push_back (instance);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001912 }
1913 return false;
1914}
1915
1916bool
1917PluginManager::UnregisterPlugin (SymbolVendorCreateInstance create_callback)
1918{
1919 if (create_callback)
1920 {
Greg Claytonab65b342011-04-13 22:47:15 +00001921 Mutex::Locker locker (GetSymbolVendorMutex ());
1922 SymbolVendorInstances &instances = GetSymbolVendorInstances ();
1923
1924 SymbolVendorInstances::iterator pos, end = instances.end();
1925 for (pos = instances.begin(); pos != end; ++ pos)
1926 {
1927 if (pos->create_callback == create_callback)
1928 {
1929 instances.erase(pos);
1930 return true;
1931 }
1932 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001933 }
1934 return false;
1935}
1936
1937SymbolVendorCreateInstance
1938PluginManager::GetSymbolVendorCreateCallbackAtIndex (uint32_t idx)
1939{
Greg Claytonab65b342011-04-13 22:47:15 +00001940 Mutex::Locker locker (GetSymbolVendorMutex ());
1941 SymbolVendorInstances &instances = GetSymbolVendorInstances ();
1942 if (idx < instances.size())
1943 return instances[idx].create_callback;
Jason Molenda743e86a2010-06-11 23:44:18 +00001944 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001945}
1946
Greg Claytonab65b342011-04-13 22:47:15 +00001947
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001948SymbolVendorCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +00001949PluginManager::GetSymbolVendorCreateCallbackForPluginName (const ConstString &name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001950{
Greg Clayton57abc5d2013-05-10 21:47:16 +00001951 if (name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001952 {
Greg Claytonab65b342011-04-13 22:47:15 +00001953 Mutex::Locker locker (GetSymbolVendorMutex ());
1954 SymbolVendorInstances &instances = GetSymbolVendorInstances ();
1955
1956 SymbolVendorInstances::iterator pos, end = instances.end();
1957 for (pos = instances.begin(); pos != end; ++ pos)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001958 {
Greg Clayton57abc5d2013-05-10 21:47:16 +00001959 if (name == pos->name)
Greg Claytonab65b342011-04-13 22:47:15 +00001960 return pos->create_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001961 }
1962 }
1963 return NULL;
1964}
1965
1966
Greg Clayton7be25422011-04-25 21:14:26 +00001967#pragma mark UnwindAssembly
Jason Molendafbcb7f22010-09-10 07:49:16 +00001968
Greg Clayton7be25422011-04-25 21:14:26 +00001969struct UnwindAssemblyInstance
Jason Molendafbcb7f22010-09-10 07:49:16 +00001970{
Greg Clayton7be25422011-04-25 21:14:26 +00001971 UnwindAssemblyInstance() :
Jason Molendafbcb7f22010-09-10 07:49:16 +00001972 name(),
1973 description(),
1974 create_callback(NULL)
1975 {
1976 }
1977
Greg Clayton57abc5d2013-05-10 21:47:16 +00001978 ConstString name;
Jason Molendafbcb7f22010-09-10 07:49:16 +00001979 std::string description;
Greg Clayton7be25422011-04-25 21:14:26 +00001980 UnwindAssemblyCreateInstance create_callback;
Jason Molendafbcb7f22010-09-10 07:49:16 +00001981};
1982
Greg Clayton7be25422011-04-25 21:14:26 +00001983typedef std::vector<UnwindAssemblyInstance> UnwindAssemblyInstances;
Jason Molendafbcb7f22010-09-10 07:49:16 +00001984
Greg Claytonab65b342011-04-13 22:47:15 +00001985static Mutex &
Greg Clayton7be25422011-04-25 21:14:26 +00001986GetUnwindAssemblyMutex ()
Jason Molendafbcb7f22010-09-10 07:49:16 +00001987{
Greg Claytonab65b342011-04-13 22:47:15 +00001988 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
1989 return g_instances_mutex;
1990}
Jason Molendafbcb7f22010-09-10 07:49:16 +00001991
Greg Clayton7be25422011-04-25 21:14:26 +00001992static UnwindAssemblyInstances &
1993GetUnwindAssemblyInstances ()
Greg Claytonab65b342011-04-13 22:47:15 +00001994{
Greg Clayton7be25422011-04-25 21:14:26 +00001995 static UnwindAssemblyInstances g_instances;
Greg Claytonab65b342011-04-13 22:47:15 +00001996 return g_instances;
Jason Molendafbcb7f22010-09-10 07:49:16 +00001997}
1998
1999bool
2000PluginManager::RegisterPlugin
2001(
Greg Clayton57abc5d2013-05-10 21:47:16 +00002002 const ConstString &name,
Jason Molendafbcb7f22010-09-10 07:49:16 +00002003 const char *description,
Greg Clayton7be25422011-04-25 21:14:26 +00002004 UnwindAssemblyCreateInstance create_callback
Jason Molendafbcb7f22010-09-10 07:49:16 +00002005)
2006{
2007 if (create_callback)
2008 {
Greg Clayton7be25422011-04-25 21:14:26 +00002009 UnwindAssemblyInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +00002010 assert ((bool)name);
Jason Molendafbcb7f22010-09-10 07:49:16 +00002011 instance.name = name;
2012 if (description && description[0])
2013 instance.description = description;
2014 instance.create_callback = create_callback;
Greg Clayton7be25422011-04-25 21:14:26 +00002015 Mutex::Locker locker (GetUnwindAssemblyMutex ());
2016 GetUnwindAssemblyInstances ().push_back (instance);
Jason Molendafbcb7f22010-09-10 07:49:16 +00002017 }
2018 return false;
2019}
2020
2021bool
Greg Clayton7be25422011-04-25 21:14:26 +00002022PluginManager::UnregisterPlugin (UnwindAssemblyCreateInstance create_callback)
Jason Molendafbcb7f22010-09-10 07:49:16 +00002023{
2024 if (create_callback)
2025 {
Greg Clayton7be25422011-04-25 21:14:26 +00002026 Mutex::Locker locker (GetUnwindAssemblyMutex ());
2027 UnwindAssemblyInstances &instances = GetUnwindAssemblyInstances ();
Greg Claytonab65b342011-04-13 22:47:15 +00002028
Greg Clayton7be25422011-04-25 21:14:26 +00002029 UnwindAssemblyInstances::iterator pos, end = instances.end();
Greg Claytonab65b342011-04-13 22:47:15 +00002030 for (pos = instances.begin(); pos != end; ++ pos)
2031 {
2032 if (pos->create_callback == create_callback)
2033 {
2034 instances.erase(pos);
2035 return true;
2036 }
2037 }
Jason Molendafbcb7f22010-09-10 07:49:16 +00002038 }
2039 return false;
2040}
2041
Greg Clayton7be25422011-04-25 21:14:26 +00002042UnwindAssemblyCreateInstance
2043PluginManager::GetUnwindAssemblyCreateCallbackAtIndex (uint32_t idx)
Jason Molendafbcb7f22010-09-10 07:49:16 +00002044{
Greg Clayton7be25422011-04-25 21:14:26 +00002045 Mutex::Locker locker (GetUnwindAssemblyMutex ());
2046 UnwindAssemblyInstances &instances = GetUnwindAssemblyInstances ();
Greg Claytonab65b342011-04-13 22:47:15 +00002047 if (idx < instances.size())
2048 return instances[idx].create_callback;
Jason Molendafbcb7f22010-09-10 07:49:16 +00002049 return NULL;
2050}
2051
Greg Claytonab65b342011-04-13 22:47:15 +00002052
Greg Clayton7be25422011-04-25 21:14:26 +00002053UnwindAssemblyCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +00002054PluginManager::GetUnwindAssemblyCreateCallbackForPluginName (const ConstString &name)
Jason Molendafbcb7f22010-09-10 07:49:16 +00002055{
Greg Clayton57abc5d2013-05-10 21:47:16 +00002056 if (name)
Jason Molendafbcb7f22010-09-10 07:49:16 +00002057 {
Greg Clayton7be25422011-04-25 21:14:26 +00002058 Mutex::Locker locker (GetUnwindAssemblyMutex ());
2059 UnwindAssemblyInstances &instances = GetUnwindAssemblyInstances ();
Greg Claytonab65b342011-04-13 22:47:15 +00002060
Greg Clayton7be25422011-04-25 21:14:26 +00002061 UnwindAssemblyInstances::iterator pos, end = instances.end();
Greg Claytonab65b342011-04-13 22:47:15 +00002062 for (pos = instances.begin(); pos != end; ++ pos)
Jason Molendafbcb7f22010-09-10 07:49:16 +00002063 {
Greg Clayton57abc5d2013-05-10 21:47:16 +00002064 if (name == pos->name)
Greg Claytonab65b342011-04-13 22:47:15 +00002065 return pos->create_callback;
Jason Molendafbcb7f22010-09-10 07:49:16 +00002066 }
2067 }
2068 return NULL;
2069}
2070
Greg Claytone8cd0c92012-10-19 18:02:49 +00002071void
2072PluginManager::DebuggerInitialize (Debugger &debugger)
2073{
Jason Molenda9b837a12013-04-05 05:06:39 +00002074 // Initialize the DynamicLoader plugins
Greg Claytone8cd0c92012-10-19 18:02:49 +00002075 {
Jason Molenda9b837a12013-04-05 05:06:39 +00002076 Mutex::Locker locker (GetDynamicLoaderMutex ());
2077 DynamicLoaderInstances &instances = GetDynamicLoaderInstances ();
2078
2079 DynamicLoaderInstances::iterator pos, end = instances.end();
2080 for (pos = instances.begin(); pos != end; ++ pos)
2081 {
2082 if (pos->debugger_init_callback)
2083 pos->debugger_init_callback (debugger);
2084 }
2085 }
2086
Andrew MacPherson17220c12014-03-05 10:12:43 +00002087 // Initialize the JITLoader plugins
2088 {
2089 Mutex::Locker locker (GetJITLoaderMutex ());
2090 JITLoaderInstances &instances = GetJITLoaderInstances ();
2091
2092 JITLoaderInstances::iterator pos, end = instances.end();
2093 for (pos = instances.begin(); pos != end; ++ pos)
2094 {
2095 if (pos->debugger_init_callback)
2096 pos->debugger_init_callback (debugger);
2097 }
2098 }
2099
Jason Molenda9b837a12013-04-05 05:06:39 +00002100 // Initialize the Platform plugins
2101 {
2102 Mutex::Locker locker (GetPlatformInstancesMutex ());
2103 PlatformInstances &instances = GetPlatformInstances ();
2104
2105 PlatformInstances::iterator pos, end = instances.end();
2106 for (pos = instances.begin(); pos != end; ++ pos)
2107 {
2108 if (pos->debugger_init_callback)
2109 pos->debugger_init_callback (debugger);
2110 }
Greg Claytone8cd0c92012-10-19 18:02:49 +00002111 }
Greg Clayton7f982402013-07-15 22:54:20 +00002112
2113 // Initialize the Process plugins
2114 {
2115 Mutex::Locker locker (GetProcessMutex());
2116 ProcessInstances &instances = GetProcessInstances();
2117
2118 ProcessInstances::iterator pos, end = instances.end();
2119 for (pos = instances.begin(); pos != end; ++ pos)
2120 {
2121 if (pos->debugger_init_callback)
2122 pos->debugger_init_callback (debugger);
2123 }
2124 }
2125
Greg Claytone8cd0c92012-10-19 18:02:49 +00002126}
2127
Greg Clayton7f982402013-07-15 22:54:20 +00002128// This is the preferred new way to register plugin specific settings. e.g.
2129// 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 +00002130static lldb::OptionValuePropertiesSP
Greg Clayton7f982402013-07-15 22:54:20 +00002131GetDebuggerPropertyForPlugins (Debugger &debugger,
Jason Molenda3b59f5c2013-04-05 22:40:42 +00002132 const ConstString &plugin_type_name,
2133 const ConstString &plugin_type_desc,
2134 bool can_create)
Greg Claytone8cd0c92012-10-19 18:02:49 +00002135{
2136 lldb::OptionValuePropertiesSP parent_properties_sp (debugger.GetValueProperties());
2137 if (parent_properties_sp)
2138 {
2139 static ConstString g_property_name("plugin");
2140
2141 OptionValuePropertiesSP plugin_properties_sp = parent_properties_sp->GetSubProperty (NULL, g_property_name);
2142 if (!plugin_properties_sp && can_create)
2143 {
2144 plugin_properties_sp.reset (new OptionValueProperties (g_property_name));
2145 parent_properties_sp->AppendProperty (g_property_name,
2146 ConstString("Settings specify to plugins."),
2147 true,
2148 plugin_properties_sp);
2149 }
2150
2151 if (plugin_properties_sp)
2152 {
2153 lldb::OptionValuePropertiesSP plugin_type_properties_sp = plugin_properties_sp->GetSubProperty (NULL, plugin_type_name);
2154 if (!plugin_type_properties_sp && can_create)
2155 {
2156 plugin_type_properties_sp.reset (new OptionValueProperties (plugin_type_name));
2157 plugin_properties_sp->AppendProperty (plugin_type_name,
2158 plugin_type_desc,
2159 true,
2160 plugin_type_properties_sp);
2161 }
2162 return plugin_type_properties_sp;
2163 }
2164 }
2165 return lldb::OptionValuePropertiesSP();
2166}
2167
Greg Clayton7f982402013-07-15 22:54:20 +00002168// This is deprecated way to register plugin specific settings. e.g.
2169// "<plugin_type_name>.plugin.<plugin_type_desc>.SETTINGNAME"
Jason Molenda3b59f5c2013-04-05 22:40:42 +00002170// and Platform generic settings would be under "platform.SETTINGNAME".
2171static lldb::OptionValuePropertiesSP
Greg Clayton7f982402013-07-15 22:54:20 +00002172GetDebuggerPropertyForPluginsOldStyle (Debugger &debugger,
2173 const ConstString &plugin_type_name,
2174 const ConstString &plugin_type_desc,
2175 bool can_create)
Jason Molenda3b59f5c2013-04-05 22:40:42 +00002176{
2177 static ConstString g_property_name("plugin");
2178 lldb::OptionValuePropertiesSP parent_properties_sp (debugger.GetValueProperties());
2179 if (parent_properties_sp)
2180 {
2181 OptionValuePropertiesSP plugin_properties_sp = parent_properties_sp->GetSubProperty (NULL, plugin_type_name);
2182 if (!plugin_properties_sp && can_create)
2183 {
2184 plugin_properties_sp.reset (new OptionValueProperties (plugin_type_name));
2185 parent_properties_sp->AppendProperty (plugin_type_name,
2186 plugin_type_desc,
2187 true,
2188 plugin_properties_sp);
2189 }
2190
2191 if (plugin_properties_sp)
2192 {
2193 lldb::OptionValuePropertiesSP plugin_type_properties_sp = plugin_properties_sp->GetSubProperty (NULL, g_property_name);
2194 if (!plugin_type_properties_sp && can_create)
2195 {
2196 plugin_type_properties_sp.reset (new OptionValueProperties (g_property_name));
2197 plugin_properties_sp->AppendProperty (g_property_name,
2198 ConstString("Settings specific to plugins"),
2199 true,
2200 plugin_type_properties_sp);
2201 }
2202 return plugin_type_properties_sp;
2203 }
2204 }
2205 return lldb::OptionValuePropertiesSP();
2206}
2207
2208
Greg Claytone8cd0c92012-10-19 18:02:49 +00002209lldb::OptionValuePropertiesSP
2210PluginManager::GetSettingForDynamicLoaderPlugin (Debugger &debugger, const ConstString &setting_name)
2211{
2212 lldb::OptionValuePropertiesSP properties_sp;
Greg Clayton7f982402013-07-15 22:54:20 +00002213 lldb::OptionValuePropertiesSP plugin_type_properties_sp (GetDebuggerPropertyForPlugins (debugger,
Greg Claytone8cd0c92012-10-19 18:02:49 +00002214 ConstString("dynamic-loader"),
2215 ConstString(), // not creating to so we don't need the description
2216 false));
2217 if (plugin_type_properties_sp)
2218 properties_sp = plugin_type_properties_sp->GetSubProperty (NULL, setting_name);
2219 return properties_sp;
2220}
2221
2222bool
2223PluginManager::CreateSettingForDynamicLoaderPlugin (Debugger &debugger,
2224 const lldb::OptionValuePropertiesSP &properties_sp,
2225 const ConstString &description,
2226 bool is_global_property)
2227{
2228 if (properties_sp)
2229 {
Greg Clayton7f982402013-07-15 22:54:20 +00002230 lldb::OptionValuePropertiesSP plugin_type_properties_sp (GetDebuggerPropertyForPlugins (debugger,
Greg Claytone8cd0c92012-10-19 18:02:49 +00002231 ConstString("dynamic-loader"),
2232 ConstString("Settings for dynamic loader plug-ins"),
2233 true));
2234 if (plugin_type_properties_sp)
2235 {
2236 plugin_type_properties_sp->AppendProperty (properties_sp->GetName(),
2237 description,
2238 is_global_property,
2239 properties_sp);
2240 return true;
2241 }
2242 }
2243 return false;
2244}
2245
Jason Molenda9b837a12013-04-05 05:06:39 +00002246
2247lldb::OptionValuePropertiesSP
2248PluginManager::GetSettingForPlatformPlugin (Debugger &debugger, const ConstString &setting_name)
2249{
2250 lldb::OptionValuePropertiesSP properties_sp;
Greg Clayton7f982402013-07-15 22:54:20 +00002251 lldb::OptionValuePropertiesSP plugin_type_properties_sp (GetDebuggerPropertyForPluginsOldStyle (debugger,
2252 ConstString("platform"),
2253 ConstString(), // not creating to so we don't need the description
2254 false));
Jason Molenda9b837a12013-04-05 05:06:39 +00002255 if (plugin_type_properties_sp)
2256 properties_sp = plugin_type_properties_sp->GetSubProperty (NULL, setting_name);
2257 return properties_sp;
2258}
2259
2260bool
2261PluginManager::CreateSettingForPlatformPlugin (Debugger &debugger,
2262 const lldb::OptionValuePropertiesSP &properties_sp,
2263 const ConstString &description,
2264 bool is_global_property)
2265{
2266 if (properties_sp)
2267 {
Greg Clayton7f982402013-07-15 22:54:20 +00002268 lldb::OptionValuePropertiesSP plugin_type_properties_sp (GetDebuggerPropertyForPluginsOldStyle (debugger,
2269 ConstString("platform"),
2270 ConstString("Settings for platform plug-ins"),
2271 true));
2272 if (plugin_type_properties_sp)
2273 {
2274 plugin_type_properties_sp->AppendProperty (properties_sp->GetName(),
2275 description,
2276 is_global_property,
2277 properties_sp);
2278 return true;
2279 }
2280 }
2281 return false;
2282}
2283
2284
2285lldb::OptionValuePropertiesSP
2286PluginManager::GetSettingForProcessPlugin (Debugger &debugger, const ConstString &setting_name)
2287{
2288 lldb::OptionValuePropertiesSP properties_sp;
2289 lldb::OptionValuePropertiesSP plugin_type_properties_sp (GetDebuggerPropertyForPlugins (debugger,
2290 ConstString("process"),
2291 ConstString(), // not creating to so we don't need the description
2292 false));
2293 if (plugin_type_properties_sp)
2294 properties_sp = plugin_type_properties_sp->GetSubProperty (NULL, setting_name);
2295 return properties_sp;
2296}
2297
2298bool
2299PluginManager::CreateSettingForProcessPlugin (Debugger &debugger,
2300 const lldb::OptionValuePropertiesSP &properties_sp,
2301 const ConstString &description,
2302 bool is_global_property)
2303{
2304 if (properties_sp)
2305 {
Jason Molenda9b837a12013-04-05 05:06:39 +00002306 lldb::OptionValuePropertiesSP plugin_type_properties_sp (GetDebuggerPropertyForPlugins (debugger,
Greg Clayton7f982402013-07-15 22:54:20 +00002307 ConstString("process"),
2308 ConstString("Settings for process plug-ins"),
Jason Molenda9b837a12013-04-05 05:06:39 +00002309 true));
2310 if (plugin_type_properties_sp)
2311 {
2312 plugin_type_properties_sp->AppendProperty (properties_sp->GetName(),
2313 description,
2314 is_global_property,
2315 properties_sp);
2316 return true;
2317 }
2318 }
2319 return false;
2320}
2321