Author: enrico Date: Thu Aug 27 16:33:50 2015 New Revision: 246212 URL: http://llvm.org/viewvc/llvm-project?rev=246212&view=rev Log: Add a new type of plugin: Language plugin
The Language plugin is menat to answer language-specific questions that are not bound to the existence of a process. Those are still the domain of the LanguageRuntime plugin The Language plugin will, instead, answer questions such as providing language-specific data formatters or expression evaluation At the moment, the interface is hollowed out, and empty do-nothing plugins have been setup for ObjC, C++ and ObjC++ Added: lldb/trunk/include/lldb/Target/Language.h lldb/trunk/source/Plugins/Language/ lldb/trunk/source/Plugins/Language/CMakeLists.txt lldb/trunk/source/Plugins/Language/CPlusPlus/ lldb/trunk/source/Plugins/Language/CPlusPlus/CMakeLists.txt lldb/trunk/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp lldb/trunk/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.h lldb/trunk/source/Plugins/Language/ObjC/ lldb/trunk/source/Plugins/Language/ObjC/CMakeLists.txt lldb/trunk/source/Plugins/Language/ObjC/ObjCLanguage.cpp lldb/trunk/source/Plugins/Language/ObjC/ObjCLanguage.h lldb/trunk/source/Plugins/Language/ObjCPlusPlus/ lldb/trunk/source/Plugins/Language/ObjCPlusPlus/CMakeLists.txt lldb/trunk/source/Plugins/Language/ObjCPlusPlus/ObjCPlusPlusLanguage.cpp lldb/trunk/source/Plugins/Language/ObjCPlusPlus/ObjCPlusPlusLanguage.h lldb/trunk/source/Target/Language.cpp Modified: lldb/trunk/include/lldb/Core/PluginManager.h lldb/trunk/include/lldb/DataFormatters/FormatCache.h lldb/trunk/include/lldb/lldb-forward.h lldb/trunk/include/lldb/lldb-private-interfaces.h lldb/trunk/lldb.xcodeproj/project.pbxproj lldb/trunk/source/Core/PluginManager.cpp lldb/trunk/source/Plugins/CMakeLists.txt Modified: lldb/trunk/include/lldb/Core/PluginManager.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Core/PluginManager.h?rev=246212&r1=246211&r2=246212&view=diff ============================================================================== --- lldb/trunk/include/lldb/Core/PluginManager.h (original) +++ lldb/trunk/include/lldb/Core/PluginManager.h Thu Aug 27 16:33:50 2015 @@ -132,6 +132,23 @@ public: GetOperatingSystemCreateCallbackForPluginName (const ConstString &name); //------------------------------------------------------------------ + // Language + //------------------------------------------------------------------ + static bool + RegisterPlugin (const ConstString &name, + const char *description, + LanguageCreateInstance create_callback); + + static bool + UnregisterPlugin (LanguageCreateInstance create_callback); + + static LanguageCreateInstance + GetLanguageCreateCallbackAtIndex (uint32_t idx); + + static LanguageCreateInstance + GetLanguageCreateCallbackForPluginName (const ConstString &name); + + //------------------------------------------------------------------ // LanguageRuntime //------------------------------------------------------------------ static bool Modified: lldb/trunk/include/lldb/DataFormatters/FormatCache.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/DataFormatters/FormatCache.h?rev=246212&r1=246211&r2=246212&view=diff ============================================================================== --- lldb/trunk/include/lldb/DataFormatters/FormatCache.h (original) +++ lldb/trunk/include/lldb/DataFormatters/FormatCache.h Thu Aug 27 16:33:50 2015 @@ -19,7 +19,6 @@ #include "lldb/lldb-public.h" #include "lldb/Core/ConstString.h" #include "lldb/Host/Mutex.h" -#include "lldb/DataFormatters/FormatClasses.h" namespace lldb_private { class FormatCache Added: lldb/trunk/include/lldb/Target/Language.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Target/Language.h?rev=246212&view=auto ============================================================================== --- lldb/trunk/include/lldb/Target/Language.h (added) +++ lldb/trunk/include/lldb/Target/Language.h Thu Aug 27 16:33:50 2015 @@ -0,0 +1,55 @@ +//===-- Language.h ---------------------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef liblldb_Language_h_ +#define liblldb_Language_h_ + +// C Includes +// C++ Includes +#include <functional> + +// Other libraries and framework includes +// Project includes +#include "lldb/lldb-public.h" +#include "lldb/Core/PluginInterface.h" +#include "lldb/lldb-private.h" + +namespace lldb_private { + + class Language : + public PluginInterface + { + public: + + ~Language() override; + + static Language* + FindPlugin (lldb::LanguageType language); + + // return false from callback to stop iterating + static void + ForEach (std::function<bool(Language*)> callback); + + virtual lldb::LanguageType + GetLanguageType () const = 0; + + protected: + //------------------------------------------------------------------ + // Classes that inherit from Language can see and modify these + //------------------------------------------------------------------ + + Language(); + private: + + DISALLOW_COPY_AND_ASSIGN (Language); + }; + +} // namespace lldb_private + +#endif // liblldb_Language_h_ Modified: lldb/trunk/include/lldb/lldb-forward.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/lldb-forward.h?rev=246212&r1=246211&r2=246212&view=diff ============================================================================== --- lldb/trunk/include/lldb/lldb-forward.h (original) +++ lldb/trunk/include/lldb/lldb-forward.h Thu Aug 27 16:33:50 2015 @@ -114,6 +114,7 @@ class IOObject; class IRExecutionUnit; class JITLoader; class JITLoaderList; +class Language; class LanguageRuntime; class MemoryRegionInfo; class LineTable; Modified: lldb/trunk/include/lldb/lldb-private-interfaces.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/lldb-private-interfaces.h?rev=246212&r1=246211&r2=246212&view=diff ============================================================================== --- lldb/trunk/include/lldb/lldb-private-interfaces.h (original) +++ lldb/trunk/include/lldb/lldb-private-interfaces.h Thu Aug 27 16:33:50 2015 @@ -28,6 +28,7 @@ namespace lldb_private typedef LogChannel* (*LogChannelCreateInstance) (); typedef EmulateInstruction * (*EmulateInstructionCreateInstance) (const ArchSpec &arch, InstructionType inst_type); typedef OperatingSystem* (*OperatingSystemCreateInstance) (Process *process, bool force); + typedef Language *(*LanguageCreateInstance) (lldb::LanguageType language); typedef LanguageRuntime *(*LanguageRuntimeCreateInstance) (Process *process, lldb::LanguageType language); typedef lldb::CommandObjectSP (*LanguageRuntimeGetCommandObject) (CommandInterpreter& interpreter); typedef SystemRuntime *(*SystemRuntimeCreateInstance) (Process *process); Modified: lldb/trunk/lldb.xcodeproj/project.pbxproj URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/lldb.xcodeproj/project.pbxproj?rev=246212&r1=246211&r2=246212&view=diff ============================================================================== --- lldb/trunk/lldb.xcodeproj/project.pbxproj (original) +++ lldb/trunk/lldb.xcodeproj/project.pbxproj Thu Aug 27 16:33:50 2015 @@ -753,6 +753,9 @@ 9492E2A51A8AC11000295BBD /* CoreMedia.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9492E2A41A8AC11000295BBD /* CoreMedia.cpp */; }; 949ADF031406F648004833E1 /* ValueObjectConstResultImpl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 949ADF021406F648004833E1 /* ValueObjectConstResultImpl.cpp */; }; 94A5B3971AB9FE8D00A5EE7F /* EmulateInstructionMIPS64.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94A5B3951AB9FE8300A5EE7F /* EmulateInstructionMIPS64.cpp */; }; + 94B638531B8F8E6C004FE1E4 /* Language.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94B638521B8F8E6C004FE1E4 /* Language.cpp */; settings = {ASSET_TAGS = (); }; }; + 94B6385D1B8FB178004FE1E4 /* CPlusPlusLanguage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94B6385B1B8FB174004FE1E4 /* CPlusPlusLanguage.cpp */; settings = {ASSET_TAGS = (); }; }; + 94B638631B8FB7F1004FE1E4 /* ObjCPlusPlusLanguage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94B638621B8FB7F1004FE1E4 /* ObjCPlusPlusLanguage.cpp */; settings = {ASSET_TAGS = (); }; }; 94B6E76213D88365005F417F /* ValueObjectSyntheticFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94B6E76113D88362005F417F /* ValueObjectSyntheticFilter.cpp */; }; 94BA8B6D176F8C9B005A91B5 /* Range.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94BA8B6C176F8C9B005A91B5 /* Range.cpp */; }; 94BA8B70176F97CE005A91B5 /* CommandHistory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94BA8B6F176F97CE005A91B5 /* CommandHistory.cpp */; }; @@ -2455,6 +2458,14 @@ 949ADF021406F648004833E1 /* ValueObjectConstResultImpl.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ValueObjectConstResultImpl.cpp; path = source/Core/ValueObjectConstResultImpl.cpp; sourceTree = "<group>"; }; 94A5B3951AB9FE8300A5EE7F /* EmulateInstructionMIPS64.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = EmulateInstructionMIPS64.cpp; path = MIPS64/EmulateInstructionMIPS64.cpp; sourceTree = "<group>"; }; 94A5B3961AB9FE8300A5EE7F /* EmulateInstructionMIPS64.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = EmulateInstructionMIPS64.h; path = MIPS64/EmulateInstructionMIPS64.h; sourceTree = "<group>"; }; + 94B638511B8F8E53004FE1E4 /* Language.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Language.h; path = include/lldb/Target/Language.h; sourceTree = "<group>"; }; + 94B638521B8F8E6C004FE1E4 /* Language.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Language.cpp; path = source/Target/Language.cpp; sourceTree = "<group>"; }; + 94B6385B1B8FB174004FE1E4 /* CPlusPlusLanguage.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = CPlusPlusLanguage.cpp; path = Language/CPlusPlus/CPlusPlusLanguage.cpp; sourceTree = "<group>"; }; + 94B6385C1B8FB174004FE1E4 /* CPlusPlusLanguage.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = CPlusPlusLanguage.h; path = Language/CPlusPlus/CPlusPlusLanguage.h; sourceTree = "<group>"; }; + 94B6385E1B8FB7A2004FE1E4 /* ObjCLanguage.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = ObjCLanguage.cpp; path = Language/ObjC/ObjCLanguage.cpp; sourceTree = "<group>"; }; + 94B6385F1B8FB7A2004FE1E4 /* ObjCLanguage.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ObjCLanguage.h; path = Language/ObjC/ObjCLanguage.h; sourceTree = "<group>"; }; + 94B638611B8FB7E9004FE1E4 /* ObjCPlusPlusLanguage.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ObjCPlusPlusLanguage.h; path = Language/ObjCPlusPlus/ObjCPlusPlusLanguage.h; sourceTree = "<group>"; }; + 94B638621B8FB7F1004FE1E4 /* ObjCPlusPlusLanguage.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ObjCPlusPlusLanguage.cpp; path = Language/ObjCPlusPlus/ObjCPlusPlusLanguage.cpp; sourceTree = "<group>"; }; 94B6E76013D8833C005F417F /* ValueObjectSyntheticFilter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ValueObjectSyntheticFilter.h; path = include/lldb/Core/ValueObjectSyntheticFilter.h; sourceTree = "<group>"; }; 94B6E76113D88362005F417F /* ValueObjectSyntheticFilter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ValueObjectSyntheticFilter.cpp; path = source/Core/ValueObjectSyntheticFilter.cpp; sourceTree = "<group>"; }; 94BA8B6C176F8C9B005A91B5 /* Range.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Range.cpp; path = source/Utility/Range.cpp; sourceTree = "<group>"; }; @@ -2947,6 +2958,7 @@ 260C897810F57C5600BB2B04 /* DynamicLoader */, 26D9FDCA12F785120003F2EE /* Instruction */, AF2BCA6518C7EFDE005B4526 /* JITLoader */, + 94B638541B8FABEA004FE1E4 /* Language */, 4CCA643A13B40B82003BDF98 /* LanguageRuntime */, 260C897E10F57C5600BB2B04 /* ObjectContainer */, 260C898210F57C5600BB2B04 /* ObjectFile */, @@ -4559,6 +4571,8 @@ 26BC179718C7F2B300D2196D /* JITLoader.cpp */, 26BC179C18C7F2CB00D2196D /* JITLoaderList.h */, 26BC179818C7F2B300D2196D /* JITLoaderList.cpp */, + 94B638511B8F8E53004FE1E4 /* Language.h */, + 94B638521B8F8E6C004FE1E4 /* Language.cpp */, 4CB4430912491DDA00C13DC2 /* LanguageRuntime.h */, 4CB4430A12491DDA00C13DC2 /* LanguageRuntime.cpp */, 2690B36F1381D5B600ECFBAE /* Memory.h */, @@ -5221,6 +5235,43 @@ name = MIPS64; sourceTree = "<group>"; }; + 94B638541B8FABEA004FE1E4 /* Language */ = { + isa = PBXGroup; + children = ( + 94B6385A1B8FB109004FE1E4 /* CPlusPlus */, + 94B638551B8FAC87004FE1E4 /* ObjC */, + 94B638601B8FB7BE004FE1E4 /* ObjCPlusPlus */, + ); + name = Language; + sourceTree = "<group>"; + }; + 94B638551B8FAC87004FE1E4 /* ObjC */ = { + isa = PBXGroup; + children = ( + 94B6385F1B8FB7A2004FE1E4 /* ObjCLanguage.h */, + 94B6385E1B8FB7A2004FE1E4 /* ObjCLanguage.cpp */, + ); + name = ObjC; + sourceTree = "<group>"; + }; + 94B6385A1B8FB109004FE1E4 /* CPlusPlus */ = { + isa = PBXGroup; + children = ( + 94B6385C1B8FB174004FE1E4 /* CPlusPlusLanguage.h */, + 94B6385B1B8FB174004FE1E4 /* CPlusPlusLanguage.cpp */, + ); + name = CPlusPlus; + sourceTree = "<group>"; + }; + 94B638601B8FB7BE004FE1E4 /* ObjCPlusPlus */ = { + isa = PBXGroup; + children = ( + 94B638611B8FB7E9004FE1E4 /* ObjCPlusPlusLanguage.h */, + 94B638621B8FB7F1004FE1E4 /* ObjCPlusPlusLanguage.cpp */, + ); + name = ObjCPlusPlus; + sourceTree = "<group>"; + }; 94CB255616B0683B0059775D /* DataFormatters */ = { isa = PBXGroup; children = ( @@ -6041,6 +6092,7 @@ 2689001B13353DDE00698AC0 /* CommandObjectHelp.cpp in Sources */, 23F4034D1926E0F60046DC9B /* NativeRegisterContextRegisterInfo.cpp in Sources */, 964463EC1A330C0500154ED8 /* CompactUnwindInfo.cpp in Sources */, + 94B638531B8F8E6C004FE1E4 /* Language.cpp in Sources */, 2689001D13353DDE00698AC0 /* CommandObjectLog.cpp in Sources */, 262173A318395D4600C52091 /* SectionLoadHistory.cpp in Sources */, 2689001E13353DDE00698AC0 /* CommandObjectMemory.cpp in Sources */, @@ -6323,6 +6375,7 @@ 8CF02AEF19DD16B100B14BE0 /* InstrumentationRuntimeStopInfo.cpp in Sources */, 268900FC13353E6F00698AC0 /* ThreadPlanBase.cpp in Sources */, 268900FD13353E6F00698AC0 /* ThreadPlanCallFunction.cpp in Sources */, + 94B6385D1B8FB178004FE1E4 /* CPlusPlusLanguage.cpp in Sources */, 268900FE13353E6F00698AC0 /* ThreadPlanCallUserExpression.cpp in Sources */, 268900FF13353E6F00698AC0 /* ThreadPlanShouldStopHere.cpp in Sources */, 2689010013353E6F00698AC0 /* ThreadPlanStepInstruction.cpp in Sources */, @@ -6459,6 +6512,7 @@ 26CFDCA3186163A4000E63E5 /* Editline.cpp in Sources */, 26E152261419CAD4007967D0 /* ObjectFilePECOFF.cpp in Sources */, B2462247141AD37D00F3D409 /* OptionGroupWatchpoint.cpp in Sources */, + 94B638631B8FB7F1004FE1E4 /* ObjCPlusPlusLanguage.cpp in Sources */, 49A71FE7141FFA5C00D59478 /* IRInterpreter.cpp in Sources */, 49A71FE8141FFACF00D59478 /* DataEncoder.cpp in Sources */, 23DDF226196C3EE600BB8417 /* CommandOptionValidators.cpp in Sources */, Modified: lldb/trunk/source/Core/PluginManager.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/PluginManager.cpp?rev=246212&r1=246211&r2=246212&view=diff ============================================================================== --- lldb/trunk/source/Core/PluginManager.cpp (original) +++ lldb/trunk/source/Core/PluginManager.cpp Thu Aug 27 16:33:50 2015 @@ -868,6 +868,111 @@ PluginManager::GetOperatingSystemCreateC } +#pragma mark Language + + +struct LanguageInstance +{ + LanguageInstance() : + name(), + description(), + create_callback(NULL) + { + } + + ConstString name; + std::string description; + LanguageCreateInstance create_callback; +}; + +typedef std::vector<LanguageInstance> LanguageInstances; + +static Mutex & +GetLanguageMutex () +{ + static Mutex g_instances_mutex (Mutex::eMutexTypeRecursive); + return g_instances_mutex; +} + +static LanguageInstances & +GetLanguageInstances () +{ + static LanguageInstances g_instances; + return g_instances; +} + +bool +PluginManager::RegisterPlugin +( + const ConstString &name, + const char *description, + LanguageCreateInstance create_callback + ) +{ + if (create_callback) + { + LanguageInstance instance; + assert ((bool)name); + instance.name = name; + if (description && description[0]) + instance.description = description; + instance.create_callback = create_callback; + Mutex::Locker locker (GetLanguageMutex ()); + GetLanguageInstances ().push_back (instance); + } + return false; +} + +bool +PluginManager::UnregisterPlugin (LanguageCreateInstance create_callback) +{ + if (create_callback) + { + Mutex::Locker locker (GetLanguageMutex ()); + LanguageInstances &instances = GetLanguageInstances (); + + LanguageInstances::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; +} + +LanguageCreateInstance +PluginManager::GetLanguageCreateCallbackAtIndex (uint32_t idx) +{ + Mutex::Locker locker (GetLanguageMutex ()); + LanguageInstances &instances = GetLanguageInstances (); + if (idx < instances.size()) + return instances[idx].create_callback; + return NULL; +} + +LanguageCreateInstance +PluginManager::GetLanguageCreateCallbackForPluginName (const ConstString &name) +{ + if (name) + { + Mutex::Locker locker (GetLanguageMutex ()); + LanguageInstances &instances = GetLanguageInstances (); + + LanguageInstances::iterator pos, end = instances.end(); + for (pos = instances.begin(); pos != end; ++ pos) + { + if (name == pos->name) + return pos->create_callback; + } + } + return NULL; +} + + #pragma mark LanguageRuntime Modified: lldb/trunk/source/Plugins/CMakeLists.txt URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/CMakeLists.txt?rev=246212&r1=246211&r2=246212&view=diff ============================================================================== --- lldb/trunk/source/Plugins/CMakeLists.txt (original) +++ lldb/trunk/source/Plugins/CMakeLists.txt Thu Aug 27 16:33:50 2015 @@ -4,6 +4,7 @@ add_subdirectory(DynamicLoader) add_subdirectory(Instruction) add_subdirectory(InstrumentationRuntime) add_subdirectory(JITLoader) +add_subdirectory(Language) add_subdirectory(LanguageRuntime) add_subdirectory(MemoryHistory) add_subdirectory(ObjectContainer) Added: lldb/trunk/source/Plugins/Language/CMakeLists.txt URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Language/CMakeLists.txt?rev=246212&view=auto ============================================================================== --- lldb/trunk/source/Plugins/Language/CMakeLists.txt (added) +++ lldb/trunk/source/Plugins/Language/CMakeLists.txt Thu Aug 27 16:33:50 2015 @@ -0,0 +1,2 @@ +add_subdirectory(CPlusPlus) +add_subdirectory(ObjC) Added: lldb/trunk/source/Plugins/Language/CPlusPlus/CMakeLists.txt URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Language/CPlusPlus/CMakeLists.txt?rev=246212&view=auto ============================================================================== --- lldb/trunk/source/Plugins/Language/CPlusPlus/CMakeLists.txt (added) +++ lldb/trunk/source/Plugins/Language/CPlusPlus/CMakeLists.txt Thu Aug 27 16:33:50 2015 @@ -0,0 +1,5 @@ +set(LLVM_NO_RTTI 1) + +add_lldb_library(lldbPluginCPlusPlusLanguage + CPlusPlusLanguage.cpp +) Added: lldb/trunk/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp?rev=246212&view=auto ============================================================================== --- lldb/trunk/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp (added) +++ lldb/trunk/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp Thu Aug 27 16:33:50 2015 @@ -0,0 +1,71 @@ +//===-- CPlusPlusLanguage.cpp --------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "CPlusPlusLanguage.h" + +#include "lldb/Core/ConstString.h" +#include "lldb/Core/PluginManager.h" + +using namespace lldb; +using namespace lldb_private; + +void +CPlusPlusLanguage::Initialize() +{ + PluginManager::RegisterPlugin (GetPluginNameStatic(), + "C++ Language", + CreateInstance); +} + +void +CPlusPlusLanguage::Terminate() +{ + PluginManager::UnregisterPlugin (CreateInstance); +} + +lldb_private::ConstString +CPlusPlusLanguage::GetPluginNameStatic() +{ + static ConstString g_name("cplusplus"); + return g_name; +} + + +//------------------------------------------------------------------ +// PluginInterface protocol +//------------------------------------------------------------------ +lldb_private::ConstString +CPlusPlusLanguage::GetPluginName() +{ + return GetPluginNameStatic(); +} + +uint32_t +CPlusPlusLanguage::GetPluginVersion() +{ + return 1; +} + +//------------------------------------------------------------------ +// Static Functions +//------------------------------------------------------------------ +Language * +CPlusPlusLanguage::CreateInstance (lldb::LanguageType language) +{ + switch (language) + { + case lldb::eLanguageTypeC_plus_plus: + case lldb::eLanguageTypeC_plus_plus_03: + case lldb::eLanguageTypeC_plus_plus_11: + case lldb::eLanguageTypeC_plus_plus_14: + return new CPlusPlusLanguage(); + default: + return nullptr; + } +} Added: lldb/trunk/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.h?rev=246212&view=auto ============================================================================== --- lldb/trunk/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.h (added) +++ lldb/trunk/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.h Thu Aug 27 16:33:50 2015 @@ -0,0 +1,63 @@ +//===-- CPlusPlusLanguage.h ----------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef liblldb_CPlusPlusLanguage_h_ +#define liblldb_CPlusPlusLanguage_h_ + +// C Includes +// C++ Includes +// Other libraries and framework includes +// Project includes +#include "lldb/lldb-private.h" +#include "lldb/Target/Language.h" + +namespace lldb_private { + +class CPlusPlusLanguage : + public Language +{ +public: + virtual ~CPlusPlusLanguage() = default; + + CPlusPlusLanguage () = default; + + lldb::LanguageType + GetLanguageType () const + { + return lldb::eLanguageTypeC_plus_plus; + } + + //------------------------------------------------------------------ + // Static Functions + //------------------------------------------------------------------ + static void + Initialize(); + + static void + Terminate(); + + static lldb_private::Language * + CreateInstance (lldb::LanguageType language); + + static lldb_private::ConstString + GetPluginNameStatic(); + + //------------------------------------------------------------------ + // PluginInterface protocol + //------------------------------------------------------------------ + virtual ConstString + GetPluginName(); + + virtual uint32_t + GetPluginVersion(); +}; + +} // namespace lldb_private + +#endif // liblldb_CPlusPlusLanguage_h_ Added: lldb/trunk/source/Plugins/Language/ObjC/CMakeLists.txt URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Language/ObjC/CMakeLists.txt?rev=246212&view=auto ============================================================================== --- lldb/trunk/source/Plugins/Language/ObjC/CMakeLists.txt (added) +++ lldb/trunk/source/Plugins/Language/ObjC/CMakeLists.txt Thu Aug 27 16:33:50 2015 @@ -0,0 +1,5 @@ +set(LLVM_NO_RTTI 1) + +add_lldb_library(lldbPluginAppleObjCLanguage + AppleObjCLanguage.cpp +) Added: lldb/trunk/source/Plugins/Language/ObjC/ObjCLanguage.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Language/ObjC/ObjCLanguage.cpp?rev=246212&view=auto ============================================================================== --- lldb/trunk/source/Plugins/Language/ObjC/ObjCLanguage.cpp (added) +++ lldb/trunk/source/Plugins/Language/ObjC/ObjCLanguage.cpp Thu Aug 27 16:33:50 2015 @@ -0,0 +1,68 @@ +//===-- ObjCLanguage.cpp --------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "ObjCLanguage.h" + +#include "lldb/Core/ConstString.h" +#include "lldb/Core/PluginManager.h" + +using namespace lldb; +using namespace lldb_private; + +void +ObjCLanguage::Initialize() +{ + PluginManager::RegisterPlugin (GetPluginNameStatic(), + "Objective-C Language", + CreateInstance); +} + +void +ObjCLanguage::Terminate() +{ + PluginManager::UnregisterPlugin (CreateInstance); +} + +lldb_private::ConstString +ObjCLanguage::GetPluginNameStatic() +{ + static ConstString g_name("objc"); + return g_name; +} + + +//------------------------------------------------------------------ +// PluginInterface protocol +//------------------------------------------------------------------ +lldb_private::ConstString +ObjCLanguage::GetPluginName() +{ + return GetPluginNameStatic(); +} + +uint32_t +ObjCLanguage::GetPluginVersion() +{ + return 1; +} + +//------------------------------------------------------------------ +// Static Functions +//------------------------------------------------------------------ +Language * +ObjCLanguage::CreateInstance (lldb::LanguageType language) +{ + switch (language) + { + case lldb::eLanguageTypeObjC: + return new ObjCLanguage(); + default: + return nullptr; + } +} Added: lldb/trunk/source/Plugins/Language/ObjC/ObjCLanguage.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Language/ObjC/ObjCLanguage.h?rev=246212&view=auto ============================================================================== --- lldb/trunk/source/Plugins/Language/ObjC/ObjCLanguage.h (added) +++ lldb/trunk/source/Plugins/Language/ObjC/ObjCLanguage.h Thu Aug 27 16:33:50 2015 @@ -0,0 +1,63 @@ +//===-- ObjCLanguage.h ----------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef liblldb_ObjCLanguage_h_ +#define liblldb_ObjCLanguage_h_ + +// C Includes +// C++ Includes +// Other libraries and framework includes +// Project includes +#include "lldb/lldb-private.h" +#include "lldb/Target/Language.h" + +namespace lldb_private { + +class ObjCLanguage : + public Language +{ +public: + virtual ~ObjCLanguage() = default; + + ObjCLanguage () = default; + + lldb::LanguageType + GetLanguageType () const + { + return lldb::eLanguageTypeObjC; + } + + //------------------------------------------------------------------ + // Static Functions + //------------------------------------------------------------------ + static void + Initialize(); + + static void + Terminate(); + + static lldb_private::Language * + CreateInstance (lldb::LanguageType language); + + static lldb_private::ConstString + GetPluginNameStatic(); + + //------------------------------------------------------------------ + // PluginInterface protocol + //------------------------------------------------------------------ + virtual ConstString + GetPluginName(); + + virtual uint32_t + GetPluginVersion(); +}; + +} // namespace lldb_private + +#endif // liblldb_ObjCLanguage_h_ Added: lldb/trunk/source/Plugins/Language/ObjCPlusPlus/CMakeLists.txt URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Language/ObjCPlusPlus/CMakeLists.txt?rev=246212&view=auto ============================================================================== --- lldb/trunk/source/Plugins/Language/ObjCPlusPlus/CMakeLists.txt (added) +++ lldb/trunk/source/Plugins/Language/ObjCPlusPlus/CMakeLists.txt Thu Aug 27 16:33:50 2015 @@ -0,0 +1,5 @@ +set(LLVM_NO_RTTI 1) + +add_lldb_library(lldbPluginObjCPlusPlusLanguage + ObjCPlusPlusLanguage.cpp +) Added: lldb/trunk/source/Plugins/Language/ObjCPlusPlus/ObjCPlusPlusLanguage.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Language/ObjCPlusPlus/ObjCPlusPlusLanguage.cpp?rev=246212&view=auto ============================================================================== --- lldb/trunk/source/Plugins/Language/ObjCPlusPlus/ObjCPlusPlusLanguage.cpp (added) +++ lldb/trunk/source/Plugins/Language/ObjCPlusPlus/ObjCPlusPlusLanguage.cpp Thu Aug 27 16:33:50 2015 @@ -0,0 +1,68 @@ +//===-- ObjCPlusPlusLanguage.cpp --------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "ObjCPlusPlusLanguage.h" + +#include "lldb/Core/ConstString.h" +#include "lldb/Core/PluginManager.h" + +using namespace lldb; +using namespace lldb_private; + +void +ObjCPlusPlusLanguage::Initialize() +{ + PluginManager::RegisterPlugin (GetPluginNameStatic(), + "Objective-C++ Language", + CreateInstance); +} + +void +ObjCPlusPlusLanguage::Terminate() +{ + PluginManager::UnregisterPlugin (CreateInstance); +} + +lldb_private::ConstString +ObjCPlusPlusLanguage::GetPluginNameStatic() +{ + static ConstString g_name("objcplusplus"); + return g_name; +} + + +//------------------------------------------------------------------ +// PluginInterface protocol +//------------------------------------------------------------------ +lldb_private::ConstString +ObjCPlusPlusLanguage::GetPluginName() +{ + return GetPluginNameStatic(); +} + +uint32_t +ObjCPlusPlusLanguage::GetPluginVersion() +{ + return 1; +} + +//------------------------------------------------------------------ +// Static Functions +//------------------------------------------------------------------ +Language * +ObjCPlusPlusLanguage::CreateInstance (lldb::LanguageType language) +{ + switch (language) + { + case lldb::eLanguageTypeObjC_plus_plus: + return new ObjCPlusPlusLanguage(); + default: + return nullptr; + } +} Added: lldb/trunk/source/Plugins/Language/ObjCPlusPlus/ObjCPlusPlusLanguage.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Language/ObjCPlusPlus/ObjCPlusPlusLanguage.h?rev=246212&view=auto ============================================================================== --- lldb/trunk/source/Plugins/Language/ObjCPlusPlus/ObjCPlusPlusLanguage.h (added) +++ lldb/trunk/source/Plugins/Language/ObjCPlusPlus/ObjCPlusPlusLanguage.h Thu Aug 27 16:33:50 2015 @@ -0,0 +1,63 @@ +//===-- ObjCPlusPlusLanguage.h ----------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef liblldb_ObjCPlusPlusLanguage_h_ +#define liblldb_ObjCPlusPlusLanguage_h_ + +// C Includes +// C++ Includes +// Other libraries and framework includes +// Project includes +#include "lldb/lldb-private.h" +#include "lldb/Target/Language.h" + +namespace lldb_private { + +class ObjCPlusPlusLanguage : + public Language +{ +public: + virtual ~ObjCPlusPlusLanguage() = default; + + ObjCPlusPlusLanguage () = default; + + lldb::LanguageType + GetLanguageType () const + { + return lldb::eLanguageTypeObjC_plus_plus; + } + + //------------------------------------------------------------------ + // Static Functions + //------------------------------------------------------------------ + static void + Initialize(); + + static void + Terminate(); + + static lldb_private::Language * + CreateInstance (lldb::LanguageType language); + + static lldb_private::ConstString + GetPluginNameStatic(); + + //------------------------------------------------------------------ + // PluginInterface protocol + //------------------------------------------------------------------ + virtual ConstString + GetPluginName(); + + virtual uint32_t + GetPluginVersion(); +}; + +} // namespace lldb_private + +#endif // liblldb_CPlusPlusLanguage_h_ Added: lldb/trunk/source/Target/Language.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/Language.cpp?rev=246212&view=auto ============================================================================== --- lldb/trunk/source/Target/Language.cpp (added) +++ lldb/trunk/source/Target/Language.cpp Thu Aug 27 16:33:50 2015 @@ -0,0 +1,101 @@ +//===-- Language.cpp -------------------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include <functional> +#include <map> + +#include "lldb/Target/Language.h" + +#include "lldb/Host/Mutex.h" +#include "lldb/Core/PluginManager.h" + +using namespace lldb; +using namespace lldb_private; + +typedef std::unique_ptr<Language> LanguageUP; +typedef std::map<lldb::LanguageType, LanguageUP> LanguagesMap; + +static LanguagesMap& +GetLanguagesMap () +{ + static LanguagesMap *g_map = nullptr; + static std::once_flag g_initialize; + + std::call_once(g_initialize, [] { + g_map = new LanguagesMap(); // NOTE: INTENTIONAL LEAK due to global destructor chain + }); + + return *g_map; +} +static Mutex& +GetLanguagesMutex () +{ + static Mutex *g_mutex = nullptr; + static std::once_flag g_initialize; + + std::call_once(g_initialize, [] { + g_mutex = new Mutex(); // NOTE: INTENTIONAL LEAK due to global destructor chain + }); + + return *g_mutex; +} + +Language* +Language::FindPlugin (lldb::LanguageType language) +{ + Mutex::Locker locker(GetLanguagesMutex()); + LanguagesMap& map(GetLanguagesMap()); + auto iter = map.find(language), end = map.end(); + if (iter != end) + return iter->second.get(); + + Language *language_ptr = nullptr; + LanguageCreateInstance create_callback; + + for (uint32_t idx = 0; + (create_callback = PluginManager::GetLanguageCreateCallbackAtIndex(idx)) != nullptr; + ++idx) + { + language_ptr = create_callback(language); + + if (language_ptr) + { + map[language] = std::unique_ptr<Language>(language_ptr); + return language_ptr; + } + } + + return nullptr; +} + +void +Language::ForEach (std::function<bool(Language*)> callback) +{ + Mutex::Locker locker(GetLanguagesMutex()); + LanguagesMap& map(GetLanguagesMap()); + for (const auto& entry : map) + { + if (!callback(entry.second.get())) + break; + } +} + +//---------------------------------------------------------------------- +// Constructor +//---------------------------------------------------------------------- +Language::Language() +{ +} + +//---------------------------------------------------------------------- +// Destructor +//---------------------------------------------------------------------- +Language::~Language() +{ +} _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits