[Lldb-commits] [lldb] r247112 - Data formatter candidate matches can be generated in a number of ways; language-based dynamic type discovery being one of them (for instance, this is what takes an 'id' and discovers that it truly is an __NSArrayI, so it should probably use the NSArray formatter)

Enrico Granata via lldb-commits lldb-commits at lists.llvm.org
Tue Sep 8 18:10:46 PDT 2015


Author: enrico
Date: Tue Sep  8 20:10:46 2015
New Revision: 247112

URL: http://llvm.org/viewvc/llvm-project?rev=247112&view=rev
Log:
Data formatter candidate matches can be generated in a number of ways; language-based dynamic type discovery being one of them (for instance, this is what takes an 'id' and discovers that it truly is an __NSArrayI, so it should probably use the NSArray formatter)

This used to be hardcoded in the FormatManager, but in a pluginized world that is not the right way to go

So, move this step to the Language plugin such that appropriate language plugins for a type get a say about adding candidates to the formatters lookup tables


Modified:
    lldb/trunk/include/lldb/DataFormatters/FormatManager.h
    lldb/trunk/include/lldb/Target/Language.h
    lldb/trunk/include/lldb/lldb-private-enumerations.h
    lldb/trunk/source/DataFormatters/FormatManager.cpp
    lldb/trunk/source/Plugins/Language/ObjC/ObjCLanguage.cpp
    lldb/trunk/source/Plugins/Language/ObjC/ObjCLanguage.h
    lldb/trunk/source/Target/Language.cpp

Modified: lldb/trunk/include/lldb/DataFormatters/FormatManager.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/DataFormatters/FormatManager.h?rev=247112&r1=247111&r2=247112&view=diff
==============================================================================
--- lldb/trunk/include/lldb/DataFormatters/FormatManager.h (original)
+++ lldb/trunk/include/lldb/DataFormatters/FormatManager.h Tue Sep  8 20:10:46 2015
@@ -264,6 +264,9 @@ public:
 
 private:
     
+    static std::vector<lldb::LanguageType>
+    GetCandidateLanguages (ValueObject& valobj);
+    
     static void
     GetPossibleMatches (ValueObject& valobj,
                         CompilerType clang_type,

Modified: lldb/trunk/include/lldb/Target/Language.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Target/Language.h?rev=247112&r1=247111&r2=247112&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Target/Language.h (original)
+++ lldb/trunk/include/lldb/Target/Language.h Tue Sep  8 20:10:46 2015
@@ -13,6 +13,7 @@
 // C Includes
 // C++ Includes
 #include <functional>
+#include <vector>
 
 // Other libraries and framework includes
 // Project includes
@@ -22,11 +23,10 @@
 
 namespace lldb_private {
     
-    class Language :
-    public PluginInterface
-    {
-    public:
-        
+class Language :
+public PluginInterface
+{
+public:
     ~Language() override;
     
     static Language*
@@ -42,6 +42,9 @@ namespace lldb_private {
     virtual lldb::TypeCategoryImplSP
     GetFormatters ();
 
+    virtual std::vector<ConstString>
+    GetPossibleFormattersMatches (ValueObject& valobj, lldb::DynamicValueType use_dynamic);
+
     // These are accessors for general information about the Languages lldb knows about:
     
     static lldb::LanguageType
@@ -70,16 +73,16 @@ namespace lldb_private {
     LanguageIsPascal (lldb::LanguageType language);
     
 
-    protected:
-        //------------------------------------------------------------------
-        // Classes that inherit from Language can see and modify these
-        //------------------------------------------------------------------
-        
-        Language();
-    private:
-        
-        DISALLOW_COPY_AND_ASSIGN (Language);
-    };
+protected:
+    //------------------------------------------------------------------
+    // Classes that inherit from Language can see and modify these
+    //------------------------------------------------------------------
+    
+    Language();
+private:
+    
+    DISALLOW_COPY_AND_ASSIGN (Language);
+};
     
 } // namespace lldb_private
 

Modified: lldb/trunk/include/lldb/lldb-private-enumerations.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/lldb-private-enumerations.h?rev=247112&r1=247111&r2=247112&view=diff
==============================================================================
--- lldb/trunk/include/lldb/lldb-private-enumerations.h (original)
+++ lldb/trunk/include/lldb/lldb-private-enumerations.h Tue Sep  8 20:10:46 2015
@@ -188,7 +188,7 @@ typedef enum FormatterChoiceCriterion
     eFormatterChoiceCriterionNavigatedTypedefs =             0x00000002,
     eFormatterChoiceCriterionRegularExpressionSummary =      0x00000004,
     eFormatterChoiceCriterionRegularExpressionFilter =       0x00000004,
-    eFormatterChoiceCriterionDynamicObjCDiscovery =          0x00000008,
+    eFormatterChoiceCriterionLanguagePlugin =                0x00000008,
     eFormatterChoiceCriterionStrippedBitField =              0x00000010,
     eFormatterChoiceCriterionWentToStaticValue =             0x00000020
 } FormatterChoiceCriterion;

Modified: lldb/trunk/source/DataFormatters/FormatManager.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/DataFormatters/FormatManager.cpp?rev=247112&r1=247111&r2=247112&view=diff
==============================================================================
--- lldb/trunk/source/DataFormatters/FormatManager.cpp (original)
+++ lldb/trunk/source/DataFormatters/FormatManager.cpp Tue Sep  8 20:10:46 2015
@@ -270,41 +270,22 @@ FormatManager::GetPossibleMatches (Value
                                true); // this is not exactly the usual meaning of stripping typedefs
         }
     }
