blob: 619dbc709d57a9e195aef883862d2b31aba69a59 [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"
28
Greg Clayton4272cc72011-02-02 02:24:04 +000029using namespace lldb;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000030using namespace lldb_private;
31
Jason Molenda743e86a2010-06-11 23:44:18 +000032enum PluginAction
Chris Lattner30fdc8d2010-06-08 16:52:24 +000033{
34 ePluginRegisterInstance,
35 ePluginUnregisterInstance,
36 ePluginGetInstanceAtIndex
37};
38
Greg Clayton03da4cc2013-04-19 21:31:16 +000039
40typedef bool (*PluginInitCallback) (void);
41typedef void (*PluginTermCallback) (void);
42
Greg Clayton4272cc72011-02-02 02:24:04 +000043struct PluginInfo
44{
45 void *plugin_handle;
Greg Clayton03da4cc2013-04-19 21:31:16 +000046 PluginInitCallback plugin_init_callback;
47 PluginTermCallback plugin_term_callback;
Greg Clayton4272cc72011-02-02 02:24:04 +000048};
49
50typedef std::map<FileSpec, PluginInfo> PluginTerminateMap;
51
52static Mutex &
53GetPluginMapMutex ()
54{
55 static Mutex g_plugin_map_mutex (Mutex::eMutexTypeRecursive);
56 return g_plugin_map_mutex;
57}
58
59static PluginTerminateMap &
60GetPluginMap ()
61{
62 static PluginTerminateMap g_plugin_map;
63 return g_plugin_map;
64}
65
66static bool
67PluginIsLoaded (const FileSpec &plugin_file_spec)
68{
69 Mutex::Locker locker (GetPluginMapMutex ());
70 PluginTerminateMap &plugin_map = GetPluginMap ();
71 return plugin_map.find (plugin_file_spec) != plugin_map.end();
72}
73
74static void
75SetPluginInfo (const FileSpec &plugin_file_spec, const PluginInfo &plugin_info)
76{
77 Mutex::Locker locker (GetPluginMapMutex ());
78 PluginTerminateMap &plugin_map = GetPluginMap ();
Michael Sartain3cf443d2013-07-17 00:26:30 +000079 assert (plugin_map.find (plugin_file_spec) == plugin_map.end());
Greg Clayton4272cc72011-02-02 02:24:04 +000080 plugin_map[plugin_file_spec] = plugin_info;
81}
82
David Majnemer5ff02782014-07-22 21:59:22 +000083template <typename FPtrTy>
84static FPtrTy
85CastToFPtr (void *VPtr)
86{
87 return reinterpret_cast<FPtrTy>(reinterpret_cast<intptr_t>(VPtr));
88}
Greg Clayton4272cc72011-02-02 02:24:04 +000089
90static FileSpec::EnumerateDirectoryResult
91LoadPluginCallback
92(
93 void *baton,
94 FileSpec::FileType file_type,
95 const FileSpec &file_spec
96)
97{
98// PluginManager *plugin_manager = (PluginManager *)baton;
99 Error error;
100
101 // If we have a regular file, a symbolic link or unknown file type, try
102 // and process the file. We must handle unknown as sometimes the directory
103 // enumeration might be enumerating a file system that doesn't have correct
104 // file type information.
105 if (file_type == FileSpec::eFileTypeRegular ||
106 file_type == FileSpec::eFileTypeSymbolicLink ||
107 file_type == FileSpec::eFileTypeUnknown )
108 {
109 FileSpec plugin_file_spec (file_spec);
110 plugin_file_spec.ResolvePath();
111
112 if (PluginIsLoaded (plugin_file_spec))
113 return FileSpec::eEnumerateDirectoryResultNext;
114 else
115 {
116 PluginInfo plugin_info = { NULL, NULL, NULL };
Greg Clayton45319462011-02-08 00:35:34 +0000117 uint32_t flags = Host::eDynamicLibraryOpenOptionLazy |
118 Host::eDynamicLibraryOpenOptionLocal |
119 Host::eDynamicLibraryOpenOptionLimitGetSymbol;
120
121 plugin_info.plugin_handle = Host::DynamicLibraryOpen (plugin_file_spec, flags, error);
Greg Clayton4272cc72011-02-02 02:24:04 +0000122 if (plugin_info.plugin_handle)
123 {
124 bool success = false;
David Majnemer5ff02782014-07-22 21:59:22 +0000125 plugin_info.plugin_init_callback =
126 CastToFPtr<PluginInitCallback>(
127 Host::DynamicLibraryGetSymbol(plugin_info.plugin_handle,
128 "LLDBPluginInitialize",
129 error));
Greg Clayton4272cc72011-02-02 02:24:04 +0000130 if (plugin_info.plugin_init_callback)
131 {
132 // Call the plug-in "bool LLDBPluginInitialize(void)" function
Greg Clayton03da4cc2013-04-19 21:31:16 +0000133 success = plugin_info.plugin_init_callback();
Greg Clayton4272cc72011-02-02 02:24:04 +0000134 }
135
136 if (success)
137 {
138 // It is ok for the "LLDBPluginTerminate" symbol to be NULL
David Majnemer5ff02782014-07-22 21:59:22 +0000139 plugin_info.plugin_term_callback =
140 CastToFPtr<PluginTermCallback>(
141 Host::DynamicLibraryGetSymbol(
142 plugin_info.plugin_handle, "LLDBPluginTerminate",
143 error));
Greg Clayton4272cc72011-02-02 02:24:04 +0000144 }
145 else
146 {
147 // The initialize function returned FALSE which means the
148 // plug-in might not be compatible, or might be too new or
149 // too old, or might not want to run on this machine.
150 Host::DynamicLibraryClose (plugin_info.plugin_handle);
151 plugin_info.plugin_handle = NULL;
152 plugin_info.plugin_init_callback = NULL;
153 }
154
155 // Regardless of success or failure, cache the plug-in load
156 // in our plug-in info so we don't try to load it again and
157 // again.
158 SetPluginInfo (plugin_file_spec, plugin_info);
159
160 return FileSpec::eEnumerateDirectoryResultNext;
161 }
162 }
163 }
164
165 if (file_type == FileSpec::eFileTypeUnknown ||
166 file_type == FileSpec::eFileTypeDirectory ||
167 file_type == FileSpec::eFileTypeSymbolicLink )
168 {
169 // Try and recurse into anything that a directory or symbolic link.
170 // We must also do this for unknown as sometimes the directory enumeration
Bruce Mitchener6a7f3332014-06-27 02:42:12 +0000171 // might be enumerating a file system that doesn't have correct file type
Greg Clayton4272cc72011-02-02 02:24:04 +0000172 // information.
173 return FileSpec::eEnumerateDirectoryResultEnter;
174 }
175
176 return FileSpec::eEnumerateDirectoryResultNext;
177}
178
179
180void
181PluginManager::Initialize ()
182{
Greg Clayton1cb64962011-03-24 04:28:38 +0000183#if 1
Greg Clayton4272cc72011-02-02 02:24:04 +0000184 FileSpec dir_spec;
185 const bool find_directories = true;
186 const bool find_files = true;
187 const bool find_other = true;
188 char dir_path[PATH_MAX];
Zachary Turner42ff0ad2014-08-21 17:29:12 +0000189 if (HostInfo::GetLLDBPath(ePathTypeLLDBSystemPlugins, dir_spec))
Greg Clayton4272cc72011-02-02 02:24:04 +0000190 {
191 if (dir_spec.Exists() && dir_spec.GetPath(dir_path, sizeof(dir_path)))
192 {
193 FileSpec::EnumerateDirectory (dir_path,
194 find_directories,
195 find_files,
196 find_other,
197 LoadPluginCallback,
198 NULL);
199 }
200 }
201
Zachary Turner42ff0ad2014-08-21 17:29:12 +0000202 if (HostInfo::GetLLDBPath(ePathTypeLLDBUserPlugins, dir_spec))
Greg Clayton4272cc72011-02-02 02:24:04 +0000203 {
204 if (dir_spec.Exists() && dir_spec.GetPath(dir_path, sizeof(dir_path)))
205 {
206 FileSpec::EnumerateDirectory (dir_path,
207 find_directories,
208 find_files,
209 find_other,
210 LoadPluginCallback,
211 NULL);
212 }
213 }
Greg Clayton1cb64962011-03-24 04:28:38 +0000214#endif
Greg Clayton4272cc72011-02-02 02:24:04 +0000215}
216
217void
218PluginManager::Terminate ()
219{
220 Mutex::Locker locker (GetPluginMapMutex ());
221 PluginTerminateMap &plugin_map = GetPluginMap ();
222
223 PluginTerminateMap::const_iterator pos, end = plugin_map.end();
224 for (pos = plugin_map.begin(); pos != end; ++pos)
225 {
226 // Call the plug-in "void LLDBPluginTerminate (void)" function if there
227 // is one (if the symbol was not NULL).
228 if (pos->second.plugin_handle)
229 {
230 if (pos->second.plugin_term_callback)
Greg Clayton03da4cc2013-04-19 21:31:16 +0000231 pos->second.plugin_term_callback();
Greg Clayton4272cc72011-02-02 02:24:04 +0000232 Host::DynamicLibraryClose (pos->second.plugin_handle);
233 }
234 }
235 plugin_map.clear();
236}
237
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000238
239#pragma mark ABI
240
241
Jason Molenda743e86a2010-06-11 23:44:18 +0000242struct ABIInstance
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000243{
244 ABIInstance() :
245 name(),
246 description(),
247 create_callback(NULL)
248 {
249 }
250
Greg Clayton57abc5d2013-05-10 21:47:16 +0000251 ConstString name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000252 std::string description;
253 ABICreateInstance create_callback;
254};
255
256typedef std::vector<ABIInstance> ABIInstances;
257
Greg Claytonded470d2011-03-19 01:12:21 +0000258static Mutex &
259GetABIInstancesMutex ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000260{
Greg Claytonded470d2011-03-19 01:12:21 +0000261 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
262 return g_instances_mutex;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000263}
264
Greg Claytonded470d2011-03-19 01:12:21 +0000265static ABIInstances &
266GetABIInstances ()
267{
268 static ABIInstances g_instances;
269 return g_instances;
270}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000271
272bool
273PluginManager::RegisterPlugin
Greg Clayton4272cc72011-02-02 02:24:04 +0000274(
Greg Clayton57abc5d2013-05-10 21:47:16 +0000275 const ConstString &name,
Greg Clayton4272cc72011-02-02 02:24:04 +0000276 const char *description,
277 ABICreateInstance create_callback
278)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000279{
280 if (create_callback)
281 {
282 ABIInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +0000283 assert ((bool)name);
284 instance.name = name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000285 if (description && description[0])
286 instance.description = description;
287 instance.create_callback = create_callback;
Greg Claytonded470d2011-03-19 01:12:21 +0000288 Mutex::Locker locker (GetABIInstancesMutex ());
289 GetABIInstances ().push_back (instance);
290 return true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000291 }
292 return false;
293}
294
295bool
296PluginManager::UnregisterPlugin (ABICreateInstance create_callback)
297{
298 if (create_callback)
299 {
Greg Claytonded470d2011-03-19 01:12:21 +0000300 Mutex::Locker locker (GetABIInstancesMutex ());
301 ABIInstances &instances = GetABIInstances ();
302
303 ABIInstances::iterator pos, end = instances.end();
304 for (pos = instances.begin(); pos != end; ++ pos)
305 {
306 if (pos->create_callback == create_callback)
307 {
308 instances.erase(pos);
309 return true;
310 }
311 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000312 }
313 return false;
314}
315
316ABICreateInstance
317PluginManager::GetABICreateCallbackAtIndex (uint32_t idx)
318{
Greg Claytonded470d2011-03-19 01:12:21 +0000319 Mutex::Locker locker (GetABIInstancesMutex ());
320 ABIInstances &instances = GetABIInstances ();
Greg Claytonded470d2011-03-19 01:12:21 +0000321 if (idx < instances.size())
322 return instances[idx].create_callback;
Jason Molenda743e86a2010-06-11 23:44:18 +0000323 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000324}
325
326ABICreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +0000327PluginManager::GetABICreateCallbackForPluginName (const ConstString &name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000328{
Greg Clayton57abc5d2013-05-10 21:47:16 +0000329 if (name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000330 {
Greg Claytonded470d2011-03-19 01:12:21 +0000331 Mutex::Locker locker (GetABIInstancesMutex ());
Greg Claytonded470d2011-03-19 01:12:21 +0000332 ABIInstances &instances = GetABIInstances ();
333
334 ABIInstances::iterator pos, end = instances.end();
335 for (pos = instances.begin(); pos != end; ++ pos)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000336 {
Greg Clayton57abc5d2013-05-10 21:47:16 +0000337 if (name == pos->name)
Greg Claytonded470d2011-03-19 01:12:21 +0000338 return pos->create_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000339 }
340 }
341 return NULL;
342}
343
344
345#pragma mark Disassembler
346
347
Jason Molenda743e86a2010-06-11 23:44:18 +0000348struct DisassemblerInstance
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000349{
350 DisassemblerInstance() :
351 name(),
352 description(),
353 create_callback(NULL)
354 {
355 }
356
Greg Clayton57abc5d2013-05-10 21:47:16 +0000357 ConstString name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000358 std::string description;
359 DisassemblerCreateInstance create_callback;
360};
361
362typedef std::vector<DisassemblerInstance> DisassemblerInstances;
363
Greg Claytonab65b342011-04-13 22:47:15 +0000364static Mutex &
365GetDisassemblerMutex ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000366{
Greg Claytonab65b342011-04-13 22:47:15 +0000367 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
368 return g_instances_mutex;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000369}
370
Greg Claytonab65b342011-04-13 22:47:15 +0000371static DisassemblerInstances &
372GetDisassemblerInstances ()
373{
374 static DisassemblerInstances g_instances;
375 return g_instances;
376}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000377
378bool
379PluginManager::RegisterPlugin
380(
Greg Clayton57abc5d2013-05-10 21:47:16 +0000381 const ConstString &name,
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000382 const char *description,
383 DisassemblerCreateInstance create_callback
384)
385{
386 if (create_callback)
387 {
388 DisassemblerInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +0000389 assert ((bool)name);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000390 instance.name = name;
391 if (description && description[0])
392 instance.description = description;
393 instance.create_callback = create_callback;
Greg Claytonab65b342011-04-13 22:47:15 +0000394 Mutex::Locker locker (GetDisassemblerMutex ());
395 GetDisassemblerInstances ().push_back (instance);
396 return true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000397 }
398 return false;
399}
400
401bool
402PluginManager::UnregisterPlugin (DisassemblerCreateInstance create_callback)
403{
404 if (create_callback)
405 {
Greg Claytonab65b342011-04-13 22:47:15 +0000406 Mutex::Locker locker (GetDisassemblerMutex ());
407 DisassemblerInstances &instances = GetDisassemblerInstances ();
408
409 DisassemblerInstances::iterator pos, end = instances.end();
410 for (pos = instances.begin(); pos != end; ++ pos)
411 {
412 if (pos->create_callback == create_callback)
413 {
414 instances.erase(pos);
415 return true;
416 }
417 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000418 }
419 return false;
420}
421
422DisassemblerCreateInstance
423PluginManager::GetDisassemblerCreateCallbackAtIndex (uint32_t idx)
424{
Greg Claytonab65b342011-04-13 22:47:15 +0000425 Mutex::Locker locker (GetDisassemblerMutex ());
426 DisassemblerInstances &instances = GetDisassemblerInstances ();
427 if (idx < instances.size())
428 return instances[idx].create_callback;
Jason Molenda743e86a2010-06-11 23:44:18 +0000429 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000430}
431
432DisassemblerCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +0000433PluginManager::GetDisassemblerCreateCallbackForPluginName (const ConstString &name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000434{
Greg Clayton57abc5d2013-05-10 21:47:16 +0000435 if (name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000436 {
Greg Claytonab65b342011-04-13 22:47:15 +0000437 Mutex::Locker locker (GetDisassemblerMutex ());
438 DisassemblerInstances &instances = GetDisassemblerInstances ();
439
440 DisassemblerInstances::iterator pos, end = instances.end();
441 for (pos = instances.begin(); pos != end; ++ pos)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000442 {
Greg Clayton57abc5d2013-05-10 21:47:16 +0000443 if (name == pos->name)
Greg Claytonab65b342011-04-13 22:47:15 +0000444 return pos->create_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000445 }
446 }
447 return NULL;
448}
449
450
451
452#pragma mark DynamicLoader
453
454
Jason Molenda743e86a2010-06-11 23:44:18 +0000455struct DynamicLoaderInstance
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000456{
457 DynamicLoaderInstance() :
458 name(),
459 description(),
Greg Claytone8cd0c92012-10-19 18:02:49 +0000460 create_callback(NULL),
461 debugger_init_callback (NULL)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000462 {
463 }
464
Greg Clayton57abc5d2013-05-10 21:47:16 +0000465 ConstString name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000466 std::string description;
467 DynamicLoaderCreateInstance create_callback;
Greg Claytone8cd0c92012-10-19 18:02:49 +0000468 DebuggerInitializeCallback debugger_init_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000469};
470
471typedef std::vector<DynamicLoaderInstance> DynamicLoaderInstances;
472
Greg Claytonab65b342011-04-13 22:47:15 +0000473
474static Mutex &
475GetDynamicLoaderMutex ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000476{
Greg Claytonab65b342011-04-13 22:47:15 +0000477 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
478 return g_instances_mutex;
479}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000480
Greg Claytonab65b342011-04-13 22:47:15 +0000481static DynamicLoaderInstances &
482GetDynamicLoaderInstances ()
483{
484 static DynamicLoaderInstances g_instances;
485 return g_instances;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000486}
487
488
489bool
490PluginManager::RegisterPlugin
491(
Greg Clayton57abc5d2013-05-10 21:47:16 +0000492 const ConstString &name,
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000493 const char *description,
Greg Claytone8cd0c92012-10-19 18:02:49 +0000494 DynamicLoaderCreateInstance create_callback,
495 DebuggerInitializeCallback debugger_init_callback
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000496)
497{
498 if (create_callback)
499 {
500 DynamicLoaderInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +0000501 assert ((bool)name);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000502 instance.name = name;
503 if (description && description[0])
504 instance.description = description;
505 instance.create_callback = create_callback;
Greg Claytone8cd0c92012-10-19 18:02:49 +0000506 instance.debugger_init_callback = debugger_init_callback;
Greg Claytonab65b342011-04-13 22:47:15 +0000507 Mutex::Locker locker (GetDynamicLoaderMutex ());
508 GetDynamicLoaderInstances ().push_back (instance);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000509 }
510 return false;
511}
512
513bool
514PluginManager::UnregisterPlugin (DynamicLoaderCreateInstance create_callback)
515{
516 if (create_callback)
517 {
Greg Claytonab65b342011-04-13 22:47:15 +0000518 Mutex::Locker locker (GetDynamicLoaderMutex ());
519 DynamicLoaderInstances &instances = GetDynamicLoaderInstances ();
520
521 DynamicLoaderInstances::iterator pos, end = instances.end();
522 for (pos = instances.begin(); pos != end; ++ pos)
523 {
524 if (pos->create_callback == create_callback)
525 {
526 instances.erase(pos);
527 return true;
528 }
529 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000530 }
531 return false;
532}
533
534DynamicLoaderCreateInstance
535PluginManager::GetDynamicLoaderCreateCallbackAtIndex (uint32_t idx)
536{
Greg Claytonab65b342011-04-13 22:47:15 +0000537 Mutex::Locker locker (GetDynamicLoaderMutex ());
538 DynamicLoaderInstances &instances = GetDynamicLoaderInstances ();
539 if (idx < instances.size())
540 return instances[idx].create_callback;
Jason Molenda743e86a2010-06-11 23:44:18 +0000541 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000542}
543
544DynamicLoaderCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +0000545PluginManager::GetDynamicLoaderCreateCallbackForPluginName (const ConstString &name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000546{
Greg Clayton57abc5d2013-05-10 21:47:16 +0000547 if (name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000548 {
Greg Claytonab65b342011-04-13 22:47:15 +0000549 Mutex::Locker locker (GetDynamicLoaderMutex ());
550 DynamicLoaderInstances &instances = GetDynamicLoaderInstances ();
551
552 DynamicLoaderInstances::iterator pos, end = instances.end();
553 for (pos = instances.begin(); pos != end; ++ pos)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000554 {
Greg Clayton57abc5d2013-05-10 21:47:16 +0000555 if (name == pos->name)
Greg Claytonab65b342011-04-13 22:47:15 +0000556 return pos->create_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000557 }
558 }
559 return NULL;
560}
561
Andrew MacPherson17220c12014-03-05 10:12:43 +0000562#pragma mark JITLoader
563
564
565struct JITLoaderInstance
566{
567 JITLoaderInstance() :
568 name(),
569 description(),
570 create_callback(NULL),
571 debugger_init_callback (NULL)
572 {
573 }
574
575 ConstString name;
576 std::string description;
577 JITLoaderCreateInstance create_callback;
578 DebuggerInitializeCallback debugger_init_callback;
579};
580
581typedef std::vector<JITLoaderInstance> JITLoaderInstances;
582
583
584static Mutex &
585GetJITLoaderMutex ()
586{
587 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
588 return g_instances_mutex;
589}
590
591static JITLoaderInstances &
592GetJITLoaderInstances ()
593{
594 static JITLoaderInstances g_instances;
595 return g_instances;
596}
597
598
599bool
600PluginManager::RegisterPlugin
601(
602 const ConstString &name,
603 const char *description,
604 JITLoaderCreateInstance create_callback,
605 DebuggerInitializeCallback debugger_init_callback
606)
607{
608 if (create_callback)
609 {
610 JITLoaderInstance instance;
611 assert ((bool)name);
612 instance.name = name;
613 if (description && description[0])
614 instance.description = description;
615 instance.create_callback = create_callback;
616 instance.debugger_init_callback = debugger_init_callback;
617 Mutex::Locker locker (GetJITLoaderMutex ());
618 GetJITLoaderInstances ().push_back (instance);
619 }
620 return false;
621}
622
623bool
624PluginManager::UnregisterPlugin (JITLoaderCreateInstance create_callback)
625{
626 if (create_callback)
627 {
628 Mutex::Locker locker (GetJITLoaderMutex ());
629 JITLoaderInstances &instances = GetJITLoaderInstances ();
630
631 JITLoaderInstances::iterator pos, end = instances.end();
632 for (pos = instances.begin(); pos != end; ++ pos)
633 {
634 if (pos->create_callback == create_callback)
635 {
636 instances.erase(pos);
637 return true;
638 }
639 }
640 }
641 return false;
642}
643
644JITLoaderCreateInstance
645PluginManager::GetJITLoaderCreateCallbackAtIndex (uint32_t idx)
646{
647 Mutex::Locker locker (GetJITLoaderMutex ());
648 JITLoaderInstances &instances = GetJITLoaderInstances ();
649 if (idx < instances.size())
650 return instances[idx].create_callback;
651 return NULL;
652}
653
654JITLoaderCreateInstance
655PluginManager::GetJITLoaderCreateCallbackForPluginName (const ConstString &name)
656{
657 if (name)
658 {
659 Mutex::Locker locker (GetJITLoaderMutex ());
660 JITLoaderInstances &instances = GetJITLoaderInstances ();
661
662 JITLoaderInstances::iterator pos, end = instances.end();
663 for (pos = instances.begin(); pos != end; ++ pos)
664 {
665 if (name == pos->name)
666 return pos->create_callback;
667 }
668 }
669 return NULL;
670}
671
Greg Claytonf03bbe22011-02-01 01:37:45 +0000672#pragma mark EmulateInstruction
673
674
675struct EmulateInstructionInstance
676{
677 EmulateInstructionInstance() :
678 name(),
679 description(),
680 create_callback(NULL)
681 {
682 }
683
Greg Clayton57abc5d2013-05-10 21:47:16 +0000684 ConstString name;
Greg Claytonf03bbe22011-02-01 01:37:45 +0000685 std::string description;
686 EmulateInstructionCreateInstance create_callback;
687};
688
689typedef std::vector<EmulateInstructionInstance> EmulateInstructionInstances;
690
Greg Claytonab65b342011-04-13 22:47:15 +0000691static Mutex &
692GetEmulateInstructionMutex ()
Greg Claytonf03bbe22011-02-01 01:37:45 +0000693{
Greg Claytonab65b342011-04-13 22:47:15 +0000694 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
695 return g_instances_mutex;
696}
697
698static EmulateInstructionInstances &
699GetEmulateInstructionInstances ()
700{
701 static EmulateInstructionInstances g_instances;
702 return g_instances;
Greg Claytonf03bbe22011-02-01 01:37:45 +0000703}
704
705
706bool
707PluginManager::RegisterPlugin
708(
Greg Clayton57abc5d2013-05-10 21:47:16 +0000709 const ConstString &name,
Greg Clayton4272cc72011-02-02 02:24:04 +0000710 const char *description,
711 EmulateInstructionCreateInstance create_callback
712)
Greg Claytonf03bbe22011-02-01 01:37:45 +0000713{
714 if (create_callback)
715 {
716 EmulateInstructionInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +0000717 assert ((bool)name);
Greg Claytonf03bbe22011-02-01 01:37:45 +0000718 instance.name = name;
719 if (description && description[0])
720 instance.description = description;
721 instance.create_callback = create_callback;
Greg Claytonab65b342011-04-13 22:47:15 +0000722 Mutex::Locker locker (GetEmulateInstructionMutex ());
723 GetEmulateInstructionInstances ().push_back (instance);
Greg Claytonf03bbe22011-02-01 01:37:45 +0000724 }
725 return false;
726}
727
728bool
729PluginManager::UnregisterPlugin (EmulateInstructionCreateInstance create_callback)
730{
731 if (create_callback)
732 {
Greg Claytonab65b342011-04-13 22:47:15 +0000733 Mutex::Locker locker (GetEmulateInstructionMutex ());
734 EmulateInstructionInstances &instances = GetEmulateInstructionInstances ();
735
736 EmulateInstructionInstances::iterator pos, end = instances.end();
737 for (pos = instances.begin(); pos != end; ++ pos)
738 {
739 if (pos->create_callback == create_callback)
740 {
741 instances.erase(pos);
742 return true;
743 }
744 }
Greg Claytonf03bbe22011-02-01 01:37:45 +0000745 }
746 return false;
747}
748
749EmulateInstructionCreateInstance
750PluginManager::GetEmulateInstructionCreateCallbackAtIndex (uint32_t idx)
751{
Greg Claytonab65b342011-04-13 22:47:15 +0000752 Mutex::Locker locker (GetEmulateInstructionMutex ());
753 EmulateInstructionInstances &instances = GetEmulateInstructionInstances ();
754 if (idx < instances.size())
755 return instances[idx].create_callback;
Greg Claytonf03bbe22011-02-01 01:37:45 +0000756 return NULL;
757}
758
759EmulateInstructionCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +0000760PluginManager::GetEmulateInstructionCreateCallbackForPluginName (const ConstString &name)
Greg Claytonf03bbe22011-02-01 01:37:45 +0000761{
Greg Clayton57abc5d2013-05-10 21:47:16 +0000762 if (name)
Greg Claytonf03bbe22011-02-01 01:37:45 +0000763 {
Greg Claytonab65b342011-04-13 22:47:15 +0000764 Mutex::Locker locker (GetEmulateInstructionMutex ());
765 EmulateInstructionInstances &instances = GetEmulateInstructionInstances ();
766
767 EmulateInstructionInstances::iterator pos, end = instances.end();
768 for (pos = instances.begin(); pos != end; ++ pos)
Greg Claytonf03bbe22011-02-01 01:37:45 +0000769 {
Greg Clayton57abc5d2013-05-10 21:47:16 +0000770 if (name == pos->name)
Greg Claytonab65b342011-04-13 22:47:15 +0000771 return pos->create_callback;
Greg Claytonf03bbe22011-02-01 01:37:45 +0000772 }
773 }
774 return NULL;
775}
Greg Clayton56d9a1b2011-08-22 02:49:39 +0000776#pragma mark OperatingSystem
777
778
779struct OperatingSystemInstance
780{
781 OperatingSystemInstance() :
782 name(),
783 description(),
784 create_callback(NULL)
785 {
786 }
787
Greg Clayton57abc5d2013-05-10 21:47:16 +0000788 ConstString name;
Greg Clayton56d9a1b2011-08-22 02:49:39 +0000789 std::string description;
790 OperatingSystemCreateInstance create_callback;
791};
792
793typedef std::vector<OperatingSystemInstance> OperatingSystemInstances;
794
795static Mutex &
796GetOperatingSystemMutex ()
797{
798 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
799 return g_instances_mutex;
800}
801
802static OperatingSystemInstances &
803GetOperatingSystemInstances ()
804{
805 static OperatingSystemInstances g_instances;
806 return g_instances;
807}
808
809bool
Greg Clayton57abc5d2013-05-10 21:47:16 +0000810PluginManager::RegisterPlugin (const ConstString &name,
811 const char *description,
812 OperatingSystemCreateInstance create_callback)
Greg Clayton56d9a1b2011-08-22 02:49:39 +0000813{
814 if (create_callback)
815 {
816 OperatingSystemInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +0000817 assert ((bool)name);
Greg Clayton56d9a1b2011-08-22 02:49:39 +0000818 instance.name = name;
819 if (description && description[0])
820 instance.description = description;
821 instance.create_callback = create_callback;
822 Mutex::Locker locker (GetOperatingSystemMutex ());
823 GetOperatingSystemInstances ().push_back (instance);
824 }
825 return false;
826}
827
828bool
829PluginManager::UnregisterPlugin (OperatingSystemCreateInstance create_callback)
830{
831 if (create_callback)
832 {
833 Mutex::Locker locker (GetOperatingSystemMutex ());
834 OperatingSystemInstances &instances = GetOperatingSystemInstances ();
835
836 OperatingSystemInstances::iterator pos, end = instances.end();
837 for (pos = instances.begin(); pos != end; ++ pos)
838 {
839 if (pos->create_callback == create_callback)
840 {
841 instances.erase(pos);
842 return true;
843 }
844 }
845 }
846 return false;
847}
848
849OperatingSystemCreateInstance
850PluginManager::GetOperatingSystemCreateCallbackAtIndex (uint32_t idx)
851{
852 Mutex::Locker locker (GetOperatingSystemMutex ());
853 OperatingSystemInstances &instances = GetOperatingSystemInstances ();
854 if (idx < instances.size())
855 return instances[idx].create_callback;
856 return NULL;
857}
858
859OperatingSystemCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +0000860PluginManager::GetOperatingSystemCreateCallbackForPluginName (const ConstString &name)
Greg Clayton56d9a1b2011-08-22 02:49:39 +0000861{
Greg Clayton57abc5d2013-05-10 21:47:16 +0000862 if (name)
Greg Clayton56d9a1b2011-08-22 02:49:39 +0000863 {
Greg Clayton56d9a1b2011-08-22 02:49:39 +0000864 Mutex::Locker locker (GetOperatingSystemMutex ());
865 OperatingSystemInstances &instances = GetOperatingSystemInstances ();
866
867 OperatingSystemInstances::iterator pos, end = instances.end();
868 for (pos = instances.begin(); pos != end; ++ pos)
869 {
Greg Clayton57abc5d2013-05-10 21:47:16 +0000870 if (name == pos->name)
Greg Clayton56d9a1b2011-08-22 02:49:39 +0000871 return pos->create_callback;
872 }
873 }
874 return NULL;
875}
Greg Claytonf03bbe22011-02-01 01:37:45 +0000876
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000877
Jim Ingham22777012010-09-23 02:01:19 +0000878#pragma mark LanguageRuntime
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000879
880
Jim Ingham22777012010-09-23 02:01:19 +0000881struct LanguageRuntimeInstance
882{
883 LanguageRuntimeInstance() :
884 name(),
885 description(),
886 create_callback(NULL)
887 {
888 }
889
Greg Clayton57abc5d2013-05-10 21:47:16 +0000890 ConstString name;
Jim Ingham22777012010-09-23 02:01:19 +0000891 std::string description;
892 LanguageRuntimeCreateInstance create_callback;
893};
894
895typedef std::vector<LanguageRuntimeInstance> LanguageRuntimeInstances;
896
Greg Claytonab65b342011-04-13 22:47:15 +0000897static Mutex &
898GetLanguageRuntimeMutex ()
Jim Ingham22777012010-09-23 02:01:19 +0000899{
Greg Claytonab65b342011-04-13 22:47:15 +0000900 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
901 return g_instances_mutex;
Jim Ingham22777012010-09-23 02:01:19 +0000902}
903
Greg Claytonab65b342011-04-13 22:47:15 +0000904static LanguageRuntimeInstances &
905GetLanguageRuntimeInstances ()
906{
907 static LanguageRuntimeInstances g_instances;
908 return g_instances;
909}
Jim Ingham22777012010-09-23 02:01:19 +0000910
911bool
912PluginManager::RegisterPlugin
Greg Clayton4272cc72011-02-02 02:24:04 +0000913(
Greg Clayton57abc5d2013-05-10 21:47:16 +0000914 const ConstString &name,
Greg Clayton4272cc72011-02-02 02:24:04 +0000915 const char *description,
916 LanguageRuntimeCreateInstance create_callback
917)
Jim Ingham22777012010-09-23 02:01:19 +0000918{
919 if (create_callback)
920 {
921 LanguageRuntimeInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +0000922 assert ((bool)name);
Jim Ingham22777012010-09-23 02:01:19 +0000923 instance.name = name;
924 if (description && description[0])
925 instance.description = description;
926 instance.create_callback = create_callback;
Greg Claytonab65b342011-04-13 22:47:15 +0000927 Mutex::Locker locker (GetLanguageRuntimeMutex ());
928 GetLanguageRuntimeInstances ().push_back (instance);
Jim Ingham22777012010-09-23 02:01:19 +0000929 }
930 return false;
931}
932
933bool
934PluginManager::UnregisterPlugin (LanguageRuntimeCreateInstance create_callback)
935{
936 if (create_callback)
937 {
Greg Claytonab65b342011-04-13 22:47:15 +0000938 Mutex::Locker locker (GetLanguageRuntimeMutex ());
939 LanguageRuntimeInstances &instances = GetLanguageRuntimeInstances ();
940
941 LanguageRuntimeInstances::iterator pos, end = instances.end();
942 for (pos = instances.begin(); pos != end; ++ pos)
943 {
944 if (pos->create_callback == create_callback)
945 {
946 instances.erase(pos);
947 return true;
948 }
949 }
Jim Ingham22777012010-09-23 02:01:19 +0000950 }
951 return false;
952}
953
954LanguageRuntimeCreateInstance
955PluginManager::GetLanguageRuntimeCreateCallbackAtIndex (uint32_t idx)
956{
Greg Claytonab65b342011-04-13 22:47:15 +0000957 Mutex::Locker locker (GetLanguageRuntimeMutex ());
958 LanguageRuntimeInstances &instances = GetLanguageRuntimeInstances ();
959 if (idx < instances.size())
960 return instances[idx].create_callback;
Jim Ingham22777012010-09-23 02:01:19 +0000961 return NULL;
962}
963
964LanguageRuntimeCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +0000965PluginManager::GetLanguageRuntimeCreateCallbackForPluginName (const ConstString &name)
Jim Ingham22777012010-09-23 02:01:19 +0000966{
Greg Clayton57abc5d2013-05-10 21:47:16 +0000967 if (name)
Jim Ingham22777012010-09-23 02:01:19 +0000968 {
Greg Claytonab65b342011-04-13 22:47:15 +0000969 Mutex::Locker locker (GetLanguageRuntimeMutex ());
970 LanguageRuntimeInstances &instances = GetLanguageRuntimeInstances ();
971
972 LanguageRuntimeInstances::iterator pos, end = instances.end();
973 for (pos = instances.begin(); pos != end; ++ pos)
Jim Ingham22777012010-09-23 02:01:19 +0000974 {
Greg Clayton57abc5d2013-05-10 21:47:16 +0000975 if (name == pos->name)
Greg Claytonab65b342011-04-13 22:47:15 +0000976 return pos->create_callback;
Jim Ingham22777012010-09-23 02:01:19 +0000977 }
978 }
979 return NULL;
980}
981
Jason Molendaeef51062013-11-05 03:57:19 +0000982#pragma mark SystemRuntime
983
984
985struct SystemRuntimeInstance
986{
987 SystemRuntimeInstance() :
988 name(),
989 description(),
990 create_callback(NULL)
991 {
992 }
993
994 ConstString name;
995 std::string description;
996 SystemRuntimeCreateInstance create_callback;
997};
998
999typedef std::vector<SystemRuntimeInstance> SystemRuntimeInstances;
1000
1001static Mutex &
1002GetSystemRuntimeMutex ()
1003{
1004 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
1005 return g_instances_mutex;
1006}
1007
1008static SystemRuntimeInstances &
1009GetSystemRuntimeInstances ()
1010{
1011 static SystemRuntimeInstances g_instances;
1012 return g_instances;
1013}
1014
1015bool
1016PluginManager::RegisterPlugin
1017(
1018 const ConstString &name,
1019 const char *description,
1020 SystemRuntimeCreateInstance create_callback
1021)
1022{
1023 if (create_callback)
1024 {
1025 SystemRuntimeInstance instance;
1026 assert ((bool)name);
1027 instance.name = name;
1028 if (description && description[0])
1029 instance.description = description;
1030 instance.create_callback = create_callback;
1031 Mutex::Locker locker (GetSystemRuntimeMutex ());
1032 GetSystemRuntimeInstances ().push_back (instance);
1033 }
1034 return false;
1035}
1036
1037bool
1038PluginManager::UnregisterPlugin (SystemRuntimeCreateInstance create_callback)
1039{
1040 if (create_callback)
1041 {
1042 Mutex::Locker locker (GetSystemRuntimeMutex ());
1043 SystemRuntimeInstances &instances = GetSystemRuntimeInstances ();
1044
1045 SystemRuntimeInstances::iterator pos, end = instances.end();
1046 for (pos = instances.begin(); pos != end; ++ pos)
1047 {
1048 if (pos->create_callback == create_callback)
1049 {
1050 instances.erase(pos);
1051 return true;
1052 }
1053 }
1054 }
1055 return false;
1056}
1057
1058SystemRuntimeCreateInstance
1059PluginManager::GetSystemRuntimeCreateCallbackAtIndex (uint32_t idx)
1060{
1061 Mutex::Locker locker (GetSystemRuntimeMutex ());
1062 SystemRuntimeInstances &instances = GetSystemRuntimeInstances ();
1063 if (idx < instances.size())
1064 return instances[idx].create_callback;
1065 return NULL;
1066}
1067
1068SystemRuntimeCreateInstance
1069PluginManager::GetSystemRuntimeCreateCallbackForPluginName (const ConstString &name)
1070{
1071 if (name)
1072 {
1073 Mutex::Locker locker (GetSystemRuntimeMutex ());
1074 SystemRuntimeInstances &instances = GetSystemRuntimeInstances ();
1075
1076 SystemRuntimeInstances::iterator pos, end = instances.end();
1077 for (pos = instances.begin(); pos != end; ++ pos)
1078 {
1079 if (name == pos->name)
1080 return pos->create_callback;
1081 }
1082 }
1083 return NULL;
1084}
1085
1086
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001087#pragma mark ObjectFile
1088
Jason Molenda743e86a2010-06-11 23:44:18 +00001089struct ObjectFileInstance
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001090{
1091 ObjectFileInstance() :
1092 name(),
1093 description(),
Greg Claytonf4d6de62013-04-24 22:29:28 +00001094 create_callback(NULL),
1095 create_memory_callback (NULL),
Greg Claytona2715cf2014-06-13 00:54:12 +00001096 get_module_specifications (NULL),
1097 save_core (NULL)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001098 {
1099 }
1100
Greg Clayton57abc5d2013-05-10 21:47:16 +00001101 ConstString name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001102 std::string description;
1103 ObjectFileCreateInstance create_callback;
Greg Claytonc9660542012-02-05 02:38:54 +00001104 ObjectFileCreateMemoryInstance create_memory_callback;
Greg Claytonf4d6de62013-04-24 22:29:28 +00001105 ObjectFileGetModuleSpecifications get_module_specifications;
Greg Claytona2715cf2014-06-13 00:54:12 +00001106 ObjectFileSaveCore save_core;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001107};
1108
1109typedef std::vector<ObjectFileInstance> ObjectFileInstances;
1110
Greg Claytonab65b342011-04-13 22:47:15 +00001111static Mutex &
1112GetObjectFileMutex ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001113{
Greg Claytonab65b342011-04-13 22:47:15 +00001114 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
1115 return g_instances_mutex;
1116}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001117
Greg Claytonab65b342011-04-13 22:47:15 +00001118static ObjectFileInstances &
1119GetObjectFileInstances ()
1120{
1121 static ObjectFileInstances g_instances;
1122 return g_instances;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001123}
1124
1125
1126bool
Greg Clayton57abc5d2013-05-10 21:47:16 +00001127PluginManager::RegisterPlugin (const ConstString &name,
Greg Claytonf4d6de62013-04-24 22:29:28 +00001128 const char *description,
1129 ObjectFileCreateInstance create_callback,
1130 ObjectFileCreateMemoryInstance create_memory_callback,
Greg Claytona2715cf2014-06-13 00:54:12 +00001131 ObjectFileGetModuleSpecifications get_module_specifications,
1132 ObjectFileSaveCore save_core)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001133{
1134 if (create_callback)
1135 {
1136 ObjectFileInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +00001137 assert ((bool)name);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001138 instance.name = name;
1139 if (description && description[0])
1140 instance.description = description;
1141 instance.create_callback = create_callback;
Greg Claytonc9660542012-02-05 02:38:54 +00001142 instance.create_memory_callback = create_memory_callback;
Greg Claytona2715cf2014-06-13 00:54:12 +00001143 instance.save_core = save_core;
Greg Claytonf4d6de62013-04-24 22:29:28 +00001144 instance.get_module_specifications = get_module_specifications;
Greg Claytonab65b342011-04-13 22:47:15 +00001145 Mutex::Locker locker (GetObjectFileMutex ());
1146 GetObjectFileInstances ().push_back (instance);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001147 }
1148 return false;
1149}
1150
1151bool
1152PluginManager::UnregisterPlugin (ObjectFileCreateInstance create_callback)
1153{
1154 if (create_callback)
1155 {
Greg Claytonab65b342011-04-13 22:47:15 +00001156 Mutex::Locker locker (GetObjectFileMutex ());
1157 ObjectFileInstances &instances = GetObjectFileInstances ();
1158
1159 ObjectFileInstances::iterator pos, end = instances.end();
1160 for (pos = instances.begin(); pos != end; ++ pos)
1161 {
1162 if (pos->create_callback == create_callback)
1163 {
1164 instances.erase(pos);
1165 return true;
1166 }
1167 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001168 }
1169 return false;
1170}
1171
1172ObjectFileCreateInstance
1173PluginManager::GetObjectFileCreateCallbackAtIndex (uint32_t idx)
1174{
Greg Claytonab65b342011-04-13 22:47:15 +00001175 Mutex::Locker locker (GetObjectFileMutex ());
1176 ObjectFileInstances &instances = GetObjectFileInstances ();
1177 if (idx < instances.size())
1178 return instances[idx].create_callback;
Jason Molenda743e86a2010-06-11 23:44:18 +00001179 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001180}
Greg Claytonab65b342011-04-13 22:47:15 +00001181
Greg Claytonc9660542012-02-05 02:38:54 +00001182
1183ObjectFileCreateMemoryInstance
1184PluginManager::GetObjectFileCreateMemoryCallbackAtIndex (uint32_t idx)
1185{
1186 Mutex::Locker locker (GetObjectFileMutex ());
1187 ObjectFileInstances &instances = GetObjectFileInstances ();
1188 if (idx < instances.size())
1189 return instances[idx].create_memory_callback;
1190 return NULL;
1191}
1192
Greg Claytonf4d6de62013-04-24 22:29:28 +00001193ObjectFileGetModuleSpecifications
1194PluginManager::GetObjectFileGetModuleSpecificationsCallbackAtIndex (uint32_t idx)
1195{
1196 Mutex::Locker locker (GetObjectFileMutex ());
1197 ObjectFileInstances &instances = GetObjectFileInstances ();
1198 if (idx < instances.size())
1199 return instances[idx].get_module_specifications;
1200 return NULL;
1201}
1202
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001203ObjectFileCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +00001204PluginManager::GetObjectFileCreateCallbackForPluginName (const ConstString &name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001205{
Greg Clayton57abc5d2013-05-10 21:47:16 +00001206 if (name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001207 {
Greg Claytonab65b342011-04-13 22:47:15 +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)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001213 {
Greg Clayton57abc5d2013-05-10 21:47:16 +00001214 if (name == pos->name)
Greg Claytonab65b342011-04-13 22:47:15 +00001215 return pos->create_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001216 }
1217 }
1218 return NULL;
1219}
1220
1221
Greg Claytonc9660542012-02-05 02:38:54 +00001222ObjectFileCreateMemoryInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +00001223PluginManager::GetObjectFileCreateMemoryCallbackForPluginName (const ConstString &name)
Greg Claytonc9660542012-02-05 02:38:54 +00001224{
Greg Clayton57abc5d2013-05-10 21:47:16 +00001225 if (name)
Greg Claytonc9660542012-02-05 02:38:54 +00001226 {
Greg Claytonc9660542012-02-05 02:38:54 +00001227 Mutex::Locker locker (GetObjectFileMutex ());
1228 ObjectFileInstances &instances = GetObjectFileInstances ();
1229
1230 ObjectFileInstances::iterator pos, end = instances.end();
1231 for (pos = instances.begin(); pos != end; ++ pos)
1232 {
Greg Clayton57abc5d2013-05-10 21:47:16 +00001233 if (name == pos->name)
Greg Claytonc9660542012-02-05 02:38:54 +00001234 return pos->create_memory_callback;
1235 }
1236 }
1237 return NULL;
1238}
1239
Greg Claytona2715cf2014-06-13 00:54:12 +00001240Error
1241PluginManager::SaveCore (const lldb::ProcessSP &process_sp, const FileSpec &outfile)
1242{
1243 Error error;
1244 Mutex::Locker locker (GetObjectFileMutex ());
1245 ObjectFileInstances &instances = GetObjectFileInstances ();
1246
1247 ObjectFileInstances::iterator pos, end = instances.end();
1248 for (pos = instances.begin(); pos != end; ++ pos)
1249 {
1250 if (pos->save_core && pos->save_core (process_sp, outfile, error))
1251 return error;
1252 }
1253 error.SetErrorString("no ObjectFile plugins were able to save a core for this process");
1254 return error;
1255}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001256
1257#pragma mark ObjectContainer
1258
Jason Molenda743e86a2010-06-11 23:44:18 +00001259struct ObjectContainerInstance
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001260{
1261 ObjectContainerInstance() :
1262 name(),
1263 description(),
Greg Claytonf4d6de62013-04-24 22:29:28 +00001264 create_callback (NULL),
1265 get_module_specifications (NULL)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001266 {
1267 }
1268
Greg Clayton57abc5d2013-05-10 21:47:16 +00001269 ConstString name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001270 std::string description;
1271 ObjectContainerCreateInstance create_callback;
Greg Claytonf4d6de62013-04-24 22:29:28 +00001272 ObjectFileGetModuleSpecifications get_module_specifications;
1273
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001274};
1275
1276typedef std::vector<ObjectContainerInstance> ObjectContainerInstances;
1277
Greg Claytonab65b342011-04-13 22:47:15 +00001278static Mutex &
1279GetObjectContainerMutex ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001280{
Greg Claytonab65b342011-04-13 22:47:15 +00001281 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
1282 return g_instances_mutex;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001283}
1284
Greg Claytonab65b342011-04-13 22:47:15 +00001285static ObjectContainerInstances &
1286GetObjectContainerInstances ()
1287{
1288 static ObjectContainerInstances g_instances;
1289 return g_instances;
1290}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001291
1292bool
Greg Clayton57abc5d2013-05-10 21:47:16 +00001293PluginManager::RegisterPlugin (const ConstString &name,
Greg Claytonf4d6de62013-04-24 22:29:28 +00001294 const char *description,
1295 ObjectContainerCreateInstance create_callback,
1296 ObjectFileGetModuleSpecifications get_module_specifications)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001297{
1298 if (create_callback)
1299 {
1300 ObjectContainerInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +00001301 assert ((bool)name);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001302 instance.name = name;
1303 if (description && description[0])
1304 instance.description = description;
1305 instance.create_callback = create_callback;
Greg Claytonf4d6de62013-04-24 22:29:28 +00001306 instance.get_module_specifications = get_module_specifications;
Greg Claytonab65b342011-04-13 22:47:15 +00001307 Mutex::Locker locker (GetObjectContainerMutex ());
1308 GetObjectContainerInstances ().push_back (instance);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001309 }
1310 return false;
1311}
1312
1313bool
1314PluginManager::UnregisterPlugin (ObjectContainerCreateInstance create_callback)
1315{
1316 if (create_callback)
1317 {
Greg Claytonab65b342011-04-13 22:47:15 +00001318 Mutex::Locker locker (GetObjectContainerMutex ());
1319 ObjectContainerInstances &instances = GetObjectContainerInstances ();
1320
1321 ObjectContainerInstances::iterator pos, end = instances.end();
1322 for (pos = instances.begin(); pos != end; ++ pos)
1323 {
1324 if (pos->create_callback == create_callback)
1325 {
1326 instances.erase(pos);
1327 return true;
1328 }
1329 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001330 }
1331 return false;
1332}
1333
1334ObjectContainerCreateInstance
1335PluginManager::GetObjectContainerCreateCallbackAtIndex (uint32_t idx)
1336{
Greg Claytonab65b342011-04-13 22:47:15 +00001337 Mutex::Locker locker (GetObjectContainerMutex ());
1338 ObjectContainerInstances &instances = GetObjectContainerInstances ();
1339 if (idx < instances.size())
1340 return instances[idx].create_callback;
Jason Molenda743e86a2010-06-11 23:44:18 +00001341 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001342}
Greg Claytonab65b342011-04-13 22:47:15 +00001343
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001344ObjectContainerCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +00001345PluginManager::GetObjectContainerCreateCallbackForPluginName (const ConstString &name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001346{
Greg Clayton57abc5d2013-05-10 21:47:16 +00001347 if (name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001348 {
Greg Claytonab65b342011-04-13 22:47:15 +00001349 Mutex::Locker locker (GetObjectContainerMutex ());
1350 ObjectContainerInstances &instances = GetObjectContainerInstances ();
1351
1352 ObjectContainerInstances::iterator pos, end = instances.end();
1353 for (pos = instances.begin(); pos != end; ++ pos)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001354 {
Greg Clayton57abc5d2013-05-10 21:47:16 +00001355 if (name == pos->name)
Greg Claytonab65b342011-04-13 22:47:15 +00001356 return pos->create_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001357 }
1358 }
1359 return NULL;
1360}
1361
Greg Claytonf4d6de62013-04-24 22:29:28 +00001362ObjectFileGetModuleSpecifications
1363PluginManager::GetObjectContainerGetModuleSpecificationsCallbackAtIndex (uint32_t idx)
1364{
1365 Mutex::Locker locker (GetObjectContainerMutex ());
1366 ObjectContainerInstances &instances = GetObjectContainerInstances ();
1367 if (idx < instances.size())
1368 return instances[idx].get_module_specifications;
1369 return NULL;
1370}
1371
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001372#pragma mark LogChannel
1373
Greg Claytonab65b342011-04-13 22:47:15 +00001374struct LogInstance
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001375{
Greg Claytonab65b342011-04-13 22:47:15 +00001376 LogInstance() :
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001377 name(),
1378 description(),
1379 create_callback(NULL)
1380 {
1381 }
1382
Greg Clayton57abc5d2013-05-10 21:47:16 +00001383 ConstString name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001384 std::string description;
1385 LogChannelCreateInstance create_callback;
1386};
1387
Greg Claytonab65b342011-04-13 22:47:15 +00001388typedef std::vector<LogInstance> LogInstances;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001389
Greg Claytonab65b342011-04-13 22:47:15 +00001390static Mutex &
1391GetLogMutex ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001392{
Greg Claytonab65b342011-04-13 22:47:15 +00001393 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
1394 return g_instances_mutex;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001395}
1396
Greg Claytonab65b342011-04-13 22:47:15 +00001397static LogInstances &
1398GetLogInstances ()
1399{
1400 static LogInstances g_instances;
1401 return g_instances;
1402}
1403
1404
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001405
1406bool
1407PluginManager::RegisterPlugin
1408(
Greg Clayton57abc5d2013-05-10 21:47:16 +00001409 const ConstString &name,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001410 const char *description,
1411 LogChannelCreateInstance create_callback
1412)
1413{
1414 if (create_callback)
1415 {
Greg Claytonab65b342011-04-13 22:47:15 +00001416 LogInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +00001417 assert ((bool)name);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001418 instance.name = name;
1419 if (description && description[0])
1420 instance.description = description;
1421 instance.create_callback = create_callback;
Greg Claytonab65b342011-04-13 22:47:15 +00001422 Mutex::Locker locker (GetLogMutex ());
1423 GetLogInstances ().push_back (instance);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001424 }
1425 return false;
1426}
1427
1428bool
1429PluginManager::UnregisterPlugin (LogChannelCreateInstance create_callback)
1430{
1431 if (create_callback)
1432 {
Greg Claytonab65b342011-04-13 22:47:15 +00001433 Mutex::Locker locker (GetLogMutex ());
1434 LogInstances &instances = GetLogInstances ();
1435
1436 LogInstances::iterator pos, end = instances.end();
1437 for (pos = instances.begin(); pos != end; ++ pos)
1438 {
1439 if (pos->create_callback == create_callback)
1440 {
1441 instances.erase(pos);
1442 return true;
1443 }
1444 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001445 }
1446 return false;
1447}
1448
1449const char *
1450PluginManager::GetLogChannelCreateNameAtIndex (uint32_t idx)
1451{
Greg Claytonab65b342011-04-13 22:47:15 +00001452 Mutex::Locker locker (GetLogMutex ());
1453 LogInstances &instances = GetLogInstances ();
1454 if (idx < instances.size())
Greg Clayton57abc5d2013-05-10 21:47:16 +00001455 return instances[idx].name.GetCString();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001456 return NULL;
1457}
1458
1459
1460LogChannelCreateInstance
1461PluginManager::GetLogChannelCreateCallbackAtIndex (uint32_t idx)
1462{
Greg Claytonab65b342011-04-13 22:47:15 +00001463 Mutex::Locker locker (GetLogMutex ());
1464 LogInstances &instances = GetLogInstances ();
1465 if (idx < instances.size())
1466 return instances[idx].create_callback;
Jason Molenda743e86a2010-06-11 23:44:18 +00001467 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001468}
1469
1470LogChannelCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +00001471PluginManager::GetLogChannelCreateCallbackForPluginName (const ConstString &name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001472{
Greg Clayton57abc5d2013-05-10 21:47:16 +00001473 if (name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001474 {
Greg Claytonab65b342011-04-13 22:47:15 +00001475 Mutex::Locker locker (GetLogMutex ());
1476 LogInstances &instances = GetLogInstances ();
1477
1478 LogInstances::iterator pos, end = instances.end();
1479 for (pos = instances.begin(); pos != end; ++ pos)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001480 {
Greg Clayton57abc5d2013-05-10 21:47:16 +00001481 if (name == pos->name)
Greg Claytonab65b342011-04-13 22:47:15 +00001482 return pos->create_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001483 }
1484 }
1485 return NULL;
1486}
1487
Greg Claytone996fd32011-03-08 22:40:15 +00001488#pragma mark Platform
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001489
Greg Claytone996fd32011-03-08 22:40:15 +00001490struct PlatformInstance
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001491{
Greg Claytone996fd32011-03-08 22:40:15 +00001492 PlatformInstance() :
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001493 name(),
1494 description(),
Jason Molenda9b837a12013-04-05 05:06:39 +00001495 create_callback(NULL),
1496 debugger_init_callback (NULL)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001497 {
1498 }
Greg Claytone996fd32011-03-08 22:40:15 +00001499
Greg Clayton57abc5d2013-05-10 21:47:16 +00001500 ConstString name;
Greg Claytone996fd32011-03-08 22:40:15 +00001501 std::string description;
1502 PlatformCreateInstance create_callback;
Jason Molenda9b837a12013-04-05 05:06:39 +00001503 DebuggerInitializeCallback debugger_init_callback;
Greg Claytone996fd32011-03-08 22:40:15 +00001504};
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001505
Greg Claytone996fd32011-03-08 22:40:15 +00001506typedef std::vector<PlatformInstance> PlatformInstances;
1507
Greg Claytonded470d2011-03-19 01:12:21 +00001508static Mutex &
1509GetPlatformInstancesMutex ()
Greg Claytone996fd32011-03-08 22:40:15 +00001510{
Greg Claytonded470d2011-03-19 01:12:21 +00001511 static Mutex g_platform_instances_mutex (Mutex::eMutexTypeRecursive);
1512 return g_platform_instances_mutex;
Greg Claytone996fd32011-03-08 22:40:15 +00001513}
1514
Greg Claytonded470d2011-03-19 01:12:21 +00001515static PlatformInstances &
1516GetPlatformInstances ()
1517{
1518 static PlatformInstances g_platform_instances;
1519 return g_platform_instances;
1520}
Greg Claytone996fd32011-03-08 22:40:15 +00001521
Greg Claytonab65b342011-04-13 22:47:15 +00001522
Greg Claytone996fd32011-03-08 22:40:15 +00001523bool
Greg Clayton57abc5d2013-05-10 21:47:16 +00001524PluginManager::RegisterPlugin (const ConstString &name,
Greg Claytone996fd32011-03-08 22:40:15 +00001525 const char *description,
Jason Molenda9b837a12013-04-05 05:06:39 +00001526 PlatformCreateInstance create_callback,
1527 DebuggerInitializeCallback debugger_init_callback)
Greg Claytone996fd32011-03-08 22:40:15 +00001528{
1529 if (create_callback)
1530 {
Greg Claytonded470d2011-03-19 01:12:21 +00001531 Mutex::Locker locker (GetPlatformInstancesMutex ());
1532
Greg Claytone996fd32011-03-08 22:40:15 +00001533 PlatformInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +00001534 assert ((bool)name);
Greg Claytone996fd32011-03-08 22:40:15 +00001535 instance.name = name;
1536 if (description && description[0])
1537 instance.description = description;
1538 instance.create_callback = create_callback;
Jason Molenda9b837a12013-04-05 05:06:39 +00001539 instance.debugger_init_callback = debugger_init_callback;
Greg Claytonded470d2011-03-19 01:12:21 +00001540 GetPlatformInstances ().push_back (instance);
1541 return true;
Greg Claytone996fd32011-03-08 22:40:15 +00001542 }
1543 return false;
1544}
1545
Jason Molenda9b837a12013-04-05 05:06:39 +00001546
Greg Claytone996fd32011-03-08 22:40:15 +00001547const char *
1548PluginManager::GetPlatformPluginNameAtIndex (uint32_t idx)
1549{
Greg Claytonded470d2011-03-19 01:12:21 +00001550 Mutex::Locker locker (GetPlatformInstancesMutex ());
Greg Claytonab65b342011-04-13 22:47:15 +00001551 PlatformInstances &instances = GetPlatformInstances ();
1552 if (idx < instances.size())
Greg Clayton57abc5d2013-05-10 21:47:16 +00001553 return instances[idx].name.GetCString();
Greg Claytone996fd32011-03-08 22:40:15 +00001554 return NULL;
1555}
1556
1557const char *
1558PluginManager::GetPlatformPluginDescriptionAtIndex (uint32_t idx)
1559{
Greg Claytonded470d2011-03-19 01:12:21 +00001560 Mutex::Locker locker (GetPlatformInstancesMutex ());
Greg Claytonab65b342011-04-13 22:47:15 +00001561 PlatformInstances &instances = GetPlatformInstances ();
1562 if (idx < instances.size())
1563 return instances[idx].description.c_str();
Greg Claytone996fd32011-03-08 22:40:15 +00001564 return NULL;
1565}
1566
1567bool
1568PluginManager::UnregisterPlugin (PlatformCreateInstance create_callback)
1569{
1570 if (create_callback)
1571 {
Greg Claytonded470d2011-03-19 01:12:21 +00001572 Mutex::Locker locker (GetPlatformInstancesMutex ());
Greg Claytonab65b342011-04-13 22:47:15 +00001573 PlatformInstances &instances = GetPlatformInstances ();
Greg Claytonded470d2011-03-19 01:12:21 +00001574
Greg Claytonab65b342011-04-13 22:47:15 +00001575 PlatformInstances::iterator pos, end = instances.end();
1576 for (pos = instances.begin(); pos != end; ++ pos)
Greg Claytonded470d2011-03-19 01:12:21 +00001577 {
1578 if (pos->create_callback == create_callback)
1579 {
Greg Claytonab65b342011-04-13 22:47:15 +00001580 instances.erase(pos);
Greg Claytonded470d2011-03-19 01:12:21 +00001581 return true;
1582 }
1583 }
Greg Claytone996fd32011-03-08 22:40:15 +00001584 }
1585 return false;
1586}
1587
1588PlatformCreateInstance
1589PluginManager::GetPlatformCreateCallbackAtIndex (uint32_t idx)
1590{
Greg Claytonded470d2011-03-19 01:12:21 +00001591 Mutex::Locker locker (GetPlatformInstancesMutex ());
Greg Claytonab65b342011-04-13 22:47:15 +00001592 PlatformInstances &instances = GetPlatformInstances ();
1593 if (idx < instances.size())
1594 return instances[idx].create_callback;
Greg Claytone996fd32011-03-08 22:40:15 +00001595 return NULL;
1596}
1597
1598PlatformCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +00001599PluginManager::GetPlatformCreateCallbackForPluginName (const ConstString &name)
Greg Claytone996fd32011-03-08 22:40:15 +00001600{
Greg Clayton57abc5d2013-05-10 21:47:16 +00001601 if (name)
Greg Claytone996fd32011-03-08 22:40:15 +00001602 {
Greg Claytonded470d2011-03-19 01:12:21 +00001603 Mutex::Locker locker (GetPlatformInstancesMutex ());
Greg Claytonab65b342011-04-13 22:47:15 +00001604 PlatformInstances &instances = GetPlatformInstances ();
Greg Claytonded470d2011-03-19 01:12:21 +00001605
Greg Claytonab65b342011-04-13 22:47:15 +00001606 PlatformInstances::iterator pos, end = instances.end();
1607 for (pos = instances.begin(); pos != end; ++ pos)
Greg Claytone996fd32011-03-08 22:40:15 +00001608 {
Greg Clayton57abc5d2013-05-10 21:47:16 +00001609 if (name == pos->name)
Greg Claytonded470d2011-03-19 01:12:21 +00001610 return pos->create_callback;
Greg Claytone996fd32011-03-08 22:40:15 +00001611 }
1612 }
1613 return NULL;
1614}
1615
Greg Claytonc7bece562013-01-25 18:06:21 +00001616size_t
Greg Claytonab65b342011-04-13 22:47:15 +00001617PluginManager::AutoCompletePlatformName (const char *name, StringList &matches)
1618{
Greg Clayton57abc5d2013-05-10 21:47:16 +00001619 if (name)
Greg Claytonab65b342011-04-13 22:47:15 +00001620 {
1621 Mutex::Locker locker (GetPlatformInstancesMutex ());
1622 PlatformInstances &instances = GetPlatformInstances ();
1623 llvm::StringRef name_sref(name);
1624
1625 PlatformInstances::iterator pos, end = instances.end();
1626 for (pos = instances.begin(); pos != end; ++ pos)
1627 {
Greg Clayton57abc5d2013-05-10 21:47:16 +00001628 llvm::StringRef plugin_name (pos->name.GetCString());
Greg Clayton7260f622011-04-18 08:33:37 +00001629 if (plugin_name.startswith(name_sref))
1630 matches.AppendString (plugin_name.data());
Greg Claytonab65b342011-04-13 22:47:15 +00001631 }
1632 }
1633 return matches.GetSize();
1634}
Greg Claytone996fd32011-03-08 22:40:15 +00001635#pragma mark Process
1636
1637struct ProcessInstance
1638{
1639 ProcessInstance() :
Greg Clayton7f982402013-07-15 22:54:20 +00001640 name(),
1641 description(),
1642 create_callback(NULL),
1643 debugger_init_callback(NULL)
Greg Claytone996fd32011-03-08 22:40:15 +00001644 {
1645 }
1646
Greg Clayton57abc5d2013-05-10 21:47:16 +00001647 ConstString name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001648 std::string description;
1649 ProcessCreateInstance create_callback;
Greg Clayton7f982402013-07-15 22:54:20 +00001650 DebuggerInitializeCallback debugger_init_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001651};
1652
1653typedef std::vector<ProcessInstance> ProcessInstances;
1654
Greg Claytonab65b342011-04-13 22:47:15 +00001655static Mutex &
1656GetProcessMutex ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001657{
Greg Claytonab65b342011-04-13 22:47:15 +00001658 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
1659 return g_instances_mutex;
1660}
1661
1662static ProcessInstances &
1663GetProcessInstances ()
1664{
1665 static ProcessInstances g_instances;
1666 return g_instances;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001667}
1668
1669
1670bool
Greg Clayton7f982402013-07-15 22:54:20 +00001671PluginManager::RegisterPlugin (const ConstString &name,
1672 const char *description,
1673 ProcessCreateInstance create_callback,
1674 DebuggerInitializeCallback debugger_init_callback)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001675{
1676 if (create_callback)
1677 {
1678 ProcessInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +00001679 assert ((bool)name);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001680 instance.name = name;
1681 if (description && description[0])
1682 instance.description = description;
1683 instance.create_callback = create_callback;
Greg Clayton7f982402013-07-15 22:54:20 +00001684 instance.debugger_init_callback = debugger_init_callback;
Greg Claytonab65b342011-04-13 22:47:15 +00001685 Mutex::Locker locker (GetProcessMutex ());
1686 GetProcessInstances ().push_back (instance);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001687 }
1688 return false;
1689}
1690
Greg Claytonbfe5f3b2011-02-18 01:44:25 +00001691const char *
1692PluginManager::GetProcessPluginNameAtIndex (uint32_t idx)
1693{
Greg Claytonab65b342011-04-13 22:47:15 +00001694 Mutex::Locker locker (GetProcessMutex ());
1695 ProcessInstances &instances = GetProcessInstances ();
1696 if (idx < instances.size())
Greg Clayton57abc5d2013-05-10 21:47:16 +00001697 return instances[idx].name.GetCString();
Greg Claytonbfe5f3b2011-02-18 01:44:25 +00001698 return NULL;
1699}
1700
1701const char *
1702PluginManager::GetProcessPluginDescriptionAtIndex (uint32_t idx)
1703{
Greg Claytonab65b342011-04-13 22:47:15 +00001704 Mutex::Locker locker (GetProcessMutex ());
1705 ProcessInstances &instances = GetProcessInstances ();
1706 if (idx < instances.size())
1707 return instances[idx].description.c_str();
Greg Claytonbfe5f3b2011-02-18 01:44:25 +00001708 return NULL;
1709}
1710
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001711bool
1712PluginManager::UnregisterPlugin (ProcessCreateInstance create_callback)
1713{
1714 if (create_callback)
1715 {
Greg Claytonab65b342011-04-13 22:47:15 +00001716 Mutex::Locker locker (GetProcessMutex ());
1717 ProcessInstances &instances = GetProcessInstances ();
1718
1719 ProcessInstances::iterator pos, end = instances.end();
1720 for (pos = instances.begin(); pos != end; ++ pos)
1721 {
1722 if (pos->create_callback == create_callback)
1723 {
1724 instances.erase(pos);
1725 return true;
1726 }
1727 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001728 }
1729 return false;
1730}
1731
1732ProcessCreateInstance
1733PluginManager::GetProcessCreateCallbackAtIndex (uint32_t idx)
1734{
Greg Claytonab65b342011-04-13 22:47:15 +00001735 Mutex::Locker locker (GetProcessMutex ());
1736 ProcessInstances &instances = GetProcessInstances ();
1737 if (idx < instances.size())
1738 return instances[idx].create_callback;
Jason Molenda743e86a2010-06-11 23:44:18 +00001739 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001740}
1741
Greg Claytonab65b342011-04-13 22:47:15 +00001742
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001743ProcessCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +00001744PluginManager::GetProcessCreateCallbackForPluginName (const ConstString &name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001745{
Greg Clayton57abc5d2013-05-10 21:47:16 +00001746 if (name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001747 {
Greg Claytonab65b342011-04-13 22:47:15 +00001748 Mutex::Locker locker (GetProcessMutex ());
1749 ProcessInstances &instances = GetProcessInstances ();
1750
1751 ProcessInstances::iterator pos, end = instances.end();
1752 for (pos = instances.begin(); pos != end; ++ pos)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001753 {
Greg Clayton57abc5d2013-05-10 21:47:16 +00001754 if (name == pos->name)
Greg Claytonab65b342011-04-13 22:47:15 +00001755 return pos->create_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001756 }
1757 }
1758 return NULL;
1759}
1760
1761#pragma mark SymbolFile
1762
Jason Molenda743e86a2010-06-11 23:44:18 +00001763struct SymbolFileInstance
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001764{
1765 SymbolFileInstance() :
1766 name(),
1767 description(),
1768 create_callback(NULL)
1769 {
1770 }
1771
Greg Clayton57abc5d2013-05-10 21:47:16 +00001772 ConstString name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001773 std::string description;
1774 SymbolFileCreateInstance create_callback;
1775};
1776
1777typedef std::vector<SymbolFileInstance> SymbolFileInstances;
1778
Greg Claytonab65b342011-04-13 22:47:15 +00001779static Mutex &
1780GetSymbolFileMutex ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001781{
Greg Claytonab65b342011-04-13 22:47:15 +00001782 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
1783 return g_instances_mutex;
1784}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001785
Greg Claytonab65b342011-04-13 22:47:15 +00001786static SymbolFileInstances &
1787GetSymbolFileInstances ()
1788{
1789 static SymbolFileInstances g_instances;
1790 return g_instances;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001791}
1792
1793
1794bool
1795PluginManager::RegisterPlugin
1796(
Greg Clayton57abc5d2013-05-10 21:47:16 +00001797 const ConstString &name,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001798 const char *description,
1799 SymbolFileCreateInstance create_callback
1800)
1801{
1802 if (create_callback)
1803 {
1804 SymbolFileInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +00001805 assert ((bool)name);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001806 instance.name = name;
1807 if (description && description[0])
1808 instance.description = description;
1809 instance.create_callback = create_callback;
Greg Claytonab65b342011-04-13 22:47:15 +00001810 Mutex::Locker locker (GetSymbolFileMutex ());
1811 GetSymbolFileInstances ().push_back (instance);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001812 }
1813 return false;
1814}
1815
1816bool
1817PluginManager::UnregisterPlugin (SymbolFileCreateInstance create_callback)
1818{
1819 if (create_callback)
1820 {
Greg Claytonab65b342011-04-13 22:47:15 +00001821 Mutex::Locker locker (GetSymbolFileMutex ());
1822 SymbolFileInstances &instances = GetSymbolFileInstances ();
1823
1824 SymbolFileInstances::iterator pos, end = instances.end();
1825 for (pos = instances.begin(); pos != end; ++ pos)
1826 {
1827 if (pos->create_callback == create_callback)
1828 {
1829 instances.erase(pos);
1830 return true;
1831 }
1832 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001833 }
1834 return false;
1835}
1836
1837SymbolFileCreateInstance
1838PluginManager::GetSymbolFileCreateCallbackAtIndex (uint32_t idx)
1839{
Greg Claytonab65b342011-04-13 22:47:15 +00001840 Mutex::Locker locker (GetSymbolFileMutex ());
1841 SymbolFileInstances &instances = GetSymbolFileInstances ();
1842 if (idx < instances.size())
1843 return instances[idx].create_callback;
Jason Molenda743e86a2010-06-11 23:44:18 +00001844 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001845}
Greg Claytonab65b342011-04-13 22:47:15 +00001846
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001847SymbolFileCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +00001848PluginManager::GetSymbolFileCreateCallbackForPluginName (const ConstString &name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001849{
Greg Clayton57abc5d2013-05-10 21:47:16 +00001850 if (name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001851 {
Greg Claytonab65b342011-04-13 22:47:15 +00001852 Mutex::Locker locker (GetSymbolFileMutex ());
1853 SymbolFileInstances &instances = GetSymbolFileInstances ();
1854
1855 SymbolFileInstances::iterator pos, end = instances.end();
1856 for (pos = instances.begin(); pos != end; ++ pos)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001857 {
Greg Clayton57abc5d2013-05-10 21:47:16 +00001858 if (name == pos->name)
Greg Claytonab65b342011-04-13 22:47:15 +00001859 return pos->create_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001860 }
1861 }
1862 return NULL;
1863}
1864
1865
1866
1867#pragma mark SymbolVendor
1868
Jason Molenda743e86a2010-06-11 23:44:18 +00001869struct SymbolVendorInstance
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001870{
1871 SymbolVendorInstance() :
1872 name(),
1873 description(),
1874 create_callback(NULL)
1875 {
1876 }
1877
Greg Clayton57abc5d2013-05-10 21:47:16 +00001878 ConstString name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001879 std::string description;
1880 SymbolVendorCreateInstance create_callback;
1881};
1882
1883typedef std::vector<SymbolVendorInstance> SymbolVendorInstances;
1884
Greg Claytonab65b342011-04-13 22:47:15 +00001885static Mutex &
1886GetSymbolVendorMutex ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001887{
Greg Claytonab65b342011-04-13 22:47:15 +00001888 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
1889 return g_instances_mutex;
1890}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001891
Greg Claytonab65b342011-04-13 22:47:15 +00001892static SymbolVendorInstances &
1893GetSymbolVendorInstances ()
1894{
1895 static SymbolVendorInstances g_instances;
1896 return g_instances;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001897}
1898
1899bool
1900PluginManager::RegisterPlugin
1901(
Greg Clayton57abc5d2013-05-10 21:47:16 +00001902 const ConstString &name,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001903 const char *description,
1904 SymbolVendorCreateInstance create_callback
1905)
1906{
1907 if (create_callback)
1908 {
1909 SymbolVendorInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +00001910 assert ((bool)name);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001911 instance.name = name;
1912 if (description && description[0])
1913 instance.description = description;
1914 instance.create_callback = create_callback;
Greg Claytonab65b342011-04-13 22:47:15 +00001915 Mutex::Locker locker (GetSymbolVendorMutex ());
1916 GetSymbolVendorInstances ().push_back (instance);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001917 }
1918 return false;
1919}
1920
1921bool
1922PluginManager::UnregisterPlugin (SymbolVendorCreateInstance create_callback)
1923{
1924 if (create_callback)
1925 {
Greg Claytonab65b342011-04-13 22:47:15 +00001926 Mutex::Locker locker (GetSymbolVendorMutex ());
1927 SymbolVendorInstances &instances = GetSymbolVendorInstances ();
1928
1929 SymbolVendorInstances::iterator pos, end = instances.end();
1930 for (pos = instances.begin(); pos != end; ++ pos)
1931 {
1932 if (pos->create_callback == create_callback)
1933 {
1934 instances.erase(pos);
1935 return true;
1936 }
1937 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001938 }
1939 return false;
1940}
1941
1942SymbolVendorCreateInstance
1943PluginManager::GetSymbolVendorCreateCallbackAtIndex (uint32_t idx)
1944{
Greg Claytonab65b342011-04-13 22:47:15 +00001945 Mutex::Locker locker (GetSymbolVendorMutex ());
1946 SymbolVendorInstances &instances = GetSymbolVendorInstances ();
1947 if (idx < instances.size())
1948 return instances[idx].create_callback;
Jason Molenda743e86a2010-06-11 23:44:18 +00001949 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001950}
1951
Greg Claytonab65b342011-04-13 22:47:15 +00001952
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001953SymbolVendorCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +00001954PluginManager::GetSymbolVendorCreateCallbackForPluginName (const ConstString &name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001955{
Greg Clayton57abc5d2013-05-10 21:47:16 +00001956 if (name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001957 {
Greg Claytonab65b342011-04-13 22:47:15 +00001958 Mutex::Locker locker (GetSymbolVendorMutex ());
1959 SymbolVendorInstances &instances = GetSymbolVendorInstances ();
1960
1961 SymbolVendorInstances::iterator pos, end = instances.end();
1962 for (pos = instances.begin(); pos != end; ++ pos)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001963 {
Greg Clayton57abc5d2013-05-10 21:47:16 +00001964 if (name == pos->name)
Greg Claytonab65b342011-04-13 22:47:15 +00001965 return pos->create_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001966 }
1967 }
1968 return NULL;
1969}
1970
1971
Greg Clayton7be25422011-04-25 21:14:26 +00001972#pragma mark UnwindAssembly
Jason Molendafbcb7f22010-09-10 07:49:16 +00001973
Greg Clayton7be25422011-04-25 21:14:26 +00001974struct UnwindAssemblyInstance
Jason Molendafbcb7f22010-09-10 07:49:16 +00001975{
Greg Clayton7be25422011-04-25 21:14:26 +00001976 UnwindAssemblyInstance() :
Jason Molendafbcb7f22010-09-10 07:49:16 +00001977 name(),
1978 description(),
1979 create_callback(NULL)
1980 {
1981 }
1982
Greg Clayton57abc5d2013-05-10 21:47:16 +00001983 ConstString name;
Jason Molendafbcb7f22010-09-10 07:49:16 +00001984 std::string description;
Greg Clayton7be25422011-04-25 21:14:26 +00001985 UnwindAssemblyCreateInstance create_callback;
Jason Molendafbcb7f22010-09-10 07:49:16 +00001986};
1987
Greg Clayton7be25422011-04-25 21:14:26 +00001988typedef std::vector<UnwindAssemblyInstance> UnwindAssemblyInstances;
Jason Molendafbcb7f22010-09-10 07:49:16 +00001989
Greg Claytonab65b342011-04-13 22:47:15 +00001990static Mutex &
Greg Clayton7be25422011-04-25 21:14:26 +00001991GetUnwindAssemblyMutex ()
Jason Molendafbcb7f22010-09-10 07:49:16 +00001992{
Greg Claytonab65b342011-04-13 22:47:15 +00001993 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
1994 return g_instances_mutex;
1995}
Jason Molendafbcb7f22010-09-10 07:49:16 +00001996
Greg Clayton7be25422011-04-25 21:14:26 +00001997static UnwindAssemblyInstances &
1998GetUnwindAssemblyInstances ()
Greg Claytonab65b342011-04-13 22:47:15 +00001999{
Greg Clayton7be25422011-04-25 21:14:26 +00002000 static UnwindAssemblyInstances g_instances;
Greg Claytonab65b342011-04-13 22:47:15 +00002001 return g_instances;
Jason Molendafbcb7f22010-09-10 07:49:16 +00002002}
2003
2004bool
2005PluginManager::RegisterPlugin
2006(
Greg Clayton57abc5d2013-05-10 21:47:16 +00002007 const ConstString &name,
Jason Molendafbcb7f22010-09-10 07:49:16 +00002008 const char *description,
Greg Clayton7be25422011-04-25 21:14:26 +00002009 UnwindAssemblyCreateInstance create_callback
Jason Molendafbcb7f22010-09-10 07:49:16 +00002010)
2011{
2012 if (create_callback)
2013 {
Greg Clayton7be25422011-04-25 21:14:26 +00002014 UnwindAssemblyInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +00002015 assert ((bool)name);
Jason Molendafbcb7f22010-09-10 07:49:16 +00002016 instance.name = name;
2017 if (description && description[0])
2018 instance.description = description;
2019 instance.create_callback = create_callback;
Greg Clayton7be25422011-04-25 21:14:26 +00002020 Mutex::Locker locker (GetUnwindAssemblyMutex ());
2021 GetUnwindAssemblyInstances ().push_back (instance);
Jason Molendafbcb7f22010-09-10 07:49:16 +00002022 }
2023 return false;
2024}
2025
2026bool
Greg Clayton7be25422011-04-25 21:14:26 +00002027PluginManager::UnregisterPlugin (UnwindAssemblyCreateInstance create_callback)
Jason Molendafbcb7f22010-09-10 07:49:16 +00002028{
2029 if (create_callback)
2030 {
Greg Clayton7be25422011-04-25 21:14:26 +00002031 Mutex::Locker locker (GetUnwindAssemblyMutex ());
2032 UnwindAssemblyInstances &instances = GetUnwindAssemblyInstances ();
Greg Claytonab65b342011-04-13 22:47:15 +00002033
Greg Clayton7be25422011-04-25 21:14:26 +00002034 UnwindAssemblyInstances::iterator pos, end = instances.end();
Greg Claytonab65b342011-04-13 22:47:15 +00002035 for (pos = instances.begin(); pos != end; ++ pos)
2036 {
2037 if (pos->create_callback == create_callback)
2038 {
2039 instances.erase(pos);
2040 return true;
2041 }
2042 }
Jason Molendafbcb7f22010-09-10 07:49:16 +00002043 }
2044 return false;
2045}
2046
Greg Clayton7be25422011-04-25 21:14:26 +00002047UnwindAssemblyCreateInstance
2048PluginManager::GetUnwindAssemblyCreateCallbackAtIndex (uint32_t idx)
Jason Molendafbcb7f22010-09-10 07:49:16 +00002049{
Greg Clayton7be25422011-04-25 21:14:26 +00002050 Mutex::Locker locker (GetUnwindAssemblyMutex ());
2051 UnwindAssemblyInstances &instances = GetUnwindAssemblyInstances ();
Greg Claytonab65b342011-04-13 22:47:15 +00002052 if (idx < instances.size())
2053 return instances[idx].create_callback;
Jason Molendafbcb7f22010-09-10 07:49:16 +00002054 return NULL;
2055}
2056
Greg Claytonab65b342011-04-13 22:47:15 +00002057
Greg Clayton7be25422011-04-25 21:14:26 +00002058UnwindAssemblyCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +00002059PluginManager::GetUnwindAssemblyCreateCallbackForPluginName (const ConstString &name)
Jason Molendafbcb7f22010-09-10 07:49:16 +00002060{
Greg Clayton57abc5d2013-05-10 21:47:16 +00002061 if (name)
Jason Molendafbcb7f22010-09-10 07:49:16 +00002062 {
Greg Clayton7be25422011-04-25 21:14:26 +00002063 Mutex::Locker locker (GetUnwindAssemblyMutex ());
2064 UnwindAssemblyInstances &instances = GetUnwindAssemblyInstances ();
Greg Claytonab65b342011-04-13 22:47:15 +00002065
Greg Clayton7be25422011-04-25 21:14:26 +00002066 UnwindAssemblyInstances::iterator pos, end = instances.end();
Greg Claytonab65b342011-04-13 22:47:15 +00002067 for (pos = instances.begin(); pos != end; ++ pos)
Jason Molendafbcb7f22010-09-10 07:49:16 +00002068 {
Greg Clayton57abc5d2013-05-10 21:47:16 +00002069 if (name == pos->name)
Greg Claytonab65b342011-04-13 22:47:15 +00002070 return pos->create_callback;
Jason Molendafbcb7f22010-09-10 07:49:16 +00002071 }
2072 }
2073 return NULL;
2074}
2075
Greg Claytone8cd0c92012-10-19 18:02:49 +00002076void
2077PluginManager::DebuggerInitialize (Debugger &debugger)
2078{
Jason Molenda9b837a12013-04-05 05:06:39 +00002079 // Initialize the DynamicLoader plugins
Greg Claytone8cd0c92012-10-19 18:02:49 +00002080 {
Jason Molenda9b837a12013-04-05 05:06:39 +00002081 Mutex::Locker locker (GetDynamicLoaderMutex ());
2082 DynamicLoaderInstances &instances = GetDynamicLoaderInstances ();
2083
2084 DynamicLoaderInstances::iterator pos, end = instances.end();
2085 for (pos = instances.begin(); pos != end; ++ pos)
2086 {
2087 if (pos->debugger_init_callback)
2088 pos->debugger_init_callback (debugger);
2089 }
2090 }
2091
Andrew MacPherson17220c12014-03-05 10:12:43 +00002092 // Initialize the JITLoader plugins
2093 {
2094 Mutex::Locker locker (GetJITLoaderMutex ());
2095 JITLoaderInstances &instances = GetJITLoaderInstances ();
2096
2097 JITLoaderInstances::iterator pos, end = instances.end();
2098 for (pos = instances.begin(); pos != end; ++ pos)
2099 {
2100 if (pos->debugger_init_callback)
2101 pos->debugger_init_callback (debugger);
2102 }
2103 }
2104
Jason Molenda9b837a12013-04-05 05:06:39 +00002105 // Initialize the Platform plugins
2106 {
2107 Mutex::Locker locker (GetPlatformInstancesMutex ());
2108 PlatformInstances &instances = GetPlatformInstances ();
2109
2110 PlatformInstances::iterator pos, end = instances.end();
2111 for (pos = instances.begin(); pos != end; ++ pos)
2112 {
2113 if (pos->debugger_init_callback)
2114 pos->debugger_init_callback (debugger);
2115 }
Greg Claytone8cd0c92012-10-19 18:02:49 +00002116 }
Greg Clayton7f982402013-07-15 22:54:20 +00002117
2118 // Initialize the Process plugins
2119 {
2120 Mutex::Locker locker (GetProcessMutex());
2121 ProcessInstances &instances = GetProcessInstances();
2122
2123 ProcessInstances::iterator pos, end = instances.end();
2124 for (pos = instances.begin(); pos != end; ++ pos)
2125 {
2126 if (pos->debugger_init_callback)
2127 pos->debugger_init_callback (debugger);
2128 }
2129 }
2130
Greg Claytone8cd0c92012-10-19 18:02:49 +00002131}
2132
Greg Clayton7f982402013-07-15 22:54:20 +00002133// This is the preferred new way to register plugin specific settings. e.g.
2134// 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 +00002135static lldb::OptionValuePropertiesSP
Greg Clayton7f982402013-07-15 22:54:20 +00002136GetDebuggerPropertyForPlugins (Debugger &debugger,
Jason Molenda3b59f5c2013-04-05 22:40:42 +00002137 const ConstString &plugin_type_name,
2138 const ConstString &plugin_type_desc,
2139 bool can_create)
Greg Claytone8cd0c92012-10-19 18:02:49 +00002140{
2141 lldb::OptionValuePropertiesSP parent_properties_sp (debugger.GetValueProperties());
2142 if (parent_properties_sp)
2143 {
2144 static ConstString g_property_name("plugin");
2145
2146 OptionValuePropertiesSP plugin_properties_sp = parent_properties_sp->GetSubProperty (NULL, g_property_name);
2147 if (!plugin_properties_sp && can_create)
2148 {
2149 plugin_properties_sp.reset (new OptionValueProperties (g_property_name));
2150 parent_properties_sp->AppendProperty (g_property_name,
2151 ConstString("Settings specify to plugins."),
2152 true,
2153 plugin_properties_sp);
2154 }
2155
2156 if (plugin_properties_sp)
2157 {
2158 lldb::OptionValuePropertiesSP plugin_type_properties_sp = plugin_properties_sp->GetSubProperty (NULL, plugin_type_name);
2159 if (!plugin_type_properties_sp && can_create)
2160 {
2161 plugin_type_properties_sp.reset (new OptionValueProperties (plugin_type_name));
2162 plugin_properties_sp->AppendProperty (plugin_type_name,
2163 plugin_type_desc,
2164 true,
2165 plugin_type_properties_sp);
2166 }
2167 return plugin_type_properties_sp;
2168 }
2169 }
2170 return lldb::OptionValuePropertiesSP();
2171}
2172
Greg Clayton7f982402013-07-15 22:54:20 +00002173// This is deprecated way to register plugin specific settings. e.g.
2174// "<plugin_type_name>.plugin.<plugin_type_desc>.SETTINGNAME"
Jason Molenda3b59f5c2013-04-05 22:40:42 +00002175// and Platform generic settings would be under "platform.SETTINGNAME".
2176static lldb::OptionValuePropertiesSP
Greg Clayton7f982402013-07-15 22:54:20 +00002177GetDebuggerPropertyForPluginsOldStyle (Debugger &debugger,
2178 const ConstString &plugin_type_name,
2179 const ConstString &plugin_type_desc,
2180 bool can_create)
Jason Molenda3b59f5c2013-04-05 22:40:42 +00002181{
2182 static ConstString g_property_name("plugin");
2183 lldb::OptionValuePropertiesSP parent_properties_sp (debugger.GetValueProperties());
2184 if (parent_properties_sp)
2185 {
2186 OptionValuePropertiesSP plugin_properties_sp = parent_properties_sp->GetSubProperty (NULL, plugin_type_name);
2187 if (!plugin_properties_sp && can_create)
2188 {
2189 plugin_properties_sp.reset (new OptionValueProperties (plugin_type_name));
2190 parent_properties_sp->AppendProperty (plugin_type_name,
2191 plugin_type_desc,
2192 true,
2193 plugin_properties_sp);
2194 }
2195
2196 if (plugin_properties_sp)
2197 {
2198 lldb::OptionValuePropertiesSP plugin_type_properties_sp = plugin_properties_sp->GetSubProperty (NULL, g_property_name);
2199 if (!plugin_type_properties_sp && can_create)
2200 {
2201 plugin_type_properties_sp.reset (new OptionValueProperties (g_property_name));
2202 plugin_properties_sp->AppendProperty (g_property_name,
2203 ConstString("Settings specific to plugins"),
2204 true,
2205 plugin_type_properties_sp);
2206 }
2207 return plugin_type_properties_sp;
2208 }
2209 }
2210 return lldb::OptionValuePropertiesSP();
2211}
2212
2213
Greg Claytone8cd0c92012-10-19 18:02:49 +00002214lldb::OptionValuePropertiesSP
2215PluginManager::GetSettingForDynamicLoaderPlugin (Debugger &debugger, const ConstString &setting_name)
2216{
2217 lldb::OptionValuePropertiesSP properties_sp;
Greg Clayton7f982402013-07-15 22:54:20 +00002218 lldb::OptionValuePropertiesSP plugin_type_properties_sp (GetDebuggerPropertyForPlugins (debugger,
Greg Claytone8cd0c92012-10-19 18:02:49 +00002219 ConstString("dynamic-loader"),
2220 ConstString(), // not creating to so we don't need the description
2221 false));
2222 if (plugin_type_properties_sp)
2223 properties_sp = plugin_type_properties_sp->GetSubProperty (NULL, setting_name);
2224 return properties_sp;
2225}
2226
2227bool
2228PluginManager::CreateSettingForDynamicLoaderPlugin (Debugger &debugger,
2229 const lldb::OptionValuePropertiesSP &properties_sp,
2230 const ConstString &description,
2231 bool is_global_property)
2232{
2233 if (properties_sp)
2234 {
Greg Clayton7f982402013-07-15 22:54:20 +00002235 lldb::OptionValuePropertiesSP plugin_type_properties_sp (GetDebuggerPropertyForPlugins (debugger,
Greg Claytone8cd0c92012-10-19 18:02:49 +00002236 ConstString("dynamic-loader"),
2237 ConstString("Settings for dynamic loader plug-ins"),
2238 true));
2239 if (plugin_type_properties_sp)
2240 {
2241 plugin_type_properties_sp->AppendProperty (properties_sp->GetName(),
2242 description,
2243 is_global_property,
2244 properties_sp);
2245 return true;
2246 }
2247 }
2248 return false;
2249}
2250
Jason Molenda9b837a12013-04-05 05:06:39 +00002251
2252lldb::OptionValuePropertiesSP
2253PluginManager::GetSettingForPlatformPlugin (Debugger &debugger, const ConstString &setting_name)
2254{
2255 lldb::OptionValuePropertiesSP properties_sp;
Greg Clayton7f982402013-07-15 22:54:20 +00002256 lldb::OptionValuePropertiesSP plugin_type_properties_sp (GetDebuggerPropertyForPluginsOldStyle (debugger,
2257 ConstString("platform"),
2258 ConstString(), // not creating to so we don't need the description
2259 false));
Jason Molenda9b837a12013-04-05 05:06:39 +00002260 if (plugin_type_properties_sp)
2261 properties_sp = plugin_type_properties_sp->GetSubProperty (NULL, setting_name);
2262 return properties_sp;
2263}
2264
2265bool
2266PluginManager::CreateSettingForPlatformPlugin (Debugger &debugger,
2267 const lldb::OptionValuePropertiesSP &properties_sp,
2268 const ConstString &description,
2269 bool is_global_property)
2270{
2271 if (properties_sp)
2272 {
Greg Clayton7f982402013-07-15 22:54:20 +00002273 lldb::OptionValuePropertiesSP plugin_type_properties_sp (GetDebuggerPropertyForPluginsOldStyle (debugger,
2274 ConstString("platform"),
2275 ConstString("Settings for platform plug-ins"),
2276 true));
2277 if (plugin_type_properties_sp)
2278 {
2279 plugin_type_properties_sp->AppendProperty (properties_sp->GetName(),
2280 description,
2281 is_global_property,
2282 properties_sp);
2283 return true;
2284 }
2285 }
2286 return false;
2287}
2288
2289
2290lldb::OptionValuePropertiesSP
2291PluginManager::GetSettingForProcessPlugin (Debugger &debugger, const ConstString &setting_name)
2292{
2293 lldb::OptionValuePropertiesSP properties_sp;
2294 lldb::OptionValuePropertiesSP plugin_type_properties_sp (GetDebuggerPropertyForPlugins (debugger,
2295 ConstString("process"),
2296 ConstString(), // not creating to so we don't need the description
2297 false));
2298 if (plugin_type_properties_sp)
2299 properties_sp = plugin_type_properties_sp->GetSubProperty (NULL, setting_name);
2300 return properties_sp;
2301}
2302
2303bool
2304PluginManager::CreateSettingForProcessPlugin (Debugger &debugger,
2305 const lldb::OptionValuePropertiesSP &properties_sp,
2306 const ConstString &description,
2307 bool is_global_property)
2308{
2309 if (properties_sp)
2310 {
Jason Molenda9b837a12013-04-05 05:06:39 +00002311 lldb::OptionValuePropertiesSP plugin_type_properties_sp (GetDebuggerPropertyForPlugins (debugger,
Greg Clayton7f982402013-07-15 22:54:20 +00002312 ConstString("process"),
2313 ConstString("Settings for process plug-ins"),
Jason Molenda9b837a12013-04-05 05:06:39 +00002314 true));
2315 if (plugin_type_properties_sp)
2316 {
2317 plugin_type_properties_sp->AppendProperty (properties_sp->GetName(),
2318 description,
2319 is_global_property,
2320 properties_sp);
2321 return true;
2322 }
2323 }
2324 return false;
2325}
2326