[Lldb-commits] [lldb] r150784 - in /lldb/trunk: include/lldb/API/ include/lldb/Core/ include/lldb/Symbol/ lldb.xcodeproj/xcshareddata/xcschemes/ scripts/Python/interface/ source/API/ source/Core/ test/functionalities/data-formatter/data-formatter-objc/ test/functionalities/data-formatter/rdar-10642615/ test/python_api/formatters/

Enrico Granata granata.enrico at gmail.com
Thu Feb 16 19:18:31 PST 2012


Author: enrico
Date: Thu Feb 16 21:18:30 2012
New Revision: 150784

URL: http://llvm.org/viewvc/llvm-project?rev=150784&view=rev
Log:
Adding formatters for several useful Objective-C/Cocoa data types. The new categories are not enabled at startup, but can be manually activated if desired.
Adding new API calls to SBValue to be able to retrieve the associated formatters
Some refactoring to FormatNavigator::Get() in order to shrink its size down to more manageable terms (a future, massive, refactoring effort will still be needed)
Test cases added for the above

Modified:
    lldb/trunk/include/lldb/API/SBType.h
    lldb/trunk/include/lldb/API/SBTypeFilter.h
    lldb/trunk/include/lldb/API/SBTypeFormat.h
    lldb/trunk/include/lldb/API/SBTypeNameSpecifier.h
    lldb/trunk/include/lldb/API/SBTypeSummary.h
    lldb/trunk/include/lldb/API/SBTypeSynthetic.h
    lldb/trunk/include/lldb/API/SBValue.h
    lldb/trunk/include/lldb/Core/FormatClasses.h
    lldb/trunk/include/lldb/Core/FormatManager.h
    lldb/trunk/include/lldb/Core/FormatNavigator.h
    lldb/trunk/include/lldb/Symbol/Type.h
    lldb/trunk/lldb.xcodeproj/xcshareddata/xcschemes/lldb-tool.xcscheme
    lldb/trunk/scripts/Python/interface/SBTypeNameSpecifier.i
    lldb/trunk/scripts/Python/interface/SBValue.i
    lldb/trunk/source/API/SBTypeNameSpecifier.cpp
    lldb/trunk/source/API/SBValue.cpp
    lldb/trunk/source/Core/FormatManager.cpp
    lldb/trunk/test/functionalities/data-formatter/data-formatter-objc/TestDataFormatterObjC.py
    lldb/trunk/test/functionalities/data-formatter/data-formatter-objc/main.m
    lldb/trunk/test/functionalities/data-formatter/rdar-10642615/Makefile
    lldb/trunk/test/functionalities/data-formatter/rdar-10642615/Test-rdar-10642615.py
    lldb/trunk/test/functionalities/data-formatter/rdar-10642615/main.cpp
    lldb/trunk/test/python_api/formatters/TestFormattersSBAPI.py

Modified: lldb/trunk/include/lldb/API/SBType.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/API/SBType.h?rev=150784&r1=150783&r2=150784&view=diff
==============================================================================
--- lldb/trunk/include/lldb/API/SBType.h (original)
+++ lldb/trunk/include/lldb/API/SBType.h Thu Feb 16 21:18:30 2012
@@ -171,6 +171,7 @@
     friend class SBFunction;
     friend class SBModule;
     friend class SBTarget;
+    friend class SBTypeNameSpecifier;
     friend class SBTypeMember;
     friend class SBTypeList;
     friend class SBValue;

Modified: lldb/trunk/include/lldb/API/SBTypeFilter.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/API/SBTypeFilter.h?rev=150784&r1=150783&r2=150784&view=diff
==============================================================================
--- lldb/trunk/include/lldb/API/SBTypeFilter.h (original)
+++ lldb/trunk/include/lldb/API/SBTypeFilter.h Thu Feb 16 21:18:30 2012
@@ -69,6 +69,7 @@
     protected:
         friend class SBDebugger;
         friend class SBTypeCategory;
+        friend class SBValue;
         
         lldb::TypeFilterImplSP
         GetSP ();

Modified: lldb/trunk/include/lldb/API/SBTypeFormat.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/API/SBTypeFormat.h?rev=150784&r1=150783&r2=150784&view=diff
==============================================================================
--- lldb/trunk/include/lldb/API/SBTypeFormat.h (original)
+++ lldb/trunk/include/lldb/API/SBTypeFormat.h Thu Feb 16 21:18:30 2012
@@ -61,6 +61,7 @@
 protected:
     friend class SBDebugger;
     friend class SBTypeCategory;
+    friend class SBValue;
     
     lldb::TypeFormatImplSP
     GetSP ();

Modified: lldb/trunk/include/lldb/API/SBTypeNameSpecifier.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/API/SBTypeNameSpecifier.h?rev=150784&r1=150783&r2=150784&view=diff
==============================================================================
--- lldb/trunk/include/lldb/API/SBTypeNameSpecifier.h (original)
+++ lldb/trunk/include/lldb/API/SBTypeNameSpecifier.h Thu Feb 16 21:18:30 2012
@@ -22,6 +22,8 @@
         
         SBTypeNameSpecifier (const char* name,
                              bool is_regex = false);
+
+        SBTypeNameSpecifier (SBType type);
         
         SBTypeNameSpecifier (const lldb::SBTypeNameSpecifier &rhs);
         
@@ -33,6 +35,9 @@
         const char*
         GetName();
         
+        SBType
+        GetType ();
+        
         bool
         IsRegex();
         

Modified: lldb/trunk/include/lldb/API/SBTypeSummary.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/API/SBTypeSummary.h?rev=150784&r1=150783&r2=150784&view=diff
==============================================================================
--- lldb/trunk/include/lldb/API/SBTypeSummary.h (original)
+++ lldb/trunk/include/lldb/API/SBTypeSummary.h Thu Feb 16 21:18:30 2012
@@ -85,6 +85,7 @@
     protected:
         friend class SBDebugger;
         friend class SBTypeCategory;
+        friend class SBValue;
         
         lldb::TypeSummaryImplSP
         GetSP ();

Modified: lldb/trunk/include/lldb/API/SBTypeSynthetic.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/API/SBTypeSynthetic.h?rev=150784&r1=150783&r2=150784&view=diff
==============================================================================
--- lldb/trunk/include/lldb/API/SBTypeSynthetic.h (original)
+++ lldb/trunk/include/lldb/API/SBTypeSynthetic.h Thu Feb 16 21:18:30 2012
@@ -75,6 +75,7 @@
     protected:
         friend class SBDebugger;
         friend class SBTypeCategory;
+        friend class SBValue;
         
         lldb::TypeSyntheticImplSP
         GetSP ();

Modified: lldb/trunk/include/lldb/API/SBValue.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/API/SBValue.h?rev=150784&r1=150783&r2=150784&view=diff
==============================================================================
--- lldb/trunk/include/lldb/API/SBValue.h (original)
+++ lldb/trunk/include/lldb/API/SBValue.h Thu Feb 16 21:18:30 2012
@@ -100,6 +100,18 @@
 
     bool
     SetValueFromCString (const char *value_str);
+    
+    lldb::SBTypeFormat
+    GetTypeFormat ();
+    
+    lldb::SBTypeSummary
+    GetTypeSummary ();
+    
+    lldb::SBTypeFilter
+    GetTypeFilter ();
+    
+    lldb::SBTypeSynthetic
+    GetTypeSynthetic ();
 
     lldb::SBValue
     GetChildAtIndex (uint32_t idx);

Modified: lldb/trunk/include/lldb/Core/FormatClasses.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Core/FormatClasses.h?rev=150784&r1=150783&r2=150784&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Core/FormatClasses.h (original)
+++ lldb/trunk/include/lldb/Core/FormatClasses.h Thu Feb 16 21:18:30 2012
@@ -42,6 +42,7 @@
 
 #include "lldb/Core/ValueObject.h"
 #include "lldb/Interpreter/ScriptInterpreterPython.h"