-    bool canBeObjCDynamic = clang_type.IsPossibleDynamicType (NULL,
-                                                              false, // no C
-                                                              true);  // yes ObjC
     
-    if (canBeObjCDynamic)
+    for (lldb::LanguageType language_type : GetCandidateLanguages(valobj))
     {
-        if (use_dynamic != lldb::eNoDynamicValues)
+        if (Language* language = Language::FindPlugin(language_type))
         {
-            do
+            for (ConstString candidate : language->GetPossibleFormattersMatches(valobj, use_dynamic))
             {
-                lldb::ProcessSP process_sp = valobj.GetProcessSP();
-                if (!process_sp)
-                    break;
-                ObjCLanguageRuntime* runtime = process_sp->GetObjCLanguageRuntime();
-                if (runtime == nullptr)
-                    break;
-                ObjCLanguageRuntime::ClassDescriptorSP objc_class_sp (runtime->GetClassDescriptor(valobj));
-                if (!objc_class_sp)
-                    break;
-                ConstString name (objc_class_sp->GetClassName());
-                entries.push_back({name,reason | lldb_private::eFormatterChoiceCriterionDynamicObjCDiscovery,did_strip_ptr,did_strip_ref,did_strip_typedef});
-            } while (false);
+                entries.push_back({candidate,
+                                   reason | lldb_private::eFormatterChoiceCriterionLanguagePlugin,
+                                   did_strip_ptr,
+                                   did_strip_ref,
+                                   did_strip_typedef});
+            }
         }
-        
-        CompilerType non_ptr_type = clang_type.GetPointeeType();
-        GetPossibleMatches(valobj,
-                           non_ptr_type,
-                           reason | lldb_private::eFormatterChoiceCriterionStrippedPointerReference,
-                           use_dynamic,
-                           entries,
-                           true,
-                           did_strip_ref,
-                           did_strip_typedef);
     }
