diff options
author | Greg Clayton <gclayton@apple.com> | 2011-04-13 22:47:15 +0000 |
---|---|---|
committer | Greg Clayton <gclayton@apple.com> | 2011-04-13 22:47:15 +0000 |
commit | ab65b34fdc9369f065ee5da8c06e6c007a26e94b (patch) | |
tree | 0eb32c4363a98fb24f2a9e5a7481d3cf831c6fee /lldb/source | |
parent | a7773f719ec0d68e08a014cb6b229e7533f22ee2 (diff) | |
download | bcm5719-llvm-ab65b34fdc9369f065ee5da8c06e6c007a26e94b.tar.gz bcm5719-llvm-ab65b34fdc9369f065ee5da8c06e6c007a26e94b.zip |
Added auto completion for architecture names and for platforms.
Modified the OptionGroupOptions to be able to specify only some of the options
that should be appended by using the usage_mask in the group defintions and
also provided a way to remap them to a new usage mask after the copy. This
allows options to be re-used and also targetted for specific option groups.
Modfied the CommandArgumentType to have a new eArgTypePlatform enumeration.
Taught the option parser to be able to automatically use the appropriate
auto completion for a given options if nothing is explicitly specified
in the option definition. So you don't have to specify it in the option
definition tables.
Renamed the default host platform name to "host", and the default platform
hostname to be "localhost".
Modified the "file" and "platform select" commands to make sure all options
and args are good prior to creating a new platform. Also defer the computation
of the architecture in the file command until all options are parsed and the
platform has either not been specified or reset to a new value to avoid
computing the arch more than once.
Switch the PluginManager code over to using llvm::StringRef for string
comparisons and got rid of all the AccessorXXX functions in lieu of the newer
mutex + collection singleton accessors.
llvm-svn: 129483
Diffstat (limited to 'lldb/source')
-rw-r--r-- | lldb/source/Commands/CommandCompletions.cpp | 33 | ||||
-rw-r--r-- | lldb/source/Commands/CommandObjectFile.cpp | 83 | ||||
-rw-r--r-- | lldb/source/Commands/CommandObjectFile.h | 60 | ||||
-rw-r--r-- | lldb/source/Commands/CommandObjectLog.cpp | 37 | ||||
-rw-r--r-- | lldb/source/Commands/CommandObjectPlatform.cpp | 81 | ||||
-rw-r--r-- | lldb/source/Commands/CommandObjectPlatform.h | 15 | ||||
-rw-r--r-- | lldb/source/Core/ArchSpec.cpp | 30 | ||||
-rw-r--r-- | lldb/source/Core/Log.cpp | 27 | ||||
-rw-r--r-- | lldb/source/Core/PluginManager.cpp | 1257 | ||||
-rw-r--r-- | lldb/source/Interpreter/CommandObject.cpp | 3 | ||||
-rw-r--r-- | lldb/source/Interpreter/Options.cpp | 93 | ||||
-rw-r--r-- | lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.cpp | 2 | ||||
-rw-r--r-- | lldb/source/Plugins/Platform/gdb-server/PlatformRemoteGDBServer.cpp | 2 | ||||
-rw-r--r-- | lldb/source/Plugins/SymbolFile/DWARF/LogChannelDWARF.cpp | 9 | ||||
-rw-r--r-- | lldb/source/Target/Platform.cpp | 14 |
15 files changed, 836 insertions, 910 deletions
diff --git a/lldb/source/Commands/CommandCompletions.cpp b/lldb/source/Commands/CommandCompletions.cpp index fcfc29b4e88..e57a8b41685 100644 --- a/lldb/source/Commands/CommandCompletions.cpp +++ b/lldb/source/Commands/CommandCompletions.cpp @@ -20,6 +20,7 @@ // Project includes #include "lldb/Host/FileSpec.h" #include "lldb/Core/FileSpecList.h" +#include "lldb/Core/PluginManager.h" #include "lldb/Interpreter/Args.h" #include "lldb/Interpreter/CommandCompletions.h" #include "lldb/Interpreter/CommandInterpreter.h" @@ -38,6 +39,8 @@ CommandCompletions::g_common_completions[] = {eSymbolCompletion, CommandCompletions::Symbols}, {eModuleCompletion, CommandCompletions::Modules}, {eSettingsNameCompletion, CommandCompletions::SettingsNames}, + {ePlatformPluginCompletion, CommandCompletions::PlatformPluginNames}, + {eArchitectureCompletion, CommandCompletions::ArchitectureNames}, {eNoCompletion, NULL} // This one has to be last in the list. }; @@ -413,6 +416,36 @@ CommandCompletions::SettingsNames (CommandInterpreter &interpreter, //return matches.GetSize(); } + +int +CommandCompletions::PlatformPluginNames (CommandInterpreter &interpreter, + const char *partial_name, + int match_start_point, + int max_return_elements, + SearchFilter *searcher, + bool &word_complete, + lldb_private::StringList &matches) +{ + const uint32_t num_matches = PluginManager::AutoCompletePlatformName(partial_name, matches); + word_complete = num_matches == 1; + return num_matches; +} + +int +CommandCompletions::ArchitectureNames (CommandInterpreter &interpreter, + const char *partial_name, + int match_start_point, + int max_return_elements, + SearchFilter *searcher, + bool &word_complete, + lldb_private::StringList &matches) +{ + const uint32_t num_matches = ArchSpec::AutoComplete (partial_name, matches); + word_complete = num_matches == 1; + return num_matches; +} + + CommandCompletions::Completer::Completer ( CommandInterpreter &interpreter, diff --git a/lldb/source/Commands/CommandObjectFile.cpp b/lldb/source/Commands/CommandObjectFile.cpp index 372baf9e822..563cbe298dc 100644 --- a/lldb/source/Commands/CommandObjectFile.cpp +++ b/lldb/source/Commands/CommandObjectFile.cpp @@ -26,7 +26,6 @@ using namespace lldb; using namespace lldb_private; FileOptionGroup::FileOptionGroup() : - m_arch (), m_arch_str () { } @@ -53,6 +52,17 @@ FileOptionGroup::GetDefinitions () return g_file_option_table; } +bool +FileOptionGroup::GetArchitecture (Platform *platform, ArchSpec &arch) +{ + if (m_arch_str.empty()) + arch.Clear(); + else + arch.SetTriple(m_arch_str.c_str(), platform); + return arch.IsValid(); +} + + Error FileOptionGroup::SetOptionValue (CommandInterpreter &interpreter, uint32_t option_idx, @@ -64,17 +74,7 @@ FileOptionGroup::SetOptionValue (CommandInterpreter &interpreter, switch (short_option) { case 'a': - { - // Save the arch value in case we specify a platform after specifying the arch - m_arch_str.assign (option_arg); - // Check to see if we already have a platform? - m_arch_platform_sp = interpreter.GetPlatform (false); - ArchSpec option_arch (option_arg, m_arch_platform_sp.get()); - if (option_arch.IsValid()) - m_arch = option_arch; - else - error.SetErrorStringWithFormat ("Invalid arch string '%s'.\n", option_arg); - } + m_arch_str.assign (option_arg); break; default: @@ -88,26 +88,7 @@ FileOptionGroup::SetOptionValue (CommandInterpreter &interpreter, void FileOptionGroup::OptionParsingStarting (CommandInterpreter &interpreter) { - m_arch.Clear(); -} - -Error -FileOptionGroup::OptionParsingFinished (CommandInterpreter &interpreter) -{ - Error error; - if (m_arch.IsValid()) - { - PlatformSP curr_platform_sp (interpreter.GetPlatform (false)); - if (curr_platform_sp.get() != m_arch_platform_sp.get()) - { - ArchSpec option_arch (m_arch_str.c_str(), curr_platform_sp.get()); - if (option_arch.IsValid()) - m_arch = option_arch; - else - error.SetErrorStringWithFormat ("invalid arch '%s' for platform '%s'", m_arch_str.c_str(), curr_platform_sp->GetName()); - } - } - return error; + m_arch_str.clear(); } //------------------------------------------------------------------------- @@ -136,8 +117,8 @@ CommandObjectFile::CommandObjectFile(CommandInterpreter &interpreter) : // Push the data for the first argument into the m_arguments vector. m_arguments.push_back (arg); - m_option_group.Append (&m_file_options); - m_option_group.Append (&m_platform_options); + m_option_group.Append (&m_file_options, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1); + m_option_group.Append (&m_platform_options, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1); m_option_group.Finalize(); } @@ -164,18 +145,46 @@ CommandObjectFile::Execute if (argc == 1) { FileSpec file_spec (file_path, true); + + bool select = true; + PlatformSP platform_sp; + + Error error; + + if (!m_platform_options.platform_name.empty()) + { + platform_sp = m_platform_options.CreatePlatformWithOptions(m_interpreter, select, error); + if (!platform_sp) + { + result.AppendError(error.AsCString()); + result.SetStatus (eReturnStatusFailed); + return false; + } + } + ArchSpec file_arch; + + if (!m_file_options.m_arch_str.empty()) + { + if (!platform_sp) + platform_sp = m_interpreter.GetDebugger().GetPlatformList().GetSelectedPlatform(); + if (!m_file_options.GetArchitecture(platform_sp.get(), file_arch)) + { + result.AppendErrorWithFormat("invalid architecture '%s'", m_file_options.m_arch_str.c_str()); + result.SetStatus (eReturnStatusFailed); + return false; + } + } if (! file_spec.Exists() && !file_spec.ResolveExecutableLocation()) { result.AppendErrorWithFormat ("File '%s' does not exist.\n", file_path); result.SetStatus (eReturnStatusFailed); - return result.Succeeded(); + return false; } TargetSP target_sp; - Debugger &debugger = m_interpreter.GetDebugger(); - Error error = debugger.GetTargetList().CreateTarget (debugger, file_spec, m_file_options.m_arch, true, target_sp); + error = debugger.GetTargetList().CreateTarget (debugger, file_spec, file_arch, true, target_sp); if (target_sp) { diff --git a/lldb/source/Commands/CommandObjectFile.h b/lldb/source/Commands/CommandObjectFile.h index 1af88964f52..f3ef2d94a15 100644 --- a/lldb/source/Commands/CommandObjectFile.h +++ b/lldb/source/Commands/CommandObjectFile.h @@ -26,37 +26,35 @@ namespace lldb_private { // CommandObjectFile //------------------------------------------------------------------------- - class FileOptionGroup : public OptionGroup - { - public: - - FileOptionGroup (); - - virtual - ~FileOptionGroup (); - - - virtual uint32_t - GetNumDefinitions (); - - virtual const OptionDefinition* - GetDefinitions (); - - virtual Error - SetOptionValue (CommandInterpreter &interpreter, - uint32_t option_idx, - const char *option_value); - - virtual void - OptionParsingStarting (CommandInterpreter &interpreter); - - virtual Error - OptionParsingFinished (CommandInterpreter &interpreter); - - ArchSpec m_arch; - lldb::PlatformSP m_arch_platform_sp; // The platform that was used to resolve m_arch - std::string m_arch_str; // Save the arch triple in case a platform is specified after the architecture - }; +class FileOptionGroup : public OptionGroup +{ +public: + + FileOptionGroup (); + + virtual + ~FileOptionGroup (); + + + virtual uint32_t + GetNumDefinitions (); + + virtual const OptionDefinition* + GetDefinitions (); + + virtual Error + SetOptionValue (CommandInterpreter &interpreter, + uint32_t option_idx, + const char *option_value); + + virtual void + OptionParsingStarting (CommandInterpreter &interpreter); + + bool + GetArchitecture (Platform *platform, ArchSpec &arch); + + std::string m_arch_str; // Save the arch triple in case a platform is specified after the architecture +}; class CommandObjectFile : public CommandObject { diff --git a/lldb/source/Commands/CommandObjectLog.cpp b/lldb/source/Commands/CommandObjectLog.cpp index e38b618bdb3..7dcfabc6617 100644 --- a/lldb/source/Commands/CommandObjectLog.cpp +++ b/lldb/source/Commands/CommandObjectLog.cpp @@ -42,16 +42,6 @@ using namespace lldb; using namespace lldb_private; -static LogChannelSP -GetLogChannelPluginForChannel (const char *channel) -{ - std::string log_channel_plugin_name(channel); - log_channel_plugin_name += LogChannel::GetPluginSuffix(); - LogChannelSP log_channel_sp (LogChannel::FindPlugin (log_channel_plugin_name.c_str())); - return log_channel_sp; -} - - class CommandObjectLogEnable : public CommandObject { public: @@ -99,6 +89,27 @@ public: return &m_options; } +// int +// HandleArgumentCompletion (Args &input, +// int &cursor_index, +// int &cursor_char_position, +// OptionElementVector &opt_element_vector, +// int match_start_point, +// int max_return_elements, +// bool &word_complete, +// StringList &matches) +// { +// std::string completion_str (input.GetArgumentAtIndex(cursor_index)); +// completion_str.erase (cursor_char_position); +// +// if (cursor_index == 1) +// { +// // +// Log::AutoCompleteChannelName (completion_str.c_str(), matches); +// } +// return matches.GetSize(); +// } +// virtual bool Execute (Args& args, CommandReturnObject &result) @@ -141,7 +152,7 @@ public: } else { - LogChannelSP log_channel_sp (GetLogChannelPluginForChannel(channel.c_str())); + LogChannelSP log_channel_sp (LogChannel::FindPlugin (channel.c_str())); if (log_channel_sp) { if (log_channel_sp->Enable (log_stream_sp, log_options, &result.GetErrorStream(), args)) @@ -314,7 +325,7 @@ public: } else { - LogChannelSP log_channel_sp (GetLogChannelPluginForChannel(channel.c_str())); + LogChannelSP log_channel_sp (LogChannel::FindPlugin(channel.c_str())); if (log_channel_sp) { log_channel_sp->Disable(args, &result.GetErrorStream()); @@ -388,7 +399,7 @@ public: } else { - LogChannelSP log_channel_sp (GetLogChannelPluginForChannel(channel.c_str())); + LogChannelSP log_channel_sp (LogChannel::FindPlugin(channel.c_str())); if (log_channel_sp) { log_channel_sp->ListCategories(&result.GetOutputStream()); diff --git a/lldb/source/Commands/CommandObjectPlatform.cpp b/lldb/source/Commands/CommandObjectPlatform.cpp index 46a53c7139e..252865162a0 100644 --- a/lldb/source/Commands/CommandObjectPlatform.cpp +++ b/lldb/source/Commands/CommandObjectPlatform.cpp @@ -29,44 +29,31 @@ using namespace lldb_private; PlatformSP -PlatformOptionGroup::CreatePlatformWithOptions (CommandInterpreter &interpreter, - const char *platform_name, - bool select, - Error& error) +PlatformOptionGroup::CreatePlatformWithOptions (CommandInterpreter &interpreter, bool select, Error& error) { - if (platform_name && platform_name[0]) + PlatformSP platform_sp; + if (!platform_name.empty()) { - if (platform_sp) - { - error.SetErrorString ("platform can't be set more than once in a command"); - return PlatformSP(); - } - - platform_sp = Platform::Create (platform_name, error); + platform_sp = Platform::Create (platform_name.c_str(), error); if (platform_sp) { - interpreter.GetDebugger().GetPlatformList().Append (platform_sp, select); - if (os_version_major != UINT32_MAX) - { - platform_sp->SetOSVersion (os_version_major, - os_version_minor, - os_version_update); - } + interpreter.GetDebugger().GetPlatformList().Append (platform_sp, select); + if (os_version_major != UINT32_MAX) + { + platform_sp->SetOSVersion (os_version_major, + os_version_minor, + os_version_update); + } } } - else - { - error.SetErrorString ("invalid platform name"); - platform_sp.reset(); - } return platform_sp; } void PlatformOptionGroup::OptionParsingStarting (CommandInterpreter &interpreter) { - platform_sp.reset(); + platform_name.clear(); os_version_major = UINT32_MAX; os_version_minor = UINT32_MAX; os_version_update = UINT32_MAX; @@ -75,7 +62,7 @@ PlatformOptionGroup::OptionParsingStarting (CommandInterpreter &interpreter) static OptionDefinition g_option_table[] = { - { LLDB_OPT_SET_ALL, false, "platform" , 'p', required_argument, NULL, 0, eArgTypeNone, "Specify name of the platform to use for this target, creating the platform if necessary."}, + { LLDB_OPT_SET_ALL, false, "platform" , 'p', required_argument, NULL, 0, eArgTypePlatform, "Specify name of the platform to use for this target, creating the platform if necessary."}, { LLDB_OPT_SET_ALL, false, "sdk-version", 'v', required_argument, NULL, 0, eArgTypeNone, "Specify the initial SDK version to use prior to connecting." } }; @@ -112,19 +99,12 @@ PlatformOptionGroup::SetOptionValue (CommandInterpreter &interpreter, switch (short_option) { case 'p': - CreatePlatformWithOptions (interpreter, option_arg, true, error); + platform_name.assign (option_arg); break; case 'v': if (Args::StringToVersion (option_arg, os_version_major, os_version_minor, os_version_update) == option_arg) - { error.SetErrorStringWithFormat ("invalid version string '%s'", option_arg); - } - else - { - if (platform_sp) - platform_sp->SetOSVersion (os_version_major, os_version_minor, os_version_update); - } break; default: @@ -149,7 +129,7 @@ public: m_option_group (interpreter), m_platform_options (false) // Don't include the "--platform" option by passing false { - m_option_group.Append (&m_platform_options); + m_option_group.Append (&m_platform_options, LLDB_OPT_SET_ALL, 1); m_option_group.Finalize(); } @@ -161,16 +141,31 @@ public: virtual bool Execute (Args& args, CommandReturnObject &result) { - Error error; if (args.GetArgumentCount() == 1) { - const bool select = true; - PlatformSP platform_sp (m_platform_options.CreatePlatformWithOptions (m_interpreter, - args.GetArgumentAtIndex (0), - select, - error)); - if (platform_sp) - platform_sp->GetStatus (result.GetOutputStream()); + const char *platform_name = args.GetArgumentAtIndex (0); + if (platform_name && platform_name[0]) + { + const bool select = true; + m_platform_options.platform_name.assign (platform_name); + Error error; + PlatformSP platform_sp (m_platform_options.CreatePlatformWithOptions (m_interpreter, select, error)); + if (platform_sp) + { + platform_sp->GetStatus (result.GetOutputStream()); + result.SetStatus (eReturnStatusSuccessFinishResult); + } + else + { + result.AppendError(error.AsCString()); + result.SetStatus (eReturnStatusFailed); + } + } + else + { + result.AppendError ("invalid platform name"); + result.SetStatus (eReturnStatusFailed); + } } else { diff --git a/lldb/source/Commands/CommandObjectPlatform.h b/lldb/source/Commands/CommandObjectPlatform.h index 255fc3bb911..00199158666 100644 --- a/lldb/source/Commands/CommandObjectPlatform.h +++ b/lldb/source/Commands/CommandObjectPlatform.h @@ -49,11 +49,11 @@ class PlatformOptionGroup : public OptionGroup public: PlatformOptionGroup (bool include_platform_option) : - m_include_platform_option (include_platform_option), - platform_sp (), + platform_name (), os_version_major (UINT32_MAX), os_version_minor (UINT32_MAX), - os_version_update (UINT32_MAX) + os_version_update (UINT32_MAX), + m_include_platform_option (include_platform_option) { } @@ -74,17 +74,16 @@ public: const char *option_value); lldb::PlatformSP - CreatePlatformWithOptions (CommandInterpreter &interpreter, - const char *platform_name, - bool select, - Error& error); + CreatePlatformWithOptions (CommandInterpreter &interpreter, + bool select, + Error &error); virtual void OptionParsingStarting (CommandInterpreter &interpreter); // Instance variables to hold the values for command options. - lldb::PlatformSP platform_sp; + std::string platform_name; uint32_t os_version_major; uint32_t os_version_minor; uint32_t os_version_update; diff --git a/lldb/source/Core/ArchSpec.cpp b/lldb/source/Core/ArchSpec.cpp index e573b99fd9c..45567328e53 100644 --- a/lldb/source/Core/ArchSpec.cpp +++ b/lldb/source/Core/ArchSpec.cpp @@ -79,11 +79,11 @@ static const CoreDefinition g_core_definitions[ArchSpec::kNumCores] = { eByteOrderLittle, 4, 4, 4, llvm::Triple::sparc , ArchSpec::eCore_sparc_generic , "sparc" }, { eByteOrderLittle, 8, 4, 4, llvm::Triple::sparcv9, ArchSpec::eCore_sparc9_generic , "sparcv9" }, - { eByteOrderLittle, 4, 1, 15, llvm::Triple::x86 , ArchSpec::eCore_x86_32_i386 , "i386" }, - { eByteOrderLittle, 4, 1, 15, llvm::Triple::x86 , ArchSpec::eCore_x86_32_i486 , "i486" }, - { eByteOrderLittle, 4, 1, 15, llvm::Triple::x86 , ArchSpec::eCore_x86_32_i486sx , "i486sx" }, + { eByteOrderLittle, 4, 1, 15, llvm::Triple::x86 , ArchSpec::eCore_x86_32_i386 , "i386" }, + { eByteOrderLittle, 4, 1, 15, llvm::Triple::x86 , ArchSpec::eCore_x86_32_i486 , "i486" }, + { eByteOrderLittle, 4, 1, 15, llvm::Triple::x86 , ArchSpec::eCore_x86_32_i486sx , "i486sx" }, - { eByteOrderLittle, 8, 1, 15, llvm::Triple::x86_64 , ArchSpec::eCore_x86_64_x86_64 , "x86_64" } + { eByteOrderLittle, 8, 1, 15, llvm::Triple::x86_64 , ArchSpec::eCore_x86_64_x86_64 , "x86_64" } }; struct ArchDefinitionEntry @@ -104,6 +104,28 @@ struct ArchDefinition }; +uint32_t +ArchSpec::AutoComplete (const char *name, StringList &matches) +{ + uint32_t i; + if (name && name[0]) + { + for (i = 0; i < ArchSpec::kNumCores; ++i) + { + if (NameMatches(g_core_definitions[i].name, eNameMatchStartsWith, name)) + matches.AppendString (g_core_definitions[i].name); + } + } + else + { + for (i = 0; i < ArchSpec::kNumCores; ++i) + matches.AppendString (g_core_definitions[i].name); + } + return matches.GetSize(); +} + + + #define CPU_ANY (UINT32_MAX) //===----------------------------------------------------------------------===// diff --git a/lldb/source/Core/Log.cpp b/lldb/source/Core/Log.cpp index 1b5c74acf03..f537f1ea2bc 100644 --- a/lldb/source/Core/Log.cpp +++ b/lldb/source/Core/Log.cpp @@ -382,6 +382,27 @@ Log::EnableAllLogChannels } void +Log::AutoCompleteChannelName (const char *channel_name, StringList &matches) +{ + LogChannelMap &map = GetChannelMap (); + LogChannelMapIter pos, end = map.end(); + for (pos = map.begin(); pos != end; ++pos) + { + const char *pos_channel_name = pos->first.GetCString(); + if (channel_name && channel_name[0]) + { + if (NameMatches (channel_name, eNameMatchStartsWith, pos_channel_name)) + { + matches.AppendString(pos_channel_name); + } + } + else + matches.AppendString(pos_channel_name); + + } +} + +void Log::DisableAllLogChannels (Stream *feedback_strm) { CallbackMap &callback_map = GetCallbackMap (); @@ -499,10 +520,4 @@ LogChannel::~LogChannel () { } -const char * -LogChannel::GetPluginSuffix () -{ - return ".log-channel"; -} - diff --git a/lldb/source/Core/PluginManager.cpp b/lldb/source/Core/PluginManager.cpp index ae89c72b9ab..aff9b2b1973 100644 --- a/lldb/source/Core/PluginManager.cpp +++ b/lldb/source/Core/PluginManager.cpp @@ -19,6 +19,8 @@ #include "lldb/Host/Host.h" #include "lldb/Host/Mutex.h" +#include "llvm/ADT/StringRef.h" + using namespace lldb; using namespace lldb_private; @@ -256,7 +258,7 @@ PluginManager::RegisterPlugin { ABIInstance instance; assert (name && name[0]); - instance.name = name; + instance.name.assign (name); if (description && description[0]) instance.description = description; instance.create_callback = create_callback; @@ -293,7 +295,6 @@ PluginManager::GetABICreateCallbackAtIndex (uint32_t idx) { Mutex::Locker locker (GetABIInstancesMutex ()); ABIInstances &instances = GetABIInstances (); - if (idx < instances.size()) return instances[idx].create_callback; return NULL; @@ -305,13 +306,13 @@ PluginManager::GetABICreateCallbackForPluginName (const char *name) if (name && name[0]) { Mutex::Locker locker (GetABIInstancesMutex ()); - std::string ss_name(name); + llvm::StringRef name_sref(name); ABIInstances &instances = GetABIInstances (); ABIInstances::iterator pos, end = instances.end(); for (pos = instances.begin(); pos != end; ++ pos) { - if (pos->name == ss_name) + if (name_sref.equals (pos->name)) return pos->create_callback; } } @@ -338,50 +339,19 @@ struct DisassemblerInstance typedef std::vector<DisassemblerInstance> DisassemblerInstances; -static bool -AccessDisassemblerInstances (PluginAction action, DisassemblerInstance &instance, uint32_t index) +static Mutex & +GetDisassemblerMutex () { - static DisassemblerInstances g_plugin_instances; - - switch (action) - { - case ePluginRegisterInstance: - if (instance.create_callback) - { - g_plugin_instances.push_back (instance); - return true; - } - break; - - case ePluginUnregisterInstance: - if (instance.create_callback) - { - DisassemblerInstances::iterator pos, end = g_plugin_instances.end(); - for (pos = g_plugin_instances.begin(); pos != end; ++ pos) - { - if (pos->create_callback == instance.create_callback) - { - g_plugin_instances.erase(pos); - return true; - } - } - } - break; - - case ePluginGetInstanceAtIndex: - if (index < g_plugin_instances.size()) - { - instance = g_plugin_instances[index]; - return true; - } - break; - - default: - break; - } - return false; + static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive); + return g_instances_mutex; } +static DisassemblerInstances & +GetDisassemblerInstances () +{ + static DisassemblerInstances g_instances; + return g_instances; +} bool PluginManager::RegisterPlugin @@ -399,7 +369,9 @@ PluginManager::RegisterPlugin if (description && description[0]) instance.description = description; instance.create_callback = create_callback; - return AccessDisassemblerInstances (ePluginRegisterInstance, instance, 0); + Mutex::Locker locker (GetDisassemblerMutex ()); + GetDisassemblerInstances ().push_back (instance); + return true; } return false; } @@ -409,9 +381,18 @@ PluginManager::UnregisterPlugin (DisassemblerCreateInstance create_callback) { if (create_callback) { - DisassemblerInstance instance; - instance.create_callback = create_callback; - return AccessDisassemblerInstances (ePluginUnregisterInstance, instance, 0); + Mutex::Locker locker (GetDisassemblerMutex ()); + DisassemblerInstances &instances = GetDisassemblerInstances (); + + DisassemblerInstances::iterator pos, end = instances.end(); + for (pos = instances.begin(); pos != end; ++ pos) + { + if (pos->create_callback == create_callback) + { + instances.erase(pos); + return true; + } + } } return false; } @@ -419,9 +400,10 @@ PluginManager::UnregisterPlugin (DisassemblerCreateInstance create_callback) DisassemblerCreateInstance PluginManager::GetDisassemblerCreateCallbackAtIndex (uint32_t idx) { - DisassemblerInstance instance; - if (AccessDisassemblerInstances (ePluginGetInstanceAtIndex, instance, idx)) - return instance.create_callback; + Mutex::Locker locker (GetDisassemblerMutex ()); + DisassemblerInstances &instances = GetDisassemblerInstances (); + if (idx < instances.size()) + return instances[idx].create_callback; return NULL; } @@ -430,12 +412,15 @@ PluginManager::GetDisassemblerCreateCallbackForPluginName (const char *name) { if (name && name[0]) { - DisassemblerInstance instance; - std::string ss_name(name); - for (uint32_t idx = 0; AccessDisassemblerInstances (ePluginGetInstanceAtIndex, instance, idx); ++idx) + llvm::StringRef name_sref(name); + Mutex::Locker locker (GetDisassemblerMutex ()); + DisassemblerInstances &instances = GetDisassemblerInstances (); + + DisassemblerInstances::iterator pos, end = instances.end(); + for (pos = instances.begin(); pos != end; ++ pos) { - if (instance.name == ss_name) - return instance.create_callback; + if (name_sref.equals (pos->name)) + return pos->create_callback; } } return NULL; @@ -462,48 +447,19 @@ struct DynamicLoaderInstance typedef std::vector<DynamicLoaderInstance> DynamicLoaderInstances; -static bool -AccessDynamicLoaderInstances (PluginAction action, DynamicLoaderInstance &instance, uint32_t index) -{ - static DynamicLoaderInstances g_plugin_instances; - switch (action) - { - case ePluginRegisterInstance: - if (instance.create_callback) - { - g_plugin_instances.push_back (instance); - return true; - } - break; - - case ePluginUnregisterInstance: - if (instance.create_callback) - { - DynamicLoaderInstances::iterator pos, end = g_plugin_instances.end(); - for (pos = g_plugin_instances.begin(); pos != end; ++ pos) - { - if (pos->create_callback == instance.create_callback) - { - g_plugin_instances.erase(pos); - return true; - } - } - } - break; - - case ePluginGetInstanceAtIndex: - if (index < g_plugin_instances.size()) - { - instance = g_plugin_instances[index]; - return true; - } - break; +static Mutex & +GetDynamicLoaderMutex () +{ + static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive); + return g_instances_mutex; +} - default: - break; - } - return false; +static DynamicLoaderInstances & +GetDynamicLoaderInstances () +{ + static DynamicLoaderInstances g_instances; + return g_instances; } @@ -523,7 +479,8 @@ PluginManager::RegisterPlugin if (description && description[0]) instance.description = description; instance.create_callback = create_callback; - return AccessDynamicLoaderInstances (ePluginRegisterInstance, instance, 0); + Mutex::Locker locker (GetDynamicLoaderMutex ()); + GetDynamicLoaderInstances ().push_back (instance); } return false; } @@ -533,9 +490,18 @@ PluginManager::UnregisterPlugin (DynamicLoaderCreateInstance create_callback) { if (create_callback) { - DynamicLoaderInstance instance; - instance.create_callback = create_callback; - return AccessDynamicLoaderInstances (ePluginUnregisterInstance, instance, 0); + Mutex::Locker locker (GetDynamicLoaderMutex ()); + DynamicLoaderInstances &instances = GetDynamicLoaderInstances (); + + DynamicLoaderInstances::iterator pos, end = instances.end(); + for (pos = instances.begin(); pos != end; ++ pos) + { + if (pos->create_callback == create_callback) + { + instances.erase(pos); + return true; + } + } } return false; } @@ -543,9 +509,10 @@ PluginManager::UnregisterPlugin (DynamicLoaderCreateInstance create_callback) DynamicLoaderCreateInstance PluginManager::GetDynamicLoaderCreateCallbackAtIndex (uint32_t idx) { - DynamicLoaderInstance instance; - if (AccessDynamicLoaderInstances (ePluginGetInstanceAtIndex, instance, idx)) - return instance.create_callback; + Mutex::Locker locker (GetDynamicLoaderMutex ()); + DynamicLoaderInstances &instances = GetDynamicLoaderInstances (); + if (idx < instances.size()) + return instances[idx].create_callback; return NULL; } @@ -554,12 +521,15 @@ PluginManager::GetDynamicLoaderCreateCallbackForPluginName (const char *name) { if (name && name[0]) { - DynamicLoaderInstance instance; - std::string ss_name(name); - for (uint32_t idx = 0; AccessDynamicLoaderInstances (ePluginGetInstanceAtIndex, instance, idx); ++idx) + llvm::StringRef name_sref(name); + Mutex::Locker locker (GetDynamicLoaderMutex ()); + DynamicLoaderInstances &instances = GetDynamicLoaderInstances (); + + DynamicLoaderInstances::iterator pos, end = instances.end(); + for (pos = instances.begin(); pos != end; ++ pos) { - if (instance.name == ss_name) - return instance.create_callback; + if (name_sref.equals (pos->name)) + return pos->create_callback; } } return NULL; @@ -584,48 +554,18 @@ struct EmulateInstructionInstance typedef std::vector<EmulateInstructionInstance> EmulateInstructionInstances; -static bool -AccessEmulateInstructionInstances (PluginAction action, EmulateInstructionInstance &instance, uint32_t index) +static Mutex & +GetEmulateInstructionMutex () { - static EmulateInstructionInstances g_plugin_instances; - - switch (action) - { - case ePluginRegisterInstance: - if (instance.create_callback) - { - g_plugin_instances.push_back (instance); - return true; - } - break; - - case ePluginUnregisterInstance: - if (instance.create_callback) - { - EmulateInstructionInstances::iterator pos, end = g_plugin_instances.end(); - for (pos = g_plugin_instances.begin(); pos != end; ++ pos) - { - if (pos->create_callback == instance.create_callback) - { - g_plugin_instances.erase(pos); - return true; - } - } - } - break; - - case ePluginGetInstanceAtIndex: - if (index < g_plugin_instances.size()) - { - instance = g_plugin_instances[index]; - return true; - } - break; - - default: - break; - } - return false; + static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive); + return g_instances_mutex; +} + +static EmulateInstructionInstances & +GetEmulateInstructionInstances () +{ + static EmulateInstructionInstances g_instances; + return g_instances; } @@ -645,7 +585,8 @@ PluginManager::RegisterPlugin if (description && description[0]) instance.description = description; instance.create_callback = create_callback; - return AccessEmulateInstructionInstances (ePluginRegisterInstance, instance, 0); + Mutex::Locker locker (GetEmulateInstructionMutex ()); + GetEmulateInstructionInstances ().push_back (instance); } return false; } @@ -655,9 +596,18 @@ PluginManager::UnregisterPlugin (EmulateInstructionCreateInstance create_callbac { if (create_callback) { - EmulateInstructionInstance instance; - instance.create_callback = create_callback; - return AccessEmulateInstructionInstances (ePluginUnregisterInstance, instance, 0); + Mutex::Locker locker (GetEmulateInstructionMutex ()); + EmulateInstructionInstances &instances = GetEmulateInstructionInstances (); + + EmulateInstructionInstances::iterator pos, end = instances.end(); + for (pos = instances.begin(); pos != end; ++ pos) + { + if (pos->create_callback == create_callback) + { + instances.erase(pos); + return true; + } + } } return false; } @@ -665,9 +615,10 @@ PluginManager::UnregisterPlugin (EmulateInstructionCreateInstance create_callbac EmulateInstructionCreateInstance PluginManager::GetEmulateInstructionCreateCallbackAtIndex (uint32_t idx) { - EmulateInstructionInstance instance; - if (AccessEmulateInstructionInstances (ePluginGetInstanceAtIndex, instance, idx)) - return instance.create_callback; + Mutex::Locker locker (GetEmulateInstructionMutex ()); + EmulateInstructionInstances &instances = GetEmulateInstructionInstances (); + if (idx < instances.size()) + return instances[idx].create_callback; return NULL; } @@ -676,12 +627,15 @@ PluginManager::GetEmulateInstructionCreateCallbackForPluginName (const char *nam { if (name && name[0]) { - EmulateInstructionInstance instance; - std::string ss_name(name); - for (uint32_t idx = 0; AccessEmulateInstructionInstances (ePluginGetInstanceAtIndex, instance, idx); ++idx) + llvm::StringRef name_sref(name); + Mutex::Locker locker (GetEmulateInstructionMutex ()); + EmulateInstructionInstances &instances = GetEmulateInstructionInstances (); + + EmulateInstructionInstances::iterator pos, end = instances.end(); + for (pos = instances.begin(); pos != end; ++ pos) { - if (instance.name == ss_name) - return instance.create_callback; + if (name_sref.equals (pos->name)) + return pos->create_callback; } } return NULL; @@ -707,50 +661,19 @@ struct LanguageRuntimeInstance typedef std::vector<LanguageRuntimeInstance> LanguageRuntimeInstances; -static bool -AccessLanguageRuntimeInstances (PluginAction action, LanguageRuntimeInstance &instance, uint32_t index) +static Mutex & +GetLanguageRuntimeMutex () { - static LanguageRuntimeInstances g_plugin_instances; - - switch (action) - { - case ePluginRegisterInstance: - if (instance.create_callback) - { - g_plugin_instances.push_back (instance); - return true; - } - break; - - case ePluginUnregisterInstance: - if (instance.create_callback) - { - LanguageRuntimeInstances::iterator pos, end = g_plugin_instances.end(); - for (pos = g_plugin_instances.begin(); pos != end; ++ pos) - { - if (pos->create_callback == instance.create_callback) - { - g_plugin_instances.erase(pos); - return true; - } - } - } - break; - - case ePluginGetInstanceAtIndex: - if (index < g_plugin_instances.size()) - { - instance = g_plugin_instances[index]; - return true; - } - break; - - default: - break; - } - return false; + static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive); + return g_instances_mutex; } +static LanguageRuntimeInstances & +GetLanguageRuntimeInstances () +{ + static LanguageRuntimeInstances g_instances; + return g_instances; +} bool PluginManager::RegisterPlugin @@ -768,7 +691,8 @@ PluginManager::RegisterPlugin if (description && description[0]) instance.description = description; instance.create_callback = create_callback; - return AccessLanguageRuntimeInstances (ePluginRegisterInstance, instance, 0); + Mutex::Locker locker (GetLanguageRuntimeMutex ()); + GetLanguageRuntimeInstances ().push_back (instance); } return false; } @@ -778,9 +702,18 @@ PluginManager::UnregisterPlugin (LanguageRuntimeCreateInstance create_callback) { if (create_callback) { - LanguageRuntimeInstance instance; - instance.create_callback = create_callback; - return AccessLanguageRuntimeInstances (ePluginUnregisterInstance, instance, 0); + Mutex::Locker locker (GetLanguageRuntimeMutex ()); + LanguageRuntimeInstances &instances = GetLanguageRuntimeInstances (); + + LanguageRuntimeInstances::iterator pos, end = instances.end(); + for (pos = instances.begin(); pos != end; ++ pos) + { + if (pos->create_callback == create_callback) + { + instances.erase(pos); + return true; + } + } } return false; } @@ -788,9 +721,10 @@ PluginManager::UnregisterPlugin (LanguageRuntimeCreateInstance create_callback) LanguageRuntimeCreateInstance PluginManager::GetLanguageRuntimeCreateCallbackAtIndex (uint32_t idx) { - LanguageRuntimeInstance instance; - if (AccessLanguageRuntimeInstances (ePluginGetInstanceAtIndex, instance, idx)) - return instance.create_callback; + Mutex::Locker locker (GetLanguageRuntimeMutex ()); + LanguageRuntimeInstances &instances = GetLanguageRuntimeInstances (); + if (idx < instances.size()) + return instances[idx].create_callback; return NULL; } @@ -799,12 +733,15 @@ PluginManager::GetLanguageRuntimeCreateCallbackForPluginName (const char *name) { if (name && name[0]) { - LanguageRuntimeInstance instance; - std::string ss_name(name); - for (uint32_t idx = 0; AccessLanguageRuntimeInstances (ePluginGetInstanceAtIndex, instance, idx); ++idx) + llvm::StringRef name_sref(name); + Mutex::Locker locker (GetLanguageRuntimeMutex ()); + LanguageRuntimeInstances &instances = GetLanguageRuntimeInstances (); + + LanguageRuntimeInstances::iterator pos, end = instances.end(); + for (pos = instances.begin(); pos != end; ++ pos) { - if (instance.name == ss_name) - return instance.create_callback; + if (name_sref.equals (pos->name)) + return pos->create_callback; } } return NULL; @@ -828,48 +765,18 @@ struct ObjectFileInstance typedef std::vector<ObjectFileInstance> ObjectFileInstances; -static bool -AccessObjectFileInstances (PluginAction action, ObjectFileInstance &instance, uint32_t index) +static Mutex & +GetObjectFileMutex () { - static ObjectFileInstances g_plugin_instances; - - switch (action) - { - case ePluginRegisterInstance: - if (instance.create_callback) - { - g_plugin_instances.push_back (instance); - return true; - } - break; - - case ePluginUnregisterInstance: - if (instance.create_callback) - { - ObjectFileInstances::iterator pos, end = g_plugin_instances.end(); - for (pos = g_plugin_instances.begin(); pos != end; ++ pos) - { - if (pos->create_callback == instance.create_callback) - { - g_plugin_instances.erase(pos); - return true; - } - } - } - break; - - case ePluginGetInstanceAtIndex: - if (index < g_plugin_instances.size()) - { - instance = g_plugin_instances[index]; - return true; - } - break; + static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive); + return g_instances_mutex; +} - default: - break; - } - return false; +static ObjectFileInstances & +GetObjectFileInstances () +{ + static ObjectFileInstances g_instances; + return g_instances; } @@ -889,7 +796,8 @@ PluginManager::RegisterPlugin if (description && description[0]) instance.description = description; instance.create_callback = create_callback; - return AccessObjectFileInstances (ePluginRegisterInstance, instance, 0); + Mutex::Locker locker (GetObjectFileMutex ()); + GetObjectFileInstances ().push_back (instance); } return false; } @@ -899,9 +807,18 @@ PluginManager::UnregisterPlugin (ObjectFileCreateInstance create_callback) { if (create_callback) { - ObjectFileInstance instance; - instance.create_callback = create_callback; - return AccessObjectFileInstances (ePluginUnregisterInstance, instance, 0); + Mutex::Locker locker (GetObjectFileMutex ()); + ObjectFileInstances &instances = GetObjectFileInstances (); + + ObjectFileInstances::iterator pos, end = instances.end(); + for (pos = instances.begin(); pos != end; ++ pos) + { + if (pos->create_callback == create_callback) + { + instances.erase(pos); + return true; + } + } } return false; } @@ -909,22 +826,27 @@ PluginManager::UnregisterPlugin (ObjectFileCreateInstance create_callback) ObjectFileCreateInstance PluginManager::GetObjectFileCreateCallbackAtIndex (uint32_t idx) { - ObjectFileInstance instance; - if (AccessObjectFileInstances (ePluginGetInstanceAtIndex, instance, idx)) - return instance.create_callback; + Mutex::Locker locker (GetObjectFileMutex ()); + ObjectFileInstances &instances = GetObjectFileInstances (); + if (idx < instances.size()) + return instances[idx].create_callback; return NULL; } + ObjectFileCreateInstance PluginManager::GetObjectFileCreateCallbackForPluginName (const char *name) { if (name && name[0]) { - ObjectFileInstance instance; - std::string ss_name(name); - for (uint32_t idx = 0; AccessObjectFileInstances (ePluginGetInstanceAtIndex, instance, idx); ++idx) + llvm::StringRef name_sref(name); + Mutex::Locker locker (GetObjectFileMutex ()); + ObjectFileInstances &instances = GetObjectFileInstances (); + + ObjectFileInstances::iterator pos, end = instances.end(); + for (pos = instances.begin(); pos != end; ++ pos) { - if (instance.name == ss_name) - return instance.create_callback; + if (name_sref.equals (pos->name)) + return pos->create_callback; } } return NULL; @@ -950,50 +872,19 @@ struct ObjectContainerInstance typedef std::vector<ObjectContainerInstance> ObjectContainerInstances; -static bool -AccessObjectContainerInstances (PluginAction action, ObjectContainerInstance &instance, uint32_t index) +static Mutex & +GetObjectContainerMutex () { - static ObjectContainerInstances g_plugin_instances; - - switch (action) - { - case ePluginRegisterInstance: - if (instance.create_callback) - { - g_plugin_instances.push_back (instance); - return true; - } - break; - - case ePluginUnregisterInstance: - if (instance.create_callback) - { - ObjectContainerInstances::iterator pos, end = g_plugin_instances.end(); - for (pos = g_plugin_instances.begin(); pos != end; ++ pos) - { - if (pos->create_callback == instance.create_callback) - { - g_plugin_instances.erase(pos); - return true; - } - } - } - break; - - case ePluginGetInstanceAtIndex: - if (index < g_plugin_instances.size()) - { - instance = g_plugin_instances[index]; - return true; - } - break; - - default: - break; - } - return false; + static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive); + return g_instances_mutex; } +static ObjectContainerInstances & +GetObjectContainerInstances () +{ + static ObjectContainerInstances g_instances; + return g_instances; +} bool PluginManager::RegisterPlugin @@ -1011,7 +902,8 @@ PluginManager::RegisterPlugin if (description && description[0]) instance.description = description; instance.create_callback = create_callback; - return AccessObjectContainerInstances (ePluginRegisterInstance, instance, 0); + Mutex::Locker locker (GetObjectContainerMutex ()); + GetObjectContainerInstances ().push_back (instance); } return false; } @@ -1021,9 +913,18 @@ PluginManager::UnregisterPlugin (ObjectContainerCreateInstance create_callback) { if (create_callback) { - ObjectContainerInstance instance; - instance.create_callback = create_callback; - return AccessObjectContainerInstances (ePluginUnregisterInstance, instance, 0); + Mutex::Locker locker (GetObjectContainerMutex ()); + ObjectContainerInstances &instances = GetObjectContainerInstances (); + + ObjectContainerInstances::iterator pos, end = instances.end(); + for (pos = instances.begin(); pos != end; ++ pos) + { + if (pos->create_callback == create_callback) + { + instances.erase(pos); + return true; + } + } } return false; } @@ -1031,22 +932,27 @@ PluginManager::UnregisterPlugin (ObjectContainerCreateInstance create_callback) ObjectContainerCreateInstance PluginManager::GetObjectContainerCreateCallbackAtIndex (uint32_t idx) { - ObjectContainerInstance instance; - if (AccessObjectContainerInstances (ePluginGetInstanceAtIndex, instance, idx)) - return instance.create_callback; + Mutex::Locker locker (GetObjectContainerMutex ()); + ObjectContainerInstances &instances = GetObjectContainerInstances (); + if (idx < instances.size()) + return instances[idx].create_callback; return NULL; } + ObjectContainerCreateInstance PluginManager::GetObjectContainerCreateCallbackForPluginName (const char *name) { if (name && name[0]) { - ObjectContainerInstance instance; - std::string ss_name(name); - for (uint32_t idx = 0; AccessObjectContainerInstances (ePluginGetInstanceAtIndex, instance, idx); ++idx) + llvm::StringRef name_sref(name); + Mutex::Locker locker (GetObjectContainerMutex ()); + ObjectContainerInstances &instances = GetObjectContainerInstances (); + + ObjectContainerInstances::iterator pos, end = instances.end(); + for (pos = instances.begin(); pos != end; ++ pos) { - if (instance.name == ss_name) - return instance.create_callback; + if (name_sref.equals (pos->name)) + return pos->create_callback; } } return NULL; @@ -1054,9 +960,9 @@ PluginManager::GetObjectContainerCreateCallbackForPluginName (const char *name) #pragma mark LogChannel -struct LogChannelInstance +struct LogInstance { - LogChannelInstance() : + LogInstance() : name(), description(), create_callback(NULL) @@ -1068,53 +974,24 @@ struct LogChannelInstance LogChannelCreateInstance create_callback; }; -typedef std::vector<LogChannelInstance> LogChannelInstances; +typedef std::vector<LogInstance> LogInstances; -static bool -AccessLogChannelInstances (PluginAction action, LogChannelInstance &instance, uint32_t index) +static Mutex & +GetLogMutex () { - static LogChannelInstances g_plugin_instances; - - switch (action) - { - case ePluginRegisterInstance: - if (instance.create_callback) - { - g_plugin_instances.push_back (instance); - return true; - } - break; - - case ePluginUnregisterInstance: - if (instance.create_callback) - { - LogChannelInstances::iterator pos, end = g_plugin_instances.end(); - for (pos = g_plugin_instances.begin(); pos != end; ++ pos) - { - if (pos->create_callback == instance.create_callback) - { - g_plugin_instances.erase(pos); - return true; - } - } - } - break; - - case ePluginGetInstanceAtIndex: - if (index < g_plugin_instances.size()) - { - instance = g_plugin_instances[index]; - return true; - } - break; + static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive); + return g_instances_mutex; +} - default: - break; - } - return false; +static LogInstances & +GetLogInstances () +{ + static LogInstances g_instances; + return g_instances; } + bool PluginManager::RegisterPlugin ( @@ -1125,13 +1002,14 @@ PluginManager::RegisterPlugin { if (create_callback) { - LogChannelInstance instance; + LogInstance instance; assert (name && name[0]); instance.name = name; if (description && description[0]) instance.description = description; instance.create_callback = create_callback; - return AccessLogChannelInstances (ePluginRegisterInstance, instance, 0); + Mutex::Locker locker (GetLogMutex ()); + GetLogInstances ().push_back (instance); } return false; } @@ -1141,9 +1019,18 @@ PluginManager::UnregisterPlugin (LogChannelCreateInstance create_callback) { if (create_callback) { - LogChannelInstance instance; - instance.create_callback = create_callback; - return AccessLogChannelInstances (ePluginUnregisterInstance, instance, 0); + Mutex::Locker locker (GetLogMutex ()); + LogInstances &instances = GetLogInstances (); + + LogInstances::iterator pos, end = instances.end(); + for (pos = instances.begin(); pos != end; ++ pos) + { + if (pos->create_callback == create_callback) + { + instances.erase(pos); + return true; + } + } } return false; } @@ -1151,9 +1038,10 @@ PluginManager::UnregisterPlugin (LogChannelCreateInstance create_callback) const char * PluginManager::GetLogChannelCreateNameAtIndex (uint32_t idx) { - LogChannelInstance instance; - if (AccessLogChannelInstances (ePluginGetInstanceAtIndex, instance, idx)) - return instance.name.c_str(); + Mutex::Locker locker (GetLogMutex ()); + LogInstances &instances = GetLogInstances (); + if (idx < instances.size()) + return instances[idx].name.c_str(); return NULL; } @@ -1161,9 +1049,10 @@ PluginManager::GetLogChannelCreateNameAtIndex (uint32_t idx) LogChannelCreateInstance PluginManager::GetLogChannelCreateCallbackAtIndex (uint32_t idx) { - LogChannelInstance instance; - if (AccessLogChannelInstances (ePluginGetInstanceAtIndex, instance, idx)) - return instance.create_callback; + Mutex::Locker locker (GetLogMutex ()); + LogInstances &instances = GetLogInstances (); + if (idx < instances.size()) + return instances[idx].create_callback; return NULL; } @@ -1172,12 +1061,15 @@ PluginManager::GetLogChannelCreateCallbackForPluginName (const char *name) { if (name && name[0]) { - LogChannelInstance instance; - std::string ss_name(name); - for (uint32_t idx = 0; AccessLogChannelInstances (ePluginGetInstanceAtIndex, instance, idx); ++idx) + llvm::StringRef name_sref(name); + Mutex::Locker locker (GetLogMutex ()); + LogInstances &instances = GetLogInstances (); + + LogInstances::iterator pos, end = instances.end(); + for (pos = instances.begin(); pos != end; ++ pos) { - if (instance.name == ss_name) - return instance.create_callback; + if (name_sref.equals (pos->name)) + return pos->create_callback; } } return NULL; @@ -1215,6 +1107,7 @@ GetPlatformInstances () return g_platform_instances; } + bool PluginManager::RegisterPlugin (const char *name, const char *description, @@ -1240,9 +1133,9 @@ const char * PluginManager::GetPlatformPluginNameAtIndex (uint32_t idx) { Mutex::Locker locker (GetPlatformInstancesMutex ()); - PlatformInstances &platform_instances = GetPlatformInstances (); - if (idx < platform_instances.size()) - return platform_instances[idx].name.c_str(); + PlatformInstances &instances = GetPlatformInstances (); + if (idx < instances.size()) + return instances[idx].name.c_str(); return NULL; } @@ -1250,9 +1143,9 @@ const char * PluginManager::GetPlatformPluginDescriptionAtIndex (uint32_t idx) { Mutex::Locker locker (GetPlatformInstancesMutex ()); - PlatformInstances &platform_instances = GetPlatformInstances (); - if (idx < platform_instances.size()) - return platform_instances[idx].description.c_str(); + PlatformInstances &instances = GetPlatformInstances (); + if (idx < instances.size()) + return instances[idx].description.c_str(); return NULL; } @@ -1262,14 +1155,14 @@ PluginManager::UnregisterPlugin (PlatformCreateInstance create_callback) if (create_callback) { Mutex::Locker locker (GetPlatformInstancesMutex ()); - PlatformInstances &platform_instances = GetPlatformInstances (); + PlatformInstances &instances = GetPlatformInstances (); - PlatformInstances::iterator pos, end = platform_instances.end(); - for (pos = platform_instances.begin(); pos != end; ++ pos) + PlatformInstances::iterator pos, end = instances.end(); + for (pos = instances.begin(); pos != end; ++ pos) { if (pos->create_callback == create_callback) { - platform_instances.erase(pos); + instances.erase(pos); return true; } } @@ -1281,9 +1174,9 @@ PlatformCreateInstance PluginManager::GetPlatformCreateCallbackAtIndex (uint32_t idx) { Mutex::Locker locker (GetPlatformInstancesMutex ()); - PlatformInstances &platform_instances = GetPlatformInstances (); - if (idx < platform_instances.size()) - return platform_instances[idx].create_callback; + PlatformInstances &instances = GetPlatformInstances (); + if (idx < instances.size()) + return instances[idx].create_callback; return NULL; } @@ -1293,19 +1186,39 @@ PluginManager::GetPlatformCreateCallbackForPluginName (const char *name) if (name && name[0]) { Mutex::Locker locker (GetPlatformInstancesMutex ()); - std::string ss_name(name); - PlatformInstances &platform_instances = GetPlatformInstances (); + PlatformInstances &instances = GetPlatformInstances (); + llvm::StringRef name_sref(name); - PlatformInstances::iterator pos, end = platform_instances.end(); - for (pos = platform_instances.begin(); pos != end; ++ pos) + PlatformInstances::iterator pos, end = instances.end(); + for (pos = instances.begin(); pos != end; ++ pos) { - if (pos->name == ss_name) + if (name_sref.equals (name)) return pos->create_callback; } } return NULL; } +uint32_t +PluginManager::AutoCompletePlatformName (const char *name, StringList &matches) +{ + if (name && name[0]) + { + Mutex::Locker locker (GetPlatformInstancesMutex ()); + PlatformInstances &instances = GetPlatformInstances (); + llvm::StringRef name_sref(name); + + PlatformInstances::iterator pos, end = instances.end(); + for (pos = instances.begin(); pos != end; ++ pos) + { + const char *plugin_name = pos->name.c_str(); + if (name_sref.startswith(plugin_name)) + matches.AppendString (plugin_name); + } + } + return matches.GetSize(); +} + #pragma mark Process struct ProcessInstance @@ -1324,48 +1237,18 @@ struct ProcessInstance typedef std::vector<ProcessInstance> ProcessInstances; -static bool -AccessProcessInstances (PluginAction action, ProcessInstance &instance, uint32_t index) +static Mutex & +GetProcessMutex () { - static ProcessInstances g_plugin_instances; - - switch (action) - { - case ePluginRegisterInstance: - if (instance.create_callback) - { - g_plugin_instances.push_back (instance); - return true; - } - break; - - case ePluginUnregisterInstance: - if (instance.create_callback) - { - ProcessInstances::iterator pos, end = g_plugin_instances.end(); - for (pos = g_plugin_instances.begin(); pos != end; ++ pos) - { - if (pos->create_callback == instance.create_callback) - { - g_plugin_instances.erase(pos); - return true; - } - } - } - break; - - case ePluginGetInstanceAtIndex: - if (index < g_plugin_instances.size()) - { - instance = g_plugin_instances[index]; - return true; - } - break; - - default: - break; - } - return false; + static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive); + return g_instances_mutex; +} + +static ProcessInstances & +GetProcessInstances () +{ + static ProcessInstances g_instances; + return g_instances; } @@ -1385,7 +1268,8 @@ PluginManager::RegisterPlugin if (description && description[0]) instance.description = description; instance.create_callback = create_callback; - return AccessProcessInstances (ePluginRegisterInstance, instance, 0); + Mutex::Locker locker (GetProcessMutex ()); + GetProcessInstances ().push_back (instance); } return false; } @@ -1393,18 +1277,20 @@ PluginManager::RegisterPlugin const char * PluginManager::GetProcessPluginNameAtIndex (uint32_t idx) { - ProcessInstance instance; - if (AccessProcessInstances (ePluginGetInstanceAtIndex, instance, idx)) - return instance.name.c_str(); + Mutex::Locker locker (GetProcessMutex ()); + ProcessInstances &instances = GetProcessInstances (); + if (idx < instances.size()) + return instances[idx].name.c_str(); return NULL; } const char * PluginManager::GetProcessPluginDescriptionAtIndex (uint32_t idx) { - ProcessInstance instance; - if (AccessProcessInstances (ePluginGetInstanceAtIndex, instance, idx)) - return instance.description.c_str(); + Mutex::Locker locker (GetProcessMutex ()); + ProcessInstances &instances = GetProcessInstances (); + if (idx < instances.size()) + return instances[idx].description.c_str(); return NULL; } @@ -1413,9 +1299,18 @@ PluginManager::UnregisterPlugin (ProcessCreateInstance create_callback) { if (create_callback) { - ProcessInstance instance; - instance.create_callback = create_callback; - return AccessProcessInstances (ePluginUnregisterInstance, instance, 0); + Mutex::Locker locker (GetProcessMutex ()); + ProcessInstances &instances = GetProcessInstances (); + + ProcessInstances::iterator pos, end = instances.end(); + for (pos = instances.begin(); pos != end; ++ pos) + { + if (pos->create_callback == create_callback) + { + instances.erase(pos); + return true; + } + } } return false; } @@ -1423,23 +1318,28 @@ PluginManager::UnregisterPlugin (ProcessCreateInstance create_callback) ProcessCreateInstance PluginManager::GetProcessCreateCallbackAtIndex (uint32_t idx) { - ProcessInstance instance; - if (AccessProcessInstances (ePluginGetInstanceAtIndex, instance, idx)) - return instance.create_callback; + Mutex::Locker locker (GetProcessMutex ()); + ProcessInstances &instances = GetProcessInstances (); + if (idx < instances.size()) + return instances[idx].create_callback; return NULL; } + ProcessCreateInstance PluginManager::GetProcessCreateCallbackForPluginName (const char *name) { if (name && name[0]) { - ProcessInstance instance; - std::string ss_name(name); - for (uint32_t idx = 0; AccessProcessInstances (ePluginGetInstanceAtIndex, instance, idx); ++idx) + llvm::StringRef name_sref(name); + Mutex::Locker locker (GetProcessMutex ()); + ProcessInstances &instances = GetProcessInstances (); + + ProcessInstances::iterator pos, end = instances.end(); + for (pos = instances.begin(); pos != end; ++ pos) { - if (instance.name == ss_name) - return instance.create_callback; + if (name_sref.equals (pos->name)) + return pos->create_callback; } } return NULL; @@ -1463,48 +1363,18 @@ struct SymbolFileInstance typedef std::vector<SymbolFileInstance> SymbolFileInstances; -static bool -AccessSymbolFileInstances (PluginAction action, SymbolFileInstance &instance, uint32_t index) +static Mutex & +GetSymbolFileMutex () { - static SymbolFileInstances g_plugin_instances; - - switch (action) - { - case ePluginRegisterInstance: - if (instance.create_callback) - { - g_plugin_instances.push_back (instance); - return true; - } - break; - - case ePluginUnregisterInstance: - if (instance.create_callback) - { - SymbolFileInstances::iterator pos, end = g_plugin_instances.end(); - for (pos = g_plugin_instances.begin(); pos != end; ++ pos) - { - if (pos->create_callback == instance.create_callback) - { - g_plugin_instances.erase(pos); - return true; - } - } - } - break; - - case ePluginGetInstanceAtIndex: - if (index < g_plugin_instances.size()) - { - instance = g_plugin_instances[index]; - return true; - } - break; + static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive); + return g_instances_mutex; +} - default: - break; - } - return false; +static SymbolFileInstances & +GetSymbolFileInstances () +{ + static SymbolFileInstances g_instances; + return g_instances; } @@ -1524,7 +1394,8 @@ PluginManager::RegisterPlugin if (description && description[0]) instance.description = description; instance.create_callback = create_callback; - return AccessSymbolFileInstances (ePluginRegisterInstance, instance, 0); + Mutex::Locker locker (GetSymbolFileMutex ()); + GetSymbolFileInstances ().push_back (instance); } return false; } @@ -1534,9 +1405,18 @@ PluginManager::UnregisterPlugin (SymbolFileCreateInstance create_callback) { if (create_callback) { - SymbolFileInstance instance; - instance.create_callback = create_callback; - return AccessSymbolFileInstances (ePluginUnregisterInstance, instance, 0); + Mutex::Locker locker (GetSymbolFileMutex ()); + SymbolFileInstances &instances = GetSymbolFileInstances (); + + SymbolFileInstances::iterator pos, end = instances.end(); + for (pos = instances.begin(); pos != end; ++ pos) + { + if (pos->create_callback == create_callback) + { + instances.erase(pos); + return true; + } + } } return false; } @@ -1544,22 +1424,27 @@ PluginManager::UnregisterPlugin (SymbolFileCreateInstance create_callback) SymbolFileCreateInstance PluginManager::GetSymbolFileCreateCallbackAtIndex (uint32_t idx) { - SymbolFileInstance instance; - if (AccessSymbolFileInstances (ePluginGetInstanceAtIndex, instance, idx)) - return instance.create_callback; + Mutex::Locker locker (GetSymbolFileMutex ()); + SymbolFileInstances &instances = GetSymbolFileInstances (); + if (idx < instances.size()) + return instances[idx].create_callback; return NULL; } + SymbolFileCreateInstance PluginManager::GetSymbolFileCreateCallbackForPluginName (const char *name) { if (name && name[0]) { - SymbolFileInstance instance; - std::string ss_name(name); - for (uint32_t idx = 0; AccessSymbolFileInstances (ePluginGetInstanceAtIndex, instance, idx); ++idx) + llvm::StringRef name_sref(name); + Mutex::Locker locker (GetSymbolFileMutex ()); + SymbolFileInstances &instances = GetSymbolFileInstances (); + + SymbolFileInstances::iterator pos, end = instances.end(); + for (pos = instances.begin(); pos != end; ++ pos) { - if (instance.name == ss_name) - return instance.create_callback; + if (name_sref.equals (pos->name)) + return pos->create_callback; } } return NULL; @@ -1585,48 +1470,18 @@ struct SymbolVendorInstance typedef std::vector<SymbolVendorInstance> SymbolVendorInstances; -static bool -AccessSymbolVendorInstances (PluginAction action, SymbolVendorInstance &instance, uint32_t index) +static Mutex & +GetSymbolVendorMutex () { - static SymbolVendorInstances g_plugin_instances; - - switch (action) - { - case ePluginRegisterInstance: - if (instance.create_callback) - { - g_plugin_instances.push_back (instance); - return true; - } - break; - - case ePluginUnregisterInstance: - if (instance.create_callback) - { - SymbolVendorInstances::iterator pos, end = g_plugin_instances.end(); - for (pos = g_plugin_instances.begin(); pos != end; ++ pos) - { - if (pos->create_callback == instance.create_callback) - { - g_plugin_instances.erase(pos); - return true; - } - } - } - break; - - case ePluginGetInstanceAtIndex: - if (index < g_plugin_instances.size()) - { - instance = g_plugin_instances[index]; - return true; - } - break; + static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive); + return g_instances_mutex; +} - default: - break; - } - return false; +static SymbolVendorInstances & +GetSymbolVendorInstances () +{ + static SymbolVendorInstances g_instances; + return g_instances; } bool @@ -1645,7 +1500,8 @@ PluginManager::RegisterPlugin if (description && description[0]) instance.description = description; instance.create_callback = create_callback; - return AccessSymbolVendorInstances (ePluginRegisterInstance, instance, 0); + Mutex::Locker locker (GetSymbolVendorMutex ()); + GetSymbolVendorInstances ().push_back (instance); } return false; } @@ -1655,9 +1511,18 @@ PluginManager::UnregisterPlugin (SymbolVendorCreateInstance create_callback) { if (create_callback) { - SymbolVendorInstance instance; - instance.create_callback = create_callback; - return AccessSymbolVendorInstances (ePluginUnregisterInstance, instance, 0); + Mutex::Locker locker (GetSymbolVendorMutex ()); + SymbolVendorInstances &instances = GetSymbolVendorInstances (); + + SymbolVendorInstances::iterator pos, end = instances.end(); + for (pos = instances.begin(); pos != end; ++ pos) + { + if (pos->create_callback == create_callback) + { + instances.erase(pos); + return true; + } + } } return false; } @@ -1665,23 +1530,28 @@ PluginManager::UnregisterPlugin (SymbolVendorCreateInstance create_callback) SymbolVendorCreateInstance PluginManager::GetSymbolVendorCreateCallbackAtIndex (uint32_t idx) { - SymbolVendorInstance instance; - if (AccessSymbolVendorInstances (ePluginGetInstanceAtIndex, instance, idx)) - return instance.create_callback; + Mutex::Locker locker (GetSymbolVendorMutex ()); + SymbolVendorInstances &instances = GetSymbolVendorInstances (); + if (idx < instances.size()) + return instances[idx].create_callback; return NULL; } + SymbolVendorCreateInstance PluginManager::GetSymbolVendorCreateCallbackForPluginName (const char *name) { if (name && name[0]) { - SymbolVendorInstance instance; - std::string ss_name(name); - for (uint32_t idx = 0; AccessSymbolVendorInstances (ePluginGetInstanceAtIndex, instance, idx); ++idx) + llvm::StringRef name_sref(name); + Mutex::Locker locker (GetSymbolVendorMutex ()); + SymbolVendorInstances &instances = GetSymbolVendorInstances (); + + SymbolVendorInstances::iterator pos, end = instances.end(); + for (pos = instances.begin(); pos != end; ++ pos) { - if (instance.name == ss_name) - return instance.create_callback; + if (name_sref.equals (pos->name)) + return pos->create_callback; } } return NULL; @@ -1706,48 +1576,18 @@ struct UnwindAssemblyProfilerInstance typedef std::vector<UnwindAssemblyProfilerInstance> UnwindAssemblyProfilerInstances; -static bool -AccessUnwindAssemblyProfilerInstances (PluginAction action, UnwindAssemblyProfilerInstance &instance, uint32_t index) +static Mutex & +GetUnwindAssemblyProfilerMutex () { - static UnwindAssemblyProfilerInstances g_plugin_instances; - - switch (action) - { - case ePluginRegisterInstance: - if (instance.create_callback) - { - g_plugin_instances.push_back (instance); - return true; - } - break; - - case ePluginUnregisterInstance: - if (instance.create_callback) - { - UnwindAssemblyProfilerInstances::iterator pos, end = g_plugin_instances.end(); - for (pos = g_plugin_instances.begin(); pos != end; ++ pos) - { - if (pos->create_callback == instance.create_callback) - { - g_plugin_instances.erase(pos); - return true; - } - } - } - break; - - case ePluginGetInstanceAtIndex: - if (index < g_plugin_instances.size()) - { - instance = g_plugin_instances[index]; - return true; - } - break; + static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive); + return g_instances_mutex; +} - default: - break; - } - return false; +static UnwindAssemblyProfilerInstances & +GetUnwindAssemblyProfilerInstances () +{ + static UnwindAssemblyProfilerInstances g_instances; + return g_instances; } bool @@ -1766,7 +1606,8 @@ PluginManager::RegisterPlugin if (description && description[0]) instance.description = description; instance.create_callback = create_callback; - return AccessUnwindAssemblyProfilerInstances (ePluginRegisterInstance, instance, 0); + Mutex::Locker locker (GetUnwindAssemblyProfilerMutex ()); + GetUnwindAssemblyProfilerInstances ().push_back (instance); } return false; } @@ -1776,9 +1617,18 @@ PluginManager::UnregisterPlugin (UnwindAssemblyProfilerCreateInstance create_cal { if (create_callback) { - UnwindAssemblyProfilerInstance instance; - instance.create_callback = create_callback; - return AccessUnwindAssemblyProfilerInstances (ePluginUnregisterInstance, instance, 0); + Mutex::Locker locker (GetUnwindAssemblyProfilerMutex ()); + UnwindAssemblyProfilerInstances &instances = GetUnwindAssemblyProfilerInstances (); + + UnwindAssemblyProfilerInstances::iterator pos, end = instances.end(); + for (pos = instances.begin(); pos != end; ++ pos) + { + if (pos->create_callback == create_callback) + { + instances.erase(pos); + return true; + } + } } return false; } @@ -1786,23 +1636,28 @@ PluginManager::UnregisterPlugin (UnwindAssemblyProfilerCreateInstance create_cal UnwindAssemblyProfilerCreateInstance PluginManager::GetUnwindAssemblyProfilerCreateCallbackAtIndex (uint32_t idx) { - UnwindAssemblyProfilerInstance instance; - if (AccessUnwindAssemblyProfilerInstances (ePluginGetInstanceAtIndex, instance, idx)) - return instance.create_callback; + Mutex::Locker locker (GetUnwindAssemblyProfilerMutex ()); + UnwindAssemblyProfilerInstances &instances = GetUnwindAssemblyProfilerInstances (); + if (idx < instances.size()) + return instances[idx].create_callback; return NULL; } + UnwindAssemblyProfilerCreateInstance PluginManager::GetUnwindAssemblyProfilerCreateCallbackForPluginName (const char *name) { if (name && name[0]) { - UnwindAssemblyProfilerInstance instance; - std::string ss_name(name); - for (uint32_t idx = 0; AccessUnwindAssemblyProfilerInstances (ePluginGetInstanceAtIndex, instance, idx); ++idx) + llvm::StringRef name_sref(name); + Mutex::Locker locker (GetUnwindAssemblyProfilerMutex ()); + UnwindAssemblyProfilerInstances &instances = GetUnwindAssemblyProfilerInstances (); + + UnwindAssemblyProfilerInstances::iterator pos, end = instances.end(); + for (pos = instances.begin(); pos != end; ++ pos) { - if (instance.name == ss_name) - return instance.create_callback; + if (name_sref.equals (pos->name)) + return pos->create_callback; } } return NULL; @@ -1826,50 +1681,21 @@ struct ArchDefaultUnwindPlanInstance typedef std::vector<ArchDefaultUnwindPlanInstance> ArchDefaultUnwindPlanInstances; -static bool -AccessArchDefaultUnwindPlanInstances (PluginAction action, ArchDefaultUnwindPlanInstance &instance, uint32_t index) +static Mutex & +GetArchDefaultUnwindPlanMutex () { - static ArchDefaultUnwindPlanInstances g_plugin_instances; - - switch (action) - { - case ePluginRegisterInstance: - if (instance.create_callback) - { - g_plugin_instances.push_back (instance); - return true; - } - break; - - case ePluginUnregisterInstance: - if (instance.create_callback) - { - ArchDefaultUnwindPlanInstances::iterator pos, end = g_plugin_instances.end(); - for (pos = g_plugin_instances.begin(); pos != end; ++ pos) - { - if (pos->create_callback == instance.create_callback) - { - g_plugin_instances.erase(pos); - return true; - } - } - } - break; - - case ePluginGetInstanceAtIndex: - if (index < g_plugin_instances.size()) - { - instance = g_plugin_instances[index]; - return true; - } - break; + static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive); + return g_instances_mutex; +} - default: - break; - } - return false; +static ArchDefaultUnwindPlanInstances & +GetArchDefaultUnwindPlanInstances () +{ + static ArchDefaultUnwindPlanInstances g_instances; + return g_instances; } + bool PluginManager::RegisterPlugin ( @@ -1886,7 +1712,8 @@ PluginManager::RegisterPlugin if (description && description[0]) instance.description = description; instance.create_callback = create_callback; - return AccessArchDefaultUnwindPlanInstances (ePluginRegisterInstance, instance, 0); + Mutex::Locker locker (GetArchDefaultUnwindPlanMutex ()); + GetArchDefaultUnwindPlanInstances ().push_back (instance); } return false; } @@ -1896,9 +1723,18 @@ PluginManager::UnregisterPlugin (ArchDefaultUnwindPlanCreateInstance create_call { if (create_callback) { - ArchDefaultUnwindPlanInstance instance; - instance.create_callback = create_callback; - return AccessArchDefaultUnwindPlanInstances (ePluginUnregisterInstance, instance, 0); + Mutex::Locker locker (GetArchDefaultUnwindPlanMutex ()); + ArchDefaultUnwindPlanInstances &instances = GetArchDefaultUnwindPlanInstances (); + + ArchDefaultUnwindPlanInstances::iterator pos, end = instances.end(); + for (pos = instances.begin(); pos != end; ++ pos) + { + if (pos->create_callback == create_callback) + { + instances.erase(pos); + return true; + } + } } return false; } @@ -1906,23 +1742,28 @@ PluginManager::UnregisterPlugin (ArchDefaultUnwindPlanCreateInstance create_call ArchDefaultUnwindPlanCreateInstance PluginManager::GetArchDefaultUnwindPlanCreateCallbackAtIndex (uint32_t idx) { - ArchDefaultUnwindPlanInstance instance; - if (AccessArchDefaultUnwindPlanInstances (ePluginGetInstanceAtIndex, instance, idx)) - return instance.create_callback; + Mutex::Locker locker (GetArchDefaultUnwindPlanMutex ()); + ArchDefaultUnwindPlanInstances &instances = GetArchDefaultUnwindPlanInstances (); + if (idx < instances.size()) + return instances[idx].create_callback; return NULL; } + ArchDefaultUnwindPlanCreateInstance PluginManager::GetArchDefaultUnwindPlanCreateCallbackForPluginName (const char *name) { if (name && name[0]) { - ArchDefaultUnwindPlanInstance instance; - std::string ss_name(name); - for (uint32_t idx = 0; AccessArchDefaultUnwindPlanInstances (ePluginGetInstanceAtIndex, instance, idx); ++idx) + llvm::StringRef name_sref(name); + Mutex::Locker locker (GetArchDefaultUnwindPlanMutex ()); + ArchDefaultUnwindPlanInstances &instances = GetArchDefaultUnwindPlanInstances (); + + ArchDefaultUnwindPlanInstances::iterator pos, end = instances.end(); + for (pos = instances.begin(); pos != end; ++ pos) { - if (instance.name == ss_name) - return instance.create_callback; + if (name_sref.equals (pos->name)) + return pos->create_callback; } } return NULL; @@ -1946,48 +1787,18 @@ struct ArchVolatileRegsInstance typedef std::vector<ArchVolatileRegsInstance> ArchVolatileRegsInstances; -static bool -AccessArchVolatileRegsInstances (PluginAction action, ArchVolatileRegsInstance &instance, uint32_t index) +static Mutex & +GetArchVolatileRegsMutex () { - static ArchVolatileRegsInstances g_plugin_instances; - - switch (action) - { - case ePluginRegisterInstance: - if (instance.create_callback) - { - g_plugin_instances.push_back (instance); - return true; - } - break; - - case ePluginUnregisterInstance: - if (instance.create_callback) - { - ArchVolatileRegsInstances::iterator pos, end = g_plugin_instances.end(); - for (pos = g_plugin_instances.begin(); pos != end; ++ pos) - { - if (pos->create_callback == instance.create_callback) - { - g_plugin_instances.erase(pos); - return true; - } - } - } - break; - - case ePluginGetInstanceAtIndex: - if (index < g_plugin_instances.size()) - { - instance = g_plugin_instances[index]; - return true; - } - break; + static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive); + return g_instances_mutex; +} - default: - break; - } - return false; +static ArchVolatileRegsInstances & +GetArchVolatileRegsInstances () +{ + static ArchVolatileRegsInstances g_instances; + return g_instances; } bool @@ -2006,7 +1817,8 @@ PluginManager::RegisterPlugin if (description && description[0]) instance.description = description; instance.create_callback = create_callback; - return AccessArchVolatileRegsInstances (ePluginRegisterInstance, instance, 0); + Mutex::Locker locker (GetArchVolatileRegsMutex ()); + GetArchVolatileRegsInstances ().push_back (instance); } return false; } @@ -2016,9 +1828,18 @@ PluginManager::UnregisterPlugin (ArchVolatileRegsCreateInstance create_callback) { if (create_callback) { - ArchVolatileRegsInstance instance; - instance.create_callback = create_callback; - return AccessArchVolatileRegsInstances (ePluginUnregisterInstance, instance, 0); + Mutex::Locker locker (GetArchVolatileRegsMutex ()); + ArchVolatileRegsInstances &instances = GetArchVolatileRegsInstances (); + + ArchVolatileRegsInstances::iterator pos, end = instances.end(); + for (pos = instances.begin(); pos != end; ++ pos) + { + if (pos->create_callback == create_callback) + { + instances.erase(pos); + return true; + } + } } return false; } @@ -2026,9 +1847,10 @@ PluginManager::UnregisterPlugin (ArchVolatileRegsCreateInstance create_callback) ArchVolatileRegsCreateInstance PluginManager::GetArchVolatileRegsCreateCallbackAtIndex (uint32_t idx) { - ArchVolatileRegsInstance instance; - if (AccessArchVolatileRegsInstances (ePluginGetInstanceAtIndex, instance, idx)) - return instance.create_callback; + Mutex::Locker locker (GetArchVolatileRegsMutex ()); + ArchVolatileRegsInstances &instances = GetArchVolatileRegsInstances (); + if (idx < instances.size()) + return instances[idx].create_callback; return NULL; } @@ -2037,12 +1859,15 @@ PluginManager::GetArchVolatileRegsCreateCallbackForPluginName (const char *name) { if (name && name[0]) { - ArchVolatileRegsInstance instance; - std::string ss_name(name); - for (uint32_t idx = 0; AccessArchVolatileRegsInstances (ePluginGetInstanceAtIndex, instance, idx); ++idx) + llvm::StringRef name_sref(name); + Mutex::Locker locker (GetArchVolatileRegsMutex ()); + ArchVolatileRegsInstances &instances = GetArchVolatileRegsInstances (); + + ArchVolatileRegsInstances::iterator pos, end = instances.end(); + for (pos = instances.begin(); pos != end; ++ pos) { - if (instance.name == ss_name) - return instance.create_callback; + if (name_sref.equals (pos->name)) + return pos->create_callback; } } return NULL; diff --git a/lldb/source/Interpreter/CommandObject.cpp b/lldb/source/Interpreter/CommandObject.cpp index baf4fcb37c0..76cee5af5db 100644 --- a/lldb/source/Interpreter/CommandObject.cpp +++ b/lldb/source/Interpreter/CommandObject.cpp @@ -650,7 +650,7 @@ CommandObject::g_arguments_data[] = { eArgTypeAddress, "address", CommandCompletions::eNoCompletion, NULL, "A valid address in the target program's execution space." }, { eArgTypeAliasName, "alias-name", CommandCompletions::eNoCompletion, NULL, "The name of an abbreviation (alias) for a debugger command." }, { eArgTypeAliasOptions, "options-for-aliased-command", CommandCompletions::eNoCompletion, NULL, "Command options to be used as part of an alias (abbreviation) definition. (See 'help commands alias' for more information.)" }, - { eArgTypeArchitecture, "arch", CommandCompletions::eNoCompletion, NULL, "The architecture name, e.g. i386 or x86_64." }, + { eArgTypeArchitecture, "arch", CommandCompletions::eArchitectureCompletion, NULL, "The architecture name, e.g. i386 or x86_64." }, { eArgTypeBoolean, "boolean", CommandCompletions::eNoCompletion, NULL, "A Boolean value: 'true' or 'false'" }, { eArgTypeBreakpointID, "breakpt-id", CommandCompletions::eNoCompletion, BreakpointIDHelpTextCallback, NULL }, { eArgTypeBreakpointIDRange, "breakpt-id-list", CommandCompletions::eNoCompletion, BreakpointIDRangeHelpTextCallback, NULL }, @@ -707,6 +707,7 @@ CommandObject::g_arguments_data[] = { eArgTypeValue, "value", CommandCompletions::eNoCompletion, NULL, "A value could be anything, depending on where and how it is used." }, { eArgTypeWidth, "width", CommandCompletions::eNoCompletion, NULL, "Help text goes here." }, { eArgTypeNone, "none", CommandCompletions::eNoCompletion, NULL, "No help available for this." }, + { eArgTypePlatform, "platform-name", CommandCompletions::ePlatformPluginCompletion, NULL, "The name of an installed platform plug-in . Type 'platform list' to see a complete list of installed platforms." } }; const CommandObject::ArgumentTableEntry* diff --git a/lldb/source/Interpreter/Options.cpp b/lldb/source/Interpreter/Options.cpp index 8f1e10abaec..d6b30edeb66 100644 --- a/lldb/source/Interpreter/Options.cpp +++ b/lldb/source/Interpreter/Options.cpp @@ -11,8 +11,9 @@ // C Includes // C++ Includes -#include <bitset> #include <algorithm> +#include <bitset> +#include <set> // Other libraries and framework includes // Project includes @@ -853,7 +854,19 @@ Options::HandleOptionArgumentCompletion // for that shared library. // FIXME: Do we want to also have an "OptionType" so we don't have to match string names? - uint32_t completion_mask = opt_defs[opt_defs_index].completionType; + uint32_t completion_mask = opt_defs[opt_defs_index].completion_type; + + if (completion_mask == 0) + { + lldb::CommandArgumentType option_arg_type = opt_defs[opt_defs_index].argument_type; + if (option_arg_type != eArgTypeNone) + { + CommandObject::ArgumentTableEntry *arg_entry = CommandObject::FindArgumentDataByType (opt_defs[opt_defs_index].argument_type); + if (arg_entry) + completion_mask = arg_entry->completion_type; + } + } + if (completion_mask & CommandCompletions::eSourceFileCompletion || completion_mask & CommandCompletions::eSymbolCompletion) { @@ -893,28 +906,21 @@ Options::HandleOptionArgumentCompletion } - - -void -OptionGroupOptions::Append (OptionGroup* group) -{ - m_option_groups.push_back (group); - const OptionDefinition* group_option_defs = group->GetDefinitions (); - const uint32_t group_option_count = group->GetNumDefinitions(); - for (uint32_t i=0; i<group_option_count; ++i) - m_option_defs.push_back (group_option_defs[i]); -} - void -OptionGroupOptions::Append (OptionGroup* group, uint32_t usage_mask) +OptionGroupOptions::Append (OptionGroup* group, + uint32_t src_mask, + uint32_t dst_mask) { - m_option_groups.push_back (group); const OptionDefinition* group_option_defs = group->GetDefinitions (); const uint32_t group_option_count = group->GetNumDefinitions(); for (uint32_t i=0; i<group_option_count; ++i) { - m_option_defs.push_back (group_option_defs[i]); - m_option_defs.back().usage_mask = usage_mask; + if (group_option_defs[i].usage_mask & src_mask) + { + m_option_infos.push_back (OptionInfo (group, i)); + m_option_defs.push_back (group_option_defs[i]); + m_option_defs.back().usage_mask = dst_mask; + } } } @@ -933,38 +939,53 @@ OptionGroupOptions::SetOptionValue (uint32_t option_idx, // After calling OptionGroupOptions::Append(...), you must finalize the groups // by calling OptionGroupOptions::Finlize() assert (m_did_finalize); - - uint32_t curr_idx = 0; - OptionGroupsType::iterator pos, end = m_option_groups.end(); - for (pos = m_option_groups.begin(); pos != end; ++pos) + assert (m_option_infos.size() + 1 == m_option_defs.size()); + Error error; + if (option_idx < m_option_infos.size()) { - const uint32_t num_group_definitions = (*pos)->GetNumDefinitions(); - if (option_idx < curr_idx + num_group_definitions) - return (*pos)->SetOptionValue (m_interpreter, option_idx - curr_idx, option_value); - curr_idx += num_group_definitions; + error = m_option_infos[option_idx].option_group->SetOptionValue (m_interpreter, + m_option_infos[option_idx].option_index, + option_value); + + } + else + { + error.SetErrorString ("invalid option index"); // Shouldn't happen... } - Error error; - error.SetErrorString ("invalid option index"); // Shouldn't happen... return error; } void OptionGroupOptions::OptionParsingStarting () { - OptionGroupsType::iterator pos, end = m_option_groups.end(); - for (pos = m_option_groups.begin(); pos != end; ++pos) - (*pos)->OptionParsingStarting (m_interpreter); + std::set<OptionGroup*> group_set; + OptionInfos::iterator pos, end = m_option_infos.end(); + for (pos = m_option_infos.begin(); pos != end; ++pos) + { + OptionGroup* group = pos->option_group; + if (group_set.find(group) == group_set.end()) + { + group->OptionParsingStarting (m_interpreter); + group_set.insert(group); + } + } } Error OptionGroupOptions::OptionParsingFinished () { + std::set<OptionGroup*> group_set; Error error; - OptionGroupsType::iterator pos, end = m_option_groups.end(); - for (pos = m_option_groups.begin(); pos != end; ++pos) + OptionInfos::iterator pos, end = m_option_infos.end(); + for (pos = m_option_infos.begin(); pos != end; ++pos) { - error = (*pos)->OptionParsingFinished (m_interpreter); - if (error.Fail()) - return error; + OptionGroup* group = pos->option_group; + if (group_set.find(group) == group_set.end()) + { + error = group->OptionParsingFinished (m_interpreter); + group_set.insert(group); + if (error.Fail()) + return error; + } } return error; } diff --git a/lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.cpp b/lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.cpp index d86ac4e0e90..225159347e2 100644 --- a/lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.cpp +++ b/lldb/source/Plugins/Platform/MacOSX/PlatformMacOSX.cpp @@ -80,7 +80,7 @@ const char * PlatformMacOSX::GetShortPluginNameStatic (bool is_host) { if (is_host) - return "local-macosx"; + return Platform::GetHostPlatformName (); else return "remote-macosx"; } diff --git a/lldb/source/Plugins/Platform/gdb-server/PlatformRemoteGDBServer.cpp b/lldb/source/Plugins/Platform/gdb-server/PlatformRemoteGDBServer.cpp index f8b67a31280..66534c3d323 100644 --- a/lldb/source/Plugins/Platform/gdb-server/PlatformRemoteGDBServer.cpp +++ b/lldb/source/Plugins/Platform/gdb-server/PlatformRemoteGDBServer.cpp @@ -312,7 +312,7 @@ PlatformRemoteGDBServer::LaunchProcess (ProcessLaunchInfo &launch_info) break; } } - const uint32_t old_packet_timeout = m_gdb_client.SetPacketTimeout (3000); // TODO: lower this to 5 seconds prior to checkin!!! + const uint32_t old_packet_timeout = m_gdb_client.SetPacketTimeout (5); int arg_packet_err = m_gdb_client.SendArgumentsPacket (argv); m_gdb_client.SetPacketTimeout (old_packet_timeout); if (arg_packet_err == 0) diff --git a/lldb/source/Plugins/SymbolFile/DWARF/LogChannelDWARF.cpp b/lldb/source/Plugins/SymbolFile/DWARF/LogChannelDWARF.cpp index 9e9f6442071..aa43d4fe933 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/LogChannelDWARF.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/LogChannelDWARF.cpp @@ -54,16 +54,9 @@ LogChannelDWARF::CreateInstance () const char * LogChannelDWARF::GetPluginNameStatic() { - static std::string g_plugin_name; - if (g_plugin_name.empty()) - { - g_plugin_name = SymbolFileDWARF::GetPluginNameStatic(); - g_plugin_name += LogChannel::GetPluginSuffix (); - } - return g_plugin_name.c_str(); + return SymbolFileDWARF::GetPluginNameStatic(); } - const char * LogChannelDWARF::GetPluginDescriptionStatic() { diff --git a/lldb/source/Target/Platform.cpp b/lldb/source/Target/Platform.cpp index 34c7337979e..5c38ab33928 100644 --- a/lldb/source/Target/Platform.cpp +++ b/lldb/source/Target/Platform.cpp @@ -46,6 +46,13 @@ GetConnectedPlatformList () return g_remote_connected_platforms; } + +const char * +Platform::GetHostPlatformName () +{ + return "host"; +} + //------------------------------------------------------------------ /// Get the native host platform plug-in. /// @@ -319,11 +326,8 @@ Platform::GetName () const char * Platform::GetHostname () { - if (IsHost() && m_name.empty()) - { - if (!Host::GetHostname(m_name)) - return "localhost"; - } + if (IsHost()) + return "localhost"; if (m_name.empty()) return NULL; |