[Lldb-commits] [lldb] r148016 - in /lldb/trunk/source/Plugins/SymbolFile/DWARF: DWARFCompileUnit.cpp DWARFCompileUnit.h SymbolFileDWARF.cpp SymbolFileDWARF.h SymbolFileDWARFDebugMap.cpp SymbolFileDWARFDebugMap.h

Greg Clayton gclayton at apple.com
Wed Jan 11 20:33:28 PST 2012


Author: gclayton
Date: Wed Jan 11 22:33:28 2012
New Revision: 148016

URL: http://llvm.org/viewvc/llvm-project?rev=148016&view=rev
Log:
<rdar://problem/10681814>

Fix DWARF parsing issue we can run into when using llvm-gcc based dSYM files.

Also fix the parsing of objective C built-in types (Class, id and SEL) so
they don't parse more information that is not needed due to the way they
are represented in DWARF.


Modified:
    lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.cpp
    lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.h
    lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
    lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h
    lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp
    lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h

Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.cpp?rev=148016&r1=148015&r2=148016&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.cpp (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.cpp Wed Jan 11 22:33:28 2012
@@ -42,7 +42,8 @@
     m_offset        (DW_INVALID_OFFSET),
     m_length        (0),
     m_version       (0),
-    m_addr_size     (DWARFCompileUnit::GetDefaultAddressSize())
+    m_addr_size     (DWARFCompileUnit::GetDefaultAddressSize()),
+    m_producer      (eProducerInvalid)
 {
 }
 
@@ -58,6 +59,7 @@
     m_die_array.clear();
     m_func_aranges_ap.reset();
     m_user_data     = NULL;
+    m_producer      = eProducerInvalid;
 }
 
 bool
@@ -876,4 +878,47 @@
     }
 }
 
+bool
+DWARFCompileUnit::Supports_DW_AT_APPLE_objc_complete_type ()
+{
+    if (GetProducer() == eProcucerLLVMGCC)
+        return false;
+    return true;
+}
+
+bool
+DWARFCompileUnit::DW_AT_decl_file_attributes_are_invalid()
+{
+    // llvm-gcc makes completely invalid decl file attributes and won't ever
+    // be fixed, so we need to know to ignore these.
+    return GetProducer() == eProcucerLLVMGCC;
+}
+
+DWARFCompileUnit::Producer
+DWARFCompileUnit::GetProducer ()
+{
+    if (m_producer == eProducerInvalid)
+    {
+        const DWARFDebugInfoEntry *die = GetCompileUnitDIEOnly();
+        if (die)
+        {
+            const char *producer_cstr = die->GetAttributeValueAsString(m_dwarf2Data, this, DW_AT_producer, NULL);
+            if (producer_cstr)
+            {
+                RegularExpression g_llvm_gcc_regex("^4\\.[012]\\.[01] \\(Based on Apple Inc\\. build [0-9]+\\) \\(LLVM build [\\.0-9]+\\)$");
+                if (g_llvm_gcc_regex.Execute (producer_cstr))
+                    m_producer = eProcucerLLVMGCC;
+                else if (strstr(producer_cstr, "clang"))
+                    m_producer = eProducerClang;
+                else if (strstr(producer_cstr, "GNU"))
+                    m_producer = eProducerGCC;
+            }
+        }
+        if (m_producer == eProducerInvalid)
+            m_producer = eProcucerOther;
+    }
+    return m_producer;
+}
+
+
 

Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.h?rev=148016&r1=148015&r2=148016&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.h (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.h Wed Jan 11 22:33:28 2012
@@ -18,6 +18,15 @@
 class DWARFCompileUnit
 {
 public:
+    enum Producer 
+    {
+        eProducerInvalid = 0,
+        eProducerClang,
+        eProducerGCC,
+        eProcucerLLVMGCC,
+        eProcucerOther
+    };
+
     DWARFCompileUnit(SymbolFileDWARF* dwarf2Data);
 
     bool        Extract(const lldb_private::DataExtractor &debug_info, uint32_t* offset_ptr);
@@ -129,6 +138,11 @@
         m_user_data = d;
     }
 
+    bool
+    Supports_DW_AT_APPLE_objc_complete_type ();
+
+    bool
+    DW_AT_decl_file_attributes_are_invalid();
 
 //    void
 //    AddGlobalDIEByIndex (uint32_t die_idx);
@@ -155,6 +169,10 @@
     {
         return m_dwarf2Data;
     }
+    
+    Producer
+    GetProducer ();
+    
 
 protected:
     SymbolFileDWARF*    m_dwarf2Data;
@@ -167,6 +185,7 @@
     uint32_t            m_length;
     uint16_t            m_version;
     uint8_t             m_addr_size;
+    Producer            m_producer;
 private:
     DISALLOW_COPY_AND_ASSIGN (DWARFCompileUnit);
 };

Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp?rev=148016&r1=148015&r2=148016&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp Wed Jan 11 22:33:28 2012
@@ -202,6 +202,7 @@
     m_indexed (false),
     m_is_external_ast_source (false),
     m_using_apple_tables (false),
