[Lldb-commits] [lldb] r246212 - Add a new type of plugin: Language plugin

Enrico Granata via lldb-commits lldb-commits at lists.llvm.org
Thu Aug 27 14:33:51 PDT 2015


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()
+{
+}




More information about the lldb-commits mailing list