blob: 0a4b21fd40951c2065faba8a53440a2327844532 [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(),
1232 create_callback(NULL)
1233 {
1234 }
Greg Claytone996fd32011-03-08 22:40:15 +00001235
1236 std::string name;
1237 std::string description;
1238 PlatformCreateInstance create_callback;
1239};
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001240
Greg Claytone996fd32011-03-08 22:40:15 +00001241typedef std::vector<PlatformInstance> PlatformInstances;
1242
Greg Claytonded470d2011-03-19 01:12:21 +00001243static Mutex &
1244GetPlatformInstancesMutex ()
Greg Claytone996fd32011-03-08 22:40:15 +00001245{
Greg Claytonded470d2011-03-19 01:12:21 +00001246 static Mutex g_platform_instances_mutex (Mutex::eMutexTypeRecursive);
1247 return g_platform_instances_mutex;
Greg Claytone996fd32011-03-08 22:40:15 +00001248}
1249
Greg Claytonded470d2011-03-19 01:12:21 +00001250static PlatformInstances &
1251GetPlatformInstances ()
1252{
1253 static PlatformInstances g_platform_instances;
1254 return g_platform_instances;
1255}
Greg Claytone996fd32011-03-08 22:40:15 +00001256
Greg Claytonab65b342011-04-13 22:47:15 +00001257
Greg Claytone996fd32011-03-08 22:40:15 +00001258bool
1259PluginManager::RegisterPlugin (const char *name,
1260 const char *description,
1261 PlatformCreateInstance create_callback)
1262{
1263 if (create_callback)
1264 {
Greg Claytonded470d2011-03-19 01:12:21 +00001265 Mutex::Locker locker (GetPlatformInstancesMutex ());
1266
Greg Claytone996fd32011-03-08 22:40:15 +00001267 PlatformInstance instance;
1268 assert (name && name[0]);
1269 instance.name = name;
1270 if (description && description[0])
1271 instance.description = description;
1272 instance.create_callback = create_callback;
Greg Claytonded470d2011-03-19 01:12:21 +00001273 GetPlatformInstances ().push_back (instance);
1274 return true;
Greg Claytone996fd32011-03-08 22:40:15 +00001275 }
1276 return false;
1277}
1278
1279const char *
1280PluginManager::GetPlatformPluginNameAtIndex (uint32_t idx)
1281{
Greg Claytonded470d2011-03-19 01:12:21 +00001282 Mutex::Locker locker (GetPlatformInstancesMutex ());
Greg Claytonab65b342011-04-13 22:47:15 +00001283 PlatformInstances &instances = GetPlatformInstances ();
1284 if (idx < instances.size())
1285 return instances[idx].name.c_str();
Greg Claytone996fd32011-03-08 22:40:15 +00001286 return NULL;
1287}
1288
1289const char *
1290PluginManager::GetPlatformPluginDescriptionAtIndex (uint32_t idx)
1291{
Greg Claytonded470d2011-03-19 01:12:21 +00001292 Mutex::Locker locker (GetPlatformInstancesMutex ());
Greg Claytonab65b342011-04-13 22:47:15 +00001293 PlatformInstances &instances = GetPlatformInstances ();
1294 if (idx < instances.size())
1295 return instances[idx].description.c_str();
Greg Claytone996fd32011-03-08 22:40:15 +00001296 return NULL;
1297}
1298
1299bool
1300PluginManager::UnregisterPlugin (PlatformCreateInstance create_callback)
1301{
1302 if (create_callback)
1303 {
Greg Claytonded470d2011-03-19 01:12:21 +00001304 Mutex::Locker locker (GetPlatformInstancesMutex ());
Greg Claytonab65b342011-04-13 22:47:15 +00001305 PlatformInstances &instances = GetPlatformInstances ();
Greg Claytonded470d2011-03-19 01:12:21 +00001306
Greg Claytonab65b342011-04-13 22:47:15 +00001307 PlatformInstances::iterator pos, end = instances.end();
1308 for (pos = instances.begin(); pos != end; ++ pos)
Greg Claytonded470d2011-03-19 01:12:21 +00001309 {
1310 if (pos->create_callback == create_callback)
1311 {
Greg Claytonab65b342011-04-13 22:47:15 +00001312 instances.erase(pos);
Greg Claytonded470d2011-03-19 01:12:21 +00001313 return true;
1314 }
1315 }
Greg Claytone996fd32011-03-08 22:40:15 +00001316 }
1317 return false;
1318}
1319
1320PlatformCreateInstance
1321PluginManager::GetPlatformCreateCallbackAtIndex (uint32_t idx)
1322{
Greg Claytonded470d2011-03-19 01:12:21 +00001323 Mutex::Locker locker (GetPlatformInstancesMutex ());
Greg Claytonab65b342011-04-13 22:47:15 +00001324 PlatformInstances &instances = GetPlatformInstances ();
1325 if (idx < instances.size())
1326 return instances[idx].create_callback;
Greg Claytone996fd32011-03-08 22:40:15 +00001327 return NULL;
1328}
1329
1330PlatformCreateInstance
1331PluginManager::GetPlatformCreateCallbackForPluginName (const char *name)
1332{
1333 if (name && name[0])
1334 {
Greg Claytonded470d2011-03-19 01:12:21 +00001335 Mutex::Locker locker (GetPlatformInstancesMutex ());
Greg Claytonab65b342011-04-13 22:47:15 +00001336 PlatformInstances &instances = GetPlatformInstances ();
1337 llvm::StringRef name_sref(name);
Greg Claytonded470d2011-03-19 01:12:21 +00001338
Greg Claytonab65b342011-04-13 22:47:15 +00001339 PlatformInstances::iterator pos, end = instances.end();
1340 for (pos = instances.begin(); pos != end; ++ pos)
Greg Claytone996fd32011-03-08 22:40:15 +00001341 {
Greg Clayton7260f622011-04-18 08:33:37 +00001342 if (name_sref.equals (pos->name))
Greg Claytonded470d2011-03-19 01:12:21 +00001343 return pos->create_callback;
Greg Claytone996fd32011-03-08 22:40:15 +00001344 }
1345 }
1346 return NULL;
1347}
1348
Greg Claytonab65b342011-04-13 22:47:15 +00001349uint32_t
1350PluginManager::AutoCompletePlatformName (const char *name, StringList &matches)
1351{
1352 if (name && name[0])
1353 {
1354 Mutex::Locker locker (GetPlatformInstancesMutex ());
1355 PlatformInstances &instances = GetPlatformInstances ();
1356 llvm::StringRef name_sref(name);
1357
1358 PlatformInstances::iterator pos, end = instances.end();
1359 for (pos = instances.begin(); pos != end; ++ pos)
1360 {
Greg Clayton7260f622011-04-18 08:33:37 +00001361 llvm::StringRef plugin_name (pos->name);
1362 if (plugin_name.startswith(name_sref))
1363 matches.AppendString (plugin_name.data());
Greg Claytonab65b342011-04-13 22:47:15 +00001364 }
1365 }
1366 return matches.GetSize();
1367}
1368
Greg Claytone996fd32011-03-08 22:40:15 +00001369#pragma mark Process
1370
1371struct ProcessInstance
1372{
1373 ProcessInstance() :
1374 name(),
1375 description(),
1376 create_callback(NULL)
1377 {
1378 }
1379
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001380 std::string name;
1381 std::string description;
1382 ProcessCreateInstance create_callback;
1383};
1384
1385typedef std::vector<ProcessInstance> ProcessInstances;
1386
Greg Claytonab65b342011-04-13 22:47:15 +00001387static Mutex &
1388GetProcessMutex ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001389{
Greg Claytonab65b342011-04-13 22:47:15 +00001390 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
1391 return g_instances_mutex;
1392}
1393
1394static ProcessInstances &
1395GetProcessInstances ()
1396{
1397 static ProcessInstances g_instances;
1398 return g_instances;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001399}
1400
1401
1402bool
1403PluginManager::RegisterPlugin
1404(
Greg Claytone996fd32011-03-08 22:40:15 +00001405 const char *name,
1406 const char *description,
1407 ProcessCreateInstance create_callback
1408 )
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001409{
1410 if (create_callback)
1411 {
1412 ProcessInstance instance;
1413 assert (name && name[0]);
1414 instance.name = name;
1415 if (description && description[0])
1416 instance.description = description;
1417 instance.create_callback = create_callback;
Greg Claytonab65b342011-04-13 22:47:15 +00001418 Mutex::Locker locker (GetProcessMutex ());
1419 GetProcessInstances ().push_back (instance);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001420 }
1421 return false;
1422}
1423
Greg Claytonbfe5f3b2011-02-18 01:44:25 +00001424const char *
1425PluginManager::GetProcessPluginNameAtIndex (uint32_t idx)
1426{
Greg Claytonab65b342011-04-13 22:47:15 +00001427 Mutex::Locker locker (GetProcessMutex ());
1428 ProcessInstances &instances = GetProcessInstances ();
1429 if (idx < instances.size())
1430 return instances[idx].name.c_str();
Greg Claytonbfe5f3b2011-02-18 01:44:25 +00001431 return NULL;
1432}
1433
1434const char *
1435PluginManager::GetProcessPluginDescriptionAtIndex (uint32_t idx)
1436{
Greg Claytonab65b342011-04-13 22:47:15 +00001437 Mutex::Locker locker (GetProcessMutex ());
1438 ProcessInstances &instances = GetProcessInstances ();
1439 if (idx < instances.size())
1440 return instances[idx].description.c_str();
Greg Claytonbfe5f3b2011-02-18 01:44:25 +00001441 return NULL;
1442}
1443
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001444bool
1445PluginManager::UnregisterPlugin (ProcessCreateInstance create_callback)
1446{
1447 if (create_callback)
1448 {
Greg Claytonab65b342011-04-13 22:47:15 +00001449 Mutex::Locker locker (GetProcessMutex ());
1450 ProcessInstances &instances = GetProcessInstances ();
1451
1452 ProcessInstances::iterator pos, end = instances.end();
1453 for (pos = instances.begin(); pos != end; ++ pos)
1454 {
1455 if (pos->create_callback == create_callback)
1456 {
1457 instances.erase(pos);
1458 return true;
1459 }
1460 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001461 }
1462 return false;
1463}
1464
1465ProcessCreateInstance
1466PluginManager::GetProcessCreateCallbackAtIndex (uint32_t idx)
1467{
Greg Claytonab65b342011-04-13 22:47:15 +00001468 Mutex::Locker locker (GetProcessMutex ());
1469 ProcessInstances &instances = GetProcessInstances ();
1470 if (idx < instances.size())
1471 return instances[idx].create_callback;
Jason Molenda743e86a2010-06-11 23:44:18 +00001472 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001473}
1474
Greg Claytonab65b342011-04-13 22:47:15 +00001475
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001476ProcessCreateInstance
1477PluginManager::GetProcessCreateCallbackForPluginName (const char *name)
1478{
1479 if (name && name[0])
1480 {
Greg Claytonab65b342011-04-13 22:47:15 +00001481 llvm::StringRef name_sref(name);
1482 Mutex::Locker locker (GetProcessMutex ());
1483 ProcessInstances &instances = GetProcessInstances ();
1484
1485 ProcessInstances::iterator pos, end = instances.end();
1486 for (pos = instances.begin(); pos != end; ++ pos)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001487 {
Greg Claytonab65b342011-04-13 22:47:15 +00001488 if (name_sref.equals (pos->name))
1489 return pos->create_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001490 }
1491 }
1492 return NULL;
1493}
1494
1495#pragma mark SymbolFile
1496
Jason Molenda743e86a2010-06-11 23:44:18 +00001497struct SymbolFileInstance
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001498{
1499 SymbolFileInstance() :
1500 name(),
1501 description(),
1502 create_callback(NULL)
1503 {
1504 }
1505
1506 std::string name;
1507 std::string description;
1508 SymbolFileCreateInstance create_callback;
1509};
1510
1511typedef std::vector<SymbolFileInstance> SymbolFileInstances;
1512
Greg Claytonab65b342011-04-13 22:47:15 +00001513static Mutex &
1514GetSymbolFileMutex ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001515{
Greg Claytonab65b342011-04-13 22:47:15 +00001516 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
1517 return g_instances_mutex;
1518}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001519
Greg Claytonab65b342011-04-13 22:47:15 +00001520static SymbolFileInstances &
1521GetSymbolFileInstances ()
1522{
1523 static SymbolFileInstances g_instances;
1524 return g_instances;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001525}
1526
1527
1528bool
1529PluginManager::RegisterPlugin
1530(
1531 const char *name,
1532 const char *description,
1533 SymbolFileCreateInstance create_callback
1534)
1535{
1536 if (create_callback)
1537 {
1538 SymbolFileInstance instance;
1539 assert (name && name[0]);
1540 instance.name = name;
1541 if (description && description[0])
1542 instance.description = description;
1543 instance.create_callback = create_callback;
Greg Claytonab65b342011-04-13 22:47:15 +00001544 Mutex::Locker locker (GetSymbolFileMutex ());
1545 GetSymbolFileInstances ().push_back (instance);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001546 }
1547 return false;
1548}
1549
1550bool
1551PluginManager::UnregisterPlugin (SymbolFileCreateInstance create_callback)
1552{
1553 if (create_callback)
1554 {
Greg Claytonab65b342011-04-13 22:47:15 +00001555 Mutex::Locker locker (GetSymbolFileMutex ());
1556 SymbolFileInstances &instances = GetSymbolFileInstances ();
1557
1558 SymbolFileInstances::iterator pos, end = instances.end();
1559 for (pos = instances.begin(); pos != end; ++ pos)
1560 {
1561 if (pos->create_callback == create_callback)
1562 {
1563 instances.erase(pos);
1564 return true;
1565 }
1566 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001567 }
1568 return false;
1569}
1570
1571SymbolFileCreateInstance
1572PluginManager::GetSymbolFileCreateCallbackAtIndex (uint32_t idx)
1573{
Greg Claytonab65b342011-04-13 22:47:15 +00001574 Mutex::Locker locker (GetSymbolFileMutex ());
1575 SymbolFileInstances &instances = GetSymbolFileInstances ();
1576 if (idx < instances.size())
1577 return instances[idx].create_callback;
Jason Molenda743e86a2010-06-11 23:44:18 +00001578 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001579}
Greg Claytonab65b342011-04-13 22:47:15 +00001580
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001581SymbolFileCreateInstance
1582PluginManager::GetSymbolFileCreateCallbackForPluginName (const char *name)
1583{
1584 if (name && name[0])
1585 {
Greg Claytonab65b342011-04-13 22:47:15 +00001586 llvm::StringRef name_sref(name);
1587 Mutex::Locker locker (GetSymbolFileMutex ());
1588 SymbolFileInstances &instances = GetSymbolFileInstances ();
1589
1590 SymbolFileInstances::iterator pos, end = instances.end();
1591 for (pos = instances.begin(); pos != end; ++ pos)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001592 {
Greg Claytonab65b342011-04-13 22:47:15 +00001593 if (name_sref.equals (pos->name))
1594 return pos->create_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001595 }
1596 }
1597 return NULL;
1598}
1599
1600
1601
1602#pragma mark SymbolVendor
1603
Jason Molenda743e86a2010-06-11 23:44:18 +00001604struct SymbolVendorInstance
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001605{
1606 SymbolVendorInstance() :
1607 name(),
1608 description(),
1609 create_callback(NULL)
1610 {
1611 }
1612
1613 std::string name;
1614 std::string description;
1615 SymbolVendorCreateInstance create_callback;
1616};
1617
1618typedef std::vector<SymbolVendorInstance> SymbolVendorInstances;
1619
Greg Claytonab65b342011-04-13 22:47:15 +00001620static Mutex &
1621GetSymbolVendorMutex ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001622{
Greg Claytonab65b342011-04-13 22:47:15 +00001623 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
1624 return g_instances_mutex;
1625}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001626
Greg Claytonab65b342011-04-13 22:47:15 +00001627static SymbolVendorInstances &
1628GetSymbolVendorInstances ()
1629{
1630 static SymbolVendorInstances g_instances;
1631 return g_instances;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001632}
1633
1634bool
1635PluginManager::RegisterPlugin
1636(
1637 const char *name,
1638 const char *description,
1639 SymbolVendorCreateInstance create_callback
1640)
1641{
1642 if (create_callback)
1643 {
1644 SymbolVendorInstance instance;
1645 assert (name && name[0]);
1646 instance.name = name;
1647 if (description && description[0])
1648 instance.description = description;
1649 instance.create_callback = create_callback;
Greg Claytonab65b342011-04-13 22:47:15 +00001650 Mutex::Locker locker (GetSymbolVendorMutex ());
1651 GetSymbolVendorInstances ().push_back (instance);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001652 }
1653 return false;
1654}
1655
1656bool
1657PluginManager::UnregisterPlugin (SymbolVendorCreateInstance create_callback)
1658{
1659 if (create_callback)
1660 {
Greg Claytonab65b342011-04-13 22:47:15 +00001661 Mutex::Locker locker (GetSymbolVendorMutex ());
1662 SymbolVendorInstances &instances = GetSymbolVendorInstances ();
1663
1664 SymbolVendorInstances::iterator pos, end = instances.end();
1665 for (pos = instances.begin(); pos != end; ++ pos)
1666 {
1667 if (pos->create_callback == create_callback)
1668 {
1669 instances.erase(pos);
1670 return true;
1671 }
1672 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001673 }
1674 return false;
1675}
1676
1677SymbolVendorCreateInstance
1678PluginManager::GetSymbolVendorCreateCallbackAtIndex (uint32_t idx)
1679{
Greg Claytonab65b342011-04-13 22:47:15 +00001680 Mutex::Locker locker (GetSymbolVendorMutex ());
1681 SymbolVendorInstances &instances = GetSymbolVendorInstances ();
1682 if (idx < instances.size())
1683 return instances[idx].create_callback;
Jason Molenda743e86a2010-06-11 23:44:18 +00001684 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001685}
1686
Greg Claytonab65b342011-04-13 22:47:15 +00001687
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001688SymbolVendorCreateInstance
1689PluginManager::GetSymbolVendorCreateCallbackForPluginName (const char *name)
1690{
1691 if (name && name[0])
1692 {
Greg Claytonab65b342011-04-13 22:47:15 +00001693 llvm::StringRef name_sref(name);
1694 Mutex::Locker locker (GetSymbolVendorMutex ());
1695 SymbolVendorInstances &instances = GetSymbolVendorInstances ();
1696
1697 SymbolVendorInstances::iterator pos, end = instances.end();
1698 for (pos = instances.begin(); pos != end; ++ pos)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001699 {
Greg Claytonab65b342011-04-13 22:47:15 +00001700 if (name_sref.equals (pos->name))
1701 return pos->create_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001702 }
1703 }
1704 return NULL;
1705}
1706
1707
Greg Clayton7be25422011-04-25 21:14:26 +00001708#pragma mark UnwindAssembly
Jason Molendafbcb7f22010-09-10 07:49:16 +00001709
Greg Clayton7be25422011-04-25 21:14:26 +00001710struct UnwindAssemblyInstance
Jason Molendafbcb7f22010-09-10 07:49:16 +00001711{
Greg Clayton7be25422011-04-25 21:14:26 +00001712 UnwindAssemblyInstance() :
Jason Molendafbcb7f22010-09-10 07:49:16 +00001713 name(),
1714 description(),
1715 create_callback(NULL)
1716 {
1717 }
1718
1719 std::string name;
1720 std::string description;
Greg Clayton7be25422011-04-25 21:14:26 +00001721 UnwindAssemblyCreateInstance create_callback;
Jason Molendafbcb7f22010-09-10 07:49:16 +00001722};
1723
Greg Clayton7be25422011-04-25 21:14:26 +00001724typedef std::vector<UnwindAssemblyInstance> UnwindAssemblyInstances;
Jason Molendafbcb7f22010-09-10 07:49:16 +00001725
Greg Claytonab65b342011-04-13 22:47:15 +00001726static Mutex &
Greg Clayton7be25422011-04-25 21:14:26 +00001727GetUnwindAssemblyMutex ()
Jason Molendafbcb7f22010-09-10 07:49:16 +00001728{
Greg Claytonab65b342011-04-13 22:47:15 +00001729 static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive);
1730 return g_instances_mutex;
1731}
Jason Molendafbcb7f22010-09-10 07:49:16 +00001732
Greg Clayton7be25422011-04-25 21:14:26 +00001733static UnwindAssemblyInstances &
1734GetUnwindAssemblyInstances ()
Greg Claytonab65b342011-04-13 22:47:15 +00001735{
Greg Clayton7be25422011-04-25 21:14:26 +00001736 static UnwindAssemblyInstances g_instances;
Greg Claytonab65b342011-04-13 22:47:15 +00001737 return g_instances;
Jason Molendafbcb7f22010-09-10 07:49:16 +00001738}
1739
1740bool
1741PluginManager::RegisterPlugin
1742(
1743 const char *name,
1744 const char *description,
Greg Clayton7be25422011-04-25 21:14:26 +00001745 UnwindAssemblyCreateInstance create_callback
Jason Molendafbcb7f22010-09-10 07:49:16 +00001746)
1747{
1748 if (create_callback)
1749 {
Greg Clayton7be25422011-04-25 21:14:26 +00001750 UnwindAssemblyInstance instance;
Jason Molendafbcb7f22010-09-10 07:49:16 +00001751 assert (name && name[0]);
1752 instance.name = name;
1753 if (description && description[0])
1754 instance.description = description;
1755 instance.create_callback = create_callback;
Greg Clayton7be25422011-04-25 21:14:26 +00001756 Mutex::Locker locker (GetUnwindAssemblyMutex ());
1757 GetUnwindAssemblyInstances ().push_back (instance);
Jason Molendafbcb7f22010-09-10 07:49:16 +00001758 }
1759 return false;
1760}
1761
1762bool
Greg Clayton7be25422011-04-25 21:14:26 +00001763PluginManager::UnregisterPlugin (UnwindAssemblyCreateInstance create_callback)
Jason Molendafbcb7f22010-09-10 07:49:16 +00001764{
1765 if (create_callback)
1766 {
Greg Clayton7be25422011-04-25 21:14:26 +00001767 Mutex::Locker locker (GetUnwindAssemblyMutex ());
1768 UnwindAssemblyInstances &instances = GetUnwindAssemblyInstances ();
Greg Claytonab65b342011-04-13 22:47:15 +00001769
Greg Clayton7be25422011-04-25 21:14:26 +00001770 UnwindAssemblyInstances::iterator pos, end = instances.end();
Greg Claytonab65b342011-04-13 22:47:15 +00001771 for (pos = instances.begin(); pos != end; ++ pos)
1772 {
1773 if (pos->create_callback == create_callback)
1774 {
1775 instances.erase(pos);
1776 return true;
1777 }
1778 }
Jason Molendafbcb7f22010-09-10 07:49:16 +00001779 }
1780 return false;
1781}
1782
Greg Clayton7be25422011-04-25 21:14:26 +00001783UnwindAssemblyCreateInstance
1784PluginManager::GetUnwindAssemblyCreateCallbackAtIndex (uint32_t idx)
Jason Molendafbcb7f22010-09-10 07:49:16 +00001785{
Greg Clayton7be25422011-04-25 21:14:26 +00001786 Mutex::Locker locker (GetUnwindAssemblyMutex ());
1787 UnwindAssemblyInstances &instances = GetUnwindAssemblyInstances ();
Greg Claytonab65b342011-04-13 22:47:15 +00001788 if (idx < instances.size())
1789 return instances[idx].create_callback;
Jason Molendafbcb7f22010-09-10 07:49:16 +00001790 return NULL;
1791}
1792
Greg Claytonab65b342011-04-13 22:47:15 +00001793
Greg Clayton7be25422011-04-25 21:14:26 +00001794UnwindAssemblyCreateInstance
1795PluginManager::GetUnwindAssemblyCreateCallbackForPluginName (const char *name)
Jason Molendafbcb7f22010-09-10 07:49:16 +00001796{
1797 if (name && name[0])
1798 {
Greg Claytonab65b342011-04-13 22:47:15 +00001799 llvm::StringRef name_sref(name);
Greg Clayton7be25422011-04-25 21:14:26 +00001800 Mutex::Locker locker (GetUnwindAssemblyMutex ());
1801 UnwindAssemblyInstances &instances = GetUnwindAssemblyInstances ();
Greg Claytonab65b342011-04-13 22:47:15 +00001802
Greg Clayton7be25422011-04-25 21:14:26 +00001803 UnwindAssemblyInstances::iterator pos, end = instances.end();
Greg Claytonab65b342011-04-13 22:47:15 +00001804 for (pos = instances.begin(); pos != end; ++ pos)
Jason Molendafbcb7f22010-09-10 07:49:16 +00001805 {
Greg Claytonab65b342011-04-13 22:47:15 +00001806 if (name_sref.equals (pos->name))
1807 return pos->create_callback;
Jason Molendafbcb7f22010-09-10 07:49:16 +00001808 }
1809 }
1810 return NULL;
1811}
1812
Greg Claytone8cd0c92012-10-19 18:02:49 +00001813void
1814PluginManager::DebuggerInitialize (Debugger &debugger)
1815{
1816 Mutex::Locker locker (GetDynamicLoaderMutex ());
1817 DynamicLoaderInstances &instances = GetDynamicLoaderInstances ();
1818
1819 DynamicLoaderInstances::iterator pos, end = instances.end();
1820 for (pos = instances.begin(); pos != end; ++ pos)
1821 {
1822 if (pos->debugger_init_callback)
1823 pos->debugger_init_callback (debugger);
1824 }
1825}
1826
1827static lldb::OptionValuePropertiesSP
1828GetDebuggerPropertyForPlugins (Debugger &debugger,
1829 const ConstString &plugin_type_name,
1830 const ConstString &plugin_type_desc,
1831 bool can_create)
1832{
1833 lldb::OptionValuePropertiesSP parent_properties_sp (debugger.GetValueProperties());
1834 if (parent_properties_sp)
1835 {
1836 static ConstString g_property_name("plugin");
1837
1838 OptionValuePropertiesSP plugin_properties_sp = parent_properties_sp->GetSubProperty (NULL, g_property_name);
1839 if (!plugin_properties_sp && can_create)
1840 {
1841 plugin_properties_sp.reset (new OptionValueProperties (g_property_name));
1842 parent_properties_sp->AppendProperty (g_property_name,
1843 ConstString("Settings specify to plugins."),
1844 true,
1845 plugin_properties_sp);
1846 }
1847
1848 if (plugin_properties_sp)
1849 {
1850 lldb::OptionValuePropertiesSP plugin_type_properties_sp = plugin_properties_sp->GetSubProperty (NULL, plugin_type_name);
1851 if (!plugin_type_properties_sp && can_create)
1852 {
1853 plugin_type_properties_sp.reset (new OptionValueProperties (plugin_type_name));
1854 plugin_properties_sp->AppendProperty (plugin_type_name,
1855 plugin_type_desc,
1856 true,
1857 plugin_type_properties_sp);
1858 }
1859 return plugin_type_properties_sp;
1860 }
1861 }
1862 return lldb::OptionValuePropertiesSP();
1863}
1864
1865lldb::OptionValuePropertiesSP
1866PluginManager::GetSettingForDynamicLoaderPlugin (Debugger &debugger, const ConstString &setting_name)
1867{
1868 lldb::OptionValuePropertiesSP properties_sp;
1869 lldb::OptionValuePropertiesSP plugin_type_properties_sp (GetDebuggerPropertyForPlugins (debugger,
1870 ConstString("dynamic-loader"),
1871 ConstString(), // not creating to so we don't need the description
1872 false));
1873 if (plugin_type_properties_sp)
1874 properties_sp = plugin_type_properties_sp->GetSubProperty (NULL, setting_name);
1875 return properties_sp;
1876}
1877
1878bool
1879PluginManager::CreateSettingForDynamicLoaderPlugin (Debugger &debugger,
1880 const lldb::OptionValuePropertiesSP &properties_sp,
1881 const ConstString &description,
1882 bool is_global_property)
1883{
1884 if (properties_sp)
1885 {
1886 lldb::OptionValuePropertiesSP plugin_type_properties_sp (GetDebuggerPropertyForPlugins (debugger,
1887 ConstString("dynamic-loader"),
1888 ConstString("Settings for dynamic loader plug-ins"),
1889 true));
1890 if (plugin_type_properties_sp)
1891 {
1892 plugin_type_properties_sp->AppendProperty (properties_sp->GetName(),
1893 description,
1894 is_global_property,
1895 properties_sp);
1896 return true;
1897 }
1898 }
1899 return false;
1900}
1901