+    m_supports_DW_AT_APPLE_objc_complete_type (eLazyBoolCalculate),
     m_ranges(),
     m_unique_ast_type_map ()
 {
@@ -3852,18 +3853,50 @@
     return objc_class_symbol;
 }
 
+// Some compilers don't emit the DW_AT_APPLE_objc_complete_type attribute. If they don't
+// then we can end up looking through all class types for a complete type and never find
+// the full definition. We need to know if this attribute is supported, so we determine
+// this here and cache th result. We also need to worry about the debug map DWARF file
+// if we are doing darwin DWARF in .o file debugging.
+bool
+SymbolFileDWARF::Supports_DW_AT_APPLE_objc_complete_type (DWARFCompileUnit *cu)
+{
+    if (m_supports_DW_AT_APPLE_objc_complete_type == eLazyBoolCalculate)
+    {
+        m_supports_DW_AT_APPLE_objc_complete_type = eLazyBoolNo;
+        if (cu && cu->Supports_DW_AT_APPLE_objc_complete_type())
+            m_supports_DW_AT_APPLE_objc_complete_type = eLazyBoolYes;
+        else
+        {
+            DWARFDebugInfo* debug_info = DebugInfo();
+            const uint32_t num_compile_units = GetNumCompileUnits();
+            for (uint32_t cu_idx = 0; cu_idx < num_compile_units; ++cu_idx)
+            {
+                DWARFCompileUnit* curr_cu = debug_info->GetCompileUnitAtIndex(cu_idx);
+                if (curr_cu != cu && curr_cu->Supports_DW_AT_APPLE_objc_complete_type())
+                {
+                    m_supports_DW_AT_APPLE_objc_complete_type = eLazyBoolYes;
+                    break;
+                }
+            }
+        }
+        if (m_supports_DW_AT_APPLE_objc_complete_type == eLazyBoolNo && m_debug_map_symfile)
+            return m_debug_map_symfile->Supports_DW_AT_APPLE_objc_complete_type (this);
+    }
+    return m_supports_DW_AT_APPLE_objc_complete_type == eLazyBoolYes;
+}
 
 // This function can be used when a DIE is found that is a forward declaration
 // DIE and we want to try and find a type that has the complete definition.
 TypeSP
