blob: ac892d261e45ffdd1ea88494a51ebf3eab4a5bef [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
10#include "lldb/Core/PluginManager.h"
11
Stephen Wilson8acdbb82011-04-08 13:36:44 +000012#include <limits.h>
13
Chris Lattner30fdc8d2010-06-08 16:52:24 +000014#include <string>
15#include <vector>
16
Greg Claytone8cd0c92012-10-19 18:02:49 +000017#include "lldb/Core/Debugger.h"
Greg Clayton4272cc72011-02-02 02:24:04 +000018#include "lldb/Core/Error.h"
Greg Clayton53239f02011-02-08 05:05:52 +000019#include "lldb/Host/FileSpec.h"
Greg Clayton4272cc72011-02-02 02:24:04 +000020#include "lldb/Host/Host.h"
Zachary Turner42ff0ad2014-08-21 17:29:12 +000021#include "lldb/Host/HostInfo.h"
Greg Clayton4272cc72011-02-02 02:24:04 +000022#include "lldb/Host/Mutex.h"
Greg Claytone8cd0c92012-10-19 18:02:49 +000023#include "lldb/Interpreter/OptionValueProperties.h"
Greg Clayton4272cc72011-02-02 02:24:04 +000024
Greg Claytonab65b342011-04-13 22:47:15 +000025#include "llvm/ADT/StringRef.h"
Zachary Turner58a559c2014-08-27 20:15:09 +000026#include "llvm/Support/DynamicLibrary.h"
Greg Claytonab65b342011-04-13 22:47:15 +000027
Greg Clayton4272cc72011-02-02 02:24:04 +000028using namespace lldb;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000029using namespace lldb_private;
30
Jason Molenda743e86a2010-06-11 23:44:18 +000031enum PluginAction
Chris Lattner30fdc8d2010-06-08 16:52:24 +000032{
33 ePluginRegisterInstance,
34 ePluginUnregisterInstance,
35 ePluginGetInstanceAtIndex
36};
37
Greg Clayton03da4cc2013-04-19 21:31:16 +000038
39typedef bool (*PluginInitCallback) (void);
40typedef void (*PluginTermCallback) (void);
41
Greg Clayton4272cc72011-02-02 02:24:04 +000042struct PluginInfo
43{
Zachary Turner58a559c2014-08-27 20:15:09 +000044 PluginInfo()
45 : plugin_init_callback(nullptr), plugin_term_callback(nullptr)
46 {
47 }
48
49 llvm::sys::DynamicLibrary library;
Greg Clayton03da4cc2013-04-19 21:31:16 +000050 PluginInitCallback plugin_init_callback;
51 PluginTermCallback plugin_term_callback;
Greg Clayton4272cc72011-02-02 02:24:04 +000052};
53
54typedef std::map<FileSpec, PluginInfo> PluginTerminateMap;
55
56static Mutex &
57GetPluginMapMutex ()
58{
59 static Mutex g_plugin_map_mutex (Mutex::eMutexTypeRecursive);
60 return g_plugin_map_mutex;
61}
62
63static PluginTerminateMap &
64GetPluginMap ()
65{
66 static PluginTerminateMap g_plugin_map;
67 return g_plugin_map;
68}
69
70static bool
71PluginIsLoaded (const FileSpec &plugin_file_spec)
72{
73 Mutex::Locker locker (GetPluginMapMutex ());
74 PluginTerminateMap &plugin_map = GetPluginMap ();
75 return plugin_map.find (plugin_file_spec) != plugin_map.end();
76}
77
78static void
79SetPluginInfo (const FileSpec &plugin_file_spec, const PluginInfo &plugin_info)
80{
81 Mutex::Locker locker (GetPluginMapMutex ());
82 PluginTerminateMap &plugin_map = GetPluginMap ();
Michael Sartain3cf443d2013-07-17 00:26:30 +000083 assert (plugin_map.find (plugin_file_spec) == plugin_map.end());
Greg Clayton4272cc72011-02-02 02:24:04 +000084 plugin_map[plugin_file_spec] = plugin_info;
85}
86
David Majnemer5ff02782014-07-22 21:59:22 +000087template <typename FPtrTy>
88static FPtrTy
89CastToFPtr (void *VPtr)
90{
91 return reinterpret_cast<FPtrTy>(reinterpret_cast<intptr_t>(VPtr));
92}
Greg Clayton4272cc72011-02-02 02:24:04 +000093
94static FileSpec::EnumerateDirectoryResult
95LoadPluginCallback
96(
97 void *baton,
98 FileSpec::FileType file_type,
99 const FileSpec &file_spec
100)
101{
102// PluginManager *plugin_manager = (PluginManager *)baton;
103 Error error;
104
105 // If we have a regular file, a symbolic link or unknown file type, try
106 // and process the file. We must handle unknown as sometimes the directory
107 // enumeration might be enumerating a file system that doesn't have correct
108 // file type information.
109 if (file_type == FileSpec::eFileTypeRegular ||
110 file_type == FileSpec::eFileTypeSymbolicLink ||
111 file_type == FileSpec::eFileTypeUnknown )
112 {
113 FileSpec plugin_file_spec (file_spec);
114 plugin_file_spec.ResolvePath();
115
116 if (PluginIsLoaded (plugin_file_spec))
117 return FileSpec::eEnumerateDirectoryResultNext;
118 else
119 {
Zachary Turner58a559c2014-08-27 20:15:09 +0000120 PluginInfo plugin_info;
Greg Clayton45319462011-02-08 00:35:34 +0000121
Zachary Turner58a559c2014-08-27 20:15:09 +0000122 std::string pluginLoadError;
123 plugin_info.library = llvm::sys::DynamicLibrary::getPermanentLibrary (plugin_file_spec.GetPath().c_str(), &pluginLoadError);
124 if (plugin_info.library.isValid())
Greg Clayton4272cc72011-02-02 02:24:04 +0000125 {
126 bool success = false;
David Majnemer5ff02782014-07-22 21:59:22 +0000127 plugin_info.plugin_init_callback =
Zachary Turner58a559c2014-08-27 20:15:09 +0000128 CastToFPtr<PluginInitCallback>(plugin_info.library.getAddressOfSymbol("LLDBPluginInitialize"));
Greg Clayton4272cc72011-02-02 02:24:04 +0000129 if (plugin_info.plugin_init_callback)
130 {
131 // Call the plug-in "bool LLDBPluginInitialize(void)" function
Greg Clayton03da4cc2013-04-19 21:31:16 +0000132 success = plugin_info.plugin_init_callback();
Greg Clayton4272cc72011-02-02 02:24:04 +0000133 }
134
135 if (success)
136 {
137 // It is ok for the "LLDBPluginTerminate" symbol to be NULL
David Majnemer5ff02782014-07-22 21:59:22 +0000138 plugin_info.plugin_term_callback =
Zachary Turner58a559c2014-08-27 20:15:09 +0000139 CastToFPtr<PluginTermCallback>(plugin_info.library.getAddressOfSymbol("LLDBPluginTerminate"));
Greg Clayton4272cc72011-02-02 02:24:04 +0000140 }
141 else
142 {
Zachary Turner58a559c2014-08-27 20:15:09 +0000143 // The initialize function returned FALSE which means the plug-in might not be
144 // compatible, or might be too new or too old, or might not want to run on this
145 // machine. Set it to a default-constructed instance to invalidate it.
146 plugin_info = PluginInfo();
Greg Clayton4272cc72011-02-02 02:24:04 +0000147 }
148
149 // Regardless of success or failure, cache the plug-in load
150 // in our plug-in info so we don't try to load it again and
151 // again.
152 SetPluginInfo (plugin_file_spec, plugin_info);
153
154 return FileSpec::eEnumerateDirectoryResultNext;
155 }
156 }
157 }
158
159 if (file_type == FileSpec::eFileTypeUnknown ||
160 file_type == FileSpec::eFileTypeDirectory ||
161 file_type == FileSpec::eFileTypeSymbolicLink )
162 {
163 // Try and recurse into anything that a directory or symbolic link.
164 // We must also do this for unknown as sometimes the directory enumeration
Bruce Mitchener6a7f3332014-06-27 02:42:12 +0000165 // might be enumerating a file system that doesn't have correct file type
Greg Clayton4272cc72011-02-02 02:24:04 +0000166 // information.
167 return FileSpec::eEnumerateDirectoryResultEnter;
168 }
169
170 return FileSpec::eEnumerateDirectoryResultNext;
171}
172
173
174void
175PluginManager::Initialize ()
176{
Greg Clayton1cb64962011-03-24 04:28:38 +0000177#if 1
Greg Clayton4272cc72011-02-02 02:24:04 +0000178 FileSpec dir_spec;
179 const bool find_directories = true;
180 const bool find_files = true;
181 const bool find_other = true;
182 char dir_path[PATH_MAX];
Zachary Turner42ff0ad2014-08-21 17:29:12 +0000183 if (HostInfo::GetLLDBPath(ePathTypeLLDBSystemPlugins, dir_spec))
Greg Clayton4272cc72011-02-02 02:24:04 +0000184 {
185 if (dir_spec.Exists() && dir_spec.GetPath(dir_path, sizeof(dir_path)))
186 {
187 FileSpec::EnumerateDirectory (dir_path,
188 find_directories,
189 find_files,
190 find_other,
191 LoadPluginCallback,
192 NULL);
193 }
194 }
195
Zachary Turner42ff0ad2014-08-21 17:29:12 +0000196 if (HostInfo::GetLLDBPath(ePathTypeLLDBUserPlugins, dir_spec))
Greg Clayton4272cc72011-02-02 02:24:04 +0000197 {
198 if (dir_spec.Exists() && dir_spec.GetPath(dir_path, sizeof(dir_path)))
199 {
200 FileSpec::EnumerateDirectory (dir_path,
201 find_directories,
202 find_files,
203 find_other,
204 LoadPluginCallback,
205 NULL);
206 }
207 }
Greg Clayton1cb64962011-03-24 04:28:38 +0000208#endif
Greg Clayton4272cc72011-02-02 02:24:04 +0000209}
210
211void
212PluginManager::Terminate ()
213{
214 Mutex::Locker locker (GetPluginMapMutex ());
215 PluginTerminateMap &plugin_map = GetPluginMap ();
216
217 PluginTerminateMap::const_iterator pos, end = plugin_map.end();
218 for (pos = plugin_map.begin(); pos != end; ++pos)
219 {
220 // Call the plug-in "void LLDBPluginTerminate (void)" function if there
221 // is one (if the symbol was not NULL).
Zachary Turner58a559c2014-08-27 20:15:09 +0000222 if (pos->second.library.isValid())
Greg Clayton4272cc72011-02-02 02:24:04 +0000223 {
224 if (pos->second.plugin_term_callback)
Greg Clayton03da4cc2013-04-19 21:31:16 +0000225 pos->second.plugin_term_callback();
Greg Clayton4272cc72011-02-02 02:24:04 +0000226 }
227 }
228 plugin_map.clear();
229}
230
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000231
232#pragma mark ABI
233
234
Jason Molenda743e86a2010-06-11 23:44:18 +0000235struct ABIInstance
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000236{
237 ABIInstance() :
238 name(),
239 description(),
240 create_callback(NULL)
241 {
242 }
243
Greg Clayton57abc5d2013-05-10 21:47:16 +0000244 ConstString name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000245 std::string description;
246 ABICreateInstance create_callback;
247};
248
249typedef std::vector<ABIInstance> ABIInstances;
250
Greg Claytonded470d2011-03-19 01:12:21 +0000251static Mutex &
252GetABIInstancesMutex ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000253{
Greg Claytonded470d2011-03-19 01:12:21 +0000254 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
255 return g_instances_mutex;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000256}
257
Greg Claytonded470d2011-03-19 01:12:21 +0000258static ABIInstances &
259GetABIInstances ()
260{
261 static ABIInstances g_instances;
262 return g_instances;
263}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000264
265bool
266PluginManager::RegisterPlugin
Greg Clayton4272cc72011-02-02 02:24:04 +0000267(
Greg Clayton57abc5d2013-05-10 21:47:16 +0000268 const ConstString &name,
Greg Clayton4272cc72011-02-02 02:24:04 +0000269 const char *description,
270 ABICreateInstance create_callback
271)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000272{
273 if (create_callback)
274 {
275 ABIInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +0000276 assert ((bool)name);
277 instance.name = name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000278 if (description && description[0])
279 instance.description = description;
280 instance.create_callback = create_callback;
Greg Claytonded470d2011-03-19 01:12:21 +0000281 Mutex::Locker locker (GetABIInstancesMutex ());
282 GetABIInstances ().push_back (instance);
283 return true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000284 }
285 return false;
286}
287
288bool
289PluginManager::UnregisterPlugin (ABICreateInstance create_callback)
290{
291 if (create_callback)
292 {
Greg Claytonded470d2011-03-19 01:12:21 +0000293 Mutex::Locker locker (GetABIInstancesMutex ());
294 ABIInstances &instances = GetABIInstances ();
295
296 ABIInstances::iterator pos, end = instances.end();
297 for (pos = instances.begin(); pos != end; ++ pos)
298 {
299 if (pos->create_callback == create_callback)
300 {
301 instances.erase(pos);
302 return true;
303 }
304 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000305 }
306 return false;
307}
308
309ABICreateInstance
310PluginManager::GetABICreateCallbackAtIndex (uint32_t idx)
311{
Greg Claytonded470d2011-03-19 01:12:21 +0000312 Mutex::Locker locker (GetABIInstancesMutex ());
313 ABIInstances &instances = GetABIInstances ();
Greg Claytonded470d2011-03-19 01:12:21 +0000314 if (idx < instances.size())
315 return instances[idx].create_callback;
Jason Molenda743e86a2010-06-11 23:44:18 +0000316 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000317}
318
319ABICreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +0000320PluginManager::GetABICreateCallbackForPluginName (const ConstString &name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000321{
Greg Clayton57abc5d2013-05-10 21:47:16 +0000322 if (name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000323 {
Greg Claytonded470d2011-03-19 01:12:21 +0000324 Mutex::Locker locker (GetABIInstancesMutex ());
Greg Claytonded470d2011-03-19 01:12:21 +0000325 ABIInstances &instances = GetABIInstances ();
326
327 ABIInstances::iterator pos, end = instances.end();
328 for (pos = instances.begin(); pos != end; ++ pos)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000329 {
Greg Clayton57abc5d2013-05-10 21:47:16 +0000330 if (name == pos->name)
Greg Claytonded470d2011-03-19 01:12:21 +0000331 return pos->create_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000332 }
333 }
334 return NULL;
335}
336
337
338#pragma mark Disassembler
339
340
Jason Molenda743e86a2010-06-11 23:44:18 +0000341struct DisassemblerInstance
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000342{
343 DisassemblerInstance() :
344 name(),
345 description(),
346 create_callback(NULL)
347 {
348 }
349
Greg Clayton57abc5d2013-05-10 21:47:16 +0000350 ConstString name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000351 std::string description;
352 DisassemblerCreateInstance create_callback;
353};
354
355typedef std::vector<DisassemblerInstance> DisassemblerInstances;
356
Greg Claytonab65b342011-04-13 22:47:15 +0000357static Mutex &
358GetDisassemblerMutex ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000359{
Greg Claytonab65b342011-04-13 22:47:15 +0000360 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
361 return g_instances_mutex;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000362}
363
Greg Claytonab65b342011-04-13 22:47:15 +0000364static DisassemblerInstances &
365GetDisassemblerInstances ()
366{
367 static DisassemblerInstances g_instances;
368 return g_instances;
369}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000370
371bool
372PluginManager::RegisterPlugin
373(
Greg Clayton57abc5d2013-05-10 21:47:16 +0000374 const ConstString &name,
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000375 const char *description,
376 DisassemblerCreateInstance create_callback
377)
378{
379 if (create_callback)
380 {
381 DisassemblerInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +0000382 assert ((bool)name);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000383 instance.name = name;
384 if (description && description[0])
385 instance.description = description;
386 instance.create_callback = create_callback;
Greg Claytonab65b342011-04-13 22:47:15 +0000387 Mutex::Locker locker (GetDisassemblerMutex ());
388 GetDisassemblerInstances ().push_back (instance);
389 return true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000390 }
391 return false;
392}
393
394bool
395PluginManager::UnregisterPlugin (DisassemblerCreateInstance create_callback)
396{
397 if (create_callback)
398 {
Greg Claytonab65b342011-04-13 22:47:15 +0000399 Mutex::Locker locker (GetDisassemblerMutex ());
400 DisassemblerInstances &instances = GetDisassemblerInstances ();
401
402 DisassemblerInstances::iterator pos, end = instances.end();
403 for (pos = instances.begin(); pos != end; ++ pos)
404 {
405 if (pos->create_callback == create_callback)
406 {
407 instances.erase(pos);
408 return true;
409 }
410 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000411 }
412 return false;
413}
414
415DisassemblerCreateInstance
416PluginManager::GetDisassemblerCreateCallbackAtIndex (uint32_t idx)
417{
Greg Claytonab65b342011-04-13 22:47:15 +0000418 Mutex::Locker locker (GetDisassemblerMutex ());
419 DisassemblerInstances &instances = GetDisassemblerInstances ();
420 if (idx < instances.size())
421 return instances[idx].create_callback;
Jason Molenda743e86a2010-06-11 23:44:18 +0000422 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000423}
424
425DisassemblerCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +0000426PluginManager::GetDisassemblerCreateCallbackForPluginName (const ConstString &name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000427{
Greg Clayton57abc5d2013-05-10 21:47:16 +0000428 if (name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000429 {
Greg Claytonab65b342011-04-13 22:47:15 +0000430 Mutex::Locker locker (GetDisassemblerMutex ());
431 DisassemblerInstances &instances = GetDisassemblerInstances ();
432
433 DisassemblerInstances::iterator pos, end = instances.end();
434 for (pos = instances.begin(); pos != end; ++ pos)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000435 {
Greg Clayton57abc5d2013-05-10 21:47:16 +0000436 if (name == pos->name)
Greg Claytonab65b342011-04-13 22:47:15 +0000437 return pos->create_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000438 }
439 }
440 return NULL;
441}
442
443
444
445#pragma mark DynamicLoader
446
447
Jason Molenda743e86a2010-06-11 23:44:18 +0000448struct DynamicLoaderInstance
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000449{
450 DynamicLoaderInstance() :
451 name(),
452 description(),
Greg Claytone8cd0c92012-10-19 18:02:49 +0000453 create_callback(NULL),
454 debugger_init_callback (NULL)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000455 {
456 }
457
Greg Clayton57abc5d2013-05-10 21:47:16 +0000458 ConstString name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000459 std::string description;
460 DynamicLoaderCreateInstance create_callback;
Greg Claytone8cd0c92012-10-19 18:02:49 +0000461 DebuggerInitializeCallback debugger_init_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000462};
463
464typedef std::vector<DynamicLoaderInstance> DynamicLoaderInstances;
465
Greg Claytonab65b342011-04-13 22:47:15 +0000466
467static Mutex &
468GetDynamicLoaderMutex ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000469{
Greg Claytonab65b342011-04-13 22:47:15 +0000470 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
471 return g_instances_mutex;
472}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000473
Greg Claytonab65b342011-04-13 22:47:15 +0000474static DynamicLoaderInstances &
475GetDynamicLoaderInstances ()
476{
477 static DynamicLoaderInstances g_instances;
478 return g_instances;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000479}
480
481
482bool
483PluginManager::RegisterPlugin
484(
Greg Clayton57abc5d2013-05-10 21:47:16 +0000485 const ConstString &name,
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000486 const char *description,
Greg Claytone8cd0c92012-10-19 18:02:49 +0000487 DynamicLoaderCreateInstance create_callback,
488 DebuggerInitializeCallback debugger_init_callback
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000489)
490{
491 if (create_callback)
492 {
493 DynamicLoaderInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +0000494 assert ((bool)name);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000495 instance.name = name;
496 if (description && description[0])
497 instance.description = description;
498 instance.create_callback = create_callback;
Greg Claytone8cd0c92012-10-19 18:02:49 +0000499 instance.debugger_init_callback = debugger_init_callback;
Greg Claytonab65b342011-04-13 22:47:15 +0000500 Mutex::Locker locker (GetDynamicLoaderMutex ());
501 GetDynamicLoaderInstances ().push_back (instance);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000502 }
503 return false;
504}
505
506bool
507PluginManager::UnregisterPlugin (DynamicLoaderCreateInstance create_callback)
508{
509 if (create_callback)
510 {
Greg Claytonab65b342011-04-13 22:47:15 +0000511 Mutex::Locker locker (GetDynamicLoaderMutex ());
512 DynamicLoaderInstances &instances = GetDynamicLoaderInstances ();
513
514 DynamicLoaderInstances::iterator pos, end = instances.end();
515 for (pos = instances.begin(); pos != end; ++ pos)
516 {
517 if (pos->create_callback == create_callback)
518 {
519 instances.erase(pos);
520 return true;
521 }
522 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000523 }
524 return false;
525}
526
527DynamicLoaderCreateInstance
528PluginManager::GetDynamicLoaderCreateCallbackAtIndex (uint32_t idx)
529{
Greg Claytonab65b342011-04-13 22:47:15 +0000530 Mutex::Locker locker (GetDynamicLoaderMutex ());
531 DynamicLoaderInstances &instances = GetDynamicLoaderInstances ();
532 if (idx < instances.size())
533 return instances[idx].create_callback;
Jason Molenda743e86a2010-06-11 23:44:18 +0000534 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000535}
536
537DynamicLoaderCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +0000538PluginManager::GetDynamicLoaderCreateCallbackForPluginName (const ConstString &name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000539{
Greg Clayton57abc5d2013-05-10 21:47:16 +0000540 if (name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000541 {
Greg Claytonab65b342011-04-13 22:47:15 +0000542 Mutex::Locker locker (GetDynamicLoaderMutex ());
543 DynamicLoaderInstances &instances = GetDynamicLoaderInstances ();
544
545 DynamicLoaderInstances::iterator pos, end = instances.end();
546 for (pos = instances.begin(); pos != end; ++ pos)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000547 {
Greg Clayton57abc5d2013-05-10 21:47:16 +0000548 if (name == pos->name)
Greg Claytonab65b342011-04-13 22:47:15 +0000549 return pos->create_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000550 }
551 }
552 return NULL;
553}
554
Andrew MacPherson17220c12014-03-05 10:12:43 +0000555#pragma mark JITLoader
556
557
558struct JITLoaderInstance
559{
560 JITLoaderInstance() :
561 name(),
562 description(),
563 create_callback(NULL),
564 debugger_init_callback (NULL)
565 {
566 }
567
568 ConstString name;
569 std::string description;
570 JITLoaderCreateInstance create_callback;
571 DebuggerInitializeCallback debugger_init_callback;
572};
573
574typedef std::vector<JITLoaderInstance> JITLoaderInstances;
575
576
577static Mutex &
578GetJITLoaderMutex ()
579{
580 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
581 return g_instances_mutex;
582}
583
584static JITLoaderInstances &
585GetJITLoaderInstances ()
586{
587 static JITLoaderInstances g_instances;
588 return g_instances;
589}
590
591
592bool
593PluginManager::RegisterPlugin
594(
595 const ConstString &name,
596 const char *description,
597 JITLoaderCreateInstance create_callback,
598 DebuggerInitializeCallback debugger_init_callback
599)
600{
601 if (create_callback)
602 {
603 JITLoaderInstance instance;
604 assert ((bool)name);
605 instance.name = name;
606 if (description && description[0])
607 instance.description = description;
608 instance.create_callback = create_callback;
609 instance.debugger_init_callback = debugger_init_callback;
610 Mutex::Locker locker (GetJITLoaderMutex ());
611 GetJITLoaderInstances ().push_back (instance);
612 }
613 return false;
614}
615
616bool
617PluginManager::UnregisterPlugin (JITLoaderCreateInstance create_callback)
618{
619 if (create_callback)
620 {
621 Mutex::Locker locker (GetJITLoaderMutex ());
622 JITLoaderInstances &instances = GetJITLoaderInstances ();
623
624 JITLoaderInstances::iterator pos, end = instances.end();
625 for (pos = instances.begin(); pos != end; ++ pos)
626 {
627 if (pos->create_callback == create_callback)
628 {
629 instances.erase(pos);
630 return true;
631 }
632 }
633 }
634 return false;
635}
636
637JITLoaderCreateInstance
638PluginManager::GetJITLoaderCreateCallbackAtIndex (uint32_t idx)
639{
640 Mutex::Locker locker (GetJITLoaderMutex ());
641 JITLoaderInstances &instances = GetJITLoaderInstances ();
642 if (idx < instances.size())
643 return instances[idx].create_callback;
644 return NULL;
645}
646
647JITLoaderCreateInstance
648PluginManager::GetJITLoaderCreateCallbackForPluginName (const ConstString &name)
649{
650 if (name)
651 {
652 Mutex::Locker locker (GetJITLoaderMutex ());
653 JITLoaderInstances &instances = GetJITLoaderInstances ();
654
655 JITLoaderInstances::iterator pos, end = instances.end();
656 for (pos = instances.begin(); pos != end; ++ pos)
657 {
658 if (name == pos->name)
659 return pos->create_callback;
660 }
661 }
662 return NULL;
663}
664
Greg Claytonf03bbe22011-02-01 01:37:45 +0000665#pragma mark EmulateInstruction
666
667
668struct EmulateInstructionInstance
669{
670 EmulateInstructionInstance() :
671 name(),
672 description(),
673 create_callback(NULL)
674 {
675 }
676
Greg Clayton57abc5d2013-05-10 21:47:16 +0000677 ConstString name;
Greg Claytonf03bbe22011-02-01 01:37:45 +0000678 std::string description;
679 EmulateInstructionCreateInstance create_callback;
680};
681
682typedef std::vector<EmulateInstructionInstance> EmulateInstructionInstances;
683
Greg Claytonab65b342011-04-13 22:47:15 +0000684static Mutex &
685GetEmulateInstructionMutex ()
Greg Claytonf03bbe22011-02-01 01:37:45 +0000686{
Greg Claytonab65b342011-04-13 22:47:15 +0000687 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
688 return g_instances_mutex;
689}
690
691static EmulateInstructionInstances &
692GetEmulateInstructionInstances ()
693{
694 static EmulateInstructionInstances g_instances;
695 return g_instances;
Greg Claytonf03bbe22011-02-01 01:37:45 +0000696}
697
698
699bool
700PluginManager::RegisterPlugin
701(
Greg Clayton57abc5d2013-05-10 21:47:16 +0000702 const ConstString &name,
Greg Clayton4272cc72011-02-02 02:24:04 +0000703 const char *description,
704 EmulateInstructionCreateInstance create_callback
705)
Greg Claytonf03bbe22011-02-01 01:37:45 +0000706{
707 if (create_callback)
708 {
709 EmulateInstructionInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +0000710 assert ((bool)name);
Greg Claytonf03bbe22011-02-01 01:37:45 +0000711 instance.name = name;
712 if (description && description[0])
713 instance.description = description;
714 instance.create_callback = create_callback;
Greg Claytonab65b342011-04-13 22:47:15 +0000715 Mutex::Locker locker (GetEmulateInstructionMutex ());
716 GetEmulateInstructionInstances ().push_back (instance);
Greg Claytonf03bbe22011-02-01 01:37:45 +0000717 }
718 return false;
719}
720
721bool
722PluginManager::UnregisterPlugin (EmulateInstructionCreateInstance create_callback)
723{
724 if (create_callback)
725 {
Greg Claytonab65b342011-04-13 22:47:15 +0000726 Mutex::Locker locker (GetEmulateInstructionMutex ());
727 EmulateInstructionInstances &instances = GetEmulateInstructionInstances ();
728
729 EmulateInstructionInstances::iterator pos, end = instances.end();
730 for (pos = instances.begin(); pos != end; ++ pos)
731 {
732 if (pos->create_callback == create_callback)
733 {
734 instances.erase(pos);
735 return true;
736 }
737 }
Greg Claytonf03bbe22011-02-01 01:37:45 +0000738 }
739 return false;
740}
741
742EmulateInstructionCreateInstance
743PluginManager::GetEmulateInstructionCreateCallbackAtIndex (uint32_t idx)
744{
Greg Claytonab65b342011-04-13 22:47:15 +0000745 Mutex::Locker locker (GetEmulateInstructionMutex ());
746 EmulateInstructionInstances &instances = GetEmulateInstructionInstances ();
747 if (idx < instances.size())
748 return instances[idx].create_callback;
Greg Claytonf03bbe22011-02-01 01:37:45 +0000749 return NULL;
750}
751
752EmulateInstructionCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +0000753PluginManager::GetEmulateInstructionCreateCallbackForPluginName (const ConstString &name)
Greg Claytonf03bbe22011-02-01 01:37:45 +0000754{
Greg Clayton57abc5d2013-05-10 21:47:16 +0000755 if (name)
Greg Claytonf03bbe22011-02-01 01:37:45 +0000756 {
Greg Claytonab65b342011-04-13 22:47:15 +0000757 Mutex::Locker locker (GetEmulateInstructionMutex ());
758 EmulateInstructionInstances &instances = GetEmulateInstructionInstances ();
759
760 EmulateInstructionInstances::iterator pos, end = instances.end();
761 for (pos = instances.begin(); pos != end; ++ pos)
Greg Claytonf03bbe22011-02-01 01:37:45 +0000762 {
Greg Clayton57abc5d2013-05-10 21:47:16 +0000763 if (name == pos->name)
Greg Claytonab65b342011-04-13 22:47:15 +0000764 return pos->create_callback;
Greg Claytonf03bbe22011-02-01 01:37:45 +0000765 }
766 }
767 return NULL;
768}
Greg Clayton56d9a1b2011-08-22 02:49:39 +0000769#pragma mark OperatingSystem
770
771
772struct OperatingSystemInstance
773{
774 OperatingSystemInstance() :
775 name(),
776 description(),
777 create_callback(NULL)
778 {
779 }
780
Greg Clayton57abc5d2013-05-10 21:47:16 +0000781 ConstString name;
Greg Clayton56d9a1b2011-08-22 02:49:39 +0000782 std::string description;
783 OperatingSystemCreateInstance create_callback;
784};
785
786typedef std::vector<OperatingSystemInstance> OperatingSystemInstances;
787
788static Mutex &
789GetOperatingSystemMutex ()
790{
791 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
792 return g_instances_mutex;
793}
794
795static OperatingSystemInstances &
796GetOperatingSystemInstances ()
797{
798 static OperatingSystemInstances g_instances;
799 return g_instances;
800}
801
802bool
Greg Clayton57abc5d2013-05-10 21:47:16 +0000803PluginManager::RegisterPlugin (const ConstString &name,
804 const char *description,
805 OperatingSystemCreateInstance create_callback)
Greg Clayton56d9a1b2011-08-22 02:49:39 +0000806{
807 if (create_callback)
808 {
809 OperatingSystemInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +0000810 assert ((bool)name);
Greg Clayton56d9a1b2011-08-22 02:49:39 +0000811 instance.name = name;
812 if (description && description[0])
813 instance.description = description;
814 instance.create_callback = create_callback;
815 Mutex::Locker locker (GetOperatingSystemMutex ());
816 GetOperatingSystemInstances ().push_back (instance);
817 }
818 return false;
819}
820
821bool
822PluginManager::UnregisterPlugin (OperatingSystemCreateInstance create_callback)
823{
824 if (create_callback)
825 {
826 Mutex::Locker locker (GetOperatingSystemMutex ());
827 OperatingSystemInstances &instances = GetOperatingSystemInstances ();
828
829 OperatingSystemInstances::iterator pos, end = instances.end();
830 for (pos = instances.begin(); pos != end; ++ pos)
831 {
832 if (pos->create_callback == create_callback)
833 {
834 instances.erase(pos);
835 return true;
836 }
837 }
838 }
839 return false;
840}
841
842OperatingSystemCreateInstance
843PluginManager::GetOperatingSystemCreateCallbackAtIndex (uint32_t idx)
844{
845 Mutex::Locker locker (GetOperatingSystemMutex ());
846 OperatingSystemInstances &instances = GetOperatingSystemInstances ();
847 if (idx < instances.size())
848 return instances[idx].create_callback;
849 return NULL;
850}
851
852OperatingSystemCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +0000853PluginManager::GetOperatingSystemCreateCallbackForPluginName (const ConstString &name)
Greg Clayton56d9a1b2011-08-22 02:49:39 +0000854{
Greg Clayton57abc5d2013-05-10 21:47:16 +0000855 if (name)
Greg Clayton56d9a1b2011-08-22 02:49:39 +0000856 {
Greg Clayton56d9a1b2011-08-22 02:49:39 +0000857 Mutex::Locker locker (GetOperatingSystemMutex ());
858 OperatingSystemInstances &instances = GetOperatingSystemInstances ();
859
860 OperatingSystemInstances::iterator pos, end = instances.end();
861 for (pos = instances.begin(); pos != end; ++ pos)
862 {
Greg Clayton57abc5d2013-05-10 21:47:16 +0000863 if (name == pos->name)
Greg Clayton56d9a1b2011-08-22 02:49:39 +0000864 return pos->create_callback;
865 }
866 }
867 return NULL;
868}
Greg Claytonf03bbe22011-02-01 01:37:45 +0000869
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000870
Jim Ingham22777012010-09-23 02:01:19 +0000871#pragma mark LanguageRuntime
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000872
873
Jim Ingham22777012010-09-23 02:01:19 +0000874struct LanguageRuntimeInstance
875{
876 LanguageRuntimeInstance() :
877 name(),
878 description(),
879 create_callback(NULL)
880 {
881 }
882
Greg Clayton57abc5d2013-05-10 21:47:16 +0000883 ConstString name;
Jim Ingham22777012010-09-23 02:01:19 +0000884 std::string description;
885 LanguageRuntimeCreateInstance create_callback;
Colin Rileyc9c55a22015-05-04 18:39:38 +0000886 LanguageRuntimeGetCommandObject command_callback;
Jim Ingham22777012010-09-23 02:01:19 +0000887};
888
889typedef std::vector<LanguageRuntimeInstance> LanguageRuntimeInstances;
890
Greg Claytonab65b342011-04-13 22:47:15 +0000891static Mutex &
892GetLanguageRuntimeMutex ()
Jim Ingham22777012010-09-23 02:01:19 +0000893{
Greg Claytonab65b342011-04-13 22:47:15 +0000894 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
895 return g_instances_mutex;
Jim Ingham22777012010-09-23 02:01:19 +0000896}
897
Greg Claytonab65b342011-04-13 22:47:15 +0000898static LanguageRuntimeInstances &
899GetLanguageRuntimeInstances ()
900{
901 static LanguageRuntimeInstances g_instances;
902 return g_instances;
903}
Jim Ingham22777012010-09-23 02:01:19 +0000904
905bool
906PluginManager::RegisterPlugin
Greg Clayton4272cc72011-02-02 02:24:04 +0000907(
Greg Clayton57abc5d2013-05-10 21:47:16 +0000908 const ConstString &name,
Greg Clayton4272cc72011-02-02 02:24:04 +0000909 const char *description,
Colin Rileyc9c55a22015-05-04 18:39:38 +0000910 LanguageRuntimeCreateInstance create_callback,
911 LanguageRuntimeGetCommandObject command_callback
Greg Clayton4272cc72011-02-02 02:24:04 +0000912)
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;
Colin Rileyc9c55a22015-05-04 18:39:38 +0000922 instance.command_callback = command_callback;
Greg Claytonab65b342011-04-13 22:47:15 +0000923 Mutex::Locker locker (GetLanguageRuntimeMutex ());
924 GetLanguageRuntimeInstances ().push_back (instance);
Jim Ingham22777012010-09-23 02:01:19 +0000925 }
926 return false;
927}
928
929bool
930PluginManager::UnregisterPlugin (LanguageRuntimeCreateInstance create_callback)
931{
932 if (create_callback)
933 {
Greg Claytonab65b342011-04-13 22:47:15 +0000934 Mutex::Locker locker (GetLanguageRuntimeMutex ());
935 LanguageRuntimeInstances &instances = GetLanguageRuntimeInstances ();
936
937 LanguageRuntimeInstances::iterator pos, end = instances.end();
938 for (pos = instances.begin(); pos != end; ++ pos)
939 {
940 if (pos->create_callback == create_callback)
941 {
942 instances.erase(pos);
943 return true;
944 }
945 }
Jim Ingham22777012010-09-23 02:01:19 +0000946 }
947 return false;
948}
949
950LanguageRuntimeCreateInstance
951PluginManager::GetLanguageRuntimeCreateCallbackAtIndex (uint32_t idx)
952{
Greg Claytonab65b342011-04-13 22:47:15 +0000953 Mutex::Locker locker (GetLanguageRuntimeMutex ());
954 LanguageRuntimeInstances &instances = GetLanguageRuntimeInstances ();
955 if (idx < instances.size())
956 return instances[idx].create_callback;
Jim Ingham22777012010-09-23 02:01:19 +0000957 return NULL;
958}
959
Colin Rileyc9c55a22015-05-04 18:39:38 +0000960LanguageRuntimeGetCommandObject
961PluginManager::GetLanguageRuntimeGetCommandObjectAtIndex (uint32_t idx)
962{
963 Mutex::Locker locker (GetLanguageRuntimeMutex ());
964 LanguageRuntimeInstances &instances = GetLanguageRuntimeInstances ();
965 if (idx < instances.size())
966 return instances[idx].command_callback;
967 return NULL;
968}
969
Jim Ingham22777012010-09-23 02:01:19 +0000970LanguageRuntimeCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +0000971PluginManager::GetLanguageRuntimeCreateCallbackForPluginName (const ConstString &name)
Jim Ingham22777012010-09-23 02:01:19 +0000972{
Greg Clayton57abc5d2013-05-10 21:47:16 +0000973 if (name)
Jim Ingham22777012010-09-23 02:01:19 +0000974 {
Greg Claytonab65b342011-04-13 22:47:15 +0000975 Mutex::Locker locker (GetLanguageRuntimeMutex ());
976 LanguageRuntimeInstances &instances = GetLanguageRuntimeInstances ();
977
978 LanguageRuntimeInstances::iterator pos, end = instances.end();
979 for (pos = instances.begin(); pos != end; ++ pos)
Jim Ingham22777012010-09-23 02:01:19 +0000980 {
Greg Clayton57abc5d2013-05-10 21:47:16 +0000981 if (name == pos->name)
Greg Claytonab65b342011-04-13 22:47:15 +0000982 return pos->create_callback;
Jim Ingham22777012010-09-23 02:01:19 +0000983 }
984 }
985 return NULL;
986}
987
Jason Molendaeef51062013-11-05 03:57:19 +0000988#pragma mark SystemRuntime
989
990
991struct SystemRuntimeInstance
992{
993 SystemRuntimeInstance() :
994 name(),
995 description(),
996 create_callback(NULL)
997 {
998 }
999
1000 ConstString name;
1001 std::string description;
1002 SystemRuntimeCreateInstance create_callback;
1003};
1004
1005typedef std::vector<SystemRuntimeInstance> SystemRuntimeInstances;
1006
1007static Mutex &
1008GetSystemRuntimeMutex ()
1009{
1010 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
1011 return g_instances_mutex;
1012}
1013
1014static SystemRuntimeInstances &
1015GetSystemRuntimeInstances ()
1016{
1017 static SystemRuntimeInstances g_instances;
1018 return g_instances;
1019}
1020
1021bool
1022PluginManager::RegisterPlugin
1023(
1024 const ConstString &name,
1025 const char *description,
1026 SystemRuntimeCreateInstance create_callback
1027)
1028{
1029 if (create_callback)
1030 {
1031 SystemRuntimeInstance instance;
1032 assert ((bool)name);
1033 instance.name = name;
1034 if (description && description[0])
1035 instance.description = description;
1036 instance.create_callback = create_callback;
1037 Mutex::Locker locker (GetSystemRuntimeMutex ());
1038 GetSystemRuntimeInstances ().push_back (instance);
1039 }
1040 return false;
1041}
1042
1043bool
1044PluginManager::UnregisterPlugin (SystemRuntimeCreateInstance create_callback)
1045{
1046 if (create_callback)
1047 {
1048 Mutex::Locker locker (GetSystemRuntimeMutex ());
1049 SystemRuntimeInstances &instances = GetSystemRuntimeInstances ();
1050
1051 SystemRuntimeInstances::iterator pos, end = instances.end();
1052 for (pos = instances.begin(); pos != end; ++ pos)
1053 {
1054 if (pos->create_callback == create_callback)
1055 {
1056 instances.erase(pos);
1057 return true;
1058 }
1059 }
1060 }
1061 return false;
1062}
1063
1064SystemRuntimeCreateInstance
1065PluginManager::GetSystemRuntimeCreateCallbackAtIndex (uint32_t idx)
1066{
1067 Mutex::Locker locker (GetSystemRuntimeMutex ());
1068 SystemRuntimeInstances &instances = GetSystemRuntimeInstances ();
1069 if (idx < instances.size())
1070 return instances[idx].create_callback;
1071 return NULL;
1072}
1073
1074SystemRuntimeCreateInstance
1075PluginManager::GetSystemRuntimeCreateCallbackForPluginName (const ConstString &name)
1076{
1077 if (name)
1078 {
1079 Mutex::Locker locker (GetSystemRuntimeMutex ());
1080 SystemRuntimeInstances &instances = GetSystemRuntimeInstances ();
1081
1082 SystemRuntimeInstances::iterator pos, end = instances.end();
1083 for (pos = instances.begin(); pos != end; ++ pos)
1084 {
1085 if (name == pos->name)
1086 return pos->create_callback;
1087 }
1088 }
1089 return NULL;
1090}
1091
1092
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001093#pragma mark ObjectFile
1094
Jason Molenda743e86a2010-06-11 23:44:18 +00001095struct ObjectFileInstance
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001096{
1097 ObjectFileInstance() :
1098 name(),
1099 description(),
Greg Claytonf4d6de62013-04-24 22:29:28 +00001100 create_callback(NULL),
1101 create_memory_callback (NULL),
Greg Claytona2715cf2014-06-13 00:54:12 +00001102 get_module_specifications (NULL),
1103 save_core (NULL)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001104 {
1105 }
1106
Greg Clayton57abc5d2013-05-10 21:47:16 +00001107 ConstString name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001108 std::string description;
1109 ObjectFileCreateInstance create_callback;
Greg Claytonc9660542012-02-05 02:38:54 +00001110 ObjectFileCreateMemoryInstance create_memory_callback;
Greg Claytonf4d6de62013-04-24 22:29:28 +00001111 ObjectFileGetModuleSpecifications get_module_specifications;
Greg Claytona2715cf2014-06-13 00:54:12 +00001112 ObjectFileSaveCore save_core;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001113};
1114
1115typedef std::vector<ObjectFileInstance> ObjectFileInstances;
1116
Greg Claytonab65b342011-04-13 22:47:15 +00001117static Mutex &
1118GetObjectFileMutex ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001119{
Greg Claytonab65b342011-04-13 22:47:15 +00001120 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
1121 return g_instances_mutex;
1122}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001123
Greg Claytonab65b342011-04-13 22:47:15 +00001124static ObjectFileInstances &
1125GetObjectFileInstances ()
1126{
1127 static ObjectFileInstances g_instances;
1128 return g_instances;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001129}
1130
1131
1132bool
Greg Clayton57abc5d2013-05-10 21:47:16 +00001133PluginManager::RegisterPlugin (const ConstString &name,
Greg Claytonf4d6de62013-04-24 22:29:28 +00001134 const char *description,
1135 ObjectFileCreateInstance create_callback,
1136 ObjectFileCreateMemoryInstance create_memory_callback,
Greg Claytona2715cf2014-06-13 00:54:12 +00001137 ObjectFileGetModuleSpecifications get_module_specifications,
1138 ObjectFileSaveCore save_core)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001139{
1140 if (create_callback)
1141 {
1142 ObjectFileInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +00001143 assert ((bool)name);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001144 instance.name = name;
1145 if (description && description[0])
1146 instance.description = description;
1147 instance.create_callback = create_callback;
Greg Claytonc9660542012-02-05 02:38:54 +00001148 instance.create_memory_callback = create_memory_callback;
Greg Claytona2715cf2014-06-13 00:54:12 +00001149 instance.save_core = save_core;
Greg Claytonf4d6de62013-04-24 22:29:28 +00001150 instance.get_module_specifications = get_module_specifications;
Greg Claytonab65b342011-04-13 22:47:15 +00001151 Mutex::Locker locker (GetObjectFileMutex ());
1152 GetObjectFileInstances ().push_back (instance);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001153 }
1154 return false;
1155}
1156
1157bool
1158PluginManager::UnregisterPlugin (ObjectFileCreateInstance create_callback)
1159{
1160 if (create_callback)
1161 {
Greg Claytonab65b342011-04-13 22:47:15 +00001162 Mutex::Locker locker (GetObjectFileMutex ());
1163 ObjectFileInstances &instances = GetObjectFileInstances ();
1164
1165 ObjectFileInstances::iterator pos, end = instances.end();
1166 for (pos = instances.begin(); pos != end; ++ pos)
1167 {
1168 if (pos->create_callback == create_callback)
1169 {
1170 instances.erase(pos);
1171 return true;
1172 }
1173 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001174 }
1175 return false;
1176}
1177
1178ObjectFileCreateInstance
1179PluginManager::GetObjectFileCreateCallbackAtIndex (uint32_t idx)
1180{
Greg Claytonab65b342011-04-13 22:47:15 +00001181 Mutex::Locker locker (GetObjectFileMutex ());
1182 ObjectFileInstances &instances = GetObjectFileInstances ();
1183 if (idx < instances.size())
1184 return instances[idx].create_callback;
Jason Molenda743e86a2010-06-11 23:44:18 +00001185 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001186}
Greg Claytonab65b342011-04-13 22:47:15 +00001187
Greg Claytonc9660542012-02-05 02:38:54 +00001188
1189ObjectFileCreateMemoryInstance
1190PluginManager::GetObjectFileCreateMemoryCallbackAtIndex (uint32_t idx)
1191{
1192 Mutex::Locker locker (GetObjectFileMutex ());
1193 ObjectFileInstances &instances = GetObjectFileInstances ();
1194 if (idx < instances.size())
1195 return instances[idx].create_memory_callback;
1196 return NULL;
1197}
1198
Greg Claytonf4d6de62013-04-24 22:29:28 +00001199ObjectFileGetModuleSpecifications
1200PluginManager::GetObjectFileGetModuleSpecificationsCallbackAtIndex (uint32_t idx)
1201{
1202 Mutex::Locker locker (GetObjectFileMutex ());
1203 ObjectFileInstances &instances = GetObjectFileInstances ();
1204 if (idx < instances.size())
1205 return instances[idx].get_module_specifications;
1206 return NULL;
1207}
1208
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001209ObjectFileCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +00001210PluginManager::GetObjectFileCreateCallbackForPluginName (const ConstString &name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001211{
Greg Clayton57abc5d2013-05-10 21:47:16 +00001212 if (name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001213 {
Greg Claytonab65b342011-04-13 22:47:15 +00001214 Mutex::Locker locker (GetObjectFileMutex ());
1215 ObjectFileInstances &instances = GetObjectFileInstances ();
1216
1217 ObjectFileInstances::iterator pos, end = instances.end();
1218 for (pos = instances.begin(); pos != end; ++ pos)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001219 {
Greg Clayton57abc5d2013-05-10 21:47:16 +00001220 if (name == pos->name)
Greg Claytonab65b342011-04-13 22:47:15 +00001221 return pos->create_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001222 }
1223 }
1224 return NULL;
1225}
1226
1227
Greg Claytonc9660542012-02-05 02:38:54 +00001228ObjectFileCreateMemoryInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +00001229PluginManager::GetObjectFileCreateMemoryCallbackForPluginName (const ConstString &name)
Greg Claytonc9660542012-02-05 02:38:54 +00001230{
Greg Clayton57abc5d2013-05-10 21:47:16 +00001231 if (name)
Greg Claytonc9660542012-02-05 02:38:54 +00001232 {
Greg Claytonc9660542012-02-05 02:38:54 +00001233 Mutex::Locker locker (GetObjectFileMutex ());
1234 ObjectFileInstances &instances = GetObjectFileInstances ();
1235
1236 ObjectFileInstances::iterator pos, end = instances.end();
1237 for (pos = instances.begin(); pos != end; ++ pos)
1238 {
Greg Clayton57abc5d2013-05-10 21:47:16 +00001239 if (name == pos->name)
Greg Claytonc9660542012-02-05 02:38:54 +00001240 return pos->create_memory_callback;
1241 }
1242 }
1243 return NULL;
1244}
1245
Greg Claytona2715cf2014-06-13 00:54:12 +00001246Error
1247PluginManager::SaveCore (const lldb::ProcessSP &process_sp, const FileSpec &outfile)
1248{
1249 Error error;
1250 Mutex::Locker locker (GetObjectFileMutex ());
1251 ObjectFileInstances &instances = GetObjectFileInstances ();
1252
1253 ObjectFileInstances::iterator pos, end = instances.end();
1254 for (pos = instances.begin(); pos != end; ++ pos)
1255 {
1256 if (pos->save_core && pos->save_core (process_sp, outfile, error))
1257 return error;
1258 }
1259 error.SetErrorString("no ObjectFile plugins were able to save a core for this process");
1260 return error;
1261}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001262
1263#pragma mark ObjectContainer
1264
Jason Molenda743e86a2010-06-11 23:44:18 +00001265struct ObjectContainerInstance
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001266{
1267 ObjectContainerInstance() :
1268 name(),
1269 description(),
Greg Claytonf4d6de62013-04-24 22:29:28 +00001270 create_callback (NULL),
1271 get_module_specifications (NULL)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001272 {
1273 }
1274
Greg Clayton57abc5d2013-05-10 21:47:16 +00001275 ConstString name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001276 std::string description;
1277 ObjectContainerCreateInstance create_callback;
Greg Claytonf4d6de62013-04-24 22:29:28 +00001278 ObjectFileGetModuleSpecifications get_module_specifications;
1279
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001280};
1281
1282typedef std::vector<ObjectContainerInstance> ObjectContainerInstances;
1283
Greg Claytonab65b342011-04-13 22:47:15 +00001284static Mutex &
1285GetObjectContainerMutex ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001286{
Greg Claytonab65b342011-04-13 22:47:15 +00001287 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
1288 return g_instances_mutex;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001289}
1290
Greg Claytonab65b342011-04-13 22:47:15 +00001291static ObjectContainerInstances &
1292GetObjectContainerInstances ()
1293{
1294 static ObjectContainerInstances g_instances;
1295 return g_instances;
1296}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001297
1298bool
Greg Clayton57abc5d2013-05-10 21:47:16 +00001299PluginManager::RegisterPlugin (const ConstString &name,
Greg Claytonf4d6de62013-04-24 22:29:28 +00001300 const char *description,
1301 ObjectContainerCreateInstance create_callback,
1302 ObjectFileGetModuleSpecifications get_module_specifications)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001303{
1304 if (create_callback)
1305 {
1306 ObjectContainerInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +00001307 assert ((bool)name);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001308 instance.name = name;
1309 if (description && description[0])
1310 instance.description = description;
1311 instance.create_callback = create_callback;
Greg Claytonf4d6de62013-04-24 22:29:28 +00001312 instance.get_module_specifications = get_module_specifications;
Greg Claytonab65b342011-04-13 22:47:15 +00001313 Mutex::Locker locker (GetObjectContainerMutex ());
1314 GetObjectContainerInstances ().push_back (instance);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001315 }
1316 return false;
1317}
1318
1319bool
1320PluginManager::UnregisterPlugin (ObjectContainerCreateInstance create_callback)
1321{
1322 if (create_callback)
1323 {
Greg Claytonab65b342011-04-13 22:47:15 +00001324 Mutex::Locker locker (GetObjectContainerMutex ());
1325 ObjectContainerInstances &instances = GetObjectContainerInstances ();
1326
1327 ObjectContainerInstances::iterator pos, end = instances.end();
1328 for (pos = instances.begin(); pos != end; ++ pos)
1329 {
1330 if (pos->create_callback == create_callback)
1331 {
1332 instances.erase(pos);
1333 return true;
1334 }
1335 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001336 }
1337 return false;
1338}
1339
1340ObjectContainerCreateInstance
1341PluginManager::GetObjectContainerCreateCallbackAtIndex (uint32_t idx)
1342{
Greg Claytonab65b342011-04-13 22:47:15 +00001343 Mutex::Locker locker (GetObjectContainerMutex ());
1344 ObjectContainerInstances &instances = GetObjectContainerInstances ();
1345 if (idx < instances.size())
1346 return instances[idx].create_callback;
Jason Molenda743e86a2010-06-11 23:44:18 +00001347 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001348}
Greg Claytonab65b342011-04-13 22:47:15 +00001349
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001350ObjectContainerCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +00001351PluginManager::GetObjectContainerCreateCallbackForPluginName (const ConstString &name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001352{
Greg Clayton57abc5d2013-05-10 21:47:16 +00001353 if (name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001354 {
Greg Claytonab65b342011-04-13 22:47:15 +00001355 Mutex::Locker locker (GetObjectContainerMutex ());
1356 ObjectContainerInstances &instances = GetObjectContainerInstances ();
1357
1358 ObjectContainerInstances::iterator pos, end = instances.end();
1359 for (pos = instances.begin(); pos != end; ++ pos)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001360 {
Greg Clayton57abc5d2013-05-10 21:47:16 +00001361 if (name == pos->name)
Greg Claytonab65b342011-04-13 22:47:15 +00001362 return pos->create_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001363 }
1364 }
1365 return NULL;
1366}
1367
Greg Claytonf4d6de62013-04-24 22:29:28 +00001368ObjectFileGetModuleSpecifications
1369PluginManager::GetObjectContainerGetModuleSpecificationsCallbackAtIndex (uint32_t idx)
1370{
1371 Mutex::Locker locker (GetObjectContainerMutex ());
1372 ObjectContainerInstances &instances = GetObjectContainerInstances ();
1373 if (idx < instances.size())
1374 return instances[idx].get_module_specifications;
1375 return NULL;
1376}
1377
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001378#pragma mark LogChannel
1379
Greg Claytonab65b342011-04-13 22:47:15 +00001380struct LogInstance
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001381{
Greg Claytonab65b342011-04-13 22:47:15 +00001382 LogInstance() :
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001383 name(),
1384 description(),
1385 create_callback(NULL)
1386 {
1387 }
1388
Greg Clayton57abc5d2013-05-10 21:47:16 +00001389 ConstString name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001390 std::string description;
1391 LogChannelCreateInstance create_callback;
1392};
1393
Greg Claytonab65b342011-04-13 22:47:15 +00001394typedef std::vector<LogInstance> LogInstances;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001395
Greg Claytonab65b342011-04-13 22:47:15 +00001396static Mutex &
1397GetLogMutex ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001398{
Greg Claytonab65b342011-04-13 22:47:15 +00001399 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
1400 return g_instances_mutex;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001401}
1402
Greg Claytonab65b342011-04-13 22:47:15 +00001403static LogInstances &
1404GetLogInstances ()
1405{
1406 static LogInstances g_instances;
1407 return g_instances;
1408}
1409
1410
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001411
1412bool
1413PluginManager::RegisterPlugin
1414(
Greg Clayton57abc5d2013-05-10 21:47:16 +00001415 const ConstString &name,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001416 const char *description,
1417 LogChannelCreateInstance create_callback
1418)
1419{
1420 if (create_callback)
1421 {
Greg Claytonab65b342011-04-13 22:47:15 +00001422 LogInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +00001423 assert ((bool)name);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001424 instance.name = name;
1425 if (description && description[0])
1426 instance.description = description;
1427 instance.create_callback = create_callback;
Greg Claytonab65b342011-04-13 22:47:15 +00001428 Mutex::Locker locker (GetLogMutex ());
1429 GetLogInstances ().push_back (instance);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001430 }
1431 return false;
1432}
1433
1434bool
1435PluginManager::UnregisterPlugin (LogChannelCreateInstance create_callback)
1436{
1437 if (create_callback)
1438 {
Greg Claytonab65b342011-04-13 22:47:15 +00001439 Mutex::Locker locker (GetLogMutex ());
1440 LogInstances &instances = GetLogInstances ();
1441
1442 LogInstances::iterator pos, end = instances.end();
1443 for (pos = instances.begin(); pos != end; ++ pos)
1444 {
1445 if (pos->create_callback == create_callback)
1446 {
1447 instances.erase(pos);
1448 return true;
1449 }
1450 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001451 }
1452 return false;
1453}
1454
1455const char *
1456PluginManager::GetLogChannelCreateNameAtIndex (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())
Greg Clayton57abc5d2013-05-10 21:47:16 +00001461 return instances[idx].name.GetCString();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001462 return NULL;
1463}
1464
1465
1466LogChannelCreateInstance
1467PluginManager::GetLogChannelCreateCallbackAtIndex (uint32_t idx)
1468{
Greg Claytonab65b342011-04-13 22:47:15 +00001469 Mutex::Locker locker (GetLogMutex ());
1470 LogInstances &instances = GetLogInstances ();
1471 if (idx < instances.size())
1472 return instances[idx].create_callback;
Jason Molenda743e86a2010-06-11 23:44:18 +00001473 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001474}
1475
1476LogChannelCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +00001477PluginManager::GetLogChannelCreateCallbackForPluginName (const ConstString &name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001478{
Greg Clayton57abc5d2013-05-10 21:47:16 +00001479 if (name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001480 {
Greg Claytonab65b342011-04-13 22:47:15 +00001481 Mutex::Locker locker (GetLogMutex ());
1482 LogInstances &instances = GetLogInstances ();
1483
1484 LogInstances::iterator pos, end = instances.end();
1485 for (pos = instances.begin(); pos != end; ++ pos)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001486 {
Greg Clayton57abc5d2013-05-10 21:47:16 +00001487 if (name == pos->name)
Greg Claytonab65b342011-04-13 22:47:15 +00001488 return pos->create_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001489 }
1490 }
1491 return NULL;
1492}
1493
Greg Claytone996fd32011-03-08 22:40:15 +00001494#pragma mark Platform
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001495
Greg Claytone996fd32011-03-08 22:40:15 +00001496struct PlatformInstance
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001497{
Greg Claytone996fd32011-03-08 22:40:15 +00001498 PlatformInstance() :
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001499 name(),
1500 description(),
Jason Molenda9b837a12013-04-05 05:06:39 +00001501 create_callback(NULL),
1502 debugger_init_callback (NULL)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001503 {
1504 }
Greg Claytone996fd32011-03-08 22:40:15 +00001505
Greg Clayton57abc5d2013-05-10 21:47:16 +00001506 ConstString name;
Greg Claytone996fd32011-03-08 22:40:15 +00001507 std::string description;
1508 PlatformCreateInstance create_callback;
Jason Molenda9b837a12013-04-05 05:06:39 +00001509 DebuggerInitializeCallback debugger_init_callback;
Greg Claytone996fd32011-03-08 22:40:15 +00001510};
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001511
Greg Claytone996fd32011-03-08 22:40:15 +00001512typedef std::vector<PlatformInstance> PlatformInstances;
1513
Greg Claytonded470d2011-03-19 01:12:21 +00001514static Mutex &
1515GetPlatformInstancesMutex ()
Greg Claytone996fd32011-03-08 22:40:15 +00001516{
Greg Claytonded470d2011-03-19 01:12:21 +00001517 static Mutex g_platform_instances_mutex (Mutex::eMutexTypeRecursive);
1518 return g_platform_instances_mutex;
Greg Claytone996fd32011-03-08 22:40:15 +00001519}
1520
Greg Claytonded470d2011-03-19 01:12:21 +00001521static PlatformInstances &
1522GetPlatformInstances ()
1523{
1524 static PlatformInstances g_platform_instances;
1525 return g_platform_instances;
1526}
Greg Claytone996fd32011-03-08 22:40:15 +00001527
Greg Claytonab65b342011-04-13 22:47:15 +00001528
Greg Claytone996fd32011-03-08 22:40:15 +00001529bool
Greg Clayton57abc5d2013-05-10 21:47:16 +00001530PluginManager::RegisterPlugin (const ConstString &name,
Greg Claytone996fd32011-03-08 22:40:15 +00001531 const char *description,
Jason Molenda9b837a12013-04-05 05:06:39 +00001532 PlatformCreateInstance create_callback,
1533 DebuggerInitializeCallback debugger_init_callback)
Greg Claytone996fd32011-03-08 22:40:15 +00001534{
1535 if (create_callback)
1536 {
Greg Claytonded470d2011-03-19 01:12:21 +00001537 Mutex::Locker locker (GetPlatformInstancesMutex ());
1538
Greg Claytone996fd32011-03-08 22:40:15 +00001539 PlatformInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +00001540 assert ((bool)name);
Greg Claytone996fd32011-03-08 22:40:15 +00001541 instance.name = name;
1542 if (description && description[0])
1543 instance.description = description;
1544 instance.create_callback = create_callback;
Jason Molenda9b837a12013-04-05 05:06:39 +00001545 instance.debugger_init_callback = debugger_init_callback;
Greg Claytonded470d2011-03-19 01:12:21 +00001546 GetPlatformInstances ().push_back (instance);
1547 return true;
Greg Claytone996fd32011-03-08 22:40:15 +00001548 }
1549 return false;
1550}
1551
Jason Molenda9b837a12013-04-05 05:06:39 +00001552
Greg Claytone996fd32011-03-08 22:40:15 +00001553const char *
1554PluginManager::GetPlatformPluginNameAtIndex (uint32_t idx)
1555{
Greg Claytonded470d2011-03-19 01:12:21 +00001556 Mutex::Locker locker (GetPlatformInstancesMutex ());
Greg Claytonab65b342011-04-13 22:47:15 +00001557 PlatformInstances &instances = GetPlatformInstances ();
1558 if (idx < instances.size())
Greg Clayton57abc5d2013-05-10 21:47:16 +00001559 return instances[idx].name.GetCString();
Greg Claytone996fd32011-03-08 22:40:15 +00001560 return NULL;
1561}
1562
1563const char *
1564PluginManager::GetPlatformPluginDescriptionAtIndex (uint32_t idx)
1565{
Greg Claytonded470d2011-03-19 01:12:21 +00001566 Mutex::Locker locker (GetPlatformInstancesMutex ());
Greg Claytonab65b342011-04-13 22:47:15 +00001567 PlatformInstances &instances = GetPlatformInstances ();
1568 if (idx < instances.size())
1569 return instances[idx].description.c_str();
Greg Claytone996fd32011-03-08 22:40:15 +00001570 return NULL;
1571}
1572
1573bool
1574PluginManager::UnregisterPlugin (PlatformCreateInstance create_callback)
1575{
1576 if (create_callback)
1577 {
Greg Claytonded470d2011-03-19 01:12:21 +00001578 Mutex::Locker locker (GetPlatformInstancesMutex ());
Greg Claytonab65b342011-04-13 22:47:15 +00001579 PlatformInstances &instances = GetPlatformInstances ();
Greg Claytonded470d2011-03-19 01:12:21 +00001580
Greg Claytonab65b342011-04-13 22:47:15 +00001581 PlatformInstances::iterator pos, end = instances.end();
1582 for (pos = instances.begin(); pos != end; ++ pos)
Greg Claytonded470d2011-03-19 01:12:21 +00001583 {
1584 if (pos->create_callback == create_callback)
1585 {
Greg Claytonab65b342011-04-13 22:47:15 +00001586 instances.erase(pos);
Greg Claytonded470d2011-03-19 01:12:21 +00001587 return true;
1588 }
1589 }
Greg Claytone996fd32011-03-08 22:40:15 +00001590 }
1591 return false;
1592}
1593
1594PlatformCreateInstance
1595PluginManager::GetPlatformCreateCallbackAtIndex (uint32_t idx)
1596{
Greg Claytonded470d2011-03-19 01:12:21 +00001597 Mutex::Locker locker (GetPlatformInstancesMutex ());
Greg Claytonab65b342011-04-13 22:47:15 +00001598 PlatformInstances &instances = GetPlatformInstances ();
1599 if (idx < instances.size())
1600 return instances[idx].create_callback;
Greg Claytone996fd32011-03-08 22:40:15 +00001601 return NULL;
1602}
1603
1604PlatformCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +00001605PluginManager::GetPlatformCreateCallbackForPluginName (const ConstString &name)
Greg Claytone996fd32011-03-08 22:40:15 +00001606{
Greg Clayton57abc5d2013-05-10 21:47:16 +00001607 if (name)
Greg Claytone996fd32011-03-08 22:40:15 +00001608 {
Greg Claytonded470d2011-03-19 01:12:21 +00001609 Mutex::Locker locker (GetPlatformInstancesMutex ());
Greg Claytonab65b342011-04-13 22:47:15 +00001610 PlatformInstances &instances = GetPlatformInstances ();
Greg Claytonded470d2011-03-19 01:12:21 +00001611
Greg Claytonab65b342011-04-13 22:47:15 +00001612 PlatformInstances::iterator pos, end = instances.end();
1613 for (pos = instances.begin(); pos != end; ++ pos)
Greg Claytone996fd32011-03-08 22:40:15 +00001614 {
Greg Clayton57abc5d2013-05-10 21:47:16 +00001615 if (name == pos->name)
Greg Claytonded470d2011-03-19 01:12:21 +00001616 return pos->create_callback;
Greg Claytone996fd32011-03-08 22:40:15 +00001617 }
1618 }
1619 return NULL;
1620}
1621
Greg Claytonc7bece562013-01-25 18:06:21 +00001622size_t
Greg Claytonab65b342011-04-13 22:47:15 +00001623PluginManager::AutoCompletePlatformName (const char *name, StringList &matches)
1624{
Greg Clayton57abc5d2013-05-10 21:47:16 +00001625 if (name)
Greg Claytonab65b342011-04-13 22:47:15 +00001626 {
1627 Mutex::Locker locker (GetPlatformInstancesMutex ());
1628 PlatformInstances &instances = GetPlatformInstances ();
1629 llvm::StringRef name_sref(name);
1630
1631 PlatformInstances::iterator pos, end = instances.end();
1632 for (pos = instances.begin(); pos != end; ++ pos)
1633 {
Greg Clayton57abc5d2013-05-10 21:47:16 +00001634 llvm::StringRef plugin_name (pos->name.GetCString());
Greg Clayton7260f622011-04-18 08:33:37 +00001635 if (plugin_name.startswith(name_sref))
1636 matches.AppendString (plugin_name.data());
Greg Claytonab65b342011-04-13 22:47:15 +00001637 }
1638 }
1639 return matches.GetSize();
1640}
Greg Claytone996fd32011-03-08 22:40:15 +00001641#pragma mark Process
1642
1643struct ProcessInstance
1644{
1645 ProcessInstance() :
Greg Clayton7f982402013-07-15 22:54:20 +00001646 name(),
1647 description(),
1648 create_callback(NULL),
1649 debugger_init_callback(NULL)
Greg Claytone996fd32011-03-08 22:40:15 +00001650 {
1651 }
1652
Greg Clayton57abc5d2013-05-10 21:47:16 +00001653 ConstString name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001654 std::string description;
1655 ProcessCreateInstance create_callback;
Greg Clayton7f982402013-07-15 22:54:20 +00001656 DebuggerInitializeCallback debugger_init_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001657};
1658
1659typedef std::vector<ProcessInstance> ProcessInstances;
1660
Greg Claytonab65b342011-04-13 22:47:15 +00001661static Mutex &
1662GetProcessMutex ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001663{
Greg Claytonab65b342011-04-13 22:47:15 +00001664 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
1665 return g_instances_mutex;
1666}
1667
1668static ProcessInstances &
1669GetProcessInstances ()
1670{
1671 static ProcessInstances g_instances;
1672 return g_instances;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001673}
1674
1675
1676bool
Greg Clayton7f982402013-07-15 22:54:20 +00001677PluginManager::RegisterPlugin (const ConstString &name,
1678 const char *description,
1679 ProcessCreateInstance create_callback,
1680 DebuggerInitializeCallback debugger_init_callback)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001681{
1682 if (create_callback)
1683 {
1684 ProcessInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +00001685 assert ((bool)name);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001686 instance.name = name;
1687 if (description && description[0])
1688 instance.description = description;
1689 instance.create_callback = create_callback;
Greg Clayton7f982402013-07-15 22:54:20 +00001690 instance.debugger_init_callback = debugger_init_callback;
Greg Claytonab65b342011-04-13 22:47:15 +00001691 Mutex::Locker locker (GetProcessMutex ());
1692 GetProcessInstances ().push_back (instance);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001693 }
1694 return false;
1695}
1696
Greg Claytonbfe5f3b2011-02-18 01:44:25 +00001697const char *
1698PluginManager::GetProcessPluginNameAtIndex (uint32_t idx)
1699{
Greg Claytonab65b342011-04-13 22:47:15 +00001700 Mutex::Locker locker (GetProcessMutex ());
1701 ProcessInstances &instances = GetProcessInstances ();
1702 if (idx < instances.size())
Greg Clayton57abc5d2013-05-10 21:47:16 +00001703 return instances[idx].name.GetCString();
Greg Claytonbfe5f3b2011-02-18 01:44:25 +00001704 return NULL;
1705}
1706
1707const char *
1708PluginManager::GetProcessPluginDescriptionAtIndex (uint32_t idx)
1709{
Greg Claytonab65b342011-04-13 22:47:15 +00001710 Mutex::Locker locker (GetProcessMutex ());
1711 ProcessInstances &instances = GetProcessInstances ();
1712 if (idx < instances.size())
1713 return instances[idx].description.c_str();
Greg Claytonbfe5f3b2011-02-18 01:44:25 +00001714 return NULL;
1715}
1716
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001717bool
1718PluginManager::UnregisterPlugin (ProcessCreateInstance create_callback)
1719{
1720 if (create_callback)
1721 {
Greg Claytonab65b342011-04-13 22:47:15 +00001722 Mutex::Locker locker (GetProcessMutex ());
1723 ProcessInstances &instances = GetProcessInstances ();
1724
1725 ProcessInstances::iterator pos, end = instances.end();
1726 for (pos = instances.begin(); pos != end; ++ pos)
1727 {
1728 if (pos->create_callback == create_callback)
1729 {
1730 instances.erase(pos);
1731 return true;
1732 }
1733 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001734 }
1735 return false;
1736}
1737
1738ProcessCreateInstance
1739PluginManager::GetProcessCreateCallbackAtIndex (uint32_t idx)
1740{
Greg Claytonab65b342011-04-13 22:47:15 +00001741 Mutex::Locker locker (GetProcessMutex ());
1742 ProcessInstances &instances = GetProcessInstances ();
1743 if (idx < instances.size())
1744 return instances[idx].create_callback;
Jason Molenda743e86a2010-06-11 23:44:18 +00001745 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001746}
1747
Greg Claytonab65b342011-04-13 22:47:15 +00001748
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001749ProcessCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +00001750PluginManager::GetProcessCreateCallbackForPluginName (const ConstString &name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001751{
Greg Clayton57abc5d2013-05-10 21:47:16 +00001752 if (name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001753 {
Greg Claytonab65b342011-04-13 22:47:15 +00001754 Mutex::Locker locker (GetProcessMutex ());
1755 ProcessInstances &instances = GetProcessInstances ();
1756
1757 ProcessInstances::iterator pos, end = instances.end();
1758 for (pos = instances.begin(); pos != end; ++ pos)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001759 {
Greg Clayton57abc5d2013-05-10 21:47:16 +00001760 if (name == pos->name)
Greg Claytonab65b342011-04-13 22:47:15 +00001761 return pos->create_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001762 }
1763 }
1764 return NULL;
1765}
1766
Zachary Turner2c1f46d2015-07-30 20:28:07 +00001767#pragma mark ScriptInterpreter
1768
1769struct ScriptInterpreterInstance
1770{
1771 ScriptInterpreterInstance()
1772 : name()
1773 , language(lldb::eScriptLanguageNone)
1774 , description()
1775 , create_callback(NULL)
1776 {
1777 }
1778
1779 ConstString name;
1780 lldb::ScriptLanguage language;
1781 std::string description;
1782 ScriptInterpreterCreateInstance create_callback;
1783};
1784
1785typedef std::vector<ScriptInterpreterInstance> ScriptInterpreterInstances;
1786
1787static Mutex &
1788GetScriptInterpreterMutex()
1789{
1790 static Mutex g_instances_mutex(Mutex::eMutexTypeRecursive);
1791 return g_instances_mutex;
1792}
1793
1794static ScriptInterpreterInstances &
1795GetScriptInterpreterInstances()
1796{
1797 static ScriptInterpreterInstances g_instances;
1798 return g_instances;
1799}
1800
1801bool
1802PluginManager::RegisterPlugin(const ConstString &name, const char *description, lldb::ScriptLanguage script_language,
1803 ScriptInterpreterCreateInstance create_callback)
1804{
1805 if (!create_callback)
1806 return false;
1807 ScriptInterpreterInstance instance;
1808 assert((bool)name);
1809 instance.name = name;
1810 if (description && description[0])
1811 instance.description = description;
1812 instance.create_callback = create_callback;
1813 instance.language = script_language;
1814 Mutex::Locker locker(GetScriptInterpreterMutex());
1815 GetScriptInterpreterInstances().push_back(instance);
1816 return false;
1817}
1818
1819bool
1820PluginManager::UnregisterPlugin(ScriptInterpreterCreateInstance create_callback)
1821{
1822 if (!create_callback)
1823 return false;
1824 Mutex::Locker locker(GetScriptInterpreterMutex());
1825 ScriptInterpreterInstances &instances = GetScriptInterpreterInstances();
1826
1827 ScriptInterpreterInstances::iterator pos, end = instances.end();
1828 for (pos = instances.begin(); pos != end; ++pos)
1829 {
1830 if (pos->create_callback != create_callback)
1831 continue;
1832
1833 instances.erase(pos);
1834 return true;
1835 }
1836 return false;
1837}
1838
1839ScriptInterpreterCreateInstance
1840PluginManager::GetScriptInterpreterCreateCallbackAtIndex(uint32_t idx)
1841{
1842 Mutex::Locker locker(GetScriptInterpreterMutex());
1843 ScriptInterpreterInstances &instances = GetScriptInterpreterInstances();
1844 if (idx < instances.size())
1845 return instances[idx].create_callback;
1846 return nullptr;
1847}
1848
1849lldb::ScriptInterpreterSP
1850PluginManager::GetScriptInterpreterForLanguage(lldb::ScriptLanguage script_lang, CommandInterpreter &interpreter)
1851{
1852 Mutex::Locker locker(GetScriptInterpreterMutex());
1853 ScriptInterpreterInstances &instances = GetScriptInterpreterInstances();
1854
1855 ScriptInterpreterInstances::iterator pos, end = instances.end();
1856 ScriptInterpreterCreateInstance none_instance = nullptr;
1857 for (pos = instances.begin(); pos != end; ++pos)
1858 {
1859 if (pos->language == lldb::eScriptLanguageNone)
1860 none_instance = pos->create_callback;
1861
1862 if (script_lang == pos->language)
1863 return pos->create_callback(interpreter);
1864 }
1865
1866 // If we didn't find one, return the ScriptInterpreter for the null language.
1867 assert(none_instance != nullptr);
1868 return none_instance(interpreter);
1869}
1870
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001871#pragma mark SymbolFile
1872
Jason Molenda743e86a2010-06-11 23:44:18 +00001873struct SymbolFileInstance
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001874{
1875 SymbolFileInstance() :
1876 name(),
1877 description(),
Oleksiy Vyalovabb5a352015-07-29 22:18:16 +00001878 create_callback(nullptr),
1879 debugger_init_callback(nullptr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001880 {
1881 }
1882
Greg Clayton57abc5d2013-05-10 21:47:16 +00001883 ConstString name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001884 std::string description;
1885 SymbolFileCreateInstance create_callback;
Oleksiy Vyalovabb5a352015-07-29 22:18:16 +00001886 DebuggerInitializeCallback debugger_init_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001887};
1888
1889typedef std::vector<SymbolFileInstance> SymbolFileInstances;
1890
Greg Claytonab65b342011-04-13 22:47:15 +00001891static Mutex &
1892GetSymbolFileMutex ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001893{
Greg Claytonab65b342011-04-13 22:47:15 +00001894 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
1895 return g_instances_mutex;
1896}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001897
Greg Claytonab65b342011-04-13 22:47:15 +00001898static SymbolFileInstances &
1899GetSymbolFileInstances ()
1900{
1901 static SymbolFileInstances g_instances;
1902 return g_instances;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001903}
1904
1905
1906bool
1907PluginManager::RegisterPlugin
1908(
Greg Clayton57abc5d2013-05-10 21:47:16 +00001909 const ConstString &name,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001910 const char *description,
Oleksiy Vyalovabb5a352015-07-29 22:18:16 +00001911 SymbolFileCreateInstance create_callback,
1912 DebuggerInitializeCallback debugger_init_callback
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001913)
1914{
1915 if (create_callback)
1916 {
1917 SymbolFileInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +00001918 assert ((bool)name);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001919 instance.name = name;
1920 if (description && description[0])
1921 instance.description = description;
1922 instance.create_callback = create_callback;
Oleksiy Vyalovabb5a352015-07-29 22:18:16 +00001923 instance.debugger_init_callback = debugger_init_callback;
Greg Claytonab65b342011-04-13 22:47:15 +00001924 Mutex::Locker locker (GetSymbolFileMutex ());
1925 GetSymbolFileInstances ().push_back (instance);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001926 }
1927 return false;
1928}
1929
1930bool
1931PluginManager::UnregisterPlugin (SymbolFileCreateInstance create_callback)
1932{
1933 if (create_callback)
1934 {
Greg Claytonab65b342011-04-13 22:47:15 +00001935 Mutex::Locker locker (GetSymbolFileMutex ());
1936 SymbolFileInstances &instances = GetSymbolFileInstances ();
1937
1938 SymbolFileInstances::iterator pos, end = instances.end();
1939 for (pos = instances.begin(); pos != end; ++ pos)
1940 {
1941 if (pos->create_callback == create_callback)
1942 {
1943 instances.erase(pos);
1944 return true;
1945 }
1946 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001947 }
1948 return false;
1949}
1950
1951SymbolFileCreateInstance
1952PluginManager::GetSymbolFileCreateCallbackAtIndex (uint32_t idx)
1953{
Greg Claytonab65b342011-04-13 22:47:15 +00001954 Mutex::Locker locker (GetSymbolFileMutex ());
1955 SymbolFileInstances &instances = GetSymbolFileInstances ();
1956 if (idx < instances.size())
1957 return instances[idx].create_callback;
Jason Molenda743e86a2010-06-11 23:44:18 +00001958 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001959}
Greg Claytonab65b342011-04-13 22:47:15 +00001960
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001961SymbolFileCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +00001962PluginManager::GetSymbolFileCreateCallbackForPluginName (const ConstString &name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001963{
Greg Clayton57abc5d2013-05-10 21:47:16 +00001964 if (name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001965 {
Greg Claytonab65b342011-04-13 22:47:15 +00001966 Mutex::Locker locker (GetSymbolFileMutex ());
1967 SymbolFileInstances &instances = GetSymbolFileInstances ();
1968
1969 SymbolFileInstances::iterator pos, end = instances.end();
1970 for (pos = instances.begin(); pos != end; ++ pos)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001971 {
Greg Clayton57abc5d2013-05-10 21:47:16 +00001972 if (name == pos->name)
Greg Claytonab65b342011-04-13 22:47:15 +00001973 return pos->create_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001974 }
1975 }
1976 return NULL;
1977}
1978
1979
1980
1981#pragma mark SymbolVendor
1982
Jason Molenda743e86a2010-06-11 23:44:18 +00001983struct SymbolVendorInstance
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001984{
1985 SymbolVendorInstance() :
1986 name(),
1987 description(),
1988 create_callback(NULL)
1989 {
1990 }
1991
Greg Clayton57abc5d2013-05-10 21:47:16 +00001992 ConstString name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001993 std::string description;
1994 SymbolVendorCreateInstance create_callback;
1995};
1996
1997typedef std::vector<SymbolVendorInstance> SymbolVendorInstances;
1998
Greg Claytonab65b342011-04-13 22:47:15 +00001999static Mutex &
2000GetSymbolVendorMutex ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002001{
Greg Claytonab65b342011-04-13 22:47:15 +00002002 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
2003 return g_instances_mutex;
2004}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002005
Greg Claytonab65b342011-04-13 22:47:15 +00002006static SymbolVendorInstances &
2007GetSymbolVendorInstances ()
2008{
2009 static SymbolVendorInstances g_instances;
2010 return g_instances;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002011}
2012
2013bool
2014PluginManager::RegisterPlugin
2015(
Greg Clayton57abc5d2013-05-10 21:47:16 +00002016 const ConstString &name,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002017 const char *description,
2018 SymbolVendorCreateInstance create_callback
2019)
2020{
2021 if (create_callback)
2022 {
2023 SymbolVendorInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +00002024 assert ((bool)name);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002025 instance.name = name;
2026 if (description && description[0])
2027 instance.description = description;
2028 instance.create_callback = create_callback;
Greg Claytonab65b342011-04-13 22:47:15 +00002029 Mutex::Locker locker (GetSymbolVendorMutex ());
2030 GetSymbolVendorInstances ().push_back (instance);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002031 }
2032 return false;
2033}
2034
2035bool
2036PluginManager::UnregisterPlugin (SymbolVendorCreateInstance create_callback)
2037{
2038 if (create_callback)
2039 {
Greg Claytonab65b342011-04-13 22:47:15 +00002040 Mutex::Locker locker (GetSymbolVendorMutex ());
2041 SymbolVendorInstances &instances = GetSymbolVendorInstances ();
2042
2043 SymbolVendorInstances::iterator pos, end = instances.end();
2044 for (pos = instances.begin(); pos != end; ++ pos)
2045 {
2046 if (pos->create_callback == create_callback)
2047 {
2048 instances.erase(pos);
2049 return true;
2050 }
2051 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002052 }
2053 return false;
2054}
2055
2056SymbolVendorCreateInstance
2057PluginManager::GetSymbolVendorCreateCallbackAtIndex (uint32_t idx)
2058{
Greg Claytonab65b342011-04-13 22:47:15 +00002059 Mutex::Locker locker (GetSymbolVendorMutex ());
2060 SymbolVendorInstances &instances = GetSymbolVendorInstances ();
2061 if (idx < instances.size())
2062 return instances[idx].create_callback;
Jason Molenda743e86a2010-06-11 23:44:18 +00002063 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002064}
2065
Greg Claytonab65b342011-04-13 22:47:15 +00002066
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002067SymbolVendorCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +00002068PluginManager::GetSymbolVendorCreateCallbackForPluginName (const ConstString &name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002069{
Greg Clayton57abc5d2013-05-10 21:47:16 +00002070 if (name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002071 {
Greg Claytonab65b342011-04-13 22:47:15 +00002072 Mutex::Locker locker (GetSymbolVendorMutex ());
2073 SymbolVendorInstances &instances = GetSymbolVendorInstances ();
2074
2075 SymbolVendorInstances::iterator pos, end = instances.end();
2076 for (pos = instances.begin(); pos != end; ++ pos)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002077 {
Greg Clayton57abc5d2013-05-10 21:47:16 +00002078 if (name == pos->name)
Greg Claytonab65b342011-04-13 22:47:15 +00002079 return pos->create_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002080 }
2081 }
2082 return NULL;
2083}
2084
2085
Greg Clayton7be25422011-04-25 21:14:26 +00002086#pragma mark UnwindAssembly
Jason Molendafbcb7f22010-09-10 07:49:16 +00002087
Greg Clayton7be25422011-04-25 21:14:26 +00002088struct UnwindAssemblyInstance
Jason Molendafbcb7f22010-09-10 07:49:16 +00002089{
Greg Clayton7be25422011-04-25 21:14:26 +00002090 UnwindAssemblyInstance() :
Jason Molendafbcb7f22010-09-10 07:49:16 +00002091 name(),
2092 description(),
2093 create_callback(NULL)
2094 {
2095 }
2096
Greg Clayton57abc5d2013-05-10 21:47:16 +00002097 ConstString name;
Jason Molendafbcb7f22010-09-10 07:49:16 +00002098 std::string description;
Greg Clayton7be25422011-04-25 21:14:26 +00002099 UnwindAssemblyCreateInstance create_callback;
Jason Molendafbcb7f22010-09-10 07:49:16 +00002100};
2101
Greg Clayton7be25422011-04-25 21:14:26 +00002102typedef std::vector<UnwindAssemblyInstance> UnwindAssemblyInstances;
Jason Molendafbcb7f22010-09-10 07:49:16 +00002103
Greg Claytonab65b342011-04-13 22:47:15 +00002104static Mutex &
Greg Clayton7be25422011-04-25 21:14:26 +00002105GetUnwindAssemblyMutex ()
Jason Molendafbcb7f22010-09-10 07:49:16 +00002106{
Greg Claytonab65b342011-04-13 22:47:15 +00002107 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
2108 return g_instances_mutex;
2109}
Jason Molendafbcb7f22010-09-10 07:49:16 +00002110
Greg Clayton7be25422011-04-25 21:14:26 +00002111static UnwindAssemblyInstances &
2112GetUnwindAssemblyInstances ()
Greg Claytonab65b342011-04-13 22:47:15 +00002113{
Greg Clayton7be25422011-04-25 21:14:26 +00002114 static UnwindAssemblyInstances g_instances;
Greg Claytonab65b342011-04-13 22:47:15 +00002115 return g_instances;
Jason Molendafbcb7f22010-09-10 07:49:16 +00002116}
2117
2118bool
2119PluginManager::RegisterPlugin
2120(
Greg Clayton57abc5d2013-05-10 21:47:16 +00002121 const ConstString &name,
Jason Molendafbcb7f22010-09-10 07:49:16 +00002122 const char *description,
Greg Clayton7be25422011-04-25 21:14:26 +00002123 UnwindAssemblyCreateInstance create_callback
Jason Molendafbcb7f22010-09-10 07:49:16 +00002124)
2125{
2126 if (create_callback)
2127 {
Greg Clayton7be25422011-04-25 21:14:26 +00002128 UnwindAssemblyInstance instance;
Greg Clayton57abc5d2013-05-10 21:47:16 +00002129 assert ((bool)name);
Jason Molendafbcb7f22010-09-10 07:49:16 +00002130 instance.name = name;
2131 if (description && description[0])
2132 instance.description = description;
2133 instance.create_callback = create_callback;
Greg Clayton7be25422011-04-25 21:14:26 +00002134 Mutex::Locker locker (GetUnwindAssemblyMutex ());
2135 GetUnwindAssemblyInstances ().push_back (instance);
Jason Molendafbcb7f22010-09-10 07:49:16 +00002136 }
2137 return false;
2138}
2139
2140bool
Greg Clayton7be25422011-04-25 21:14:26 +00002141PluginManager::UnregisterPlugin (UnwindAssemblyCreateInstance create_callback)
Jason Molendafbcb7f22010-09-10 07:49:16 +00002142{
2143 if (create_callback)
2144 {
Greg Clayton7be25422011-04-25 21:14:26 +00002145 Mutex::Locker locker (GetUnwindAssemblyMutex ());
2146 UnwindAssemblyInstances &instances = GetUnwindAssemblyInstances ();
Greg Claytonab65b342011-04-13 22:47:15 +00002147
Greg Clayton7be25422011-04-25 21:14:26 +00002148 UnwindAssemblyInstances::iterator pos, end = instances.end();
Greg Claytonab65b342011-04-13 22:47:15 +00002149 for (pos = instances.begin(); pos != end; ++ pos)
2150 {
2151 if (pos->create_callback == create_callback)
2152 {
2153 instances.erase(pos);
2154 return true;
2155 }
2156 }
Jason Molendafbcb7f22010-09-10 07:49:16 +00002157 }
2158 return false;
2159}
2160
Greg Clayton7be25422011-04-25 21:14:26 +00002161UnwindAssemblyCreateInstance
2162PluginManager::GetUnwindAssemblyCreateCallbackAtIndex (uint32_t idx)
Jason Molendafbcb7f22010-09-10 07:49:16 +00002163{
Greg Clayton7be25422011-04-25 21:14:26 +00002164 Mutex::Locker locker (GetUnwindAssemblyMutex ());
2165 UnwindAssemblyInstances &instances = GetUnwindAssemblyInstances ();
Greg Claytonab65b342011-04-13 22:47:15 +00002166 if (idx < instances.size())
2167 return instances[idx].create_callback;
Jason Molendafbcb7f22010-09-10 07:49:16 +00002168 return NULL;
2169}
2170
Greg Claytonab65b342011-04-13 22:47:15 +00002171
Greg Clayton7be25422011-04-25 21:14:26 +00002172UnwindAssemblyCreateInstance
Greg Clayton57abc5d2013-05-10 21:47:16 +00002173PluginManager::GetUnwindAssemblyCreateCallbackForPluginName (const ConstString &name)
Jason Molendafbcb7f22010-09-10 07:49:16 +00002174{
Greg Clayton57abc5d2013-05-10 21:47:16 +00002175 if (name)
Jason Molendafbcb7f22010-09-10 07:49:16 +00002176 {
Greg Clayton7be25422011-04-25 21:14:26 +00002177 Mutex::Locker locker (GetUnwindAssemblyMutex ());
2178 UnwindAssemblyInstances &instances = GetUnwindAssemblyInstances ();
Greg Claytonab65b342011-04-13 22:47:15 +00002179
Greg Clayton7be25422011-04-25 21:14:26 +00002180 UnwindAssemblyInstances::iterator pos, end = instances.end();
Greg Claytonab65b342011-04-13 22:47:15 +00002181 for (pos = instances.begin(); pos != end; ++ pos)
Jason Molendafbcb7f22010-09-10 07:49:16 +00002182 {
Greg Clayton57abc5d2013-05-10 21:47:16 +00002183 if (name == pos->name)
Greg Claytonab65b342011-04-13 22:47:15 +00002184 return pos->create_callback;
Jason Molendafbcb7f22010-09-10 07:49:16 +00002185 }
2186 }
2187 return NULL;
2188}
2189
Kuba Breckabeed8212014-09-04 01:03:18 +00002190#pragma mark MemoryHistory
2191
2192struct MemoryHistoryInstance
2193{
2194 MemoryHistoryInstance() :
2195 name(),
2196 description(),
2197 create_callback(NULL)
2198 {
2199 }
2200
2201 ConstString name;
2202 std::string description;
2203 MemoryHistoryCreateInstance create_callback;
2204};
2205
2206typedef std::vector<MemoryHistoryInstance> MemoryHistoryInstances;
2207
2208static Mutex &
2209GetMemoryHistoryMutex ()
2210{
2211 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
2212 return g_instances_mutex;
2213}
2214
2215static MemoryHistoryInstances &
2216GetMemoryHistoryInstances ()
2217{
2218 static MemoryHistoryInstances g_instances;
2219 return g_instances;
2220}
2221
2222bool
2223PluginManager::RegisterPlugin
2224(
2225 const ConstString &name,
2226 const char *description,
2227 MemoryHistoryCreateInstance create_callback
2228 )
2229{
2230 if (create_callback)
2231 {
2232 MemoryHistoryInstance instance;
2233 assert ((bool)name);
2234 instance.name = name;
2235 if (description && description[0])
2236 instance.description = description;
2237 instance.create_callback = create_callback;
2238 Mutex::Locker locker (GetMemoryHistoryMutex ());
2239 GetMemoryHistoryInstances ().push_back (instance);
2240 }
2241 return false;
2242}
2243
2244bool
2245PluginManager::UnregisterPlugin (MemoryHistoryCreateInstance create_callback)
2246{
2247 if (create_callback)
2248 {
2249 Mutex::Locker locker (GetMemoryHistoryMutex ());
2250 MemoryHistoryInstances &instances = GetMemoryHistoryInstances ();
2251
2252 MemoryHistoryInstances::iterator pos, end = instances.end();
2253 for (pos = instances.begin(); pos != end; ++ pos)
2254 {
2255 if (pos->create_callback == create_callback)
2256 {
2257 instances.erase(pos);
2258 return true;
2259 }
2260 }
2261 }
2262 return false;
2263}
2264
2265MemoryHistoryCreateInstance
2266PluginManager::GetMemoryHistoryCreateCallbackAtIndex (uint32_t idx)
2267{
2268 Mutex::Locker locker (GetMemoryHistoryMutex ());
2269 MemoryHistoryInstances &instances = GetMemoryHistoryInstances ();
2270 if (idx < instances.size())
2271 return instances[idx].create_callback;
2272 return NULL;
2273}
2274
2275
2276MemoryHistoryCreateInstance
2277PluginManager::GetMemoryHistoryCreateCallbackForPluginName (const ConstString &name)
2278{
2279 if (name)
2280 {
2281 Mutex::Locker locker (GetMemoryHistoryMutex ());
2282 MemoryHistoryInstances &instances = GetMemoryHistoryInstances ();
2283
2284 MemoryHistoryInstances::iterator pos, end = instances.end();
2285 for (pos = instances.begin(); pos != end; ++ pos)
2286 {
2287 if (name == pos->name)
2288 return pos->create_callback;
2289 }
2290 }
2291 return NULL;
2292}
2293
Kuba Breckaafdf8422014-10-10 23:43:03 +00002294#pragma mark InstrumentationRuntime
2295
2296struct InstrumentationRuntimeInstance
2297{
2298 InstrumentationRuntimeInstance() :
2299 name(),
2300 description(),
2301 create_callback(NULL)
2302 {
2303 }
2304
2305 ConstString name;
2306 std::string description;
2307 InstrumentationRuntimeCreateInstance create_callback;
2308 InstrumentationRuntimeGetType get_type_callback;
2309};
2310
2311typedef std::vector<InstrumentationRuntimeInstance> InstrumentationRuntimeInstances;
2312
2313static Mutex &
2314GetInstrumentationRuntimeMutex ()
2315{
2316 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
2317 return g_instances_mutex;
2318}
2319
2320static InstrumentationRuntimeInstances &
2321GetInstrumentationRuntimeInstances ()
2322{
2323 static InstrumentationRuntimeInstances g_instances;
2324 return g_instances;
2325}
2326
2327bool
2328PluginManager::RegisterPlugin
2329(
2330 const ConstString &name,
2331 const char *description,
2332 InstrumentationRuntimeCreateInstance create_callback,
2333 InstrumentationRuntimeGetType get_type_callback
2334 )
2335{
2336 if (create_callback)
2337 {
2338 InstrumentationRuntimeInstance instance;
2339 assert ((bool)name);
2340 instance.name = name;
2341 if (description && description[0])
2342 instance.description = description;
2343 instance.create_callback = create_callback;
2344 instance.get_type_callback = get_type_callback;
2345 Mutex::Locker locker (GetInstrumentationRuntimeMutex ());
2346 GetInstrumentationRuntimeInstances ().push_back (instance);
2347 }
2348 return false;
2349}
2350
2351bool
2352PluginManager::UnregisterPlugin (InstrumentationRuntimeCreateInstance create_callback)
2353{
2354 if (create_callback)
2355 {
2356 Mutex::Locker locker (GetInstrumentationRuntimeMutex ());
2357 InstrumentationRuntimeInstances &instances = GetInstrumentationRuntimeInstances ();
2358
2359 InstrumentationRuntimeInstances::iterator pos, end = instances.end();
2360 for (pos = instances.begin(); pos != end; ++ pos)
2361 {
2362 if (pos->create_callback == create_callback)
2363 {
2364 instances.erase(pos);
2365 return true;
2366 }
2367 }
2368 }
2369 return false;
2370}
2371
2372InstrumentationRuntimeGetType
2373PluginManager::GetInstrumentationRuntimeGetTypeCallbackAtIndex (uint32_t idx)
2374{
2375 Mutex::Locker locker (GetInstrumentationRuntimeMutex ());
2376 InstrumentationRuntimeInstances &instances = GetInstrumentationRuntimeInstances ();
2377 if (idx < instances.size())
2378 return instances[idx].get_type_callback;
2379 return NULL;
2380}
2381
2382InstrumentationRuntimeCreateInstance
2383PluginManager::GetInstrumentationRuntimeCreateCallbackAtIndex (uint32_t idx)
2384{
2385 Mutex::Locker locker (GetInstrumentationRuntimeMutex ());
2386 InstrumentationRuntimeInstances &instances = GetInstrumentationRuntimeInstances ();
2387 if (idx < instances.size())
2388 return instances[idx].create_callback;
2389 return NULL;
2390}
2391
2392
2393InstrumentationRuntimeCreateInstance
2394PluginManager::GetInstrumentationRuntimeCreateCallbackForPluginName (const ConstString &name)
2395{
2396 if (name)
2397 {
2398 Mutex::Locker locker (GetInstrumentationRuntimeMutex ());
2399 InstrumentationRuntimeInstances &instances = GetInstrumentationRuntimeInstances ();
2400
2401 InstrumentationRuntimeInstances::iterator pos, end = instances.end();
2402 for (pos = instances.begin(); pos != end; ++ pos)
2403 {
2404 if (name == pos->name)
2405 return pos->create_callback;
2406 }
2407 }
2408 return NULL;
2409}
2410
2411#pragma mark PluginManager
2412
Greg Claytone8cd0c92012-10-19 18:02:49 +00002413void
2414PluginManager::DebuggerInitialize (Debugger &debugger)
2415{
Jason Molenda9b837a12013-04-05 05:06:39 +00002416 // Initialize the DynamicLoader plugins
Greg Claytone8cd0c92012-10-19 18:02:49 +00002417 {
Jason Molenda9b837a12013-04-05 05:06:39 +00002418 Mutex::Locker locker (GetDynamicLoaderMutex ());
2419 DynamicLoaderInstances &instances = GetDynamicLoaderInstances ();
2420
2421 DynamicLoaderInstances::iterator pos, end = instances.end();
2422 for (pos = instances.begin(); pos != end; ++ pos)
2423 {
2424 if (pos->debugger_init_callback)
2425 pos->debugger_init_callback (debugger);
2426 }
2427 }
2428
Andrew MacPherson17220c12014-03-05 10:12:43 +00002429 // Initialize the JITLoader plugins
2430 {
2431 Mutex::Locker locker (GetJITLoaderMutex ());
2432 JITLoaderInstances &instances = GetJITLoaderInstances ();
2433
2434 JITLoaderInstances::iterator pos, end = instances.end();
2435 for (pos = instances.begin(); pos != end; ++ pos)
2436 {
2437 if (pos->debugger_init_callback)
2438 pos->debugger_init_callback (debugger);
2439 }
2440 }
2441
Jason Molenda9b837a12013-04-05 05:06:39 +00002442 // Initialize the Platform plugins
2443 {
2444 Mutex::Locker locker (GetPlatformInstancesMutex ());
2445 PlatformInstances &instances = GetPlatformInstances ();
2446
2447 PlatformInstances::iterator pos, end = instances.end();
2448 for (pos = instances.begin(); pos != end; ++ pos)
2449 {
2450 if (pos->debugger_init_callback)
2451 pos->debugger_init_callback (debugger);
2452 }
Greg Claytone8cd0c92012-10-19 18:02:49 +00002453 }
Oleksiy Vyalovabb5a352015-07-29 22:18:16 +00002454
Greg Clayton7f982402013-07-15 22:54:20 +00002455 // Initialize the Process plugins
2456 {
2457 Mutex::Locker locker (GetProcessMutex());
2458 ProcessInstances &instances = GetProcessInstances();
2459
2460 ProcessInstances::iterator pos, end = instances.end();
2461 for (pos = instances.begin(); pos != end; ++ pos)
2462 {
2463 if (pos->debugger_init_callback)
2464 pos->debugger_init_callback (debugger);
2465 }
2466 }
2467
Oleksiy Vyalovabb5a352015-07-29 22:18:16 +00002468 // Initialize the SymbolFile plugins
2469 {
2470 Mutex::Locker locker (GetSymbolFileMutex());
2471 for (auto& sym_file: GetSymbolFileInstances())
2472 {
2473 if (sym_file.debugger_init_callback)
2474 sym_file.debugger_init_callback (debugger);
2475 }
2476 }
Greg Claytone8cd0c92012-10-19 18:02:49 +00002477}
2478
Greg Clayton7f982402013-07-15 22:54:20 +00002479// This is the preferred new way to register plugin specific settings. e.g.
2480// 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 +00002481static lldb::OptionValuePropertiesSP
Greg Clayton7f982402013-07-15 22:54:20 +00002482GetDebuggerPropertyForPlugins (Debugger &debugger,
Jason Molenda3b59f5c2013-04-05 22:40:42 +00002483 const ConstString &plugin_type_name,
2484 const ConstString &plugin_type_desc,
2485 bool can_create)
Greg Claytone8cd0c92012-10-19 18:02:49 +00002486{
2487 lldb::OptionValuePropertiesSP parent_properties_sp (debugger.GetValueProperties());
2488 if (parent_properties_sp)
2489 {
2490 static ConstString g_property_name("plugin");
2491
2492 OptionValuePropertiesSP plugin_properties_sp = parent_properties_sp->GetSubProperty (NULL, g_property_name);
2493 if (!plugin_properties_sp && can_create)
2494 {
2495 plugin_properties_sp.reset (new OptionValueProperties (g_property_name));
2496 parent_properties_sp->AppendProperty (g_property_name,
2497 ConstString("Settings specify to plugins."),
2498 true,
2499 plugin_properties_sp);
2500 }
2501
2502 if (plugin_properties_sp)
2503 {
2504 lldb::OptionValuePropertiesSP plugin_type_properties_sp = plugin_properties_sp->GetSubProperty (NULL, plugin_type_name);
2505 if (!plugin_type_properties_sp && can_create)
2506 {
2507 plugin_type_properties_sp.reset (new OptionValueProperties (plugin_type_name));
2508 plugin_properties_sp->AppendProperty (plugin_type_name,
2509 plugin_type_desc,
2510 true,
2511 plugin_type_properties_sp);
2512 }
2513 return plugin_type_properties_sp;
2514 }
2515 }
2516 return lldb::OptionValuePropertiesSP();
2517}
2518
Greg Clayton7f982402013-07-15 22:54:20 +00002519// This is deprecated way to register plugin specific settings. e.g.
2520// "<plugin_type_name>.plugin.<plugin_type_desc>.SETTINGNAME"
Jason Molenda3b59f5c2013-04-05 22:40:42 +00002521// and Platform generic settings would be under "platform.SETTINGNAME".
2522static lldb::OptionValuePropertiesSP
Greg Clayton7f982402013-07-15 22:54:20 +00002523GetDebuggerPropertyForPluginsOldStyle (Debugger &debugger,
2524 const ConstString &plugin_type_name,
2525 const ConstString &plugin_type_desc,
2526 bool can_create)
Jason Molenda3b59f5c2013-04-05 22:40:42 +00002527{
2528 static ConstString g_property_name("plugin");
2529 lldb::OptionValuePropertiesSP parent_properties_sp (debugger.GetValueProperties());
2530 if (parent_properties_sp)
2531 {
2532 OptionValuePropertiesSP plugin_properties_sp = parent_properties_sp->GetSubProperty (NULL, plugin_type_name);
2533 if (!plugin_properties_sp && can_create)
2534 {
2535 plugin_properties_sp.reset (new OptionValueProperties (plugin_type_name));
2536 parent_properties_sp->AppendProperty (plugin_type_name,
2537 plugin_type_desc,
2538 true,
2539 plugin_properties_sp);
2540 }
2541
2542 if (plugin_properties_sp)
2543 {
2544 lldb::OptionValuePropertiesSP plugin_type_properties_sp = plugin_properties_sp->GetSubProperty (NULL, g_property_name);
2545 if (!plugin_type_properties_sp && can_create)
2546 {
2547 plugin_type_properties_sp.reset (new OptionValueProperties (g_property_name));
2548 plugin_properties_sp->AppendProperty (g_property_name,
2549 ConstString("Settings specific to plugins"),
2550 true,
2551 plugin_type_properties_sp);
2552 }
2553 return plugin_type_properties_sp;
2554 }
2555 }
2556 return lldb::OptionValuePropertiesSP();
2557}
2558
2559
Greg Claytone8cd0c92012-10-19 18:02:49 +00002560lldb::OptionValuePropertiesSP
2561PluginManager::GetSettingForDynamicLoaderPlugin (Debugger &debugger, const ConstString &setting_name)
2562{
2563 lldb::OptionValuePropertiesSP properties_sp;
Greg Clayton7f982402013-07-15 22:54:20 +00002564 lldb::OptionValuePropertiesSP plugin_type_properties_sp (GetDebuggerPropertyForPlugins (debugger,
Greg Claytone8cd0c92012-10-19 18:02:49 +00002565 ConstString("dynamic-loader"),
2566 ConstString(), // not creating to so we don't need the description
2567 false));
2568 if (plugin_type_properties_sp)
2569 properties_sp = plugin_type_properties_sp->GetSubProperty (NULL, setting_name);
2570 return properties_sp;
2571}
2572
2573bool
2574PluginManager::CreateSettingForDynamicLoaderPlugin (Debugger &debugger,
2575 const lldb::OptionValuePropertiesSP &properties_sp,
2576 const ConstString &description,
2577 bool is_global_property)
2578{
2579 if (properties_sp)
2580 {
Greg Clayton7f982402013-07-15 22:54:20 +00002581 lldb::OptionValuePropertiesSP plugin_type_properties_sp (GetDebuggerPropertyForPlugins (debugger,
Greg Claytone8cd0c92012-10-19 18:02:49 +00002582 ConstString("dynamic-loader"),
2583 ConstString("Settings for dynamic loader plug-ins"),
2584 true));
2585 if (plugin_type_properties_sp)
2586 {
2587 plugin_type_properties_sp->AppendProperty (properties_sp->GetName(),
2588 description,
2589 is_global_property,
2590 properties_sp);
2591 return true;
2592 }
2593 }
2594 return false;
2595}
2596
Jason Molenda9b837a12013-04-05 05:06:39 +00002597
2598lldb::OptionValuePropertiesSP
2599PluginManager::GetSettingForPlatformPlugin (Debugger &debugger, const ConstString &setting_name)
2600{
2601 lldb::OptionValuePropertiesSP properties_sp;
Greg Clayton7f982402013-07-15 22:54:20 +00002602 lldb::OptionValuePropertiesSP plugin_type_properties_sp (GetDebuggerPropertyForPluginsOldStyle (debugger,
2603 ConstString("platform"),
2604 ConstString(), // not creating to so we don't need the description
2605 false));
Jason Molenda9b837a12013-04-05 05:06:39 +00002606 if (plugin_type_properties_sp)
2607 properties_sp = plugin_type_properties_sp->GetSubProperty (NULL, setting_name);
2608 return properties_sp;
2609}
2610
2611bool
2612PluginManager::CreateSettingForPlatformPlugin (Debugger &debugger,
2613 const lldb::OptionValuePropertiesSP &properties_sp,
2614 const ConstString &description,
2615 bool is_global_property)
2616{
2617 if (properties_sp)
2618 {
Greg Clayton7f982402013-07-15 22:54:20 +00002619 lldb::OptionValuePropertiesSP plugin_type_properties_sp (GetDebuggerPropertyForPluginsOldStyle (debugger,
2620 ConstString("platform"),
2621 ConstString("Settings for platform plug-ins"),
2622 true));
2623 if (plugin_type_properties_sp)
2624 {
2625 plugin_type_properties_sp->AppendProperty (properties_sp->GetName(),
2626 description,
2627 is_global_property,
2628 properties_sp);
2629 return true;
2630 }
2631 }
2632 return false;
2633}
2634
2635
2636lldb::OptionValuePropertiesSP
2637PluginManager::GetSettingForProcessPlugin (Debugger &debugger, const ConstString &setting_name)
2638{
2639 lldb::OptionValuePropertiesSP properties_sp;
2640 lldb::OptionValuePropertiesSP plugin_type_properties_sp (GetDebuggerPropertyForPlugins (debugger,
2641 ConstString("process"),
2642 ConstString(), // not creating to so we don't need the description
2643 false));
2644 if (plugin_type_properties_sp)
2645 properties_sp = plugin_type_properties_sp->GetSubProperty (NULL, setting_name);
2646 return properties_sp;
2647}
2648
2649bool
2650PluginManager::CreateSettingForProcessPlugin (Debugger &debugger,
2651 const lldb::OptionValuePropertiesSP &properties_sp,
2652 const ConstString &description,
2653 bool is_global_property)
2654{
2655 if (properties_sp)
2656 {
Jason Molenda9b837a12013-04-05 05:06:39 +00002657 lldb::OptionValuePropertiesSP plugin_type_properties_sp (GetDebuggerPropertyForPlugins (debugger,
Greg Clayton7f982402013-07-15 22:54:20 +00002658 ConstString("process"),
2659 ConstString("Settings for process plug-ins"),
Jason Molenda9b837a12013-04-05 05:06:39 +00002660 true));
2661 if (plugin_type_properties_sp)
2662 {
2663 plugin_type_properties_sp->AppendProperty (properties_sp->GetName(),
2664 description,
2665 is_global_property,
2666 properties_sp);
2667 return true;
2668 }
2669 }
2670 return false;
2671}
2672
Oleksiy Vyalovabb5a352015-07-29 22:18:16 +00002673
2674static const char* kSymbolFilePluginName("symbol-file");
2675
2676lldb::OptionValuePropertiesSP
2677PluginManager::GetSettingForSymbolFilePlugin (Debugger &debugger,
2678 const ConstString &setting_name)
2679{
2680 lldb::OptionValuePropertiesSP properties_sp;
2681 lldb::OptionValuePropertiesSP plugin_type_properties_sp (GetDebuggerPropertyForPlugins (debugger,
2682 ConstString(kSymbolFilePluginName),
2683 ConstString(), // not creating to so we don't need the description
2684 false));
2685 if (plugin_type_properties_sp)
2686 properties_sp = plugin_type_properties_sp->GetSubProperty (nullptr, setting_name);
2687 return properties_sp;
2688}
2689
2690bool
2691PluginManager::CreateSettingForSymbolFilePlugin (Debugger &debugger,
2692 const lldb::OptionValuePropertiesSP &properties_sp,
2693 const ConstString &description,
2694 bool is_global_property)
2695{
2696 if (properties_sp)
2697 {
2698 lldb::OptionValuePropertiesSP plugin_type_properties_sp (GetDebuggerPropertyForPlugins (debugger,
2699 ConstString(kSymbolFilePluginName),
2700 ConstString("Settings for symbol file plug-ins"),
2701 true));
2702 if (plugin_type_properties_sp)
2703 {
2704 plugin_type_properties_sp->AppendProperty (properties_sp->GetName(),
2705 description,
2706 is_global_property,
2707 properties_sp);
2708 return true;
2709 }
2710 }
2711 return false;
2712}