+#include "lldb/Symbol/Type.h"
 
 namespace lldb_private {
 
@@ -1314,23 +1315,65 @@
 public:
     
     TypeNameSpecifierImpl() :
-    m_name(),
-    m_is_regex(false)
+    m_is_regex(false),
+    m_type()
     {
     }
     
     TypeNameSpecifierImpl (const char* name, bool is_regex) :
-    m_name(),
-    m_is_regex(is_regex)
+    m_is_regex(is_regex),
+    m_type()
     {
         if (name)
-                m_name.assign(name);
+            m_type.m_type_name.assign(name);
+    }
+    
+    // if constructing with a given type, is_regex cannot be true since we are
+    // very clearly pap
+    TypeNameSpecifierImpl (lldb::TypeSP type) :
+    m_is_regex(false),
+    m_type()
+    {
+        if (type)
+        {
+            m_type.m_type_name.assign(type->GetName().GetCString());
+            m_type.m_typeimpl_sp = lldb::TypeImplSP(new TypeImpl(type));
+        }
+    }
+
+    TypeNameSpecifierImpl (ClangASTType type) :
+    m_is_regex(false),
+    m_type()
+    {
+        if (type.IsValid())
+        {
+            m_type.m_type_name.assign(type.GetConstTypeName().GetCString());
+            m_type.m_typeimpl_sp = lldb::TypeImplSP(new TypeImpl(type));
+        }
     }
     
     const char*
     GetName()
     {
-        return m_name.c_str();
+        if (m_type.m_type_name.size())
+            return m_type.m_type_name.c_str();
+        return NULL;
+    }
+    
+    lldb::TypeSP
+    GetTypeSP ()
+    {
+        if (m_type.m_typeimpl_sp && m_type.m_typeimpl_sp->IsValid())
+            return m_type.m_typeimpl_sp->GetTypeSP();
+        return lldb::TypeSP();
+    }
+    
+    ClangASTType
+    GetClangASTType ()
+    {
+        if (m_type.m_typeimpl_sp && m_type.m_typeimpl_sp->IsValid())
+            return m_type.m_typeimpl_sp->GetClangASTType();
+        return ClangASTType();
     }
     
     bool
@@ -1340,8 +1383,16 @@
     }
     
 private:
-    std::string m_name;
     bool m_is_regex;
+    // this works better than TypeAndOrName because the latter only wraps a TypeSP
+    // whereas TypeImplSP can also be backed by a ClangASTType which is more commonly
+    // used in LLDB. moreover, TypeImplSP is also what is currently backing SBType
+    struct TypeOrName
+    {
+        std::string m_type_name;
+        lldb::TypeImplSP m_typeimpl_sp;
+    };
+    TypeOrName m_type;
 };
     
 } // namespace lldb_private

Modified: lldb/trunk/include/lldb/Core/FormatManager.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Core/FormatManager.h?rev=150784&r1=150783&r2=150784&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Core/FormatManager.h (original)
+++ lldb/trunk/include/lldb/Core/FormatManager.h Thu Feb 16 21:18:30 2012
@@ -671,6 +671,10 @@
     ConstString m_system_category_name;
     ConstString m_gnu_cpp_category_name;
     ConstString m_objc_category_name;
+    ConstString m_corefoundation_category_name;
+    ConstString m_coregraphics_category_name;
+    ConstString m_coreservices_category_name;
+    ConstString m_vectortypes_category_name;
     
     CategoryMap&
     GetCategories ()
@@ -678,6 +682,19 @@
         return m_categories_map;
     }
     
+    // WARNING: these are temporary functions that setup formatters
+    // while a few of these actually should be globally available and setup by LLDB itself
+    // most would actually belong to the users' lldbinit file or to some other form of configurable
+    // storage
+    void
+    LoadSTLFormatters();
+    
+    void
+    LoadSystemFormatters();
+    
+    void
+    LoadObjCFormatters();
+    
 };
     
 } // namespace lldb_private

Modified: lldb/trunk/include/lldb/Core/FormatNavigator.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Core/FormatNavigator.h?rev=150784&r1=150783&r2=150784&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Core/FormatNavigator.h (original)
+++ lldb/trunk/include/lldb/Core/FormatNavigator.h Thu Feb 16 21:18:30 2012
@@ -476,7 +476,7 @@
     
     #define LLDB_MAX_REASONABLE_OBJC_CLASS_DEPTH 100
     
-    bool Get_ObjC(ValueObject& valobj,
+    bool Get_ObjC(const lldb::ProcessSP &process_sp,
              ObjCLanguageRuntime::ObjCISA isa,
              std::set<ObjCLanguageRuntime::ObjCISA> &found_values,
              MapValueType& entry,
@@ -485,7 +485,9 @@
         LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES));
         if (log)
             log->Printf("going to an Objective-C dynamic scanning");
-        Process* process = valobj.GetUpdatePoint().GetProcessSP().get();
+        if (!process_sp)
+            return false;
+        Process* process = process_sp.get();
         ObjCLanguageRuntime* runtime = process->GetObjCLanguageRuntime();
         if (runtime == NULL)
         {
@@ -540,7 +542,7 @@
             return false;
         }
                 
-        if (Get_ObjC(valobj, parent, found_values, entry, reason))
+        if (Get_ObjC(process_sp, parent, found_values, entry, reason))
         {
             reason |= lldb_private::eFormatterChoiceCriterionNavigatedBaseClasses;
             return true;
@@ -548,6 +550,151 @@
         return false;
     }
     