-SymbolFileDWARF::FindCompleteObjCDefinitionTypeForDIE (DWARFCompileUnit* cu, 
-                                                       const DWARFDebugInfoEntry *die, 
-                                                       const ConstString &type_name)
+SymbolFileDWARF::FindCompleteObjCDefinitionTypeForDIE (const DWARFDebugInfoEntry *die, 
+                                                       const ConstString &type_name,
+                                                       bool must_be_implementation)
 {
     
     TypeSP type_sp;
     
-    if (cu == NULL || die == NULL || !type_name || !GetObjCClassSymbol (type_name))
+    if (!type_name || (must_be_implementation && !GetObjCClassSymbol (type_name)))
         return type_sp;
     
     DIEArray die_offsets;
@@ -3886,8 +3919,6 @@
     
     const size_t num_matches = die_offsets.size();
     
-    const dw_tag_t die_tag = die->Tag();
-    
     DWARFCompileUnit* type_cu = NULL;
     const DWARFDebugInfoEntry* type_die = NULL;
     if (num_matches)
@@ -3905,40 +3936,21 @@
                 // Don't try and resolve the DIE we are looking for with the DIE itself!
                 if (type_die != die)
                 {
-                    const dw_tag_t type_die_tag = type_die->Tag();
-                    // Make sure the tags match
-                    if (type_die_tag == die_tag)
+                    switch (type_die->Tag())
                     {
-                        // The tags match, lets try resolving this type
-                        try_resolving_type = true;
-                    }
-                    else
-                    {
-                        // The tags don't match, but we need to watch our for a
-                        // forward declaration for a struct and ("struct foo")
-                        // ends up being a class ("class foo { ... };") or
-                        // vice versa.
-                        switch (type_die_tag)
-                        {
-                            case DW_TAG_class_type:
-                                // We had a "class foo", see if we ended up with a "struct foo { ... };"
-                                try_resolving_type = (die_tag == DW_TAG_structure_type);
-                                break;
-                            case DW_TAG_structure_type:
-                                // We had a "struct foo", see if we ended up with a "class foo { ... };"
-                                try_resolving_type = (die_tag == DW_TAG_class_type);
-                                break;
-                            default:
-                                // Tags don't match, don't event try to resolve
-                                // using this type whose name matches....
-                                break;
-                        }
+                        case DW_TAG_class_type:
+                        case DW_TAG_structure_type:
+                            try_resolving_type = true;
+                            break;
+                        default:
+                            break;
                     }
                 }
                 
                 if (try_resolving_type)
                 {
-                    try_resolving_type = type_die->GetAttributeValueAsUnsigned (this, type_cu, DW_AT_APPLE_objc_complete_type, 0);
+					if (type_cu->Supports_DW_AT_APPLE_objc_complete_type())
+	                    try_resolving_type = type_die->GetAttributeValueAsUnsigned (this, type_cu, DW_AT_APPLE_objc_complete_type, 0);
                     
                     if (try_resolving_type)
                     {
@@ -3952,7 +3964,8 @@
                                           MakeUserID(type_die->GetOffset()), 
                                           MakeUserID(type_cu->GetOffset()));
                             
-                            m_die_to_type[die] = resolved_type;
+                            if (die)
+                                m_die_to_type[die] = resolved_type;
                             type_sp = resolved_type;
                             break;
                         }
@@ -4232,28 +4245,52 @@
                     case DW_TAG_volatile_type:  encoding_data_type = Type::eEncodingIsVolatileUID;          break;
                     }
 