-    
+        
     // try to strip typedef chains
     if (clang_type.IsTypedefType())
     {
@@ -666,8 +647,8 @@ FormatManager::GetTypeForCache (ValueObj
     return ConstString();
 }
 
-static std::vector<lldb::LanguageType>
-GetCandidateLanguages (ValueObject& valobj)
+std::vector<lldb::LanguageType>
+FormatManager::GetCandidateLanguages (ValueObject& valobj)
 {
     lldb::LanguageType lang_type = valobj.GetObjectRuntimeLanguage();
     switch (lang_type)

Modified: lldb/trunk/source/Plugins/Language/ObjC/ObjCLanguage.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Language/ObjC/ObjCLanguage.cpp?rev=247112&r1=247111&r2=247112&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Language/ObjC/ObjCLanguage.cpp (original)
+++ lldb/trunk/source/Plugins/Language/ObjC/ObjCLanguage.cpp Tue Sep  8 20:10:46 2015
@@ -12,6 +12,9 @@
 #include "lldb/Core/ConstString.h"
 #include "lldb/Core/PluginManager.h"
 #include "lldb/Core/StreamString.h"
+#include "lldb/Core/ValueObject.h"
+#include "lldb/Symbol/CompilerType.h"
+#include "lldb/Target/ObjCLanguageRuntime.h"
 
 using namespace lldb;
 using namespace lldb_private;
@@ -298,3 +301,37 @@ ObjCLanguage::MethodName::GetFullNames (
     }
     return names.size();
 }
+
+std::vector<ConstString>
+ObjCLanguage::GetPossibleFormattersMatches (ValueObject& valobj, lldb::DynamicValueType use_dynamic)
+{
+    std::vector<ConstString> result;
+    
+    if (use_dynamic == lldb::eNoDynamicValues)
+        return result;
+    
+    CompilerType compiler_type(valobj.GetCompilerType());
+    
+    const bool check_cpp = false;
+    const bool check_objc = true;
+    bool canBeObjCDynamic = compiler_type.IsPossibleDynamicType(nullptr, check_cpp, check_objc);
+    
+    if (canBeObjCDynamic)
+    {
+        do {
+            lldb::ProcessSP process_sp = valobj.GetProcessSP();
+            if (!process_sp)
+                break;
+            ObjCLanguageRuntime* runtime = process_sp->GetObjCLanguageRuntime();
+            if (runtime == nullptr)
+                break;
+            ObjCLanguageRuntime::ClassDescriptorSP objc_class_sp (runtime->GetClassDescriptor(valobj));
+            if (!objc_class_sp)
+                break;
+            if (ConstString name = objc_class_sp->GetClassName())
+                result.push_back(name);
+        } while (false);
+    }
+    
+    return result;
+}

Modified: lldb/trunk/source/Plugins/Language/ObjC/ObjCLanguage.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Language/ObjC/ObjCLanguage.h?rev=247112&r1=247111&r2=247112&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Language/ObjC/ObjCLanguage.h (original)
+++ lldb/trunk/source/Plugins/Language/ObjC/ObjCLanguage.h Tue Sep  8 20:10:46 2015
@@ -135,11 +135,14 @@ public:
     ObjCLanguage () = default;
     
     lldb::LanguageType
-    GetLanguageType () const
+    GetLanguageType () const override
     {
         return lldb::eLanguageTypeObjC;
     }
     
+    std::vector<ConstString>
+    GetPossibleFormattersMatches (ValueObject& valobj, lldb::DynamicValueType use_dynamic) override;
+    
     //------------------------------------------------------------------
     // Static Functions
     //------------------------------------------------------------------
@@ -183,10 +186,10 @@ public:
     // PluginInterface protocol
     //------------------------------------------------------------------
     virtual ConstString
-    GetPluginName();
+    GetPluginName() override;
     
     virtual uint32_t
-    GetPluginVersion();
+    GetPluginVersion() override;
 };
     
 } // namespace lldb_private

Modified: lldb/trunk/source/Target/Language.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/Language.cpp?rev=247112&r1=247111&r2=247112&view=diff
==============================================================================
--- lldb/trunk/source/Target/Language.cpp (original)
+++ lldb/trunk/source/Target/Language.cpp Tue Sep  8 20:10:46 2015
@@ -94,6 +94,12 @@ Language::GetFormatters ()
     return nullptr;
 }
 
+std::vector<ConstString>
+Language::GetPossibleFormattersMatches (ValueObject& valobj, lldb::DynamicValueType use_dynamic)
+{
+    return {};
+}
+
 struct language_name_pair {
     const char *name;
     LanguageType type;




More information about the lldb-commits mailing list