+    bool
+    Get_CXXClass (ValueObject& valobj,
+                  const clang::Type* typePtr,
+                  MapValueType& entry,
+                  lldb::DynamicValueType use_dynamic,
+                  uint32_t& reason)
+    {
+        LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES));
+        if (log)
+            log->Printf("working with C++");
+        clang::CXXRecordDecl* record = typePtr->getAsCXXRecordDecl();
+        if (record)
+        {
+            if (!record->hasDefinition())
+                ClangASTContext::GetCompleteType(valobj.GetClangAST(), valobj.GetClangType());
+            if (record->hasDefinition())
+            {
+                clang::CXXRecordDecl::base_class_iterator pos,end;
+                if (record->getNumBases() > 0)
+                {
+                    if (log)
+                        log->Printf("look into bases");
+                    end = record->bases_end();
+                    for (pos = record->bases_begin(); pos != end; pos++)
+                    {
+                        if ((Get(valobj, pos->getType(), entry, use_dynamic, reason)) && entry->Cascades())
+                        {
+                            reason |= lldb_private::eFormatterChoiceCriterionNavigatedBaseClasses;
+                            return true;
+                        }
+                    }
+                }
+                if (record->getNumVBases() > 0)
+                {
+                    if (log)
+                        log->Printf("look into VBases");
+                    end = record->vbases_end();
+                    for (pos = record->vbases_begin(); pos != end; pos++)
+                    {
+                        if ((Get(valobj, pos->getType(), entry, use_dynamic, reason)) && entry->Cascades())
+                        {
+                            reason |= lldb_private::eFormatterChoiceCriterionNavigatedBaseClasses;
+                            return true;
+                        }
+                    }
+                }
+            }
+        }
+        return false;
+    }
+    
+    bool
+    Get_BitfieldMatch (ValueObject& valobj,
+                       ConstString typeName,
+                       MapValueType& entry,
+                       uint32_t& reason)
+    {
+        LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES));
+        // for bitfields, append size to the typename so one can custom format them
+        StreamString sstring;
+        sstring.Printf("%s:%d",typeName.AsCString(),valobj.GetBitfieldBitSize());
+        ConstString bitfieldname = ConstString(sstring.GetData());
+        if (log)
+            log->Printf("appended bitfield info, final result is %s", bitfieldname.GetCString());
+        if (Get(bitfieldname, entry))
+        {
+            if (log)
+                log->Printf("bitfield direct match found, returning");
+            return true;
+        }
+        else
+        {
+            reason |= lldb_private::eFormatterChoiceCriterionStrippedBitField;
+            if (log)
+                log->Printf("no bitfield direct match");
+            return false;
+        }
+    }
+    
+    bool
+    Get_ObjCDynamic(lldb::ProcessSP process_sp,
+                    ValueObject& valobj,
+                    MapValueType& entry,
+                    uint32_t& reason)
+    {
+        LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES));
+        if (!process_sp)
+            return false;
+        if (log)
+            log->Printf("this is an ObjC 'id', let's do dynamic search");
+        Process* process = process_sp.get();
+        ObjCLanguageRuntime* runtime = process->GetObjCLanguageRuntime();
+        if (runtime == NULL)
+        {
+            if (log)
+                log->Printf("no valid ObjC runtime, skipping dynamic");
+        }
+        else
+        {
+            std::set<ObjCLanguageRuntime::ObjCISA> found_values;
+            if (Get_ObjC(process_sp, runtime->GetISA(valobj), found_values, entry, reason))
+            {
+                reason |= lldb_private::eFormatterChoiceCriterionDynamicObjCHierarchy;
+                return true;
+            }
+        }
+        return false;
+    }
+    
+    bool
+    Get_ObjCStatic(const clang::ObjCObjectType *objc_class_type,
+                   ValueObject& valobj,
+                   clang::QualType type,
+                   MapValueType& entry,
+                   lldb::DynamicValueType use_dynamic,
+                   uint32_t& reason)
+    {
+        LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES));
+        if (log)
+            log->Printf("working with ObjC");
+        clang::ASTContext *ast = valobj.GetClangAST();
+        if (ClangASTContext::GetCompleteType(ast, valobj.GetClangType()) && !objc_class_type->isObjCId())
+        {
+            clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
+            if (class_interface_decl)
+            {
+                if (log)
+                    log->Printf("got an ObjCInterfaceDecl");
+                clang::ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
+                if (superclass_interface_decl)
+                {
+                    if (log)
+                        log->Printf("got a parent class for this ObjC class");
+                    clang::QualType ivar_qual_type(ast->getObjCInterfaceType(superclass_interface_decl));
+                    if (Get(valobj, ivar_qual_type, entry, use_dynamic, reason) && entry->Cascades())
+                    {
+                        reason |= lldb_private::eFormatterChoiceCriterionNavigatedBaseClasses;
+                        return true;
+                    }
+                }
+            }
+        }
+        return false;
+    }
+    
     bool Get(ValueObject& valobj,
              clang::QualType type,
              MapValueType& entry,
@@ -571,32 +718,19 @@
             return false;
         }
         ConstString typeName(ClangASTType::GetTypeNameForQualType(type).c_str());
+        
         if (valobj.GetBitfieldBitSize() > 0)
         {
-            // for bitfields, append size to the typename so one can custom format them
-            StreamString sstring;
-            sstring.Printf("%s:%d",typeName.AsCString(),valobj.GetBitfieldBitSize());
-            ConstString bitfieldname = ConstString(sstring.GetData());
-            if (log)
-                log->Printf("appended bitfield info, final result is %s", bitfieldname.GetCString());
-            if (Get(bitfieldname, entry))
-            {
-                if (log)
-                    log->Printf("bitfield direct match found, returning");
+            if (Get_BitfieldMatch(valobj, typeName, entry, reason))
                 return true;
-            }
-            else
-            {
-                reason |= lldb_private::eFormatterChoiceCriterionStrippedBitField;
-                if (log)
-                    log->Printf("no bitfield direct match");
-            }
         }
+        
         if (log)
             log->Printf("trying to get %s for VO name %s of type %s",
                         m_name.c_str(),
                         valobj.GetName().AsCString(),
                         typeName.AsCString());
+        
         if (Get(typeName, entry))
         {
             if (log)
@@ -616,28 +750,14 @@
                 return true;
             }
         }