-                    if (type_name_cstr != NULL && sc.comp_unit != NULL && 
-                        (sc.comp_unit->GetLanguage() == eLanguageTypeObjC || sc.comp_unit->GetLanguage() == eLanguageTypeObjC_plus_plus))
+                    if (clang_type == NULL && (encoding_data_type == Type::eEncodingIsPointerUID || encoding_data_type == Type::eEncodingIsTypedefUID))
                     {
-                        static ConstString g_objc_type_name_id("id");
-                        static ConstString g_objc_type_name_Class("Class");
-                        static ConstString g_objc_type_name_selector("SEL");
-                        
-                        if (type_name_const_str == g_objc_type_name_id)
+                        if (type_name_cstr != NULL && sc.comp_unit != NULL && 
+                            (sc.comp_unit->GetLanguage() == eLanguageTypeObjC || sc.comp_unit->GetLanguage() == eLanguageTypeObjC_plus_plus))
                         {
-                            clang_type = ast.GetBuiltInType_objc_id();
-                            resolve_state = Type::eResolveStateFull;
+                            static ConstString g_objc_type_name_id("id");
+                            static ConstString g_objc_type_name_Class("Class");
+                            static ConstString g_objc_type_name_selector("SEL");
+                            
+                            if (type_name_const_str == g_objc_type_name_id)
+                            {
+                                if (log)
+                                    GetObjectFile()->GetModule()->LogMessage (log.get(), "SymbolFileDWARF::ParseType (die = 0x%8.8x) %s '%s' is Objective C 'id' built-in type.", 
+                                                                              die->GetOffset(), 
+                                                                              DW_TAG_value_to_name(die->Tag()), 
+                                                                              die->GetName(this, dwarf_cu));
+                                clang_type = ast.GetBuiltInType_objc_id();
+                                encoding_data_type = Type::eEncodingIsUID;
+                                encoding_uid = LLDB_INVALID_UID;
+                                resolve_state = Type::eResolveStateFull;
 
-                        }
-                        else if (type_name_const_str == g_objc_type_name_Class)
-                        {
-                            clang_type = ast.GetBuiltInType_objc_Class();
-                            resolve_state = Type::eResolveStateFull;
-                        }
-                        else if (type_name_const_str == g_objc_type_name_selector)
-                        {
-                            clang_type = ast.GetBuiltInType_objc_selector();
-                            resolve_state = Type::eResolveStateFull;
+                            }
+                            else if (type_name_const_str == g_objc_type_name_Class)
+                            {
+                                if (log)
+                                    GetObjectFile()->GetModule()->LogMessage (log.get(), "SymbolFileDWARF::ParseType (die = 0x%8.8x) %s '%s' is Objective C 'Class' built-in type.", 
+                                                                              die->GetOffset(), 
+                                                                              DW_TAG_value_to_name(die->Tag()), 
+                                                                              die->GetName(this, dwarf_cu));
+                                clang_type = ast.GetBuiltInType_objc_Class();
+                                encoding_data_type = Type::eEncodingIsUID;
+                                encoding_uid = LLDB_INVALID_UID;
+                                resolve_state = Type::eResolveStateFull;
+                            }
+                            else if (type_name_const_str == g_objc_type_name_selector)
+                            {
+                                if (log)
+                                    GetObjectFile()->GetModule()->LogMessage (log.get(), "SymbolFileDWARF::ParseType (die = 0x%8.8x) %s '%s' is Objective C 'selector' built-in type.", 
+                                                                              die->GetOffset(), 
+                                                                              DW_TAG_value_to_name(die->Tag()), 
+                                                                              die->GetName(this, dwarf_cu));
+                                clang_type = ast.GetBuiltInType_objc_selector();
+                                encoding_data_type = Type::eEncodingIsUID;
+                                encoding_uid = LLDB_INVALID_UID;
+                                resolve_state = Type::eResolveStateFull;
+                            }
                         }
                     }
                         
