diff options
| author | Enrico Granata <egranata@apple.com> | 2015-08-27 21:33:50 +0000 |
|---|---|---|
| committer | Enrico Granata <egranata@apple.com> | 2015-08-27 21:33:50 +0000 |
| commit | 5f9d310640209347c6e534a4ed97074d205e1766 (patch) | |
| tree | 2e4d195d3acb02842ab819772de93e1a7df3c721 /lldb/source | |
| parent | 7033a9ce3321c87207b795153b43edfbb5426e3c (diff) | |
| download | bcm5719-llvm-5f9d310640209347c6e534a4ed97074d205e1766.tar.gz bcm5719-llvm-5f9d310640209347c6e534a4ed97074d205e1766.zip | |
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++
llvm-svn: 246212
Diffstat (limited to 'lldb/source')
| -rw-r--r-- | lldb/source/Core/PluginManager.cpp | 105 | ||||
| -rw-r--r-- | lldb/source/Plugins/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | lldb/source/Plugins/Language/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | lldb/source/Plugins/Language/CPlusPlus/CMakeLists.txt | 5 | ||||
| -rw-r--r-- | lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp | 71 | ||||
| -rw-r--r-- | lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.h | 63 | ||||
| -rw-r--r-- | lldb/source/Plugins/Language/ObjC/CMakeLists.txt | 5 | ||||
| -rw-r--r-- | lldb/source/Plugins/Language/ObjC/ObjCLanguage.cpp | 68 | ||||
| -rw-r--r-- | lldb/source/Plugins/Language/ObjC/ObjCLanguage.h | 63 | ||||
| -rw-r--r-- | lldb/source/Plugins/Language/ObjCPlusPlus/CMakeLists.txt | 5 | ||||
| -rw-r--r-- | lldb/source/Plugins/Language/ObjCPlusPlus/ObjCPlusPlusLanguage.cpp | 68 | ||||
| -rw-r--r-- | lldb/source/Plugins/Language/ObjCPlusPlus/ObjCPlusPlusLanguage.h | 63 | ||||
| -rw-r--r-- | lldb/source/Target/Language.cpp | 101 |
13 files changed, 620 insertions, 0 deletions
diff --git a/lldb/source/Core/PluginManager.cpp b/lldb/source/Core/PluginManager.cpp index ac892d261e4..ca3c5387537 100644 --- a/lldb/source/Core/PluginManager.cpp +++ b/lldb/source/Core/PluginManager.cpp @@ -868,6 +868,111 @@ PluginManager::GetOperatingSystemCreateCallbackForPluginName (const ConstString } +#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 diff --git a/lldb/source/Plugins/CMakeLists.txt b/lldb/source/Plugins/CMakeLists.txt index 67ae85de81e..f138eeeeec2 100644 --- a/lldb/source/Plugins/CMakeLists.txt +++ b/lldb/source/Plugins/CMakeLists.txt @@ -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) diff --git a/lldb/source/Plugins/Language/CMakeLists.txt b/lldb/source/Plugins/Language/CMakeLists.txt new file mode 100644 index 00000000000..034ae1545ae --- /dev/null +++ b/lldb/source/Plugins/Language/CMakeLists.txt @@ -0,0 +1,2 @@ +add_subdirectory(CPlusPlus) +add_subdirectory(ObjC) diff --git a/lldb/source/Plugins/Language/CPlusPlus/CMakeLists.txt b/lldb/source/Plugins/Language/CPlusPlus/CMakeLists.txt new file mode 100644 index 00000000000..ae6b1c8c280 --- /dev/null +++ b/lldb/source/Plugins/Language/CPlusPlus/CMakeLists.txt @@ -0,0 +1,5 @@ +set(LLVM_NO_RTTI 1) + +add_lldb_library(lldbPluginCPlusPlusLanguage + CPlusPlusLanguage.cpp +) diff --git a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp new file mode 100644 index 00000000000..a0291462a6e --- /dev/null +++ b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp @@ -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; + } +} diff --git a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.h b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.h new file mode 100644 index 00000000000..62a92a62c07 --- /dev/null +++ b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.h @@ -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_ diff --git a/lldb/source/Plugins/Language/ObjC/CMakeLists.txt b/lldb/source/Plugins/Language/ObjC/CMakeLists.txt new file mode 100644 index 00000000000..af4cc0692d4 --- /dev/null +++ b/lldb/source/Plugins/Language/ObjC/CMakeLists.txt @@ -0,0 +1,5 @@ +set(LLVM_NO_RTTI 1) + +add_lldb_library(lldbPluginAppleObjCLanguage + AppleObjCLanguage.cpp +) diff --git a/lldb/source/Plugins/Language/ObjC/ObjCLanguage.cpp b/lldb/source/Plugins/Language/ObjC/ObjCLanguage.cpp new file mode 100644 index 00000000000..8f21c46bfe3 --- /dev/null +++ b/lldb/source/Plugins/Language/ObjC/ObjCLanguage.cpp @@ -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; + } +} diff --git a/lldb/source/Plugins/Language/ObjC/ObjCLanguage.h b/lldb/source/Plugins/Language/ObjC/ObjCLanguage.h new file mode 100644 index 00000000000..3a43972f3f0 --- /dev/null +++ b/lldb/source/Plugins/Language/ObjC/ObjCLanguage.h @@ -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_ diff --git a/lldb/source/Plugins/Language/ObjCPlusPlus/CMakeLists.txt b/lldb/source/Plugins/Language/ObjCPlusPlus/CMakeLists.txt new file mode 100644 index 00000000000..fb599faeffc --- /dev/null +++ b/lldb/source/Plugins/Language/ObjCPlusPlus/CMakeLists.txt @@ -0,0 +1,5 @@ +set(LLVM_NO_RTTI 1) + +add_lldb_library(lldbPluginObjCPlusPlusLanguage + ObjCPlusPlusLanguage.cpp +) diff --git a/lldb/source/Plugins/Language/ObjCPlusPlus/ObjCPlusPlusLanguage.cpp b/lldb/source/Plugins/Language/ObjCPlusPlus/ObjCPlusPlusLanguage.cpp new file mode 100644 index 00000000000..62ddafefad9 --- /dev/null +++ b/lldb/source/Plugins/Language/ObjCPlusPlus/ObjCPlusPlusLanguage.cpp @@ -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; + } +} diff --git a/lldb/source/Plugins/Language/ObjCPlusPlus/ObjCPlusPlusLanguage.h b/lldb/source/Plugins/Language/ObjCPlusPlus/ObjCPlusPlusLanguage.h new file mode 100644 index 00000000000..67be5109b27 --- /dev/null +++ b/lldb/source/Plugins/Language/ObjCPlusPlus/ObjCPlusPlusLanguage.h @@ -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_ diff --git a/lldb/source/Target/Language.cpp b/lldb/source/Target/Language.cpp new file mode 100644 index 00000000000..b7a88d16bda --- /dev/null +++ b/lldb/source/Target/Language.cpp @@ -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() +{ +} |