+        
+        lldb::ProcessSP process_sp = valobj.GetUpdatePoint().GetProcessSP();
+        
         if (use_dynamic != lldb::eNoDynamicValues &&
-            (/*strstr(typeName, "id") == typeName ||*/
-             ClangASTType::GetMinimumLanguage(valobj.GetClangAST(), valobj.GetClangType()) == lldb::eLanguageTypeObjC))
+             ClangASTType::GetMinimumLanguage(valobj.GetClangAST(), valobj.GetClangType()) == lldb::eLanguageTypeObjC)
         {
-            if (log)
-                log->Printf("this is an ObjC 'id', let's do dynamic search");
-            Process* process = valobj.GetUpdatePoint().GetProcessSP().get();
-            ObjCLanguageRuntime* runtime = process->GetObjCLanguageRuntime();
-            if (runtime == NULL)
-            {
-                if (log)
-                    log->Printf("no valid ObjC runtime, skipping dynamic");
-            }
-            else
-            {
-                std::set<ObjCLanguageRuntime::ObjCISA> found_values;
-                if (Get_ObjC(valobj, runtime->GetISA(valobj), found_values, entry, reason))
-                {
-                    reason |= lldb_private::eFormatterChoiceCriterionDynamicObjCHierarchy;
-                    return true;
-                }
-            }
+            if (Get_ObjCDynamic(process_sp, valobj, entry, reason))
+                return true;
         }
         else if (use_dynamic != lldb::eNoDynamicValues && log)
         {
@@ -664,24 +784,8 @@
             if (use_dynamic != lldb::eNoDynamicValues &&
                 typeName == m_id_cs)
             {
-                if (log)
-                    log->Printf("this is an ObjC 'id', let's do dynamic search");
-                Process* process = valobj.GetUpdatePoint().GetProcessSP().get();
-                ObjCLanguageRuntime* runtime = process->GetObjCLanguageRuntime();
-                if (runtime == NULL)
-                {
-                    if (log)
-                        log->Printf("no valid ObjC runtime, skipping dynamic");
-                }
-                else
-                {
-                    std::set<ObjCLanguageRuntime::ObjCISA> found_values;
-                    if (Get_ObjC(valobj, runtime->GetISA(valobj), found_values, entry, reason))
-                    {
-                        reason |= lldb_private::eFormatterChoiceCriterionDynamicObjCHierarchy;
-                        return true;
-                    }
-                }
+                if (Get_ObjCDynamic(process_sp, valobj, entry, reason))
+                    return true;
             }
             if (log)
                 log->Printf("stripping ObjC pointer");
@@ -704,74 +808,19 @@
         const clang::ObjCObjectType *objc_class_type = typePtr->getAs<clang::ObjCObjectType>();
         if (objc_class_type)
         {
-            if (log)
-                log->Printf("working with ObjC");
-            clang::ASTContext *ast = valobj.GetClangAST();
-            if (ClangASTContext::GetCompleteType(ast, valobj.GetClangType()) && !objc_class_type->isObjCId())
-            {
-                clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
-                if (class_interface_decl)
-                {
-                    if (log)
-                        log->Printf("got an ObjCInterfaceDecl");
-                    clang::ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
-                    if (superclass_interface_decl)
-                    {
-                        if (log)
-                            log->Printf("got a parent class for this ObjC class");
-                        clang::QualType ivar_qual_type(ast->getObjCInterfaceType(superclass_interface_decl));
-                        if (Get(valobj, ivar_qual_type, entry, use_dynamic, reason) && entry->Cascades())
-                        {
-                            reason |= lldb_private::eFormatterChoiceCriterionNavigatedBaseClasses;
-                            return true;
-                        }
-                    }
-                }
-            }
+            if (Get_ObjCStatic(objc_class_type,
+                              valobj,
+                              type,
+                              entry,
+                              use_dynamic,
+                              reason))
+            return true;
         }
         // for C++ classes, navigate up the hierarchy
         if (typePtr->isRecordType())
         {
-            if (log)
-                log->Printf("working with C++");
-            clang::CXXRecordDecl* record = typePtr->getAsCXXRecordDecl();
-            if (record)
-            {
-                if (!record->hasDefinition())
-                    ClangASTContext::GetCompleteType(valobj.GetClangAST(), valobj.GetClangType());
-                if (record->hasDefinition())
-                {
-                    clang::CXXRecordDecl::base_class_iterator pos,end;
-                    if (record->getNumBases() > 0)
-                    {
-                        if (log)
-                            log->Printf("look into bases");
-                        end = record->bases_end();
-                        for (pos = record->bases_begin(); pos != end; pos++)
-                        {
-                            if ((Get(valobj, pos->getType(), entry, use_dynamic, reason)) && entry->Cascades())
-                            {
-                                reason |= lldb_private::eFormatterChoiceCriterionNavigatedBaseClasses;
-                                return true;
-                            }
-                        }
-                    }
-                    if (record->getNumVBases() > 0)
-                    {
-                        if (log)
-                            log->Printf("look into VBases");
-                        end = record->vbases_end();
-                        for (pos = record->vbases_begin(); pos != end; pos++)
-                        {
-                            if ((Get(valobj, pos->getType(), entry, use_dynamic, reason)) && entry->Cascades())
-                            {
-                                reason |= lldb_private::eFormatterChoiceCriterionNavigatedBaseClasses;
-                                return true;
-                            }
-                        }
-                    }
-                }
-            }
+            if (Get_CXXClass(valobj, typePtr, entry, use_dynamic, reason))
+                return true;
         }
         // try to strip typedef chains
         const clang::TypedefType* type_tdef = type->getAs<clang::TypedefType>();

Modified: lldb/trunk/include/lldb/Symbol/Type.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Symbol/Type.h?rev=150784&r1=150783&r2=150784&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Symbol/Type.h (original)
+++ lldb/trunk/include/lldb/Symbol/Type.h Thu Feb 16 21:18:30 2012
@@ -386,6 +386,12 @@
     lldb::clang_type_t
     GetOpaqueQualType();    
 
+    lldb::TypeSP
+    GetTypeSP ()
+    {
+        return m_type_sp;
+    }
+
     bool
     GetDescription (lldb_private::Stream &strm, 
                     lldb::DescriptionLevel description_level);

Modified: lldb/trunk/lldb.xcodeproj/xcshareddata/xcschemes/lldb-tool.xcscheme
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/lldb.xcodeproj/xcshareddata/xcschemes/lldb-tool.xcscheme?rev=150784&r1=150783&r2=150784&view=diff
==============================================================================
--- lldb/trunk/lldb.xcodeproj/xcshareddata/xcschemes/lldb-tool.xcscheme (original)
+++ lldb/trunk/lldb.xcodeproj/xcshareddata/xcschemes/lldb-tool.xcscheme Thu Feb 16 21:18:30 2012
@@ -81,8 +81,8 @@
       </EnvironmentVariables>
    </TestAction>
    <LaunchAction
-      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
-      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.GDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.GDB"
       launchStyle = "0"
       useCustomWorkingDirectory = "NO"
       customWorkingDirectory = "/Volumes/work/gclayton/Documents/devb/attach"

Modified: lldb/trunk/scripts/Python/interface/SBTypeNameSpecifier.i
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/scripts/Python/interface/SBTypeNameSpecifier.i?rev=150784&r1=150783&r2=150784&view=diff
==============================================================================
--- lldb/trunk/scripts/Python/interface/SBTypeNameSpecifier.i (original)
+++ lldb/trunk/scripts/Python/interface/SBTypeNameSpecifier.i Thu Feb 16 21:18:30 2012
@@ -21,6 +21,8 @@
         
         SBTypeNameSpecifier (const char* name,
                              bool is_regex = false);
+                             
+        SBTypeNameSpecifier (SBType type);
         
         SBTypeNameSpecifier (const lldb::SBTypeNameSpecifier &rhs);
         
@@ -35,6 +37,9 @@
         const char*
         GetName();
         
+        lldb::SBType
+        GetType ();
+        
         bool
         IsRegex();
         

Modified: lldb/trunk/scripts/Python/interface/SBValue.i
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/scripts/Python/interface/SBValue.i?rev=150784&r1=150783&r2=150784&view=diff
==============================================================================
--- lldb/trunk/scripts/Python/interface/SBValue.i (original)
+++ lldb/trunk/scripts/Python/interface/SBValue.i Thu Feb 16 21:18:30 2012
@@ -136,6 +136,18 @@
     bool
     SetValueFromCString (const char *value_str);
 
+    lldb::SBTypeFormat
+    GetTypeFormat ();
+    
+    lldb::SBTypeSummary
+    GetTypeSummary ();
+    
+    lldb::SBTypeFilter
+    GetTypeFilter ();
+    
+    lldb::SBTypeSynthetic
+    GetTypeSynthetic ();
+
     lldb::SBValue
     GetChildAtIndex (uint32_t idx);
 

Modified: lldb/trunk/source/API/SBTypeNameSpecifier.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/API/SBTypeNameSpecifier.cpp?rev=150784&r1=150783&r2=150784&view=diff
==============================================================================
--- lldb/trunk/source/API/SBTypeNameSpecifier.cpp (original)
+++ lldb/trunk/source/API/SBTypeNameSpecifier.cpp Thu Feb 16 21:18:30 2012
@@ -10,6 +10,7 @@
 #include "lldb/API/SBTypeNameSpecifier.h"
 
 #include "lldb/API/SBStream.h"
+#include "lldb/API/SBType.h"
 
 #include "lldb/Core/DataVisualization.h"
 
@@ -29,6 +30,13 @@
         m_opaque_sp.reset();
 }
 
+SBTypeNameSpecifier::SBTypeNameSpecifier (SBType type) :
+m_opaque_sp()
+{
+    if (type.IsValid())
+        m_opaque_sp = TypeNameSpecifierImplSP(new TypeNameSpecifierImpl(type.m_opaque_sp->GetClangASTType()));
+}
+
 SBTypeNameSpecifier::SBTypeNameSpecifier (const lldb::SBTypeNameSpecifier &rhs) :
 m_opaque_sp(rhs.m_opaque_sp)
 {}
@@ -52,6 +60,17 @@
     return m_opaque_sp->GetName();
 }
 
+SBType
+SBTypeNameSpecifier::GetType ()
+{
+    if (!IsValid())
+        return SBType();
+    lldb_private::ClangASTType c_type = m_opaque_sp->GetClangASTType();
+    if (c_type.IsValid())
+        return SBType(c_type);
+    return SBType();
+}
+
 bool
 SBTypeNameSpecifier::IsRegex ()
 {

Modified: lldb/trunk/source/API/SBValue.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/API/SBValue.cpp?rev=150784&r1=150783&r2=150784&view=diff
==============================================================================
--- lldb/trunk/source/API/SBValue.cpp (original)
+++ lldb/trunk/source/API/SBValue.cpp Thu Feb 16 21:18:30 2012
@@ -8,10 +8,16 @@
 //===----------------------------------------------------------------------===//
 
 #include "lldb/API/SBValue.h"
+
 #include "lldb/API/SBStream.h"
+#include "lldb/API/SBTypeFilter.h"
+#include "lldb/API/SBTypeFormat.h"
+#include "lldb/API/SBTypeSummary.h"
+#include "lldb/API/SBTypeSynthetic.h"
 
 #include "lldb/Breakpoint/Watchpoint.h"
 #include "lldb/Core/DataExtractor.h"
+#include "lldb/Core/DataVisualization.h"
 #include "lldb/Core/Log.h"
 #include "lldb/Core/Module.h"
 #include "lldb/Core/Scalar.h"
@@ -371,6 +377,86 @@
     return success;
 }
 