@@ -4304,7 +4341,15 @@
                                 switch (attr)
                                 {
                                 case DW_AT_decl_file:
-                                    decl.SetFile(sc.comp_unit->GetSupportFiles().GetFileSpecAtIndex(form_value.Unsigned())); 
+                                    if (dwarf_cu->DW_AT_decl_file_attributes_are_invalid())
+									{
+										// llvm-gcc outputs invalid DW_AT_decl_file attributes that always
+										// point to the compile unit file, so we clear this invalid value
+										// so that we can still unique types efficiently.
+                                        decl.SetFile(FileSpec ("<invalid>", false));
+									}
+                                    else
+                                        decl.SetFile(sc.comp_unit->GetSupportFiles().GetFileSpecAtIndex(form_value.Unsigned())); 
                                     break;
 
                                 case DW_AT_decl_line:
@@ -4420,21 +4465,21 @@
 
                     if (class_language == eLanguageTypeObjC)
                     {
-                        if (!is_complete_objc_class)
+                        if (!is_complete_objc_class && Supports_DW_AT_APPLE_objc_complete_type(dwarf_cu))
                         {
                             // We have a valid eSymbolTypeObjCClass class symbol whose
                             // name matches the current objective C class that we
                             // are trying to find and this DIE isn't the complete
                             // definition (we checked is_complete_objc_class above and
                             // know it is false), so the real definition is in here somewhere
-                            type_sp = FindCompleteObjCDefinitionTypeForDIE (dwarf_cu, die, type_name_const_str);
+                            type_sp = FindCompleteObjCDefinitionTypeForDIE (die, type_name_const_str, true);
 
                             if (!type_sp && m_debug_map_symfile)
                             {
                                 // We weren't able to find a full declaration in
                                 // this DWARF, see if we have a declaration anywhere    
                                 // else...
-                                type_sp = m_debug_map_symfile->FindCompleteObjCDefinitionTypeForDIE (dwarf_cu, die, type_name_const_str);
+                                type_sp = m_debug_map_symfile->FindCompleteObjCDefinitionTypeForDIE (die, type_name_const_str, true);
                             }
                             
                             if (type_sp)
@@ -4865,19 +4910,16 @@
                                 {
                                     ConstString class_name (class_name_start, class_name_end - class_name_start);
                                     TypeList types;
-                                    const uint32_t match_count = FindTypes (empty_sc, class_name, NULL, true, UINT32_MAX, types);
-                                    if (match_count > 0)
+                                    
+                                    TypeSP complete_objc_class_type_sp (FindCompleteObjCDefinitionTypeForDIE (NULL, class_name, true));
+                                    if (!complete_objc_class_type_sp)
+                                        complete_objc_class_type_sp = FindCompleteObjCDefinitionTypeForDIE (NULL, class_name, false);
+
+                                    if (complete_objc_class_type_sp)
                                     {
-                                        for (uint32_t i=0; i<match_count; ++i)
-                                        {
-                                            Type *type = types.GetTypeAtIndex (i).get();
-                                            clang_type_t type_clang_forward_type = type->GetClangForwardType();
-                                            if (ClangASTContext::IsObjCClassType (type_clang_forward_type))
-                                            {
-                                                class_opaque_type = type_clang_forward_type;
-                                                break;
-                                            }
-                                        }
+                                        clang_type_t type_clang_forward_type = complete_objc_class_type_sp->GetClangForwardType();
+                                        if (ClangASTContext::IsObjCClassType (type_clang_forward_type))
+                                            class_opaque_type = type_clang_forward_type;
                                     }
                                 }
 

Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h?rev=148016&r1=148015&r2=148016&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h Wed Jan 11 22:33:28 2012
@@ -22,6 +22,7 @@
 #include "llvm/ADT/DenseMap.h"
 #include "llvm/ADT/SmallPtrSet.h"
 
+#include "lldb/lldb-private.h"
 #include "lldb/Core/ClangForward.h"
 #include "lldb/Core/ConstString.h"
 #include "lldb/Core/dwarf.h"
@@ -375,9 +376,14 @@
                                 const lldb_private::ConstString &type_name);
 
     lldb::TypeSP            FindCompleteObjCDefinitionTypeForDIE (
-                                DWARFCompileUnit* cu, 
                                 const DWARFDebugInfoEntry *die, 
-                                const lldb_private::ConstString &type_name);
+                                const lldb_private::ConstString &type_name,
+                                bool must_be_implementation);
+
+    bool                    Supports_DW_AT_APPLE_objc_complete_type (DWARFCompileUnit *cu);
+
+    lldb::TypeSP            FindCompleteObjCDefinitionType (const lldb_private::ConstString &type_name,
+                                                            bool header_definition_ok);
 
     lldb_private::Symbol *  GetObjCClassSymbol (const lldb_private::ConstString &objc_class_name);
 
@@ -498,9 +504,10 @@
     NameToDIE                           m_global_index;             // Global and static variables
     NameToDIE                           m_type_index;               // All type DIE offsets
     NameToDIE                           m_namespace_index;          // All type DIE offsets
-    bool m_indexed:1,
-         m_is_external_ast_source:1,
-         m_using_apple_tables:1;
+    bool                                m_indexed:1,
+                                        m_is_external_ast_source:1,
+                                        m_using_apple_tables:1;
+    lldb_private::LazyBool              m_supports_DW_AT_APPLE_objc_complete_type;
 
     std::auto_ptr<DWARFDebugRanges>     m_ranges;
     UniqueDWARFASTTypeMap m_unique_ast_type_map;

Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp?rev=148016&r1=148015&r2=148016&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp Wed Jan 11 22:33:28 2012
@@ -65,7 +65,8 @@
     m_flags(),
     m_compile_unit_infos(),
     m_func_indexes(),
-    m_glob_indexes()
+    m_glob_indexes(),
+    m_supports_DW_AT_APPLE_objc_complete_type (eLazyBoolCalculate)
 {
 }
 
@@ -952,16 +953,36 @@
 }
 
 
