<div dir="ltr">This breaks 2 tests on linux:<div><br><div><div>Failing Tests (2)</div><div>FAIL: LLDB (suite) :: TestMiBreak.py </div><div>FAIL: LLDB (suite) :: TestSettings.py </div></div></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Oct 8, 2015 at 4:07 PM, Sean Callanan via lldb-commits <span dir="ltr"><<a href="mailto:lldb-commits@lists.llvm.org" target="_blank">lldb-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: spyffe<br>
Date: Thu Oct  8 18:07:53 2015<br>
New Revision: 249769<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=249769&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=249769&view=rev</a><br>
Log:<br>
Added support for enumerating the languages that actually support TypeSystems<br>
and expressions.  Also wired that into the OptionValue infrastructure, although<br>
it isn't used for tab-completion yet.<br>
<br>
Modified:<br>
    lldb/trunk/include/lldb/Core/PluginManager.h<br>
    lldb/trunk/include/lldb/Symbol/ClangASTContext.h<br>
    lldb/trunk/include/lldb/Symbol/GoASTContext.h<br>
    lldb/trunk/include/lldb/Target/Language.h<br>
    lldb/trunk/include/lldb/lldb-private-interfaces.h<br>
    lldb/trunk/source/Core/PluginManager.cpp<br>
    lldb/trunk/source/Interpreter/OptionValueLanguage.cpp<br>
    lldb/trunk/source/Symbol/ClangASTContext.cpp<br>
    lldb/trunk/source/Symbol/GoASTContext.cpp<br>
    lldb/trunk/source/Target/Language.cpp<br>
<br>
Modified: lldb/trunk/include/lldb/Core/PluginManager.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Core/PluginManager.h?rev=249769&r1=249768&r2=249769&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Core/PluginManager.h?rev=249769&r1=249768&r2=249769&view=diff</a><br>
==============================================================================<br>
--- lldb/trunk/include/lldb/Core/PluginManager.h (original)<br>
+++ lldb/trunk/include/lldb/Core/PluginManager.h Thu Oct  8 18:07:53 2015<br>
@@ -425,7 +425,8 @@ public:<br>
     static bool<br>
     RegisterPlugin (const ConstString &name,<br>
                     const char *description,<br>
-                    TypeSystemCreateInstance create_callback);<br>
+                    TypeSystemCreateInstance create_callback,<br>
+                    TypeSystemEnumerateSupportedLanguages enumerate_languages_callback);<br>
<br>
     static bool<br>
     UnregisterPlugin (TypeSystemCreateInstance create_callback);<br>
@@ -436,6 +437,12 @@ public:<br>
     static TypeSystemCreateInstance<br>
     GetTypeSystemCreateCallbackForPluginName (const ConstString &name);<br>
<br>
+    static TypeSystemEnumerateSupportedLanguages<br>
+    GetTypeSystemEnumerateSupportedLanguagesCallbackAtIndex (uint32_t idx);<br>
+<br>
+    static TypeSystemEnumerateSupportedLanguages<br>
+    GetTypeSystemEnumerateSupportedLanguagesCallbackForPluginName (const ConstString &name);<br>
+<br>
     //------------------------------------------------------------------<br>
     // Some plug-ins might register a DebuggerInitializeCallback<br>
     // callback when registering the plug-in. After a new Debugger<br>
<br>
Modified: lldb/trunk/include/lldb/Symbol/ClangASTContext.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Symbol/ClangASTContext.h?rev=249769&r1=249768&r2=249769&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Symbol/ClangASTContext.h?rev=249769&r1=249768&r2=249769&view=diff</a><br>
==============================================================================<br>
--- lldb/trunk/include/lldb/Symbol/ClangASTContext.h (original)<br>
+++ lldb/trunk/include/lldb/Symbol/ClangASTContext.h Thu Oct  8 18:07:53 2015<br>
@@ -72,6 +72,9 @@ public:<br>
<br>
     static lldb::TypeSystemSP<br>
     CreateInstance (lldb::LanguageType language, Module *module, Target *target);<br>
+<br>
+    static void<br>
+    EnumerateSupportedLanguages(std::set<lldb::LanguageType> &languages_for_types, std::set<lldb::LanguageType> &languages_for_expressions);<br>
<br>
     static void<br>
     Initialize ();<br>
<br>
Modified: lldb/trunk/include/lldb/Symbol/GoASTContext.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Symbol/GoASTContext.h?rev=249769&r1=249768&r2=249769&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Symbol/GoASTContext.h?rev=249769&r1=249768&r2=249769&view=diff</a><br>
==============================================================================<br>
--- lldb/trunk/include/lldb/Symbol/GoASTContext.h (original)<br>
+++ lldb/trunk/include/lldb/Symbol/GoASTContext.h Thu Oct  8 18:07:53 2015<br>
@@ -41,6 +41,9 @@ class GoASTContext : public TypeSystem<br>
<br>
     static lldb::TypeSystemSP<br>
     CreateInstance (lldb::LanguageType language, Module *module, Target *target);<br>