+lldb::SBTypeFormat
+SBValue::GetTypeFormat ()
+{
+    lldb::SBTypeFormat format;
+    lldb::ValueObjectSP value_sp(GetSP());
+    if (value_sp)
+    {
+        Mutex::Locker api_locker (value_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
+        if (value_sp->UpdateValueIfNeeded(true))
+        {
+            lldb::TypeFormatImplSP format_sp = value_sp->GetValueFormat();
+            if (format_sp)
+                format.SetSP(format_sp);
+        }
+    }
+    return format;
+}
+
+lldb::SBTypeSummary
+SBValue::GetTypeSummary ()
+{
+    lldb::SBTypeSummary summary;
+    lldb::ValueObjectSP value_sp(GetSP());
+    if (value_sp)
+    {
+        Mutex::Locker api_locker (value_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
+        if (value_sp->UpdateValueIfNeeded(true))
+        {
+            lldb::TypeSummaryImplSP summary_sp = value_sp->GetSummaryFormat();
+            if (summary_sp)
+                summary.SetSP(summary_sp);
+        }
+    }
+    return summary;
+}
+
+lldb::SBTypeFilter
+SBValue::GetTypeFilter ()
+{
+    lldb::SBTypeFilter filter;
+    lldb::ValueObjectSP value_sp(GetSP());
+    if (value_sp)
+    {
+        Mutex::Locker api_locker (value_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
+        if (value_sp->UpdateValueIfNeeded(true))
+        {
+            lldb::SyntheticChildrenSP synthetic_sp = value_sp->GetSyntheticChildren();
+            
+            if (synthetic_sp && !synthetic_sp->IsScripted())
+            {
+                TypeFilterImplSP filter_sp = std::tr1::static_pointer_cast<TypeFilterImpl>(synthetic_sp);
+                filter.SetSP(filter_sp);
+            }
+        }
+    }
+    return filter;
+}
+
+lldb::SBTypeSynthetic
+SBValue::GetTypeSynthetic ()
+{
+    lldb::SBTypeSynthetic synthetic;
+    lldb::ValueObjectSP value_sp(GetSP());
+    if (value_sp)
+    {
+        Mutex::Locker api_locker (value_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
+        if (value_sp->UpdateValueIfNeeded(true))
+        {
+            lldb::SyntheticChildrenSP children_sp = value_sp->GetSyntheticChildren();
+            
+            if (children_sp && children_sp->IsScripted())
+            {
+                TypeSyntheticImplSP synth_sp = std::tr1::static_pointer_cast<TypeSyntheticImpl>(children_sp);
+                synthetic.SetSP(synth_sp);
+            }
+        }
+    }
+    return synthetic;
+}
+
 lldb::SBValue
 SBValue::CreateChildAtOffset (const char *name, uint32_t offset, SBType type)
 {

Modified: lldb/trunk/source/Core/FormatManager.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/FormatManager.cpp?rev=150784&r1=150783&r2=150784&view=diff
==============================================================================
--- lldb/trunk/source/Core/FormatManager.cpp (original)
+++ lldb/trunk/source/Core/FormatManager.cpp Thu Feb 16 21:18:30 2012
@@ -580,45 +580,29 @@
     m_default_category_name(ConstString("default")),
     m_system_category_name(ConstString("system")), 
     m_gnu_cpp_category_name(ConstString("gnu-libstdc++")),
-    m_objc_category_name(ConstString("objc"))
+    m_objc_category_name(ConstString("objc")),
+    m_corefoundation_category_name(ConstString("CoreFoundation")),
+    m_coregraphics_category_name(ConstString("CoreGraphics")),
+    m_coreservices_category_name(ConstString("CoreServices")),
+    m_vectortypes_category_name(ConstString("VectorTypes"))
 {
     
-    // add some default stuff
-    // most formats, summaries, ... actually belong to the users' lldbinit file rather than here
-    lldb::TypeSummaryImplSP string_format(new StringSummaryFormat(TypeSummaryImpl::Flags().SetCascades(false)
-                                                                  .SetSkipPointers(true)
-                                                                  .SetSkipReferences(false)
-                                                                  .SetDontShowChildren(true)
-                                                                  .SetDontShowValue(false)
-                                                                  .SetShowMembersOneLiner(false)
-                                                                  .SetHideItemNames(false),
-                                                                  "${var%s}"));
-    
-    
-    lldb::TypeSummaryImplSP string_array_format(new StringSummaryFormat(TypeSummaryImpl::Flags().SetCascades(false)
-                                                                        .SetSkipPointers(true)
-                                                                        .SetSkipReferences(false)
-                                                                        .SetDontShowChildren(false)
-                                                                        .SetDontShowValue(true)
-                                                                        .SetShowMembersOneLiner(false)
-                                                                        .SetHideItemNames(false),
-                                                                        "${var%s}"));
-    
-    lldb::RegularExpressionSP any_size_char_arr(new RegularExpression("char \\[[0-9]+\\]"));
+    LoadSystemFormatters();
+    LoadSTLFormatters();
+    LoadObjCFormatters();
     
-    TypeCategoryImpl::SharedPointer sys_category_sp = GetCategory(m_system_category_name);
-    
-    sys_category_sp->GetSummaryNavigator()->Add(ConstString("char *"), string_format);
-    sys_category_sp->GetSummaryNavigator()->Add(ConstString("const char *"), string_format);
-    sys_category_sp->GetRegexSummaryNavigator()->Add(any_size_char_arr, string_array_format);
-    
-    // WARNING: temporary code!!
-    // The platform should be responsible for initializing its own formatters
-    // (e.g. to handle versioning, different runtime libraries, ...)
-    // Currently, basic formatters for std:: objects as implemented by
-    // the GNU libstdc++ are defined regardless, and enabled by default
-    // This is going to be moved to some platform-dependent location
-    // (in the meanwhile, these formatters should work for Mac OS X & Linux)
+    EnableCategory(m_objc_category_name,CategoryMap::Last);
+    //EnableCategory(m_corefoundation_category_name,CategoryMap::Last);
+    //EnableCategory(m_coreservices_category_name,CategoryMap::Last);
+    //EnableCategory(m_coregraphics_category_name,CategoryMap::Last);
+    EnableCategory(m_gnu_cpp_category_name,CategoryMap::Last);
+    //EnableCategory(m_vectortypes_category_name,CategoryMap::Last);
+    EnableCategory(m_system_category_name,CategoryMap::Last);
+}
+
+void
+FormatManager::LoadSTLFormatters()
+{
     lldb::TypeSummaryImplSP std_string_summary_sp(new StringSummaryFormat(TypeSummaryImpl::Flags().SetCascades(true)
                                                                           .SetSkipPointers(false)
                                                                           .SetSkipReferences(false)
@@ -638,7 +622,7 @@
                                                 std_string_summary_sp);
     gnu_category_sp->GetSummaryNavigator()->Add(ConstString("std::basic_string<char, class std::char_traits<char>, class std::allocator<char> >"),
                                                 std_string_summary_sp);
-
+    
     
 #ifndef LLDB_DISABLE_PYTHON
     
@@ -646,29 +630,223 @@
     stl_synth_flags.SetCascades(true).SetSkipPointers(false).SetSkipReferences(false);
     
     gnu_category_sp->GetRegexSyntheticNavigator()->Add(RegularExpressionSP(new RegularExpression("^(std::)?vector<.+>$")),
-                                     SyntheticChildrenSP(new TypeSyntheticImpl(stl_synth_flags,
-                                                                               "gnu_libstdcpp.StdVectorSynthProvider")));
+                                                       SyntheticChildrenSP(new TypeSyntheticImpl(stl_synth_flags,
+                                                                                                 "gnu_libstdcpp.StdVectorSynthProvider")));
     gnu_category_sp->GetRegexSyntheticNavigator()->Add(RegularExpressionSP(new RegularExpression("^(std::)?map<.+> >$")),
-                                     SyntheticChildrenSP(new TypeSyntheticImpl(stl_synth_flags,
-                                                                               "gnu_libstdcpp.StdMapSynthProvider")));
+                                                       SyntheticChildrenSP(new TypeSyntheticImpl(stl_synth_flags,
+                                                                                                 "gnu_libstdcpp.StdMapSynthProvider")));
     gnu_category_sp->GetRegexSyntheticNavigator()->Add(RegularExpressionSP(new RegularExpression("^(std::)?list<.+>$")),
-                                     SyntheticChildrenSP(new TypeSyntheticImpl(stl_synth_flags,
-                                                                               "gnu_libstdcpp.StdListSynthProvider")));
+                                                       SyntheticChildrenSP(new TypeSyntheticImpl(stl_synth_flags,
+                                                                                                 "gnu_libstdcpp.StdListSynthProvider")));
+#endif
+}
+
+void
+FormatManager::LoadSystemFormatters()
+{
+    lldb::TypeSummaryImplSP string_format(new StringSummaryFormat(TypeSummaryImpl::Flags().SetCascades(false)
+                                                                  .SetSkipPointers(true)
+                                                                  .SetSkipReferences(false)
+                                                                  .SetDontShowChildren(true)
+                                                                  .SetDontShowValue(false)
+                                                                  .SetShowMembersOneLiner(false)
+                                                                  .SetHideItemNames(false),
+                                                                  "${var%s}"));
+    
+    
+    lldb::TypeSummaryImplSP string_array_format(new StringSummaryFormat(TypeSummaryImpl::Flags().SetCascades(false)
+                                                                        .SetSkipPointers(true)
+                                                                        .SetSkipReferences(false)
+                                                                        .SetDontShowChildren(false)
+                                                                        .SetDontShowValue(true)
+                                                                        .SetShowMembersOneLiner(false)
+                                                                        .SetHideItemNames(false),
+                                                                        "${var%s}"));
+    
+    lldb::RegularExpressionSP any_size_char_arr(new RegularExpression("char \\[[0-9]+\\]"));
+    
+    TypeCategoryImpl::SharedPointer sys_category_sp = GetCategory(m_system_category_name);
+    
+    sys_category_sp->GetSummaryNavigator()->Add(ConstString("char *"), string_format);
+    sys_category_sp->GetSummaryNavigator()->Add(ConstString("const char *"), string_format);
+    sys_category_sp->GetRegexSummaryNavigator()->Add(any_size_char_arr, string_array_format);
+}
 
-    lldb::TypeSummaryImplSP ObjC_BOOL_summary(new ScriptSummaryFormat(TypeSummaryImpl::Flags().SetCascades(false)
-                                                                      .SetSkipPointers(false)
-                                                                      .SetSkipReferences(false)
-                                                                      .SetDontShowChildren(true)
-                                                                      .SetDontShowValue(true)
-                                                                      .SetShowMembersOneLiner(false)
-                                                                      .SetHideItemNames(false),
+static void
+AddSummary(TypeCategoryImpl::SharedPointer category_sp,
+           const char* string,
+           ConstString type_name,
+           TypeSummaryImpl::Flags flags)
+{
+    lldb::TypeSummaryImplSP summary_sp(new StringSummaryFormat(flags,
+                                                               string));
+    category_sp->GetSummaryNavigator()->Add(type_name,
+                                            summary_sp);
+}
+
+void
+FormatManager::LoadObjCFormatters()
+{
+    TypeSummaryImpl::Flags objc_flags;
+    objc_flags.SetCascades(false)
+    .SetSkipPointers(false)
+    .SetSkipReferences(false)
+    .SetDontShowChildren(true)
+    .SetDontShowValue(true)
+    .SetShowMembersOneLiner(false)
+    .SetHideItemNames(false);
+    
+    lldb::TypeSummaryImplSP ObjC_BOOL_summary(new ScriptSummaryFormat(objc_flags,
                                                                       "objc.BOOL_SummaryProvider",
                                                                       ""));
     TypeCategoryImpl::SharedPointer objc_category_sp = GetCategory(m_objc_category_name);
     objc_category_sp->GetSummaryNavigator()->Add(ConstString("BOOL"),
                                                  ObjC_BOOL_summary);
-#endif
-    EnableCategory(m_objc_category_name,CategoryMap::Last);
-    EnableCategory(m_gnu_cpp_category_name,CategoryMap::Last);
-    EnableCategory(m_system_category_name,CategoryMap::Last);
+    
+    
+    TypeCategoryImpl::SharedPointer corefoundation_category_sp = GetCategory(m_corefoundation_category_name);
+
+    AddSummary(corefoundation_category_sp,
+               "${var.years} years, ${var.months} months, ${var.days} days, ${var.hours} hours, ${var.minutes} minutes ${var.seconds} seconds",
+               ConstString("CFGregorianUnits"),
+               objc_flags);
+    AddSummary(corefoundation_category_sp,
+               "location=${var.location} length=${var.length}",
+               ConstString("CFRange"),
+               objc_flags);
+    AddSummary(corefoundation_category_sp,
+               "x=${var.x}, y=${var.y}",
+               ConstString("NSPoint"),
+               objc_flags);
+    AddSummary(corefoundation_category_sp,
+               "location=${var.location}, length=${var.length}",
+               ConstString("NSRange"),
+               objc_flags);
+    AddSummary(corefoundation_category_sp,
+               "${var.origin}, ${var.size}",
+               ConstString("NSRect"),
+               objc_flags);
+    AddSummary(corefoundation_category_sp,
+               "(${var.origin}, ${var.size}), ...",
+               ConstString("NSRectArray"),
+               objc_flags);
+    AddSummary(objc_category_sp,
+               "width=${var.width}, height=${var.height}",
+               ConstString("NSSize"),
+               objc_flags);
+    
+    TypeCategoryImpl::SharedPointer coregraphics_category_sp = GetCategory(m_coregraphics_category_name);
+    
+    AddSummary(coregraphics_category_sp,
+               "(width=${var.width}, height=${var.height})",
+               ConstString("CGSize"),
+               objc_flags);
+    AddSummary(coregraphics_category_sp,
+               "(x=${var.x}, y=${var.y})",
+               ConstString("CGPoint"),
+               objc_flags);
+    AddSummary(coregraphics_category_sp,
+               "origin=${var.origin} size=${var.size}",
+               ConstString("CGRect"),
+               objc_flags);
+    
+    TypeCategoryImpl::SharedPointer coreservices_category_sp = GetCategory(m_coreservices_category_name);
+    
+    AddSummary(coreservices_category_sp,
+               "red=${var.red} green=${var.green} blue=${var.blue}",
+               ConstString("RGBColor"),
+               objc_flags);
+    AddSummary(coreservices_category_sp,
+               "(t=${var.top}, l=${var.left}, b=${var.bottom}, r=${var.right})",
+               ConstString("Rect"),
+               objc_flags);
+    AddSummary(coreservices_category_sp,
+               "(v=${var.v}, h=${var.h})",
+               ConstString("Point"),
+               objc_flags);
+    AddSummary(coreservices_category_sp,
+               "${var.month}/${var.day}/${var.year}  ${var.hour} :${var.minute} :${var.second} dayOfWeek:${var.dayOfWeek}",
+               ConstString("DateTimeRect *"),
+               objc_flags);
+    AddSummary(coreservices_category_sp,
+               "${var.ld.month}/${var.ld.day}/${var.ld.year} ${var.ld.hour} :${var.ld.minute} :${var.ld.second} dayOfWeek:${var.ld.dayOfWeek}",
+               ConstString("LongDateRect"),
+               objc_flags);
+    AddSummary(coreservices_category_sp,
+               "(x=${var.x}, y=${var.y})",
+               ConstString("HIPoint"),
+               objc_flags);
+    AddSummary(coreservices_category_sp,
+               "origin=${var.origin} size=${var.size}",
+               ConstString("HIRect"),
+               objc_flags);
+    
+    TypeCategoryImpl::SharedPointer vectors_category_sp = GetCategory(m_vectortypes_category_name);
+
+    TypeSummaryImpl::Flags vector_flags;
+    vector_flags.SetCascades(true)
+    .SetSkipPointers(true)
+    .SetSkipReferences(false)
+    .SetDontShowChildren(true)
+    .SetDontShowValue(false)
+    .SetShowMembersOneLiner(true)
+    .SetHideItemNames(true);
+    
+    AddSummary(vectors_category_sp,
+               "${var.uint128}",
+               ConstString("builtin_type_vec128"),
+               objc_flags);
+
+    AddSummary(vectors_category_sp,
+               "",
+               ConstString("float [4]"),
+               vector_flags);
+    AddSummary(vectors_category_sp,
+               "",
+               ConstString("int32_t [4]"),
+               vector_flags);
+    AddSummary(vectors_category_sp,
+               "",
+               ConstString("int16_t [8]"),
+               vector_flags);
+    AddSummary(vectors_category_sp,
+               "",
+               ConstString("vDouble"),
+               vector_flags);
+    AddSummary(vectors_category_sp,
+               "",
+               ConstString("vFloat"),
+               vector_flags);
+    AddSummary(vectors_category_sp,
+               "",
+               ConstString("vSInt8"),
+               vector_flags);
+    AddSummary(vectors_category_sp,
+               "",
+               ConstString("vSInt16"),
+               vector_flags);
+    AddSummary(vectors_category_sp,
+               "",
+               ConstString("vSInt32"),
+               vector_flags);
+    AddSummary(vectors_category_sp,
+               "",
+               ConstString("vUInt16"),
+               vector_flags);
+    AddSummary(vectors_category_sp,
+               "",
+               ConstString("vUInt8"),
+               vector_flags);
+    AddSummary(vectors_category_sp,
+               "",
+               ConstString("vUInt16"),
+               vector_flags);
+    AddSummary(vectors_category_sp,
+               "",
+               ConstString("vUInt32"),
+               vector_flags);
+    AddSummary(vectors_category_sp,
+               "",
+               ConstString("vBool32"),
+               vector_flags);
 }

Modified: lldb/trunk/test/functionalities/data-formatter/data-formatter-objc/TestDataFormatterObjC.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/functionalities/data-formatter/data-formatter-objc/TestDataFormatterObjC.py?rev=150784&r1=150783&r2=150784&view=diff
==============================================================================
--- lldb/trunk/test/functionalities/data-formatter/data-formatter-objc/TestDataFormatterObjC.py (original)
+++ lldb/trunk/test/functionalities/data-formatter/data-formatter-objc/TestDataFormatterObjC.py Thu Feb 16 21:18:30 2012
@@ -52,6 +52,10 @@
             self.runCmd('type format clear', check=False)
             self.runCmd('type summary clear', check=False)
             self.runCmd('type synth clear', check=False)
+            self.runCmd('type category disable CoreFoundation', check=False)
+            self.runCmd('type category disable CoreGraphics', check=False)
+            self.runCmd('type category disable CoreServices', check=False)
+
 
         # Execute the cleanup function during test case tear down.
         self.addTearDownHook(cleanup)
@@ -253,6 +257,32 @@
         self.expect('expr -d true -- @"Hello"',
             substrs = ['Hello'])
 
+        # check formatters for common Objective-C types
+        self.runCmd('type category enable CoreFoundation')
+        self.runCmd('type category enable CoreGraphics')
+        self.runCmd('type category enable CoreServices')
+        self.expect("frame variable",
+             substrs = ['(CFGregorianUnits) cf_greg_units = 1 years, 3 months, 5 days, 12 hours, 5 minutes 7 seconds',
+             '(CFRange) cf_range = location=4 length=4',
+             '(NSPoint) ns_point = x=4, y=4',
+             '(NSRange) ns_range = location=4, length=4',
+             '(NSRect *) ns_rect_ptr = (x=1, y=1), (width=5, height=5)',
+             '(NSRect) ns_rect = (x=1, y=1), (width=5, height=5)',
+             '(NSRectArray) ns_rect_arr = ((x=1, y=1), (width=5, height=5)), ...',
+             '(NSSize) ns_size = width=5, height=7',
+             '(NSSize *) ns_size_ptr = width=5, height=7',
+             '(CGSize) cg_size = (width=1, height=6)',
+             '(CGPoint) cg_point = (x=2, y=7)',
+             '(CGRect) cg_rect = origin=(x=1, y=2) size=(width=7, height=7)',
+             '(RGBColor) rgb_color = red=3 green=56 blue=35',
+             '(RGBColor *) rgb_color_ptr = red=3 green=56 blue=35',
+             '(Rect) rect = (t=4, l=8, b=4, r=7)',
+             '(Rect *) rect_ptr = (t=4, l=8, b=4, r=7)',
+             '(Point) point = (v=7, h=12)',
+             '(Point *) point_ptr = (v=7, h=12)',
+             '(HIPoint) hi_point = (x=7, y=12)',
+             '(HIRect) hi_rect = origin=(x=3, y=5) size=(width=4, height=6)'])
+
 if __name__ == '__main__':
     import atexit
     lldb.SBDebugger.Initialize()

Modified: lldb/trunk/test/functionalities/data-formatter/data-formatter-objc/main.m
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/functionalities/data-formatter/data-formatter-objc/main.m?rev=150784&r1=150783&r2=150784&view=diff
==============================================================================
--- lldb/trunk/test/functionalities/data-formatter/data-formatter-objc/main.m (original)
+++ lldb/trunk/test/functionalities/data-formatter/data-formatter-objc/main.m Thu Feb 16 21:18:30 2012
@@ -8,6 +8,7 @@
 //===----------------------------------------------------------------------===//
 
 #import <Foundation/Foundation.h>
+#include <Carbon/Carbon.h>
 
 @interface MyClass : NSObject
 {
@@ -86,9 +87,9 @@
     
     NSString *str4 = [NSString stringWithFormat:@"This is string number %ld right here", (long)4];
     
-    NSRect rect = {{1,1},{5,5}};
+    NSRect ns_rect = {{1,1},{5,5}};
     
-    NSString* str5 = NSStringFromRect(rect);
+    NSString* str5 = NSStringFromRect(ns_rect);
     
     NSString* str6 = [@"/usr/doc/README.1ST" pathExtension];
     
@@ -119,6 +120,31 @@
     
     id dyn_test = str12;
     
+	CFGregorianUnits cf_greg_units = {1,3,5,12,5,7};
+	CFRange cf_range = {4,4};
+	NSPoint ns_point = {4,4};
+	NSRange ns_range = {4,4};
+	NSRect* ns_rect_ptr = &ns_rect;
+	NSRectArray ns_rect_arr = &ns_rect;
+	NSSize ns_size = {5,7};
+	NSSize* ns_size_ptr = &ns_size;
+	
+	CGSize cg_size = {1,6};
+	CGPoint cg_point = {2,7};
+	CGRect cg_rect = {{1,2}, {7,7}};
+	
+	RGBColor rgb_color = {3,56,35};
+	RGBColor* rgb_color_ptr = &rgb_color;
+	
+	Rect rect = {4,8,4,7};
+	Rect* rect_ptr = ▭
+	
+	Point point = {7,12};
+	Point* point_ptr = &point;
+	
+	HIPoint hi_point = {7,12};
+	HIRect hi_rect = {{3,5},{4,6}};
+
     // Set break point at this line.
     [pool drain];
     return 0;

Modified: lldb/trunk/test/functionalities/data-formatter/rdar-10642615/Makefile
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/functionalities/data-formatter/rdar-10642615/Makefile?rev=150784&r1=150783&r2=150784&view=diff
==============================================================================
--- lldb/trunk/test/functionalities/data-formatter/rdar-10642615/Makefile (original)
+++ lldb/trunk/test/functionalities/data-formatter/rdar-10642615/Makefile Thu Feb 16 21:18:30 2012
@@ -4,4 +4,4 @@
 
 include $(LEVEL)/Makefile.rules
 
-LDFLAGS += -framework Accelerate
\ No newline at end of file
+LDFLAGS += -framework Accelerate -framework vecLib
\ No newline at end of file

Modified: lldb/trunk/test/functionalities/data-formatter/rdar-10642615/Test-rdar-10642615.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/functionalities/data-formatter/rdar-10642615/Test-rdar-10642615.py?rev=150784&r1=150783&r2=150784&view=diff
==============================================================================
--- lldb/trunk/test/functionalities/data-formatter/rdar-10642615/Test-rdar-10642615.py (original)
+++ lldb/trunk/test/functionalities/data-formatter/rdar-10642615/Test-rdar-10642615.py Thu Feb 16 21:18:30 2012
@@ -49,42 +49,25 @@
         # clean slate for the next test case.
         def cleanup():
             self.runCmd('type summary clear', check=False)
+            self.runCmd('type category disable VectorTypes', check=False)
 
         # Execute the cleanup function during test case tear down.
         self.addTearDownHook(cleanup)
 
-        self.expect('frame variable value',
-            substrs = ['[0] = 1', '[2] = 4'])
+        self.runCmd('type category enable VectorTypes')
 
-        self.runCmd("type summary add vFloat --inline-children")
-     
-        self.expect('frame variable value',
-            substrs = ['[0]=1, [1]', ', [2]=4'])
-
-        self.runCmd("type summary add vFloat --inline-children --omit-names")
-
-        self.expect('frame variable value',
-            substrs = ['1, 0, 4, 0'])
-
-        self.runCmd("type summary add vFloat --inline-children")
-
-        self.expect('frame variable value',
-	            substrs = ['[0]=1, [1]', ', [2]=4'])
-
-        self.runCmd("type summary delete vFloat")
-
-        self.expect('frame variable value',
-            substrs = ['[0] = 1', '[2] = 4'])
-
-        self.runCmd("type summary add vFloat --omit-names", check=False) # should not work since we're not inlining children
-
-        self.expect('frame variable value',
-            substrs = ['[0] = 1', '[2] = 4'])
-
-        self.runCmd("type summary add vFloat --inline-children --omit-names")
-
-        self.expect('frame variable value',
-            substrs = ['1, 0, 4, 0'])
+        self.expect('frame variable',
+            substrs = ['(vFloat) valueFL = (1, 0, 4, 0)',
+                       '(int16_t [8]) valueI16 = (1, 0, 4, 0, 0, 1, 0, 4)',
+                       '(int32_t [4]) valueI32 = (1, 0, 4, 0)',
+                       '(vDouble) valueDL = (1, 4)',
+                       "(vUInt8) valueU8 = ('\\x01', '\\0', '\\x04', '\\0', '\\0', '\\x01', '\\0', '\\x04', '\\0', '\\0', '\\0', '\\0', '\\0', '\\0', '\\0', '\\0')",
+                       '(vUInt16) valueU16 = (1, 0, 4, 0, 0, 1, 0, 4)',
+                       '(vUInt32) valueU32 = (1, 2, 3, 4)',
+                       "(vSInt8) valueS8 = ('\\x01', '\\0', '\\x04', '\\0', '\\0', '\\x01', '\\0', '\\x04', '\\0', '\\0', '\\0', '\\0', '\\0', '\\0', '\\0', '\\0')",
+                       '(vSInt16) valueS16 = (1, 0, 4, 0, 0, 1, 0, 4)',
+                       '(vSInt32) valueS32 = (4, 3, 2, 1)',
+                       '(vBool32) valueBool32 = (0, 1, 0, 1)'])
 
 if __name__ == '__main__':
     import atexit

Modified: lldb/trunk/test/functionalities/data-formatter/rdar-10642615/main.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/functionalities/data-formatter/rdar-10642615/main.cpp?rev=150784&r1=150783&r2=150784&view=diff
==============================================================================
--- lldb/trunk/test/functionalities/data-formatter/rdar-10642615/main.cpp (original)
+++ lldb/trunk/test/functionalities/data-formatter/rdar-10642615/main.cpp Thu Feb 16 21:18:30 2012
@@ -8,13 +8,20 @@
 //===----------------------------------------------------------------------===//
 
 #include <Accelerate/Accelerate.h>
+#include <vecLib/vecLibTypes.h>
 
 int main()
 {
-	float f[4] __attribute__((__aligned__(16)));
-    f[0] = 1;
-    f[2] = 4;
-	vFloat *vPointer = (vFloat *) f;
-	vFloat value = *vPointer;
+	vFloat valueFL = {1,0,4,0};
+	vDouble valueDL = {1,4};
+	int16_t valueI16[8] = {1,0,4,0,0,1,0,4};
+	int32_t valueI32[4] = {1,0,4,0};
+	vUInt8 valueU8 = {1,0,4,0,0,1,0,4};
+	vUInt16 valueU16 = {1,0,4,0,0,1,0,4};
+	vUInt32 valueU32 = {1,2,3,4};
+	vSInt8 valueS8 = {1,0,4,0,0,1,0,4};
+	vSInt16 valueS16 = {1,0,4,0,0,1,0,4};
+	vSInt32 valueS32 = {4,3,2,1};
+	vBool32 valueBool32 = {false,true,false,true};
 	return 0; // Set break point at this line.
 }

Modified: lldb/trunk/test/python_api/formatters/TestFormattersSBAPI.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/python_api/formatters/TestFormattersSBAPI.py?rev=150784&r1=150783&r2=150784&view=diff
==============================================================================
--- lldb/trunk/test/python_api/formatters/TestFormattersSBAPI.py (original)
+++ lldb/trunk/test/python_api/formatters/TestFormattersSBAPI.py Thu Feb 16 21:18:30 2012
@@ -251,9 +251,24 @@
         self.expect("frame variable foo", matching=True,
              substrs = ['hello scripted world'])
 
+        frame = self.dbg.GetSelectedTarget().GetProcess().GetSelectedThread().GetSelectedFrame()
+        foo_ptr = frame.FindVariable("foo_ptr")
+        summary = foo_ptr.GetTypeSummary()
+
+        self.assertFalse(summary.IsValid(), "summary found for foo* when none was planned")
+
         self.expect("frame variable foo_ptr", matching=False,
              substrs = ['hello scripted world'])
 
+        new_category.AddTypeSummary(lldb.SBTypeNameSpecifier("JustAStruct"),
+             lldb.SBTypeSummary.CreateWithSummaryString("hello static world",
+             lldb.eTypeOptionNone))
+
+        summary = foo_ptr.GetTypeSummary()
+
+        self.assertTrue(summary.IsValid(), "no summary found for foo* when one was in place")
+        self.assertTrue(summary.GetData() == "hello static world", "wrong summary found for foo*")
+
 if __name__ == '__main__':
     import atexit
     lldb.SBDebugger.Initialize()





More information about the lldb-commits mailing list