[Lldb-commits] [lldb] r115016 - /lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp

Greg Clayton gclayton at apple.com
Tue Sep 28 18:57:38 PDT 2010


Author: gclayton
Date: Tue Sep 28 20:57:37 2010
New Revision: 115016

URL: http://llvm.org/viewvc/llvm-project?rev=115016&view=rev
Log:
Fixed an LLVM/Clang assertion that would happen for C++ and ObjC methods if the DWARF doesn't specify the accessibility for the method. Currently gcc 4.2 and clang++ do not set the accessibility correctly on methods. We currently shouldn't default to private since public methods don't have the accessibility specified. 

Bottom line: we currently default to public for both C++ and ObjC if the accessibility isn't set.

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

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=115016&r1=115015&r2=115016&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp Tue Sep 28 20:57:37 2010
@@ -2694,60 +2694,6 @@
                         m_forward_decl_clang_type_to_die[clang_type] = die;
                     }
 
-#if 0
-                    type_list->GetClangASTContext().StartTagDeclarationDefinition (clang_type);
-                    if (die->HasChildren())
-                    {
-                        std::vector<clang::CXXBaseSpecifier *> base_classes;
-                        std::vector<int> member_accessibilities;
-                        bool is_a_class = false;
-                        ParseChildMembers (sc, 
-                                           dwarf_cu, 
-                                           die, 
-                                           clang_type,
-                                           class_language,
-                                           base_classes, 
-                                           member_accessibilities, 
-                                           default_accessibility, 
-                                           is_a_class);
-
-                        // If we have a DW_TAG_structure_type instead of a DW_TAG_class_type we
-                        // need to tell the clang type it is actually a class.
-                        if (class_language != eLanguageTypeObjC)
-                        {
-                            if (is_a_class && tag_decl_kind != clang::TTK_Class)
-                                type_list->GetClangASTContext().SetTagTypeKind (clang_type, clang::TTK_Class);
-                        }
-
-                        // Since DW_TAG_structure_type gets used for both classes
-                        // and structures, we may need to set any DW_TAG_member
-                        // fields to have a "private" access if none was specified.
-                        // When we parsed the child members we tracked that actual
-                        // accessibility value for each DW_TAG_member in the
-                        // "member_accessibilities" array. If the value for the
-                        // member is zero, then it was set to the "default_accessibility"
-                        // which for structs was "public". Below we correct this
-                        // by setting any fields to "private" that weren't correctly
-                        // set.
-                        if (is_a_class && !member_accessibilities.empty())
-                        {
-                            // This is a class and all members that didn't have
-                            // their access specified are private.
-                            type_list->GetClangASTContext().SetDefaultAccessForRecordFields (clang_type, eAccessPrivate, &member_accessibilities.front(), member_accessibilities.size());
-                        }
-
-                        if (!base_classes.empty())
-                        {
-                            type_list->GetClangASTContext().SetBaseClassesForClassType (clang_type, &base_classes.front(), base_classes.size());
-
-                            // Clang will copy each CXXBaseSpecifier in "base_classes"
-                            // so we have to free them all.
-                            ClangASTContext::DeleteBaseClassSpecifiers (&base_classes.front(), base_classes.size());
-                        }
-                        
-                    }
-                    type_list->GetClangASTContext().CompleteTagDeclarationDefinition (clang_type);
-#endif // #if 0
                 }
                 break;
 
@@ -2826,14 +2772,6 @@
                         m_forward_decl_die_to_clang_type[die] = clang_type;
                         m_forward_decl_clang_type_to_die[clang_type] = die;
 
-#if 0
-                        if (die->HasChildren())
-                        {
-                            type_list->GetClangASTContext().StartTagDeclarationDefinition (clang_type);
-                            ParseChildEnumerators(sc, enumerator_clang_type, byte_size, dwarf_cu, die);
-                            type_list->GetClangASTContext().CompleteTagDeclarationDefinition (clang_type);
-                        }
-#endif // #if 0
                     }
                 }
                 break;
@@ -2978,6 +2916,11 @@
 
                                     if (class_opaque_type)
                                     {
+                                        // If accessibility isn't set to anything valid, assume public for 
+                                        // now...
+                                        if (accessibility == eAccessNone)
+                                            accessibility = eAccessPublic;
+
                                         clang::ObjCMethodDecl *objc_method_decl;
                                         objc_method_decl = type_list->GetClangASTContext().AddMethodToObjCObjectType (class_opaque_type, 
                                                                                                                       type_name_cstr,
@@ -2998,6 +2941,11 @@
                                         clang_type_t class_opaque_type = class_type->GetClangType (true);
                                         if (ClangASTContext::IsCXXClassType (class_opaque_type))
                                         {
+                                            // Neither GCC 4.2 nor clang++ currently set a valid accessibility
+                                            // in the DWARF for C++ methods... Default to public for now...
+                                            if (accessibility == eAccessNone)
+                                                accessibility = eAccessPublic;
+
                                             clang::CXXMethodDecl *cxx_method_decl;
                                             cxx_method_decl = type_list->GetClangASTContext().AddMethodToCXXRecordType (class_opaque_type, 
                                                                                                                         type_name_cstr,





More information about the lldb-commits mailing list