+<br>
+    static void<br>
+    EnumerateSupportedLanguages(std::set<lldb::LanguageType> &languages_for_types, std::set<lldb::LanguageType> &languages_for_expressions);<br>
<br>
     static void<br>
     Initialize ();<br>
<br>
Modified: lldb/trunk/include/lldb/Target/Language.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Target/Language.h?rev=249769&r1=249768&r2=249769&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Target/Language.h?rev=249769&r1=249768&r2=249769&view=diff</a><br>
==============================================================================<br>
--- lldb/trunk/include/lldb/Target/Language.h (original)<br>
+++ lldb/trunk/include/lldb/Target/Language.h Thu Oct  8 18:07:53 2015<br>
@@ -139,7 +139,11 @@ public:<br>
<br>
     static bool<br>
     LanguageIsPascal (lldb::LanguageType language);<br>
-<br>
+<br>
+    static void<br>
+    GetLanguagesSupportingTypeSystems (std::set<lldb::LanguageType> &languages,<br>
+                                       std::set<lldb::LanguageType> &languages_for_expressions);<br>
+<br>
 protected:<br>
     //------------------------------------------------------------------<br>
     // Classes that inherit from Language can see and modify these<br>
<br>
Modified: lldb/trunk/include/lldb/lldb-private-interfaces.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/lldb-private-interfaces.h?rev=249769&r1=249768&r2=249769&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/lldb-private-interfaces.h?rev=249769&r1=249768&r2=249769&view=diff</a><br>
==============================================================================<br>
--- lldb/trunk/include/lldb/lldb-private-interfaces.h (original)<br>
+++ lldb/trunk/include/lldb/lldb-private-interfaces.h Thu Oct  8 18:07:53 2015<br>
@@ -14,6 +14,8 @@<br>
<br>
 #include "lldb/lldb-private.h"<br>
<br>
+#include <set><br>
+<br>
 namespace lldb_private<br>
 {<br>
     typedef lldb::ABISP (*ABICreateInstance) (const ArchSpec &arch);<br>
@@ -47,6 +49,7 @@ namespace lldb_private<br>
     typedef lldb::InstrumentationRuntimeType (*InstrumentationRuntimeGetType) ();<br>
     typedef lldb::InstrumentationRuntimeSP (*InstrumentationRuntimeCreateInstance) (const lldb::ProcessSP &process_sp);<br>
     typedef lldb::TypeSystemSP (*TypeSystemCreateInstance) (lldb::LanguageType language, Module *module, Target *target);<br>
+    typedef void (*TypeSystemEnumerateSupportedLanguages) (std::set<lldb::LanguageType> &languages_for_types, std::set<lldb::LanguageType> &languages_for_expressions);<br>
     typedef int (*ComparisonFunction)(const void *, const void *);<br>
     typedef void (*DebuggerInitializeCallback)(Debugger &debugger);<br>
<br>
<br>
Modified: lldb/trunk/source/Core/PluginManager.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/PluginManager.cpp?rev=249769&r1=249768&r2=249769&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/PluginManager.cpp?rev=249769&r1=249768&r2=249769&view=diff</a><br>
==============================================================================<br>
--- lldb/trunk/source/Core/PluginManager.cpp (original)<br>
+++ lldb/trunk/source/Core/PluginManager.cpp Thu Oct  8 18:07:53 2015<br>
@@ -2531,6 +2531,7 @@ struct TypeSystemInstance<br>
     ConstString name;<br>
     std::string description;<br>
     TypeSystemCreateInstance create_callback;<br>
+    TypeSystemEnumerateSupportedLanguages enumerate_callback;<br>
 };<br>
<br>
 typedef std::vector<TypeSystemInstance> TypeSystemInstances;<br>