+
+bool
+SymbolFileDWARFDebugMap::Supports_DW_AT_APPLE_objc_complete_type (SymbolFileDWARF *skip_dwarf_oso)
+{
+    if (m_supports_DW_AT_APPLE_objc_complete_type == eLazyBoolCalculate)
+    {
+        m_supports_DW_AT_APPLE_objc_complete_type = eLazyBoolNo;
+        SymbolFileDWARF *oso_dwarf;
+        for (uint32_t oso_idx = 0; ((oso_dwarf = GetSymbolFileByOSOIndex (oso_idx)) != NULL); ++oso_idx)
+        {
+            if (skip_dwarf_oso != oso_dwarf && oso_dwarf->Supports_DW_AT_APPLE_objc_complete_type(NULL))
+            {
+                m_supports_DW_AT_APPLE_objc_complete_type = eLazyBoolYes;
+                break;
+            }
+        }
+    }
+    return m_supports_DW_AT_APPLE_objc_complete_type == eLazyBoolYes;
+}
+
 TypeSP
-SymbolFileDWARFDebugMap::FindCompleteObjCDefinitionTypeForDIE (DWARFCompileUnit* cu, 
-                                                               const DWARFDebugInfoEntry *die, 
-                                                               const ConstString &type_name)
+SymbolFileDWARFDebugMap::FindCompleteObjCDefinitionTypeForDIE (const DWARFDebugInfoEntry *die, 
+                                                               const ConstString &type_name,
+                                                               bool must_be_implementation)
 {
     TypeSP type_sp;
     SymbolFileDWARF *oso_dwarf;
     for (uint32_t oso_idx = 0; ((oso_dwarf = GetSymbolFileByOSOIndex (oso_idx)) != NULL); ++oso_idx)
     {
-        type_sp = oso_dwarf->FindCompleteObjCDefinitionTypeForDIE (cu, die, type_name);
+        type_sp = oso_dwarf->FindCompleteObjCDefinitionTypeForDIE (die, type_name, must_be_implementation);
         if (type_sp)
             break;
     }

Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h?rev=148016&r1=148015&r2=148016&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h Wed Jan 11 22:33:28 2012
@@ -216,10 +216,13 @@
                               const DWARFDebugInfoEntry *die, 
                               const lldb_private::ConstString &type_name);    
 
+    bool
+    Supports_DW_AT_APPLE_objc_complete_type (SymbolFileDWARF *skip_dwarf_oso);
+
     lldb::TypeSP
-    FindCompleteObjCDefinitionTypeForDIE (DWARFCompileUnit* cu, 
-                                          const DWARFDebugInfoEntry *die, 
-                                          const lldb_private::ConstString &type_name);
+    FindCompleteObjCDefinitionTypeForDIE (const DWARFDebugInfoEntry *die, 
+                                          const lldb_private::ConstString &type_name,
+                                          bool must_be_implementation);
     
 
     UniqueDWARFASTTypeMap &
@@ -235,6 +238,7 @@
     std::vector<uint32_t> m_func_indexes;   // Sorted by address
     std::vector<uint32_t> m_glob_indexes;
     UniqueDWARFASTTypeMap m_unique_ast_type_map;
+    lldb_private::LazyBool m_supports_DW_AT_APPLE_objc_complete_type;
 };
 
 #endif // #ifndef SymbolFileDWARF_SymbolFileDWARFDebugMap_h_





More information about the lldb-commits mailing list