blob: bc1af9832a2cc8c4bf4d94de906ca26bc7689a53 [file] [log] [blame]
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001//===-- PluginManager.cpp ---------------------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
Daniel Malea93a64302012-12-05 00:20:57 +000010#include "lldb/lldb-python.h"
11
Chris Lattner30fdc8d2010-06-08 16:52:24 +000012#include "lldb/Core/PluginManager.h"
13
Stephen Wilson8acdbb82011-04-08 13:36:44 +000014#include <limits.h>
15
Chris Lattner30fdc8d2010-06-08 16:52:24 +000016#include <string>
17#include <vector>
18
Greg Claytone8cd0c92012-10-19 18:02:49 +000019#include "lldb/Core/Debugger.h"
Greg Clayton4272cc72011-02-02 02:24:04 +000020#include "lldb/Core/Error.h"
Greg Clayton53239f02011-02-08 05:05:52 +000021#include "lldb/Host/FileSpec.h"
Greg Clayton4272cc72011-02-02 02:24:04 +000022#include "lldb/Host/Host.h"
23#include "lldb/Host/Mutex.h"
Greg Claytone8cd0c92012-10-19 18:02:49 +000024#include "lldb/Interpreter/OptionValueProperties.h"
Greg Clayton4272cc72011-02-02 02:24:04 +000025
Greg Claytonab65b342011-04-13 22:47:15 +000026#include "llvm/ADT/StringRef.h"
27
Greg Clayton4272cc72011-02-02 02:24:04 +000028using namespace lldb;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000029using namespace lldb_private;
30
Jason Molenda743e86a2010-06-11 23:44:18 +000031enum PluginAction
Chris Lattner30fdc8d2010-06-08 16:52:24 +000032{
33 ePluginRegisterInstance,
34 ePluginUnregisterInstance,
35 ePluginGetInstanceAtIndex
36};
37
Greg Clayton4272cc72011-02-02 02:24:04 +000038struct PluginInfo
39{
40 void *plugin_handle;
41 void *plugin_init_callback;
42 void *plugin_term_callback;
43};
44
45typedef std::map<FileSpec, PluginInfo> PluginTerminateMap;
46
47static Mutex &
48GetPluginMapMutex ()
49{
50 static Mutex g_plugin_map_mutex (Mutex::eMutexTypeRecursive);
51 return g_plugin_map_mutex;
52}
53
54static PluginTerminateMap &
55GetPluginMap ()
56{
57 static PluginTerminateMap g_plugin_map;
58 return g_plugin_map;
59}
60
61static bool
62PluginIsLoaded (const FileSpec &plugin_file_spec)
63{
64 Mutex::Locker locker (GetPluginMapMutex ());
65 PluginTerminateMap &plugin_map = GetPluginMap ();
66 return plugin_map.find (plugin_file_spec) != plugin_map.end();
67}
68
69static void
70SetPluginInfo (const FileSpec &plugin_file_spec, const PluginInfo &plugin_info)
71{
72 Mutex::Locker locker (GetPluginMapMutex ());
73 PluginTerminateMap &plugin_map = GetPluginMap ();
74 assert (plugin_map.find (plugin_file_spec) != plugin_map.end());
75 plugin_map[plugin_file_spec] = plugin_info;
76}
77
78
79static FileSpec::EnumerateDirectoryResult
80LoadPluginCallback
81(
82 void *baton,
83 FileSpec::FileType file_type,
84 const FileSpec &file_spec
85)
86{
87// PluginManager *plugin_manager = (PluginManager *)baton;
88 Error error;
89
90 // If we have a regular file, a symbolic link or unknown file type, try
91 // and process the file. We must handle unknown as sometimes the directory
92 // enumeration might be enumerating a file system that doesn't have correct
93 // file type information.
94 if (file_type == FileSpec::eFileTypeRegular ||
95 file_type == FileSpec::eFileTypeSymbolicLink ||
96 file_type == FileSpec::eFileTypeUnknown )
97 {
98 FileSpec plugin_file_spec (file_spec);
99 plugin_file_spec.ResolvePath();
100
101 if (PluginIsLoaded (plugin_file_spec))
102 return FileSpec::eEnumerateDirectoryResultNext;
103 else
104 {
105 PluginInfo plugin_info = { NULL, NULL, NULL };
Greg Clayton45319462011-02-08 00:35:34 +0000106 uint32_t flags = Host::eDynamicLibraryOpenOptionLazy |
107 Host::eDynamicLibraryOpenOptionLocal |
108 Host::eDynamicLibraryOpenOptionLimitGetSymbol;
109
110 plugin_info.plugin_handle = Host::DynamicLibraryOpen (plugin_file_spec, flags, error);
Greg Clayton4272cc72011-02-02 02:24:04 +0000111 if (plugin_info.plugin_handle)
112 {
113 bool success = false;
114 plugin_info.plugin_init_callback = Host::DynamicLibraryGetSymbol (plugin_info.plugin_handle, "LLDBPluginInitialize", error);
115 if (plugin_info.plugin_init_callback)
116 {
117 // Call the plug-in "bool LLDBPluginInitialize(void)" function
118 success = ((bool (*)(void))plugin_info.plugin_init_callback)();
119 }
120
121 if (success)
122 {
123 // It is ok for the "LLDBPluginTerminate" symbol to be NULL
124 plugin_info.plugin_term_callback = Host::DynamicLibraryGetSymbol (plugin_info.plugin_handle, "LLDBPluginTerminate", error);
125 }
126 else
127 {
128 // The initialize function returned FALSE which means the
129 // plug-in might not be compatible, or might be too new or
130 // too old, or might not want to run on this machine.
131 Host::DynamicLibraryClose (plugin_info.plugin_handle);
132 plugin_info.plugin_handle = NULL;
133 plugin_info.plugin_init_callback = NULL;
134 }
135
136 // Regardless of success or failure, cache the plug-in load
137 // in our plug-in info so we don't try to load it again and
138 // again.
139 SetPluginInfo (plugin_file_spec, plugin_info);
140
141 return FileSpec::eEnumerateDirectoryResultNext;
142 }
143 }
144 }
145
146 if (file_type == FileSpec::eFileTypeUnknown ||
147 file_type == FileSpec::eFileTypeDirectory ||
148 file_type == FileSpec::eFileTypeSymbolicLink )
149 {
150 // Try and recurse into anything that a directory or symbolic link.
151 // We must also do this for unknown as sometimes the directory enumeration
152 // might be enurating a file system that doesn't have correct file type
153 // information.
154 return FileSpec::eEnumerateDirectoryResultEnter;
155 }
156
157 return FileSpec::eEnumerateDirectoryResultNext;
158}
159
160
161void
162PluginManager::Initialize ()
163{
Greg Clayton1cb64962011-03-24 04:28:38 +0000164#if 1
Greg Clayton4272cc72011-02-02 02:24:04 +0000165 FileSpec dir_spec;
166 const bool find_directories = true;
167 const bool find_files = true;
168 const bool find_other = true;
169 char dir_path[PATH_MAX];
170 if (Host::GetLLDBPath (ePathTypeLLDBSystemPlugins, dir_spec))
171 {
172 if (dir_spec.Exists() && dir_spec.GetPath(dir_path, sizeof(dir_path)))
173 {
174 FileSpec::EnumerateDirectory (dir_path,
175 find_directories,
176 find_files,
177 find_other,
178 LoadPluginCallback,
179 NULL);
180 }
181 }
182
183 if (Host::GetLLDBPath (ePathTypeLLDBUserPlugins, dir_spec))
184 {
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 }
Greg Clayton1cb64962011-03-24 04:28:38 +0000195#endif
Greg Clayton4272cc72011-02-02 02:24:04 +0000196}
197
198void
199PluginManager::Terminate ()
200{
201 Mutex::Locker locker (GetPluginMapMutex ());
202 PluginTerminateMap &plugin_map = GetPluginMap ();
203
204 PluginTerminateMap::const_iterator pos, end = plugin_map.end();
205 for (pos = plugin_map.begin(); pos != end; ++pos)
206 {
207 // Call the plug-in "void LLDBPluginTerminate (void)" function if there
208 // is one (if the symbol was not NULL).
209 if (pos->second.plugin_handle)
210 {
211 if (pos->second.plugin_term_callback)
212 ((void (*)(void))pos->second.plugin_term_callback)();
213 Host::DynamicLibraryClose (pos->second.plugin_handle);
214 }
215 }
216 plugin_map.clear();
217}
218
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000219
220#pragma mark ABI
221
222
Jason Molenda743e86a2010-06-11 23:44:18 +0000223struct ABIInstance
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000224{
225 ABIInstance() :
226 name(),
227 description(),
228 create_callback(NULL)
229 {
230 }
231
232 std::string name;
233 std::string description;
234 ABICreateInstance create_callback;
235};
236
237typedef std::vector<ABIInstance> ABIInstances;
238
Greg Claytonded470d2011-03-19 01:12:21 +0000239static Mutex &
240GetABIInstancesMutex ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000241{
Greg Claytonded470d2011-03-19 01:12:21 +0000242 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
243 return g_instances_mutex;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000244}
245
Greg Claytonded470d2011-03-19 01:12:21 +0000246static ABIInstances &
247GetABIInstances ()
248{
249 static ABIInstances g_instances;
250 return g_instances;
251}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000252
253bool
254PluginManager::RegisterPlugin
Greg Clayton4272cc72011-02-02 02:24:04 +0000255(
256 const char *name,
257 const char *description,
258 ABICreateInstance create_callback
259)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000260{
261 if (create_callback)
262 {
263 ABIInstance instance;
264 assert (name && name[0]);
Greg Claytonab65b342011-04-13 22:47:15 +0000265 instance.name.assign (name);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000266 if (description && description[0])
267 instance.description = description;
268 instance.create_callback = create_callback;
Greg Claytonded470d2011-03-19 01:12:21 +0000269 Mutex::Locker locker (GetABIInstancesMutex ());
270 GetABIInstances ().push_back (instance);
271 return true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000272 }
273 return false;
274}
275
276bool
277PluginManager::UnregisterPlugin (ABICreateInstance create_callback)
278{
279 if (create_callback)
280 {
Greg Claytonded470d2011-03-19 01:12:21 +0000281 Mutex::Locker locker (GetABIInstancesMutex ());
282 ABIInstances &instances = GetABIInstances ();
283
284 ABIInstances::iterator pos, end = instances.end();
285 for (pos = instances.begin(); pos != end; ++ pos)
286 {
287 if (pos->create_callback == create_callback)
288 {
289 instances.erase(pos);
290 return true;
291 }
292 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000293 }
294 return false;
295}
296
297ABICreateInstance
298PluginManager::GetABICreateCallbackAtIndex (uint32_t idx)
299{
Greg Claytonded470d2011-03-19 01:12:21 +0000300 Mutex::Locker locker (GetABIInstancesMutex ());
301 ABIInstances &instances = GetABIInstances ();
Greg Claytonded470d2011-03-19 01:12:21 +0000302 if (idx < instances.size())
303 return instances[idx].create_callback;
Jason Molenda743e86a2010-06-11 23:44:18 +0000304 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000305}
306
307ABICreateInstance
308PluginManager::GetABICreateCallbackForPluginName (const char *name)
309{
310 if (name && name[0])
311 {
Greg Claytonded470d2011-03-19 01:12:21 +0000312 Mutex::Locker locker (GetABIInstancesMutex ());
Greg Claytonab65b342011-04-13 22:47:15 +0000313 llvm::StringRef name_sref(name);
Greg Claytonded470d2011-03-19 01:12:21 +0000314 ABIInstances &instances = GetABIInstances ();
315
316 ABIInstances::iterator pos, end = instances.end();
317 for (pos = instances.begin(); pos != end; ++ pos)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000318 {
Greg Claytonab65b342011-04-13 22:47:15 +0000319 if (name_sref.equals (pos->name))
Greg Claytonded470d2011-03-19 01:12:21 +0000320 return pos->create_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000321 }
322 }
323 return NULL;
324}
325
326
327#pragma mark Disassembler
328
329
Jason Molenda743e86a2010-06-11 23:44:18 +0000330struct DisassemblerInstance
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000331{
332 DisassemblerInstance() :
333 name(),
334 description(),
335 create_callback(NULL)
336 {
337 }
338
339 std::string name;
340 std::string description;
341 DisassemblerCreateInstance create_callback;
342};
343
344typedef std::vector<DisassemblerInstance> DisassemblerInstances;
345
Greg Claytonab65b342011-04-13 22:47:15 +0000346static Mutex &
347GetDisassemblerMutex ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000348{
Greg Claytonab65b342011-04-13 22:47:15 +0000349 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
350 return g_instances_mutex;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000351}
352
Greg Claytonab65b342011-04-13 22:47:15 +0000353static DisassemblerInstances &
354GetDisassemblerInstances ()
355{
356 static DisassemblerInstances g_instances;
357 return g_instances;
358}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000359
360bool
361PluginManager::RegisterPlugin
362(
363 const char *name,
364 const char *description,
365 DisassemblerCreateInstance create_callback
366)
367{
368 if (create_callback)
369 {
370 DisassemblerInstance instance;
371 assert (name && name[0]);
372 instance.name = name;
373 if (description && description[0])
374 instance.description = description;
375 instance.create_callback = create_callback;
Greg Claytonab65b342011-04-13 22:47:15 +0000376 Mutex::Locker locker (GetDisassemblerMutex ());
377 GetDisassemblerInstances ().push_back (instance);
378 return true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000379 }
380 return false;
381}
382
383bool
384PluginManager::UnregisterPlugin (DisassemblerCreateInstance create_callback)
385{
386 if (create_callback)
387 {
Greg Claytonab65b342011-04-13 22:47:15 +0000388 Mutex::Locker locker (GetDisassemblerMutex ());
389 DisassemblerInstances &instances = GetDisassemblerInstances ();
390
391 DisassemblerInstances::iterator pos, end = instances.end();
392 for (pos = instances.begin(); pos != end; ++ pos)
393 {
394 if (pos->create_callback == create_callback)
395 {
396 instances.erase(pos);
397 return true;
398 }
399 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000400 }
401 return false;
402}
403
404DisassemblerCreateInstance
405PluginManager::GetDisassemblerCreateCallbackAtIndex (uint32_t idx)
406{
Greg Claytonab65b342011-04-13 22:47:15 +0000407 Mutex::Locker locker (GetDisassemblerMutex ());
408 DisassemblerInstances &instances = GetDisassemblerInstances ();
409 if (idx < instances.size())
410 return instances[idx].create_callback;
Jason Molenda743e86a2010-06-11 23:44:18 +0000411 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000412}
413
414DisassemblerCreateInstance
415PluginManager::GetDisassemblerCreateCallbackForPluginName (const char *name)
416{
417 if (name && name[0])
418 {
Greg Claytonab65b342011-04-13 22:47:15 +0000419 llvm::StringRef name_sref(name);
420 Mutex::Locker locker (GetDisassemblerMutex ());
421 DisassemblerInstances &instances = GetDisassemblerInstances ();
422
423 DisassemblerInstances::iterator pos, end = instances.end();
424 for (pos = instances.begin(); pos != end; ++ pos)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000425 {
Greg Claytonab65b342011-04-13 22:47:15 +0000426 if (name_sref.equals (pos->name))
427 return pos->create_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000428 }
429 }
430 return NULL;
431}
432
433
434
435#pragma mark DynamicLoader
436
437
Jason Molenda743e86a2010-06-11 23:44:18 +0000438struct DynamicLoaderInstance
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000439{
440 DynamicLoaderInstance() :
441 name(),
442 description(),
Greg Claytone8cd0c92012-10-19 18:02:49 +0000443 create_callback(NULL),
444 debugger_init_callback (NULL)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000445 {
446 }
447
448 std::string name;
449 std::string description;
450 DynamicLoaderCreateInstance create_callback;
Greg Claytone8cd0c92012-10-19 18:02:49 +0000451 DebuggerInitializeCallback debugger_init_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000452};
453
454typedef std::vector<DynamicLoaderInstance> DynamicLoaderInstances;
455
Greg Claytonab65b342011-04-13 22:47:15 +0000456
457static Mutex &
458GetDynamicLoaderMutex ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000459{
Greg Claytonab65b342011-04-13 22:47:15 +0000460 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
461 return g_instances_mutex;
462}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000463
Greg Claytonab65b342011-04-13 22:47:15 +0000464static DynamicLoaderInstances &
465GetDynamicLoaderInstances ()
466{
467 static DynamicLoaderInstances g_instances;
468 return g_instances;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000469}
470
471
472bool
473PluginManager::RegisterPlugin
474(
475 const char *name,
476 const char *description,
Greg Claytone8cd0c92012-10-19 18:02:49 +0000477 DynamicLoaderCreateInstance create_callback,
478 DebuggerInitializeCallback debugger_init_callback
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000479)
480{
481 if (create_callback)
482 {
483 DynamicLoaderInstance instance;
484 assert (name && name[0]);
485 instance.name = name;
486 if (description && description[0])
487 instance.description = description;
488 instance.create_callback = create_callback;
Greg Claytone8cd0c92012-10-19 18:02:49 +0000489 instance.debugger_init_callback = debugger_init_callback;
Greg Claytonab65b342011-04-13 22:47:15 +0000490 Mutex::Locker locker (GetDynamicLoaderMutex ());
491 GetDynamicLoaderInstances ().push_back (instance);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000492 }
493 return false;
494}
495
496bool
497PluginManager::UnregisterPlugin (DynamicLoaderCreateInstance create_callback)
498{
499 if (create_callback)
500 {
Greg Claytonab65b342011-04-13 22:47:15 +0000501 Mutex::Locker locker (GetDynamicLoaderMutex ());
502 DynamicLoaderInstances &instances = GetDynamicLoaderInstances ();
503
504 DynamicLoaderInstances::iterator pos, end = instances.end();
505 for (pos = instances.begin(); pos != end; ++ pos)
506 {
507 if (pos->create_callback == create_callback)
508 {
509 instances.erase(pos);
510 return true;
511 }
512 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000513 }
514 return false;
515}
516
517DynamicLoaderCreateInstance
518PluginManager::GetDynamicLoaderCreateCallbackAtIndex (uint32_t idx)
519{
Greg Claytonab65b342011-04-13 22:47:15 +0000520 Mutex::Locker locker (GetDynamicLoaderMutex ());
521 DynamicLoaderInstances &instances = GetDynamicLoaderInstances ();
522 if (idx < instances.size())
523 return instances[idx].create_callback;
Jason Molenda743e86a2010-06-11 23:44:18 +0000524 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000525}
526
527DynamicLoaderCreateInstance
528PluginManager::GetDynamicLoaderCreateCallbackForPluginName (const char *name)
529{
530 if (name && name[0])
531 {
Greg Claytonab65b342011-04-13 22:47:15 +0000532 llvm::StringRef name_sref(name);
533 Mutex::Locker locker (GetDynamicLoaderMutex ());
534 DynamicLoaderInstances &instances = GetDynamicLoaderInstances ();
535
536 DynamicLoaderInstances::iterator pos, end = instances.end();
537 for (pos = instances.begin(); pos != end; ++ pos)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000538 {
Greg Claytonab65b342011-04-13 22:47:15 +0000539 if (name_sref.equals (pos->name))
540 return pos->create_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000541 }
542 }
543 return NULL;
544}
545
Greg Claytonf03bbe22011-02-01 01:37:45 +0000546#pragma mark EmulateInstruction
547
548
549struct EmulateInstructionInstance
550{
551 EmulateInstructionInstance() :
552 name(),
553 description(),
554 create_callback(NULL)
555 {
556 }
557
558 std::string name;
559 std::string description;
560 EmulateInstructionCreateInstance create_callback;
561};
562
563typedef std::vector<EmulateInstructionInstance> EmulateInstructionInstances;
564
Greg Claytonab65b342011-04-13 22:47:15 +0000565static Mutex &
566GetEmulateInstructionMutex ()
Greg Claytonf03bbe22011-02-01 01:37:45 +0000567{
Greg Claytonab65b342011-04-13 22:47:15 +0000568 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
569 return g_instances_mutex;
570}
571
572static EmulateInstructionInstances &
573GetEmulateInstructionInstances ()
574{
575 static EmulateInstructionInstances g_instances;
576 return g_instances;
Greg Claytonf03bbe22011-02-01 01:37:45 +0000577}
578
579
580bool
581PluginManager::RegisterPlugin
582(
Greg Clayton4272cc72011-02-02 02:24:04 +0000583 const char *name,
584 const char *description,
585 EmulateInstructionCreateInstance create_callback
586)
Greg Claytonf03bbe22011-02-01 01:37:45 +0000587{
588 if (create_callback)
589 {
590 EmulateInstructionInstance instance;
591 assert (name && name[0]);
592 instance.name = name;
593 if (description && description[0])
594 instance.description = description;
595 instance.create_callback = create_callback;
Greg Claytonab65b342011-04-13 22:47:15 +0000596 Mutex::Locker locker (GetEmulateInstructionMutex ());
597 GetEmulateInstructionInstances ().push_back (instance);
Greg Claytonf03bbe22011-02-01 01:37:45 +0000598 }
599 return false;
600}
601
602bool
603PluginManager::UnregisterPlugin (EmulateInstructionCreateInstance create_callback)
604{
605 if (create_callback)
606 {
Greg Claytonab65b342011-04-13 22:47:15 +0000607 Mutex::Locker locker (GetEmulateInstructionMutex ());
608 EmulateInstructionInstances &instances = GetEmulateInstructionInstances ();
609
610 EmulateInstructionInstances::iterator pos, end = instances.end();
611 for (pos = instances.begin(); pos != end; ++ pos)
612 {
613 if (pos->create_callback == create_callback)
614 {
615 instances.erase(pos);
616 return true;
617 }
618 }
Greg Claytonf03bbe22011-02-01 01:37:45 +0000619 }
620 return false;
621}
622
623EmulateInstructionCreateInstance
624PluginManager::GetEmulateInstructionCreateCallbackAtIndex (uint32_t idx)
625{
Greg Claytonab65b342011-04-13 22:47:15 +0000626 Mutex::Locker locker (GetEmulateInstructionMutex ());
627 EmulateInstructionInstances &instances = GetEmulateInstructionInstances ();
628 if (idx < instances.size())
629 return instances[idx].create_callback;
Greg Claytonf03bbe22011-02-01 01:37:45 +0000630 return NULL;
631}
632
633EmulateInstructionCreateInstance
634PluginManager::GetEmulateInstructionCreateCallbackForPluginName (const char *name)
635{
636 if (name && name[0])
637 {
Greg Claytonab65b342011-04-13 22:47:15 +0000638 llvm::StringRef name_sref(name);
639 Mutex::Locker locker (GetEmulateInstructionMutex ());
640 EmulateInstructionInstances &instances = GetEmulateInstructionInstances ();
641
642 EmulateInstructionInstances::iterator pos, end = instances.end();
643 for (pos = instances.begin(); pos != end; ++ pos)
Greg Claytonf03bbe22011-02-01 01:37:45 +0000644 {
Greg Claytonab65b342011-04-13 22:47:15 +0000645 if (name_sref.equals (pos->name))
646 return pos->create_callback;
Greg Claytonf03bbe22011-02-01 01:37:45 +0000647 }
648 }
649 return NULL;
650}
Greg Clayton56d9a1b2011-08-22 02:49:39 +0000651#pragma mark OperatingSystem
652
653
654struct OperatingSystemInstance
655{
656 OperatingSystemInstance() :
657 name(),
658 description(),
659 create_callback(NULL)
660 {
661 }
662
663 std::string name;
664 std::string description;
665 OperatingSystemCreateInstance create_callback;
666};
667
668typedef std::vector<OperatingSystemInstance> OperatingSystemInstances;
669
670static Mutex &
671GetOperatingSystemMutex ()
672{
673 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
674 return g_instances_mutex;
675}
676
677static OperatingSystemInstances &
678GetOperatingSystemInstances ()
679{
680 static OperatingSystemInstances g_instances;
681 return g_instances;
682}
683
684bool
685PluginManager::RegisterPlugin
686(
687 const char *name,
688 const char *description,
689 OperatingSystemCreateInstance create_callback
690 )
691{
692 if (create_callback)
693 {
694 OperatingSystemInstance instance;
695 assert (name && name[0]);
696 instance.name = name;
697 if (description && description[0])
698 instance.description = description;
699 instance.create_callback = create_callback;
700 Mutex::Locker locker (GetOperatingSystemMutex ());
701 GetOperatingSystemInstances ().push_back (instance);
702 }
703 return false;
704}
705
706bool
707PluginManager::UnregisterPlugin (OperatingSystemCreateInstance create_callback)
708{
709 if (create_callback)
710 {
711 Mutex::Locker locker (GetOperatingSystemMutex ());
712 OperatingSystemInstances &instances = GetOperatingSystemInstances ();
713
714 OperatingSystemInstances::iterator pos, end = instances.end();
715 for (pos = instances.begin(); pos != end; ++ pos)
716 {
717 if (pos->create_callback == create_callback)
718 {
719 instances.erase(pos);
720 return true;
721 }
722 }
723 }
724 return false;
725}
726
727OperatingSystemCreateInstance
728PluginManager::GetOperatingSystemCreateCallbackAtIndex (uint32_t idx)
729{
730 Mutex::Locker locker (GetOperatingSystemMutex ());
731 OperatingSystemInstances &instances = GetOperatingSystemInstances ();
732 if (idx < instances.size())
733 return instances[idx].create_callback;
734 return NULL;
735}
736
737OperatingSystemCreateInstance
738PluginManager::GetOperatingSystemCreateCallbackForPluginName (const char *name)
739{
740 if (name && name[0])
741 {
742 llvm::StringRef name_sref(name);
743 Mutex::Locker locker (GetOperatingSystemMutex ());
744 OperatingSystemInstances &instances = GetOperatingSystemInstances ();
745
746 OperatingSystemInstances::iterator pos, end = instances.end();
747 for (pos = instances.begin(); pos != end; ++ pos)
748 {
749 if (name_sref.equals (pos->name))
750 return pos->create_callback;
751 }
752 }
753 return NULL;
754}
Greg Claytonf03bbe22011-02-01 01:37:45 +0000755
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000756
Jim Ingham22777012010-09-23 02:01:19 +0000757#pragma mark LanguageRuntime
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000758
759
Jim Ingham22777012010-09-23 02:01:19 +0000760struct LanguageRuntimeInstance
761{
762 LanguageRuntimeInstance() :
763 name(),
764 description(),
765 create_callback(NULL)
766 {
767 }
768
769 std::string name;
770 std::string description;
771 LanguageRuntimeCreateInstance create_callback;
772};
773
774typedef std::vector<LanguageRuntimeInstance> LanguageRuntimeInstances;
775
Greg Claytonab65b342011-04-13 22:47:15 +0000776static Mutex &
777GetLanguageRuntimeMutex ()
Jim Ingham22777012010-09-23 02:01:19 +0000778{
Greg Claytonab65b342011-04-13 22:47:15 +0000779 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
780 return g_instances_mutex;
Jim Ingham22777012010-09-23 02:01:19 +0000781}
782
Greg Claytonab65b342011-04-13 22:47:15 +0000783static LanguageRuntimeInstances &
784GetLanguageRuntimeInstances ()
785{
786 static LanguageRuntimeInstances g_instances;
787 return g_instances;
788}
Jim Ingham22777012010-09-23 02:01:19 +0000789
790bool
791PluginManager::RegisterPlugin
Greg Clayton4272cc72011-02-02 02:24:04 +0000792(
793 const char *name,
794 const char *description,
795 LanguageRuntimeCreateInstance create_callback
796)
Jim Ingham22777012010-09-23 02:01:19 +0000797{
798 if (create_callback)
799 {
800 LanguageRuntimeInstance instance;
801 assert (name && name[0]);
802 instance.name = name;
803 if (description && description[0])
804 instance.description = description;
805 instance.create_callback = create_callback;
Greg Claytonab65b342011-04-13 22:47:15 +0000806 Mutex::Locker locker (GetLanguageRuntimeMutex ());
807 GetLanguageRuntimeInstances ().push_back (instance);
Jim Ingham22777012010-09-23 02:01:19 +0000808 }
809 return false;
810}
811
812bool
813PluginManager::UnregisterPlugin (LanguageRuntimeCreateInstance create_callback)
814{
815 if (create_callback)
816 {
Greg Claytonab65b342011-04-13 22:47:15 +0000817 Mutex::Locker locker (GetLanguageRuntimeMutex ());
818 LanguageRuntimeInstances &instances = GetLanguageRuntimeInstances ();
819
820 LanguageRuntimeInstances::iterator pos, end = instances.end();
821 for (pos = instances.begin(); pos != end; ++ pos)
822 {
823 if (pos->create_callback == create_callback)
824 {
825 instances.erase(pos);
826 return true;
827 }
828 }
Jim Ingham22777012010-09-23 02:01:19 +0000829 }
830 return false;
831}
832
833LanguageRuntimeCreateInstance
834PluginManager::GetLanguageRuntimeCreateCallbackAtIndex (uint32_t idx)
835{
Greg Claytonab65b342011-04-13 22:47:15 +0000836 Mutex::Locker locker (GetLanguageRuntimeMutex ());
837 LanguageRuntimeInstances &instances = GetLanguageRuntimeInstances ();
838 if (idx < instances.size())
839 return instances[idx].create_callback;
Jim Ingham22777012010-09-23 02:01:19 +0000840 return NULL;
841}
842
843LanguageRuntimeCreateInstance
844PluginManager::GetLanguageRuntimeCreateCallbackForPluginName (const char *name)
845{
846 if (name && name[0])
847 {
Greg Claytonab65b342011-04-13 22:47:15 +0000848 llvm::StringRef name_sref(name);
849 Mutex::Locker locker (GetLanguageRuntimeMutex ());
850 LanguageRuntimeInstances &instances = GetLanguageRuntimeInstances ();
851
852 LanguageRuntimeInstances::iterator pos, end = instances.end();
853 for (pos = instances.begin(); pos != end; ++ pos)
Jim Ingham22777012010-09-23 02:01:19 +0000854 {
Greg Claytonab65b342011-04-13 22:47:15 +0000855 if (name_sref.equals (pos->name))
856 return pos->create_callback;
Jim Ingham22777012010-09-23 02:01:19 +0000857 }
858 }
859 return NULL;
860}
861
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000862#pragma mark ObjectFile
863
Jason Molenda743e86a2010-06-11 23:44:18 +0000864struct ObjectFileInstance
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000865{
866 ObjectFileInstance() :
867 name(),
868 description(),
869 create_callback(NULL)
870 {
871 }
872
873 std::string name;
874 std::string description;
875 ObjectFileCreateInstance create_callback;
Greg Claytonc9660542012-02-05 02:38:54 +0000876 ObjectFileCreateMemoryInstance create_memory_callback;
877
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000878};
879
880typedef std::vector<ObjectFileInstance> ObjectFileInstances;
881
Greg Claytonab65b342011-04-13 22:47:15 +0000882static Mutex &
883GetObjectFileMutex ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000884{
Greg Claytonab65b342011-04-13 22:47:15 +0000885 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
886 return g_instances_mutex;
887}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000888
Greg Claytonab65b342011-04-13 22:47:15 +0000889static ObjectFileInstances &
890GetObjectFileInstances ()
891{
892 static ObjectFileInstances g_instances;
893 return g_instances;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000894}
895
896
897bool
898PluginManager::RegisterPlugin
899(
900 const char *name,
901 const char *description,
Greg Claytonc9660542012-02-05 02:38:54 +0000902 ObjectFileCreateInstance create_callback,
903 ObjectFileCreateMemoryInstance create_memory_callback
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000904)
905{
906 if (create_callback)
907 {
908 ObjectFileInstance instance;
909 assert (name && name[0]);
910 instance.name = name;
911 if (description && description[0])
912 instance.description = description;
913 instance.create_callback = create_callback;
Greg Claytonc9660542012-02-05 02:38:54 +0000914 instance.create_memory_callback = create_memory_callback;
Greg Claytonab65b342011-04-13 22:47:15 +0000915 Mutex::Locker locker (GetObjectFileMutex ());
916 GetObjectFileInstances ().push_back (instance);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000917 }
918 return false;
919}
920
921bool
922PluginManager::UnregisterPlugin (ObjectFileCreateInstance create_callback)
923{
924 if (create_callback)
925 {
Greg Claytonab65b342011-04-13 22:47:15 +0000926 Mutex::Locker locker (GetObjectFileMutex ());
927 ObjectFileInstances &instances = GetObjectFileInstances ();
928
929 ObjectFileInstances::iterator pos, end = instances.end();
930 for (pos = instances.begin(); pos != end; ++ pos)
931 {
932 if (pos->create_callback == create_callback)
933 {
934 instances.erase(pos);
935 return true;
936 }
937 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000938 }
939 return false;
940}
941
942ObjectFileCreateInstance
943PluginManager::GetObjectFileCreateCallbackAtIndex (uint32_t idx)
944{
Greg Claytonab65b342011-04-13 22:47:15 +0000945 Mutex::Locker locker (GetObjectFileMutex ());
946 ObjectFileInstances &instances = GetObjectFileInstances ();
947 if (idx < instances.size())
948 return instances[idx].create_callback;
Jason Molenda743e86a2010-06-11 23:44:18 +0000949 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000950}
Greg Claytonab65b342011-04-13 22:47:15 +0000951
Greg Claytonc9660542012-02-05 02:38:54 +0000952
953ObjectFileCreateMemoryInstance
954PluginManager::GetObjectFileCreateMemoryCallbackAtIndex (uint32_t idx)
955{
956 Mutex::Locker locker (GetObjectFileMutex ());
957 ObjectFileInstances &instances = GetObjectFileInstances ();
958 if (idx < instances.size())
959 return instances[idx].create_memory_callback;
960 return NULL;
961}
962
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000963ObjectFileCreateInstance
964PluginManager::GetObjectFileCreateCallbackForPluginName (const char *name)
965{
966 if (name && name[0])
967 {
Greg Claytonab65b342011-04-13 22:47:15 +0000968 llvm::StringRef name_sref(name);
969 Mutex::Locker locker (GetObjectFileMutex ());
970 ObjectFileInstances &instances = GetObjectFileInstances ();
971
972 ObjectFileInstances::iterator pos, end = instances.end();
973 for (pos = instances.begin(); pos != end; ++ pos)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000974 {
Greg Claytonab65b342011-04-13 22:47:15 +0000975 if (name_sref.equals (pos->name))
976 return pos->create_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000977 }
978 }
979 return NULL;
980}
981
982
Greg Claytonc9660542012-02-05 02:38:54 +0000983ObjectFileCreateMemoryInstance
984PluginManager::GetObjectFileCreateMemoryCallbackForPluginName (const char *name)
985{
986 if (name && name[0])
987 {
988 llvm::StringRef name_sref(name);
989 Mutex::Locker locker (GetObjectFileMutex ());
990 ObjectFileInstances &instances = GetObjectFileInstances ();
991
992 ObjectFileInstances::iterator pos, end = instances.end();
993 for (pos = instances.begin(); pos != end; ++ pos)
994 {
995 if (name_sref.equals (pos->name))
996 return pos->create_memory_callback;
997 }
998 }
999 return NULL;
1000}
1001
1002
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001003
1004#pragma mark ObjectContainer
1005
Jason Molenda743e86a2010-06-11 23:44:18 +00001006struct ObjectContainerInstance
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001007{
1008 ObjectContainerInstance() :
1009 name(),
1010 description(),
1011 create_callback(NULL)
1012 {
1013 }
1014
1015 std::string name;
1016 std::string description;
1017 ObjectContainerCreateInstance create_callback;
1018};
1019
1020typedef std::vector<ObjectContainerInstance> ObjectContainerInstances;
1021
Greg Claytonab65b342011-04-13 22:47:15 +00001022static Mutex &
1023GetObjectContainerMutex ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001024{
Greg Claytonab65b342011-04-13 22:47:15 +00001025 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
1026 return g_instances_mutex;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001027}
1028
Greg Claytonab65b342011-04-13 22:47:15 +00001029static ObjectContainerInstances &
1030GetObjectContainerInstances ()
1031{
1032 static ObjectContainerInstances g_instances;
1033 return g_instances;
1034}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001035
1036bool
1037PluginManager::RegisterPlugin
1038(
1039 const char *name,
1040 const char *description,
1041 ObjectContainerCreateInstance create_callback
1042)
1043{
1044 if (create_callback)
1045 {
1046 ObjectContainerInstance instance;
1047 assert (name && name[0]);
1048 instance.name = name;
1049 if (description && description[0])
1050 instance.description = description;
1051 instance.create_callback = create_callback;
Greg Claytonab65b342011-04-13 22:47:15 +00001052 Mutex::Locker locker (GetObjectContainerMutex ());
1053 GetObjectContainerInstances ().push_back (instance);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001054 }
1055 return false;
1056}
1057
1058bool
1059PluginManager::UnregisterPlugin (ObjectContainerCreateInstance create_callback)
1060{
1061 if (create_callback)
1062 {
Greg Claytonab65b342011-04-13 22:47:15 +00001063 Mutex::Locker locker (GetObjectContainerMutex ());
1064 ObjectContainerInstances &instances = GetObjectContainerInstances ();
1065
1066 ObjectContainerInstances::iterator pos, end = instances.end();
1067 for (pos = instances.begin(); pos != end; ++ pos)
1068 {
1069 if (pos->create_callback == create_callback)
1070 {
1071 instances.erase(pos);
1072 return true;
1073 }
1074 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001075 }
1076 return false;
1077}
1078
1079ObjectContainerCreateInstance
1080PluginManager::GetObjectContainerCreateCallbackAtIndex (uint32_t idx)
1081{
Greg Claytonab65b342011-04-13 22:47:15 +00001082 Mutex::Locker locker (GetObjectContainerMutex ());
1083 ObjectContainerInstances &instances = GetObjectContainerInstances ();
1084 if (idx < instances.size())
1085 return instances[idx].create_callback;
Jason Molenda743e86a2010-06-11 23:44:18 +00001086 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001087}
Greg Claytonab65b342011-04-13 22:47:15 +00001088
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001089ObjectContainerCreateInstance
1090PluginManager::GetObjectContainerCreateCallbackForPluginName (const char *name)
1091{
1092 if (name && name[0])
1093 {
Greg Claytonab65b342011-04-13 22:47:15 +00001094 llvm::StringRef name_sref(name);
1095 Mutex::Locker locker (GetObjectContainerMutex ());
1096 ObjectContainerInstances &instances = GetObjectContainerInstances ();
1097
1098 ObjectContainerInstances::iterator pos, end = instances.end();
1099 for (pos = instances.begin(); pos != end; ++ pos)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001100 {
Greg Claytonab65b342011-04-13 22:47:15 +00001101 if (name_sref.equals (pos->name))
1102 return pos->create_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001103 }
1104 }
1105 return NULL;
1106}
1107
1108#pragma mark LogChannel
1109
Greg Claytonab65b342011-04-13 22:47:15 +00001110struct LogInstance
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001111{
Greg Claytonab65b342011-04-13 22:47:15 +00001112 LogInstance() :
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001113 name(),
1114 description(),
1115 create_callback(NULL)
1116 {
1117 }
1118
1119 std::string name;
1120 std::string description;
1121 LogChannelCreateInstance create_callback;
1122};
1123
Greg Claytonab65b342011-04-13 22:47:15 +00001124typedef std::vector<LogInstance> LogInstances;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001125
Greg Claytonab65b342011-04-13 22:47:15 +00001126static Mutex &
1127GetLogMutex ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001128{
Greg Claytonab65b342011-04-13 22:47:15 +00001129 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
1130 return g_instances_mutex;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001131}
1132
Greg Claytonab65b342011-04-13 22:47:15 +00001133static LogInstances &
1134GetLogInstances ()
1135{
1136 static LogInstances g_instances;
1137 return g_instances;
1138}
1139
1140
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001141
1142bool
1143PluginManager::RegisterPlugin
1144(
1145 const char *name,
1146 const char *description,
1147 LogChannelCreateInstance create_callback
1148)
1149{
1150 if (create_callback)
1151 {
Greg Claytonab65b342011-04-13 22:47:15 +00001152 LogInstance instance;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001153 assert (name && name[0]);
1154 instance.name = name;
1155 if (description && description[0])
1156 instance.description = description;
1157 instance.create_callback = create_callback;
Greg Claytonab65b342011-04-13 22:47:15 +00001158 Mutex::Locker locker (GetLogMutex ());
1159 GetLogInstances ().push_back (instance);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001160 }
1161 return false;
1162}
1163
1164bool
1165PluginManager::UnregisterPlugin (LogChannelCreateInstance create_callback)
1166{
1167 if (create_callback)
1168 {
Greg Claytonab65b342011-04-13 22:47:15 +00001169 Mutex::Locker locker (GetLogMutex ());
1170 LogInstances &instances = GetLogInstances ();
1171
1172 LogInstances::iterator pos, end = instances.end();
1173 for (pos = instances.begin(); pos != end; ++ pos)
1174 {
1175 if (pos->create_callback == create_callback)
1176 {
1177 instances.erase(pos);
1178 return true;
1179 }
1180 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001181 }
1182 return false;
1183}
1184
1185const char *
1186PluginManager::GetLogChannelCreateNameAtIndex (uint32_t idx)
1187{
Greg Claytonab65b342011-04-13 22:47:15 +00001188 Mutex::Locker locker (GetLogMutex ());
1189 LogInstances &instances = GetLogInstances ();
1190 if (idx < instances.size())
1191 return instances[idx].name.c_str();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001192 return NULL;
1193}
1194
1195
1196LogChannelCreateInstance
1197PluginManager::GetLogChannelCreateCallbackAtIndex (uint32_t idx)
1198{
Greg Claytonab65b342011-04-13 22:47:15 +00001199 Mutex::Locker locker (GetLogMutex ());
1200 LogInstances &instances = GetLogInstances ();
1201 if (idx < instances.size())
1202 return instances[idx].create_callback;
Jason Molenda743e86a2010-06-11 23:44:18 +00001203 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001204}
1205
1206LogChannelCreateInstance
1207PluginManager::GetLogChannelCreateCallbackForPluginName (const char *name)
1208{
1209 if (name && name[0])
1210 {
Greg Claytonab65b342011-04-13 22:47:15 +00001211 llvm::StringRef name_sref(name);
1212 Mutex::Locker locker (GetLogMutex ());
1213 LogInstances &instances = GetLogInstances ();
1214
1215 LogInstances::iterator pos, end = instances.end();
1216 for (pos = instances.begin(); pos != end; ++ pos)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001217 {
Greg Claytonab65b342011-04-13 22:47:15 +00001218 if (name_sref.equals (pos->name))
1219 return pos->create_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001220 }
1221 }
1222 return NULL;
1223}
1224
Greg Claytone996fd32011-03-08 22:40:15 +00001225#pragma mark Platform
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001226
Greg Claytone996fd32011-03-08 22:40:15 +00001227struct PlatformInstance
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001228{
Greg Claytone996fd32011-03-08 22:40:15 +00001229 PlatformInstance() :
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001230 name(),
1231 description(),
Jason Molenda9b837a12013-04-05 05:06:39 +00001232 create_callback(NULL),
1233 debugger_init_callback (NULL)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001234 {
1235 }
Greg Claytone996fd32011-03-08 22:40:15 +00001236
1237 std::string name;
1238 std::string description;
1239 PlatformCreateInstance create_callback;
Jason Molenda9b837a12013-04-05 05:06:39 +00001240 DebuggerInitializeCallback debugger_init_callback;
Greg Claytone996fd32011-03-08 22:40:15 +00001241};
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001242
Greg Claytone996fd32011-03-08 22:40:15 +00001243typedef std::vector<PlatformInstance> PlatformInstances;
1244
Greg Claytonded470d2011-03-19 01:12:21 +00001245static Mutex &
1246GetPlatformInstancesMutex ()
Greg Claytone996fd32011-03-08 22:40:15 +00001247{
Greg Claytonded470d2011-03-19 01:12:21 +00001248 static Mutex g_platform_instances_mutex (Mutex::eMutexTypeRecursive);
1249 return g_platform_instances_mutex;
Greg Claytone996fd32011-03-08 22:40:15 +00001250}
1251
Greg Claytonded470d2011-03-19 01:12:21 +00001252static PlatformInstances &
1253GetPlatformInstances ()
1254{
1255 static PlatformInstances g_platform_instances;
1256 return g_platform_instances;
1257}
Greg Claytone996fd32011-03-08 22:40:15 +00001258
Greg Claytonab65b342011-04-13 22:47:15 +00001259
Greg Claytone996fd32011-03-08 22:40:15 +00001260bool
1261PluginManager::RegisterPlugin (const char *name,
1262 const char *description,
Jason Molenda9b837a12013-04-05 05:06:39 +00001263 PlatformCreateInstance create_callback,
1264 DebuggerInitializeCallback debugger_init_callback)
Greg Claytone996fd32011-03-08 22:40:15 +00001265{
1266 if (create_callback)
1267 {
Greg Claytonded470d2011-03-19 01:12:21 +00001268 Mutex::Locker locker (GetPlatformInstancesMutex ());
1269
Greg Claytone996fd32011-03-08 22:40:15 +00001270 PlatformInstance instance;
1271 assert (name && name[0]);
1272 instance.name = name;
1273 if (description && description[0])
1274 instance.description = description;
1275 instance.create_callback = create_callback;
Jason Molenda9b837a12013-04-05 05:06:39 +00001276 instance.debugger_init_callback = debugger_init_callback;
Greg Claytonded470d2011-03-19 01:12:21 +00001277 GetPlatformInstances ().push_back (instance);
1278 return true;
Greg Claytone996fd32011-03-08 22:40:15 +00001279 }
1280 return false;
1281}
1282
Jason Molenda9b837a12013-04-05 05:06:39 +00001283
Greg Claytone996fd32011-03-08 22:40:15 +00001284const char *
1285PluginManager::GetPlatformPluginNameAtIndex (uint32_t idx)
1286{
Greg Claytonded470d2011-03-19 01:12:21 +00001287 Mutex::Locker locker (GetPlatformInstancesMutex ());
Greg Claytonab65b342011-04-13 22:47:15 +00001288 PlatformInstances &instances = GetPlatformInstances ();
1289 if (idx < instances.size())
1290 return instances[idx].name.c_str();
Greg Claytone996fd32011-03-08 22:40:15 +00001291 return NULL;
1292}
1293
1294const char *
1295PluginManager::GetPlatformPluginDescriptionAtIndex (uint32_t idx)
1296{
Greg Claytonded470d2011-03-19 01:12:21 +00001297 Mutex::Locker locker (GetPlatformInstancesMutex ());
Greg Claytonab65b342011-04-13 22:47:15 +00001298 PlatformInstances &instances = GetPlatformInstances ();
1299 if (idx < instances.size())
1300 return instances[idx].description.c_str();
Greg Claytone996fd32011-03-08 22:40:15 +00001301 return NULL;
1302}
1303
1304bool
1305PluginManager::UnregisterPlugin (PlatformCreateInstance create_callback)
1306{
1307 if (create_callback)
1308 {
Greg Claytonded470d2011-03-19 01:12:21 +00001309 Mutex::Locker locker (GetPlatformInstancesMutex ());
Greg Claytonab65b342011-04-13 22:47:15 +00001310 PlatformInstances &instances = GetPlatformInstances ();
Greg Claytonded470d2011-03-19 01:12:21 +00001311
Greg Claytonab65b342011-04-13 22:47:15 +00001312 PlatformInstances::iterator pos, end = instances.end();
1313 for (pos = instances.begin(); pos != end; ++ pos)
Greg Claytonded470d2011-03-19 01:12:21 +00001314 {
1315 if (pos->create_callback == create_callback)
1316 {
Greg Claytonab65b342011-04-13 22:47:15 +00001317 instances.erase(pos);
Greg Claytonded470d2011-03-19 01:12:21 +00001318 return true;
1319 }
1320 }
Greg Claytone996fd32011-03-08 22:40:15 +00001321 }
1322 return false;
1323}
1324
1325PlatformCreateInstance
1326PluginManager::GetPlatformCreateCallbackAtIndex (uint32_t idx)
1327{
Greg Claytonded470d2011-03-19 01:12:21 +00001328 Mutex::Locker locker (GetPlatformInstancesMutex ());
Greg Claytonab65b342011-04-13 22:47:15 +00001329 PlatformInstances &instances = GetPlatformInstances ();
1330 if (idx < instances.size())
1331 return instances[idx].create_callback;
Greg Claytone996fd32011-03-08 22:40:15 +00001332 return NULL;
1333}
1334
1335PlatformCreateInstance
1336PluginManager::GetPlatformCreateCallbackForPluginName (const char *name)
1337{
1338 if (name && name[0])
1339 {
Greg Claytonded470d2011-03-19 01:12:21 +00001340 Mutex::Locker locker (GetPlatformInstancesMutex ());
Greg Claytonab65b342011-04-13 22:47:15 +00001341 PlatformInstances &instances = GetPlatformInstances ();
1342 llvm::StringRef name_sref(name);
Greg Claytonded470d2011-03-19 01:12:21 +00001343
Greg Claytonab65b342011-04-13 22:47:15 +00001344 PlatformInstances::iterator pos, end = instances.end();
1345 for (pos = instances.begin(); pos != end; ++ pos)
Greg Claytone996fd32011-03-08 22:40:15 +00001346 {
Greg Clayton7260f622011-04-18 08:33:37 +00001347 if (name_sref.equals (pos->name))
Greg Claytonded470d2011-03-19 01:12:21 +00001348 return pos->create_callback;
Greg Claytone996fd32011-03-08 22:40:15 +00001349 }
1350 }
1351 return NULL;
1352}
1353
Greg Claytonc7bece562013-01-25 18:06:21 +00001354size_t
Greg Claytonab65b342011-04-13 22:47:15 +00001355PluginManager::AutoCompletePlatformName (const char *name, StringList &matches)
1356{
1357 if (name && name[0])
1358 {
1359 Mutex::Locker locker (GetPlatformInstancesMutex ());
1360 PlatformInstances &instances = GetPlatformInstances ();
1361 llvm::StringRef name_sref(name);
1362
1363 PlatformInstances::iterator pos, end = instances.end();
1364 for (pos = instances.begin(); pos != end; ++ pos)
1365 {
Greg Clayton7260f622011-04-18 08:33:37 +00001366 llvm::StringRef plugin_name (pos->name);
1367 if (plugin_name.startswith(name_sref))
1368 matches.AppendString (plugin_name.data());
Greg Claytonab65b342011-04-13 22:47:15 +00001369 }
1370 }
1371 return matches.GetSize();
1372}
Greg Claytone996fd32011-03-08 22:40:15 +00001373#pragma mark Process
1374
1375struct ProcessInstance
1376{
1377 ProcessInstance() :
1378 name(),
1379 description(),
1380 create_callback(NULL)
1381 {
1382 }
1383
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001384 std::string name;
1385 std::string description;
1386 ProcessCreateInstance create_callback;
1387};
1388
1389typedef std::vector<ProcessInstance> ProcessInstances;
1390
Greg Claytonab65b342011-04-13 22:47:15 +00001391static Mutex &
1392GetProcessMutex ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001393{
Greg Claytonab65b342011-04-13 22:47:15 +00001394 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
1395 return g_instances_mutex;
1396}
1397
1398static ProcessInstances &
1399GetProcessInstances ()
1400{
1401 static ProcessInstances g_instances;
1402 return g_instances;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001403}
1404
1405
1406bool
1407PluginManager::RegisterPlugin
1408(
Greg Claytone996fd32011-03-08 22:40:15 +00001409 const char *name,
1410 const char *description,
1411 ProcessCreateInstance create_callback
1412 )
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001413{
1414 if (create_callback)
1415 {
1416 ProcessInstance instance;
1417 assert (name && name[0]);
1418 instance.name = name;
1419 if (description && description[0])
1420 instance.description = description;
1421 instance.create_callback = create_callback;
Greg Claytonab65b342011-04-13 22:47:15 +00001422 Mutex::Locker locker (GetProcessMutex ());
1423 GetProcessInstances ().push_back (instance);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001424 }
1425 return false;
1426}
1427
Greg Claytonbfe5f3b2011-02-18 01:44:25 +00001428const char *
1429PluginManager::GetProcessPluginNameAtIndex (uint32_t idx)
1430{
Greg Claytonab65b342011-04-13 22:47:15 +00001431 Mutex::Locker locker (GetProcessMutex ());
1432 ProcessInstances &instances = GetProcessInstances ();
1433 if (idx < instances.size())
1434 return instances[idx].name.c_str();
Greg Claytonbfe5f3b2011-02-18 01:44:25 +00001435 return NULL;
1436}
1437
1438const char *
1439PluginManager::GetProcessPluginDescriptionAtIndex (uint32_t idx)
1440{
Greg Claytonab65b342011-04-13 22:47:15 +00001441 Mutex::Locker locker (GetProcessMutex ());
1442 ProcessInstances &instances = GetProcessInstances ();
1443 if (idx < instances.size())
1444 return instances[idx].description.c_str();
Greg Claytonbfe5f3b2011-02-18 01:44:25 +00001445 return NULL;
1446}
1447
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001448bool
1449PluginManager::UnregisterPlugin (ProcessCreateInstance create_callback)
1450{
1451 if (create_callback)
1452 {
Greg Claytonab65b342011-04-13 22:47:15 +00001453 Mutex::Locker locker (GetProcessMutex ());
1454 ProcessInstances &instances = GetProcessInstances ();
1455
1456 ProcessInstances::iterator pos, end = instances.end();
1457 for (pos = instances.begin(); pos != end; ++ pos)
1458 {
1459 if (pos->create_callback == create_callback)
1460 {
1461 instances.erase(pos);
1462 return true;
1463 }
1464 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001465 }
1466 return false;
1467}
1468
1469ProcessCreateInstance
1470PluginManager::GetProcessCreateCallbackAtIndex (uint32_t idx)
1471{
Greg Claytonab65b342011-04-13 22:47:15 +00001472 Mutex::Locker locker (GetProcessMutex ());
1473 ProcessInstances &instances = GetProcessInstances ();
1474 if (idx < instances.size())
1475 return instances[idx].create_callback;
Jason Molenda743e86a2010-06-11 23:44:18 +00001476 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001477}
1478
Greg Claytonab65b342011-04-13 22:47:15 +00001479
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001480ProcessCreateInstance
1481PluginManager::GetProcessCreateCallbackForPluginName (const char *name)
1482{
1483 if (name && name[0])
1484 {
Greg Claytonab65b342011-04-13 22:47:15 +00001485 llvm::StringRef name_sref(name);
1486 Mutex::Locker locker (GetProcessMutex ());
1487 ProcessInstances &instances = GetProcessInstances ();
1488
1489 ProcessInstances::iterator pos, end = instances.end();
1490 for (pos = instances.begin(); pos != end; ++ pos)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001491 {
Greg Claytonab65b342011-04-13 22:47:15 +00001492 if (name_sref.equals (pos->name))
1493 return pos->create_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001494 }
1495 }
1496 return NULL;
1497}
1498
1499#pragma mark SymbolFile
1500
Jason Molenda743e86a2010-06-11 23:44:18 +00001501struct SymbolFileInstance
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001502{
1503 SymbolFileInstance() :
1504 name(),
1505 description(),
1506 create_callback(NULL)
1507 {
1508 }
1509
1510 std::string name;
1511 std::string description;
1512 SymbolFileCreateInstance create_callback;
1513};
1514
1515typedef std::vector<SymbolFileInstance> SymbolFileInstances;
1516
Greg Claytonab65b342011-04-13 22:47:15 +00001517static Mutex &
1518GetSymbolFileMutex ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001519{
Greg Claytonab65b342011-04-13 22:47:15 +00001520 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
1521 return g_instances_mutex;
1522}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001523
Greg Claytonab65b342011-04-13 22:47:15 +00001524static SymbolFileInstances &
1525GetSymbolFileInstances ()
1526{
1527 static SymbolFileInstances g_instances;
1528 return g_instances;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001529}
1530
1531
1532bool
1533PluginManager::RegisterPlugin
1534(
1535 const char *name,
1536 const char *description,
1537 SymbolFileCreateInstance create_callback
1538)
1539{
1540 if (create_callback)
1541 {
1542 SymbolFileInstance instance;
1543 assert (name && name[0]);
1544 instance.name = name;
1545 if (description && description[0])
1546 instance.description = description;
1547 instance.create_callback = create_callback;
Greg Claytonab65b342011-04-13 22:47:15 +00001548 Mutex::Locker locker (GetSymbolFileMutex ());
1549 GetSymbolFileInstances ().push_back (instance);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001550 }
1551 return false;
1552}
1553
1554bool
1555PluginManager::UnregisterPlugin (SymbolFileCreateInstance create_callback)
1556{
1557 if (create_callback)
1558 {
Greg Claytonab65b342011-04-13 22:47:15 +00001559 Mutex::Locker locker (GetSymbolFileMutex ());
1560 SymbolFileInstances &instances = GetSymbolFileInstances ();
1561
1562 SymbolFileInstances::iterator pos, end = instances.end();
1563 for (pos = instances.begin(); pos != end; ++ pos)
1564 {
1565 if (pos->create_callback == create_callback)
1566 {
1567 instances.erase(pos);
1568 return true;
1569 }
1570 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001571 }
1572 return false;
1573}
1574
1575SymbolFileCreateInstance
1576PluginManager::GetSymbolFileCreateCallbackAtIndex (uint32_t idx)
1577{
Greg Claytonab65b342011-04-13 22:47:15 +00001578 Mutex::Locker locker (GetSymbolFileMutex ());
1579 SymbolFileInstances &instances = GetSymbolFileInstances ();
1580 if (idx < instances.size())
1581 return instances[idx].create_callback;
Jason Molenda743e86a2010-06-11 23:44:18 +00001582 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001583}
Greg Claytonab65b342011-04-13 22:47:15 +00001584
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001585SymbolFileCreateInstance
1586PluginManager::GetSymbolFileCreateCallbackForPluginName (const char *name)
1587{
1588 if (name && name[0])
1589 {
Greg Claytonab65b342011-04-13 22:47:15 +00001590 llvm::StringRef name_sref(name);
1591 Mutex::Locker locker (GetSymbolFileMutex ());
1592 SymbolFileInstances &instances = GetSymbolFileInstances ();
1593
1594 SymbolFileInstances::iterator pos, end = instances.end();
1595 for (pos = instances.begin(); pos != end; ++ pos)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001596 {
Greg Claytonab65b342011-04-13 22:47:15 +00001597 if (name_sref.equals (pos->name))
1598 return pos->create_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001599 }
1600 }
1601 return NULL;
1602}
1603
1604
1605
1606#pragma mark SymbolVendor
1607
Jason Molenda743e86a2010-06-11 23:44:18 +00001608struct SymbolVendorInstance
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001609{
1610 SymbolVendorInstance() :
1611 name(),
1612 description(),
1613 create_callback(NULL)
1614 {
1615 }
1616
1617 std::string name;
1618 std::string description;
1619 SymbolVendorCreateInstance create_callback;
1620};
1621
1622typedef std::vector<SymbolVendorInstance> SymbolVendorInstances;
1623
Greg Claytonab65b342011-04-13 22:47:15 +00001624static Mutex &
1625GetSymbolVendorMutex ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001626{
Greg Claytonab65b342011-04-13 22:47:15 +00001627 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
1628 return g_instances_mutex;
1629}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001630
Greg Claytonab65b342011-04-13 22:47:15 +00001631static SymbolVendorInstances &
1632GetSymbolVendorInstances ()
1633{
1634 static SymbolVendorInstances g_instances;
1635 return g_instances;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001636}
1637
1638bool
1639PluginManager::RegisterPlugin
1640(
1641 const char *name,
1642 const char *description,
1643 SymbolVendorCreateInstance create_callback
1644)
1645{
1646 if (create_callback)
1647 {
1648 SymbolVendorInstance instance;
1649 assert (name && name[0]);
1650 instance.name = name;
1651 if (description && description[0])
1652 instance.description = description;
1653 instance.create_callback = create_callback;
Greg Claytonab65b342011-04-13 22:47:15 +00001654 Mutex::Locker locker (GetSymbolVendorMutex ());
1655 GetSymbolVendorInstances ().push_back (instance);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001656 }
1657 return false;
1658}
1659
1660bool
1661PluginManager::UnregisterPlugin (SymbolVendorCreateInstance create_callback)
1662{
1663 if (create_callback)
1664 {
Greg Claytonab65b342011-04-13 22:47:15 +00001665 Mutex::Locker locker (GetSymbolVendorMutex ());
1666 SymbolVendorInstances &instances = GetSymbolVendorInstances ();
1667
1668 SymbolVendorInstances::iterator pos, end = instances.end();
1669 for (pos = instances.begin(); pos != end; ++ pos)
1670 {
1671 if (pos->create_callback == create_callback)
1672 {
1673 instances.erase(pos);
1674 return true;
1675 }
1676 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001677 }
1678 return false;
1679}
1680
1681SymbolVendorCreateInstance
1682PluginManager::GetSymbolVendorCreateCallbackAtIndex (uint32_t idx)
1683{
Greg Claytonab65b342011-04-13 22:47:15 +00001684 Mutex::Locker locker (GetSymbolVendorMutex ());
1685 SymbolVendorInstances &instances = GetSymbolVendorInstances ();
1686 if (idx < instances.size())
1687 return instances[idx].create_callback;
Jason Molenda743e86a2010-06-11 23:44:18 +00001688 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001689}
1690
Greg Claytonab65b342011-04-13 22:47:15 +00001691
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001692SymbolVendorCreateInstance
1693PluginManager::GetSymbolVendorCreateCallbackForPluginName (const char *name)
1694{
1695 if (name && name[0])
1696 {
Greg Claytonab65b342011-04-13 22:47:15 +00001697 llvm::StringRef name_sref(name);
1698 Mutex::Locker locker (GetSymbolVendorMutex ());
1699 SymbolVendorInstances &instances = GetSymbolVendorInstances ();
1700
1701 SymbolVendorInstances::iterator pos, end = instances.end();
1702 for (pos = instances.begin(); pos != end; ++ pos)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001703 {
Greg Claytonab65b342011-04-13 22:47:15 +00001704 if (name_sref.equals (pos->name))
1705 return pos->create_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001706 }
1707 }
1708 return NULL;
1709}
1710
1711
Greg Clayton7be25422011-04-25 21:14:26 +00001712#pragma mark UnwindAssembly
Jason Molendafbcb7f22010-09-10 07:49:16 +00001713
Greg Clayton7be25422011-04-25 21:14:26 +00001714struct UnwindAssemblyInstance
Jason Molendafbcb7f22010-09-10 07:49:16 +00001715{
Greg Clayton7be25422011-04-25 21:14:26 +00001716 UnwindAssemblyInstance() :
Jason Molendafbcb7f22010-09-10 07:49:16 +00001717 name(),
1718 description(),
1719 create_callback(NULL)
1720 {
1721 }
1722
1723 std::string name;
1724 std::string description;
Greg Clayton7be25422011-04-25 21:14:26 +00001725 UnwindAssemblyCreateInstance create_callback;
Jason Molendafbcb7f22010-09-10 07:49:16 +00001726};
1727
Greg Clayton7be25422011-04-25 21:14:26 +00001728typedef std::vector<UnwindAssemblyInstance> UnwindAssemblyInstances;
Jason Molendafbcb7f22010-09-10 07:49:16 +00001729
Greg Claytonab65b342011-04-13 22:47:15 +00001730static Mutex &
Greg Clayton7be25422011-04-25 21:14:26 +00001731GetUnwindAssemblyMutex ()
Jason Molendafbcb7f22010-09-10 07:49:16 +00001732{
Greg Claytonab65b342011-04-13 22:47:15 +00001733 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
1734 return g_instances_mutex;
1735}
Jason Molendafbcb7f22010-09-10 07:49:16 +00001736
Greg Clayton7be25422011-04-25 21:14:26 +00001737static UnwindAssemblyInstances &
1738GetUnwindAssemblyInstances ()
Greg Claytonab65b342011-04-13 22:47:15 +00001739{
Greg Clayton7be25422011-04-25 21:14:26 +00001740 static UnwindAssemblyInstances g_instances;
Greg Claytonab65b342011-04-13 22:47:15 +00001741 return g_instances;
Jason Molendafbcb7f22010-09-10 07:49:16 +00001742}
1743
1744bool
1745PluginManager::RegisterPlugin
1746(
1747 const char *name,
1748 const char *description,
Greg Clayton7be25422011-04-25 21:14:26 +00001749 UnwindAssemblyCreateInstance create_callback
Jason Molendafbcb7f22010-09-10 07:49:16 +00001750)
1751{
1752 if (create_callback)
1753 {
Greg Clayton7be25422011-04-25 21:14:26 +00001754 UnwindAssemblyInstance instance;
Jason Molendafbcb7f22010-09-10 07:49:16 +00001755 assert (name && name[0]);
1756 instance.name = name;
1757 if (description && description[0])
1758 instance.description = description;
1759 instance.create_callback = create_callback;
Greg Clayton7be25422011-04-25 21:14:26 +00001760 Mutex::Locker locker (GetUnwindAssemblyMutex ());
1761 GetUnwindAssemblyInstances ().push_back (instance);
Jason Molendafbcb7f22010-09-10 07:49:16 +00001762 }
1763 return false;
1764}
1765
1766bool
Greg Clayton7be25422011-04-25 21:14:26 +00001767PluginManager::UnregisterPlugin (UnwindAssemblyCreateInstance create_callback)
Jason Molendafbcb7f22010-09-10 07:49:16 +00001768{
1769 if (create_callback)
1770 {
Greg Clayton7be25422011-04-25 21:14:26 +00001771 Mutex::Locker locker (GetUnwindAssemblyMutex ());
1772 UnwindAssemblyInstances &instances = GetUnwindAssemblyInstances ();
Greg Claytonab65b342011-04-13 22:47:15 +00001773
Greg Clayton7be25422011-04-25 21:14:26 +00001774 UnwindAssemblyInstances::iterator pos, end = instances.end();
Greg Claytonab65b342011-04-13 22:47:15 +00001775 for (pos = instances.begin(); pos != end; ++ pos)
1776 {
1777 if (pos->create_callback == create_callback)
1778 {
1779 instances.erase(pos);
1780 return true;
1781 }
1782 }
Jason Molendafbcb7f22010-09-10 07:49:16 +00001783 }
1784 return false;
1785}
1786
Greg Clayton7be25422011-04-25 21:14:26 +00001787UnwindAssemblyCreateInstance
1788PluginManager::GetUnwindAssemblyCreateCallbackAtIndex (uint32_t idx)
Jason Molendafbcb7f22010-09-10 07:49:16 +00001789{
Greg Clayton7be25422011-04-25 21:14:26 +00001790 Mutex::Locker locker (GetUnwindAssemblyMutex ());
1791 UnwindAssemblyInstances &instances = GetUnwindAssemblyInstances ();
Greg Claytonab65b342011-04-13 22:47:15 +00001792 if (idx < instances.size())
1793 return instances[idx].create_callback;
Jason Molendafbcb7f22010-09-10 07:49:16 +00001794 return NULL;
1795}
1796
Greg Claytonab65b342011-04-13 22:47:15 +00001797
Greg Clayton7be25422011-04-25 21:14:26 +00001798UnwindAssemblyCreateInstance
1799PluginManager::GetUnwindAssemblyCreateCallbackForPluginName (const char *name)
Jason Molendafbcb7f22010-09-10 07:49:16 +00001800{
1801 if (name && name[0])
1802 {
Greg Claytonab65b342011-04-13 22:47:15 +00001803 llvm::StringRef name_sref(name);
Greg Clayton7be25422011-04-25 21:14:26 +00001804 Mutex::Locker locker (GetUnwindAssemblyMutex ());
1805 UnwindAssemblyInstances &instances = GetUnwindAssemblyInstances ();
Greg Claytonab65b342011-04-13 22:47:15 +00001806
Greg Clayton7be25422011-04-25 21:14:26 +00001807 UnwindAssemblyInstances::iterator pos, end = instances.end();
Greg Claytonab65b342011-04-13 22:47:15 +00001808 for (pos = instances.begin(); pos != end; ++ pos)
Jason Molendafbcb7f22010-09-10 07:49:16 +00001809 {
Greg Claytonab65b342011-04-13 22:47:15 +00001810 if (name_sref.equals (pos->name))
1811 return pos->create_callback;
Jason Molendafbcb7f22010-09-10 07:49:16 +00001812 }
1813 }
1814 return NULL;
1815}
1816
Greg Claytone8cd0c92012-10-19 18:02:49 +00001817void
1818PluginManager::DebuggerInitialize (Debugger &debugger)
1819{
Jason Molenda9b837a12013-04-05 05:06:39 +00001820 // Initialize the DynamicLoader plugins
Greg Claytone8cd0c92012-10-19 18:02:49 +00001821 {
Jason Molenda9b837a12013-04-05 05:06:39 +00001822 Mutex::Locker locker (GetDynamicLoaderMutex ());
1823 DynamicLoaderInstances &instances = GetDynamicLoaderInstances ();
1824
1825 DynamicLoaderInstances::iterator pos, end = instances.end();
1826 for (pos = instances.begin(); pos != end; ++ pos)
1827 {
1828 if (pos->debugger_init_callback)
1829 pos->debugger_init_callback (debugger);
1830 }
1831 }
1832
1833 // Initialize the Platform plugins
1834 {
1835 Mutex::Locker locker (GetPlatformInstancesMutex ());
1836 PlatformInstances &instances = GetPlatformInstances ();
1837
1838 PlatformInstances::iterator pos, end = instances.end();
1839 for (pos = instances.begin(); pos != end; ++ pos)
1840 {
1841 if (pos->debugger_init_callback)
1842 pos->debugger_init_callback (debugger);
1843 }
Greg Claytone8cd0c92012-10-19 18:02:49 +00001844 }
1845}
1846
Jason Molenda3b59f5c2013-04-05 22:40:42 +00001847// This will put a plugin's settings under e.g. "plugin.dynamic-loader.darwin-kernel.SETTINGNAME".
1848// The new preferred ordering is to put plugins under "dynamic-loader.plugin.darwin-kernel.SETTINGNAME"
1849// and if there were a generic dynamic-loader setting, it would be "dynamic-loader.SETTINGNAME".
Greg Claytone8cd0c92012-10-19 18:02:49 +00001850static lldb::OptionValuePropertiesSP
Jason Molenda3b59f5c2013-04-05 22:40:42 +00001851GetDebuggerPropertyForPluginsOldStyle (Debugger &debugger,
1852 const ConstString &plugin_type_name,
1853 const ConstString &plugin_type_desc,
1854 bool can_create)
Greg Claytone8cd0c92012-10-19 18:02:49 +00001855{
1856 lldb::OptionValuePropertiesSP parent_properties_sp (debugger.GetValueProperties());
1857 if (parent_properties_sp)
1858 {
1859 static ConstString g_property_name("plugin");
1860
1861 OptionValuePropertiesSP plugin_properties_sp = parent_properties_sp->GetSubProperty (NULL, g_property_name);
1862 if (!plugin_properties_sp && can_create)
1863 {
1864 plugin_properties_sp.reset (new OptionValueProperties (g_property_name));
1865 parent_properties_sp->AppendProperty (g_property_name,
1866 ConstString("Settings specify to plugins."),
1867 true,
1868 plugin_properties_sp);
1869 }
1870
1871 if (plugin_properties_sp)
1872 {
1873 lldb::OptionValuePropertiesSP plugin_type_properties_sp = plugin_properties_sp->GetSubProperty (NULL, plugin_type_name);
1874 if (!plugin_type_properties_sp && can_create)
1875 {
1876 plugin_type_properties_sp.reset (new OptionValueProperties (plugin_type_name));
1877 plugin_properties_sp->AppendProperty (plugin_type_name,
1878 plugin_type_desc,
1879 true,
1880 plugin_type_properties_sp);
1881 }
1882 return plugin_type_properties_sp;
1883 }
1884 }
1885 return lldb::OptionValuePropertiesSP();
1886}
1887
Jason Molenda3b59f5c2013-04-05 22:40:42 +00001888// This is the preferred new way to register plugin specific settings. e.g.
1889// "platform.plugin.darwin-kernel.SETTINGNAME"
1890// and Platform generic settings would be under "platform.SETTINGNAME".
1891static lldb::OptionValuePropertiesSP
1892GetDebuggerPropertyForPlugins (Debugger &debugger,
1893 const ConstString &plugin_type_name,
1894 const ConstString &plugin_type_desc,
1895 bool can_create)
1896{
1897 static ConstString g_property_name("plugin");
1898 lldb::OptionValuePropertiesSP parent_properties_sp (debugger.GetValueProperties());
1899 if (parent_properties_sp)
1900 {
1901 OptionValuePropertiesSP plugin_properties_sp = parent_properties_sp->GetSubProperty (NULL, plugin_type_name);
1902 if (!plugin_properties_sp && can_create)
1903 {
1904 plugin_properties_sp.reset (new OptionValueProperties (plugin_type_name));
1905 parent_properties_sp->AppendProperty (plugin_type_name,
1906 plugin_type_desc,
1907 true,
1908 plugin_properties_sp);
1909 }
1910
1911 if (plugin_properties_sp)
1912 {
1913 lldb::OptionValuePropertiesSP plugin_type_properties_sp = plugin_properties_sp->GetSubProperty (NULL, g_property_name);
1914 if (!plugin_type_properties_sp && can_create)
1915 {
1916 plugin_type_properties_sp.reset (new OptionValueProperties (g_property_name));
1917 plugin_properties_sp->AppendProperty (g_property_name,
1918 ConstString("Settings specific to plugins"),
1919 true,
1920 plugin_type_properties_sp);
1921 }
1922 return plugin_type_properties_sp;
1923 }
1924 }
1925 return lldb::OptionValuePropertiesSP();
1926}
1927
1928
Greg Claytone8cd0c92012-10-19 18:02:49 +00001929lldb::OptionValuePropertiesSP
1930PluginManager::GetSettingForDynamicLoaderPlugin (Debugger &debugger, const ConstString &setting_name)
1931{
1932 lldb::OptionValuePropertiesSP properties_sp;
Jason Molenda3b59f5c2013-04-05 22:40:42 +00001933 lldb::OptionValuePropertiesSP plugin_type_properties_sp (GetDebuggerPropertyForPluginsOldStyle (debugger,
Greg Claytone8cd0c92012-10-19 18:02:49 +00001934 ConstString("dynamic-loader"),
1935 ConstString(), // not creating to so we don't need the description
1936 false));
1937 if (plugin_type_properties_sp)
1938 properties_sp = plugin_type_properties_sp->GetSubProperty (NULL, setting_name);
1939 return properties_sp;
1940}
1941
1942bool
1943PluginManager::CreateSettingForDynamicLoaderPlugin (Debugger &debugger,
1944 const lldb::OptionValuePropertiesSP &properties_sp,
1945 const ConstString &description,
1946 bool is_global_property)
1947{
1948 if (properties_sp)
1949 {
Jason Molenda3b59f5c2013-04-05 22:40:42 +00001950 lldb::OptionValuePropertiesSP plugin_type_properties_sp (GetDebuggerPropertyForPluginsOldStyle (debugger,
Greg Claytone8cd0c92012-10-19 18:02:49 +00001951 ConstString("dynamic-loader"),
1952 ConstString("Settings for dynamic loader plug-ins"),
1953 true));
1954 if (plugin_type_properties_sp)
1955 {
1956 plugin_type_properties_sp->AppendProperty (properties_sp->GetName(),
1957 description,
1958 is_global_property,
1959 properties_sp);
1960 return true;
1961 }
1962 }
1963 return false;
1964}
1965
Jason Molenda9b837a12013-04-05 05:06:39 +00001966
1967lldb::OptionValuePropertiesSP
1968PluginManager::GetSettingForPlatformPlugin (Debugger &debugger, const ConstString &setting_name)
1969{
1970 lldb::OptionValuePropertiesSP properties_sp;
1971 lldb::OptionValuePropertiesSP plugin_type_properties_sp (GetDebuggerPropertyForPlugins (debugger,
1972 ConstString("platform"),
1973 ConstString(), // not creating to so we don't need the description
1974 false));
1975 if (plugin_type_properties_sp)
1976 properties_sp = plugin_type_properties_sp->GetSubProperty (NULL, setting_name);
1977 return properties_sp;
1978}
1979
1980bool
1981PluginManager::CreateSettingForPlatformPlugin (Debugger &debugger,
1982 const lldb::OptionValuePropertiesSP &properties_sp,
1983 const ConstString &description,
1984 bool is_global_property)
1985{
1986 if (properties_sp)
1987 {
1988 lldb::OptionValuePropertiesSP plugin_type_properties_sp (GetDebuggerPropertyForPlugins (debugger,
1989 ConstString("platform"),
1990 ConstString("Settings for platform plug-ins"),
1991 true));
1992 if (plugin_type_properties_sp)
1993 {
1994 plugin_type_properties_sp->AppendProperty (properties_sp->GetName(),
1995 description,
1996 is_global_property,
1997 properties_sp);
1998 return true;
1999 }
2000 }
2001 return false;
2002}
2003