@@ -2552,7 +2553,8 @@ GetTypeSystemInstances ()<br>
 bool<br>
 PluginManager::RegisterPlugin (const ConstString &name,<br>
                                const char *description,<br>
-                               TypeSystemCreateInstance create_callback)<br>
+                               TypeSystemCreateInstance create_callback,<br>
+                               TypeSystemEnumerateSupportedLanguages enumerate_supported_languages_callback)<br>
 {<br>
     if (create_callback)<br>
     {<br>
@@ -2617,6 +2619,33 @@ PluginManager::GetTypeSystemCreateCallba<br>
     return NULL;<br>
 }<br>
<br>
+TypeSystemEnumerateSupportedLanguages<br>
+PluginManager::GetTypeSystemEnumerateSupportedLanguagesCallbackAtIndex (uint32_t idx)<br>
+{<br>
+    Mutex::Locker locker (GetTypeSystemMutex ());<br>
+    TypeSystemInstances &instances = GetTypeSystemInstances ();<br>
+    if (idx < instances.size())<br>
+        return instances[idx].enumerate_callback;<br>
+    return NULL;<br>
+}<br>
+<br>
+TypeSystemEnumerateSupportedLanguages<br>
+PluginManager::GetTypeSystemEnumerateSupportedLanguagesCallbackForPluginName (const ConstString &name)<br>
+{<br>
+    if (name)<br>
+    {<br>
+        Mutex::Locker locker (GetTypeSystemMutex ());<br>
+        TypeSystemInstances &instances = GetTypeSystemInstances ();<br>
+<br>
+        TypeSystemInstances::iterator pos, end = instances.end();<br>
+        for (pos = instances.begin(); pos != end; ++ pos)<br>
+        {<br>
+            if (name == pos->name)<br>
+                return pos->enumerate_callback;<br>
+        }<br>
+    }<br>
+    return NULL;<br>
+}<br>
<br>
 #pragma mark PluginManager<br>
<br>
<br>
Modified: lldb/trunk/source/Interpreter/OptionValueLanguage.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Interpreter/OptionValueLanguage.cpp?rev=249769&r1=249768&r2=249769&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Interpreter/OptionValueLanguage.cpp?rev=249769&r1=249768&r2=249769&view=diff</a><br>
==============================================================================<br>
--- lldb/trunk/source/Interpreter/OptionValueLanguage.cpp (original)<br>
+++ lldb/trunk/source/Interpreter/OptionValueLanguage.cpp Thu Oct  8 18:07:53 2015<br>
@@ -48,8 +48,12 @@ OptionValueLanguage::SetValueFromString<br>
     case eVarSetOperationAssign:<br>
         {<br>
             ConstString lang_name(value.trim());<br>
+            std::set<lldb::LanguageType> languages_for_types;<br>
+            std::set<lldb::LanguageType> languages_for_expressions;<br>
+            Language::GetLanguagesSupportingTypeSystems(languages_for_types, languages_for_expressions);<br>
+<br>
             LanguageType new_type = Language::GetLanguageTypeFromString(lang_name.GetCString());<br>
-            if (new_type)<br>
+            if (new_type && languages_for_types.count(new_type))<br>
             {<br>
                 m_value_was_set = true;<br>
                 m_current_value = new_type;<br>
@@ -59,7 +63,10 @@ OptionValueLanguage::SetValueFromString<br>
                 StreamString error_strm;<br>
                 error_strm.Printf("invalid language type '%s', ", value.str().c_str());<br>
                 error_strm.Printf("valid values are:\n");<br>
-                Language::PrintAllLanguages(error_strm, "    ", "\n");<br>
+                for (lldb::LanguageType language : languages_for_types)<br>
+                {<br>
+                    error_strm.Printf("%s%s%s", "    ", Language::GetNameForLanguageType(language), "\n");<br>
+                }<br>
                 error.SetErrorString(error_strm.GetData());<br>
             }<br>
         }<br>
<br>
Modified: lldb/trunk/source/Symbol/ClangASTContext.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/ClangASTContext.cpp?rev=249769&r1=249768&r2=249769&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/ClangASTContext.cpp?rev=249769&r1=249768&r2=249769&view=diff</a><br>
==============================================================================<br>
--- lldb/trunk/source/Symbol/ClangASTContext.cpp (original)<br>
+++ lldb/trunk/source/Symbol/ClangASTContext.cpp Thu Oct  8 18:07:53 2015<br>
@@ -13,6 +13,7 @@<br>
 // C++ Includes<br>
 #include <mutex> // std::once<br>
 #include <string><br>
+#include <vector><br>
<br>
 // Other libraries and framework includes<br>
<br>
@@ -424,13 +425,41 @@ ClangASTContext::CreateInstance (lldb::L<br>
     return lldb::TypeSystemSP();<br>
 }<br>
<br>
+void<br>
+ClangASTContext::EnumerateSupportedLanguages(std::set<lldb::LanguageType> &languages_for_types, std::set<lldb::LanguageType> &languages_for_expressions)<br>
+{<br>
+    static std::vector<lldb::LanguageType> s_supported_languages_for_types({<br>
+        lldb::eLanguageTypeC89,<br>
+        lldb::eLanguageTypeC,<br>
+        lldb::eLanguageTypeC11,<br>
+        lldb::eLanguageTypeC_plus_plus,<br>
+        lldb::eLanguageTypeC99,<br>
+        lldb::eLanguageTypeObjC,<br>
+        lldb::eLanguageTypeObjC_plus_plus,<br>
+        lldb::eLanguageTypeC_plus_plus_03,<br>
+        lldb::eLanguageTypeC_plus_plus_11,<br>
+        lldb::eLanguageTypeC11,<br>
+        lldb::eLanguageTypeC_plus_plus_14});<br>
+<br>
+    static std::vector<lldb::LanguageType> s_supported_languages_for_expressions({<br>
+        lldb::eLanguageTypeC_plus_plus,<br>
+        lldb::eLanguageTypeObjC_plus_plus,<br>
+        lldb::eLanguageTypeC_plus_plus_03,<br>
+        lldb::eLanguageTypeC_plus_plus_11,<br>
+        lldb::eLanguageTypeC_plus_plus_14});<br>
+<br>
+    languages_for_types.insert(s_supported_languages_for_types.begin(), s_supported_languages_for_types.end());<br>
+    languages_for_expressions.insert(s_supported_languages_for_expressions.begin(), s_supported_languages_for_expressions.end());<br>
+}<br>
+<br>
<br>
 void<br>
 ClangASTContext::Initialize()<br>
 {<br>
     PluginManager::RegisterPlugin (GetPluginNameStatic(),<br>
                                    "clang base AST context plug-in",<br>
-                                   CreateInstance);<br>
+                                   CreateInstance,<br>
+                                   EnumerateSupportedLanguages);<br>
 }<br>
<br>
 void<br>
<br>
Modified: lldb/trunk/source/Symbol/GoASTContext.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/GoASTContext.cpp?rev=249769&r1=249768&r2=249769&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/GoASTContext.cpp?rev=249769&r1=249768&r2=249769&view=diff</a><br>
==============================================================================<br>
--- lldb/trunk/source/Symbol/GoASTContext.cpp (original)<br>
+++ lldb/trunk/source/Symbol/GoASTContext.cpp Thu Oct  8 18:07:53 2015<br>
@@ -342,13 +342,26 @@ GoASTContext::CreateInstance (lldb::Lang<br>
     return lldb::TypeSystemSP();<br>
 }<br>
<br>
+void<br>
+GoASTContext::EnumerateSupportedLanguages(std::set<lldb::LanguageType> &languages_for_types, std::set<lldb::LanguageType> &languages_for_expressions)<br>
+{<br>
+    static std::vector<lldb::LanguageType> s_supported_languages_for_types({<br>
+        lldb::eLanguageTypeGo});<br>
+<br>
+    static std::vector<lldb::LanguageType> s_supported_languages_for_expressions({});<br>
+<br>
+    languages_for_types.insert(s_supported_languages_for_types.begin(), s_supported_languages_for_types.end());<br>
+    languages_for_expressions.insert(s_supported_languages_for_expressions.begin(), s_supported_languages_for_expressions.end());<br>
+}<br>
+<br>
<br>
 void<br>
 GoASTContext::Initialize()<br>
 {<br>
     PluginManager::RegisterPlugin (GetPluginNameStatic(),<br>
                                    "AST context plug-in",<br>
-                                   CreateInstance);<br>
+                                   CreateInstance,<br>
+                                   EnumerateSupportedLanguages);<br>
 }<br>
<br>
 void<br>
<br>
Modified: lldb/trunk/source/Target/Language.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/Language.cpp?rev=249769&r1=249768&r2=249769&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/Language.cpp?rev=249769&r1=249768&r2=249769&view=diff</a><br>
==============================================================================<br>
--- lldb/trunk/source/Target/Language.cpp (original)<br>
+++ lldb/trunk/source/Target/Language.cpp Thu Oct  8 18:07:53 2015<br>
@@ -287,6 +287,18 @@ Language::LanguageIsPascal (LanguageType<br>
     }<br>
 }<br>
<br>
+void<br>
+Language::GetLanguagesSupportingTypeSystems (std::set<lldb::LanguageType> &languages,<br>
+                                             std::set<lldb::LanguageType> &languages_for_expressions)<br>
+{<br>
+    uint32_t idx = 0;<br>
+<br>
+    while (TypeSystemEnumerateSupportedLanguages enumerate = PluginManager::GetTypeSystemEnumerateSupportedLanguagesCallbackAtIndex(idx++))<br>
+    {<br>
+        (*enumerate)(languages, languages_for_expressions);<br>
+    }<br>
+}<br>
+<br>
 std::unique_ptr<Language::TypeScavenger><br>
 Language::GetTypeScavenger ()<br>
 {<br>
<br>
<br>
_______________________________________________<br>
lldb-commits mailing list<br>
<a href="mailto:lldb-commits@lists.llvm.org">lldb-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits</a><br>
</blockquote></div><br></div>