Author: tberghammer Date: Wed Dec 2 05:35:54 2015 New Revision: 254502 URL: http://llvm.org/viewvc/llvm-project?rev=254502&view=rev Log: Revert "Added support for -gmodule debugging when debug info is left in the .o files on Darwin."
The commit caused a test failure on the linux buildbot in TestDataFormatterSynthVal. Modified: lldb/trunk/include/lldb/Symbol/ClangASTContext.h lldb/trunk/include/lldb/Symbol/ClangASTImporter.h lldb/trunk/include/lldb/Symbol/ClangExternalASTSourceCallbacks.h lldb/trunk/include/lldb/Symbol/SymbolFile.h lldb/trunk/include/lldb/Symbol/SymbolVendor.h lldb/trunk/include/lldb/Symbol/Type.h lldb/trunk/include/lldb/lldb-forward.h lldb/trunk/include/lldb/lldb-private-enumerations.h lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/incomplete-types/TestCppIncompleteTypes.py lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParser.h lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.h lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDIE.cpp lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDIE.h lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h lldb/trunk/source/Symbol/ClangASTContext.cpp lldb/trunk/source/Symbol/ClangASTImporter.cpp lldb/trunk/source/Symbol/ClangExternalASTSourceCallbacks.cpp lldb/trunk/source/Symbol/SymbolFile.cpp lldb/trunk/source/Symbol/SymbolVendor.cpp lldb/trunk/source/Symbol/Type.cpp Modified: lldb/trunk/include/lldb/Symbol/ClangASTContext.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Symbol/ClangASTContext.h?rev=254502&r1=254501&r2=254502&view=diff ============================================================================== --- lldb/trunk/include/lldb/Symbol/ClangASTContext.h (original) +++ lldb/trunk/include/lldb/Symbol/ClangASTContext.h Wed Dec 2 05:35:54 2015 @@ -1006,18 +1006,10 @@ public: lldb::AccessType access, bool is_artificial); - static bool + bool SetHasExternalStorage (lldb::opaque_compiler_type_t type, bool has_extern); - - static bool - CanImport (const CompilerType &type, lldb_private::ClangASTImporter &importer); - - static bool - Import (const CompilerType &type, lldb_private::ClangASTImporter &importer); - - static bool - GetHasExternalStorage (const CompilerType &type); + //------------------------------------------------------------------ // Tag Declarations //------------------------------------------------------------------ @@ -1100,19 +1092,13 @@ public: void DumpTypeDescription (lldb::opaque_compiler_type_t type, Stream *s) override; - - static void - DumpTypeName (const CompilerType &type); - + static clang::EnumDecl * GetAsEnumDecl (const CompilerType& type); static clang::RecordDecl * GetAsRecordDecl (const CompilerType& type); - - static clang::TagDecl * - GetAsTagDecl (const CompilerType& type); - + clang::CXXRecordDecl * GetAsCXXRecordDecl (lldb::opaque_compiler_type_t type); @@ -1123,12 +1109,9 @@ public: GetQualType (const CompilerType& type) { // Make sure we have a clang type before making a clang::QualType - if (type.GetOpaqueQualType()) - { - ClangASTContext *ast = llvm::dyn_cast_or_null<ClangASTContext>(type.GetTypeSystem()); - if (ast) - return clang::QualType::getFromOpaquePtr(type.GetOpaqueQualType()); - } + ClangASTContext *ast = llvm::dyn_cast_or_null<ClangASTContext>(type.GetTypeSystem()); + if (ast) + return clang::QualType::getFromOpaquePtr(type.GetOpaqueQualType()); return clang::QualType(); } Modified: lldb/trunk/include/lldb/Symbol/ClangASTImporter.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Symbol/ClangASTImporter.h?rev=254502&r1=254501&r2=254502&view=diff ============================================================================== --- lldb/trunk/include/lldb/Symbol/ClangASTImporter.h (original) +++ lldb/trunk/include/lldb/Symbol/ClangASTImporter.h Wed Dec 2 05:35:54 2015 @@ -107,11 +107,7 @@ public: CopyType (clang::ASTContext *dst_ctx, clang::ASTContext *src_ctx, lldb::opaque_compiler_type_t type); - - CompilerType - CopyType (ClangASTContext &dst, - const CompilerType &src_type); - + clang::Decl * CopyDecl (clang::ASTContext *dst_ctx, clang::ASTContext *src_ctx, @@ -138,10 +134,7 @@ public: bool CompleteObjCInterfaceDecl (clang::ObjCInterfaceDecl *interface_decl); - - bool - CompleteAndFetchChildren (clang::QualType type); - + bool RequireCompleteType (clang::QualType type); Modified: lldb/trunk/include/lldb/Symbol/ClangExternalASTSourceCallbacks.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Symbol/ClangExternalASTSourceCallbacks.h?rev=254502&r1=254501&r2=254502&view=diff ============================================================================== --- lldb/trunk/include/lldb/Symbol/ClangExternalASTSourceCallbacks.h (original) +++ lldb/trunk/include/lldb/Symbol/ClangExternalASTSourceCallbacks.h Wed Dec 2 05:35:54 2015 @@ -97,11 +97,6 @@ public: { } - void - FindExternalLexicalDecls(const clang::DeclContext *DC, - llvm::function_ref<bool(clang::Decl::Kind)> IsKindWeWant, - llvm::SmallVectorImpl<clang::Decl *> &Result) override; - bool FindExternalVisibleDeclsByName(const clang::DeclContext *decl_ctx, clang::DeclarationName decl_name) override; void CompleteType(clang::TagDecl *tag_decl) override; Modified: lldb/trunk/include/lldb/Symbol/SymbolFile.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Symbol/SymbolFile.h?rev=254502&r1=254501&r2=254502&view=diff ============================================================================== --- lldb/trunk/include/lldb/Symbol/SymbolFile.h (original) +++ lldb/trunk/include/lldb/Symbol/SymbolFile.h Wed Dec 2 05:35:54 2015 @@ -15,6 +15,7 @@ #include "lldb/Symbol/CompilerType.h" #include "lldb/Symbol/CompilerDecl.h" #include "lldb/Symbol/CompilerDeclContext.h" + #include "lldb/Symbol/Type.h" namespace lldb_private { @@ -141,8 +142,6 @@ public: virtual uint32_t FindFunctions (const ConstString &name, const CompilerDeclContext *parent_decl_ctx, uint32_t name_type_mask, bool include_inlines, bool append, SymbolContextList& sc_list); virtual uint32_t FindFunctions (const RegularExpression& regex, bool include_inlines, bool append, SymbolContextList& sc_list); virtual uint32_t FindTypes (const SymbolContext& sc, const ConstString &name, const CompilerDeclContext *parent_decl_ctx, bool append, uint32_t max_matches, TypeMap& types); - virtual size_t FindTypes (const std::vector<CompilerContext> &context, bool append, TypeMap& types); - // virtual uint32_t FindTypes (const SymbolContext& sc, const RegularExpression& regex, bool append, uint32_t max_matches, TypeList& types) = 0; virtual TypeList * GetTypeList (); virtual size_t GetTypes (lldb_private::SymbolContextScope *sc_scope, Modified: lldb/trunk/include/lldb/Symbol/SymbolVendor.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Symbol/SymbolVendor.h?rev=254502&r1=254501&r2=254502&view=diff ============================================================================== --- lldb/trunk/include/lldb/Symbol/SymbolVendor.h (original) +++ lldb/trunk/include/lldb/Symbol/SymbolVendor.h Wed Dec 2 05:35:54 2015 @@ -128,9 +128,6 @@ public: size_t max_matches, TypeMap& types); - virtual size_t - FindTypes (const std::vector<CompilerContext> &context, bool append, TypeMap& types); - virtual CompilerDeclContext FindNamespace (const SymbolContext& sc, const ConstString &name, Modified: lldb/trunk/include/lldb/Symbol/Type.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Symbol/Type.h?rev=254502&r1=254501&r2=254502&view=diff ============================================================================== --- lldb/trunk/include/lldb/Symbol/Type.h (original) +++ lldb/trunk/include/lldb/Symbol/Type.h Wed Dec 2 05:35:54 2015 @@ -24,31 +24,6 @@ namespace lldb_private { -//---------------------------------------------------------------------- -// CompilerContext allows an array of these items to be passed to -// perform detailed lookups in SymbolVendor and SymbolFile functions. -//---------------------------------------------------------------------- -struct CompilerContext -{ - CompilerContext (CompilerContextKind t, const ConstString &n) : - type(t), - name(n) - { - } - - bool - operator == (const CompilerContext &rhs) const - { - return type == rhs.type && name == rhs.name; - } - - void - Dump () const; - - CompilerContextKind type; - ConstString name; -}; - class SymbolFileType : public std::enable_shared_from_this<SymbolFileType>, public UserID @@ -60,9 +35,6 @@ class SymbolFileType : { } - SymbolFileType (SymbolFile &symbol_file, const lldb::TypeSP &type_sp); - - ~SymbolFileType () { } Modified: lldb/trunk/include/lldb/lldb-forward.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/lldb-forward.h?rev=254502&r1=254501&r2=254502&view=diff ============================================================================== --- lldb/trunk/include/lldb/lldb-forward.h (original) +++ lldb/trunk/include/lldb/lldb-forward.h Wed Dec 2 05:35:54 2015 @@ -62,7 +62,6 @@ class CommandObject; class CommandReturnObject; class Communication; class CompactUnwindInfo; -struct CompilerContext; class CompilerDecl; class CompilerDeclContext; class CompilerType; Modified: lldb/trunk/include/lldb/lldb-private-enumerations.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/lldb-private-enumerations.h?rev=254502&r1=254501&r2=254502&view=diff ============================================================================== --- lldb/trunk/include/lldb/lldb-private-enumerations.h (original) +++ lldb/trunk/include/lldb/lldb-private-enumerations.h Wed Dec 2 05:35:54 2015 @@ -241,25 +241,6 @@ enum class TypeValidatorResult : bool { Success = true, Failure = false }; - -//---------------------------------------------------------------------- -// Enumerations that can be used to specify scopes types when looking up -// types. -//---------------------------------------------------------------------- -enum class CompilerContextKind -{ - Invalid = 0, - TranslationUnit, - Module, - Namespace, - Class, - Structure, - Union, - Function, - Variable, - Enumeration, - Typedef -}; } // namespace lldb_private Modified: lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/incomplete-types/TestCppIncompleteTypes.py URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/incomplete-types/TestCppIncompleteTypes.py?rev=254502&r1=254501&r2=254502&view=diff ============================================================================== --- lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/incomplete-types/TestCppIncompleteTypes.py (original) +++ lldb/trunk/packages/Python/lldbsuite/test/lang/cpp/incomplete-types/TestCppIncompleteTypes.py Wed Dec 2 05:35:54 2015 @@ -14,11 +14,11 @@ class TestCppIncompleteTypes(TestBase): value_f = frame.EvaluateExpression("f") self.assertTrue(value_f.IsValid(), "'expr f' results in a valid SBValue object") - self.assertTrue(value_f.GetError().Success(), "'expr f' is successful") + self.assertFalse(value_f.GetError().Success(), "'expr f' results in an error, but LLDB does not crash") value_a = frame.EvaluateExpression("a") self.assertTrue(value_a.IsValid(), "'expr a' results in a valid SBValue object") - self.assertTrue(value_a.GetError().Success(), "'expr a' is successful") + self.assertFalse(value_a.GetError().Success(), "'expr a' results in an error, but LLDB does not crash") @skipIfGcc @skipIfWindows # Clang on Windows asserts in external record layout in this case. Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParser.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParser.h?rev=254502&r1=254501&r2=254502&view=diff ============================================================================== --- lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParser.h (original) +++ lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParser.h Wed Dec 2 05:35:54 2015 @@ -33,18 +33,6 @@ public: const DWARFDIE &die) = 0; virtual bool - CanCompleteType (const lldb_private::CompilerType &compiler_type) - { - return false; - } - - virtual bool - CompleteType (const lldb_private::CompilerType &compiler_type) - { - return false; - } - - virtual bool CompleteTypeFromDWARF (const DWARFDIE &die, lldb_private::Type *type, lldb_private::CompilerType &compiler_type) = 0; Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp?rev=254502&r1=254501&r2=254502&view=diff ============================================================================== --- lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp (original) +++ lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp Wed Dec 2 05:35:54 2015 @@ -24,14 +24,11 @@ #include "lldb/Core/StreamString.h" #include "lldb/Core/Value.h" #include "lldb/Host/Host.h" -#include "lldb/Symbol/ClangASTImporter.h" #include "lldb/Symbol/ClangExternalASTSourceCommon.h" #include "lldb/Symbol/CompileUnit.h" #include "lldb/Symbol/Function.h" #include "lldb/Symbol/ObjectFile.h" -#include "lldb/Symbol/SymbolVendor.h" #include "lldb/Symbol/TypeList.h" -#include "lldb/Symbol/TypeMap.h" #include "lldb/Target/Language.h" #include "Plugins/Language/ObjC/ObjCLanguage.h" @@ -117,78 +114,6 @@ struct BitfieldInfo } }; - -ClangASTImporter & -DWARFASTParserClang::GetClangASTImporter() -{ - if (!m_clang_ast_importer_ap) - { - m_clang_ast_importer_ap.reset (new ClangASTImporter); - } - return *m_clang_ast_importer_ap; -} - - -TypeSP -DWARFASTParserClang::ParseTypeFromDWO (const DWARFDIE &die, Log *log) -{ - ModuleSP dwo_module_sp = die.GetContainingDWOModule(); - if (dwo_module_sp) - { - // This type comes from an external DWO module - std::vector<CompilerContext> dwo_context; - die.GetDWOContext(dwo_context); - TypeMap dwo_types; - if (dwo_module_sp->GetSymbolVendor()->FindTypes(dwo_context, true, dwo_types)) - { - const size_t num_dwo_types = dwo_types.GetSize(); - if (num_dwo_types == 1) - { - // We found a real definition for this type elsewhere - // so lets use it and cache the fact that we found - // a complete type for this die - TypeSP dwo_type_sp = dwo_types.GetTypeAtIndex(0); - if (dwo_type_sp) - { - lldb_private::CompilerType dwo_type = dwo_type_sp->GetForwardCompilerType(); - - lldb_private::CompilerType type = GetClangASTImporter().CopyType (m_ast, dwo_type); - - //printf ("copied_qual_type: ast = %p, clang_type = %p, name = '%s'\n", m_ast, copied_qual_type.getAsOpaquePtr(), external_type->GetName().GetCString()); - if (type) - { - SymbolFileDWARF *dwarf = die.GetDWARF(); - TypeSP type_sp (new Type (die.GetID(), - dwarf, - dwo_type_sp->GetName(), - dwo_type_sp->GetByteSize(), - NULL, - LLDB_INVALID_UID, - Type::eEncodingInvalid, - &dwo_type_sp->GetDeclaration(), - type, - Type::eResolveStateForward)); - - dwarf->GetTypeList()->Insert(type_sp); - dwarf->GetDIEToType()[die.GetDIE()] = type_sp.get(); - clang::TagDecl *tag_decl = ClangASTContext::GetAsTagDecl(type); - if (tag_decl) - LinkDeclContextToDIE(tag_decl, die); - else - { - clang::DeclContext *defn_decl_ctx = GetCachedClangDeclContextForDIE(die); - if (defn_decl_ctx) - LinkDeclContextToDIE(defn_decl_ctx, die); - } - return type_sp; - } - } - } - } - } - return TypeSP(); -} - TypeSP DWARFASTParserClang::ParseTypeFromDWARF (const SymbolContext& sc, const DWARFDIE &die, @@ -562,15 +487,15 @@ DWARFASTParserClang::ParseTypeFromDWARF if (dwarf->GetUniqueDWARFASTTypeMap().Find(type_name_const_str, die, decl, byte_size_valid ? byte_size : -1, *unique_ast_entry_ap)) + { + type_sp = unique_ast_entry_ap->m_type_sp; + if (type_sp) { - type_sp = unique_ast_entry_ap->m_type_sp; - if (type_sp) - { - dwarf->GetDIEToType()[die.GetDIE()] = type_sp.get(); - return type_sp; - } + dwarf->GetDIEToType()[die.GetDIE()] = type_sp.get(); + return type_sp; } } + } } DEBUG_PRINTF ("0x%8.8" PRIx64 ": %s (\"%s\")\n", die.GetID(), DW_TAG_value_to_name(tag), type_name_cstr); @@ -675,11 +600,6 @@ DWARFASTParserClang::ParseTypeFromDWARF type_name_cstr); } - // See if the type comes from a DWO module and if so, track down that type. - type_sp = ParseTypeFromDWO(die, log); - if (type_sp) - return type_sp; - DWARFDeclContext die_decl_ctx; die.GetDWARFDeclContext(die_decl_ctx); @@ -913,7 +833,7 @@ DWARFASTParserClang::ParseTypeFromDWARF case DW_AT_type: encoding_form = form_value; break; case DW_AT_byte_size: byte_size = form_value.Unsigned(); break; case DW_AT_accessibility: break; //accessibility = DW_ACCESS_to_AccessType(form_value.Unsigned()); break; - case DW_AT_declaration: is_forward_declaration = form_value.Boolean(); break; + case DW_AT_declaration: break; //is_forward_declaration = form_value.Boolean(); break; case DW_AT_allocated: case DW_AT_associated: case DW_AT_bit_stride: @@ -930,54 +850,6 @@ DWARFASTParserClang::ParseTypeFromDWARF } } - if (is_forward_declaration) - { - type_sp = ParseTypeFromDWO(die, log); - if (type_sp) - return type_sp; - - DWARFDeclContext die_decl_ctx; - die.GetDWARFDeclContext(die_decl_ctx); - - type_sp = dwarf->FindDefinitionTypeForDWARFDeclContext (die_decl_ctx); - - if (!type_sp) - { - SymbolFileDWARFDebugMap *debug_map_symfile = dwarf->GetDebugMapSymfile(); - if (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 = debug_map_symfile->FindDefinitionTypeForDWARFDeclContext (die_decl_ctx); - } - } - - if (type_sp) - { - if (log) - { - dwarf->GetObjectFile()->GetModule()->LogMessage (log, - "SymbolFileDWARF(%p) - 0x%8.8x: %s type \"%s\" is a forward declaration, complete type is 0x%8.8" PRIx64, - static_cast<void*>(this), - die.GetOffset(), - DW_TAG_value_to_name(tag), - type_name_cstr, - type_sp->GetID()); - } - - // We found a real definition for this type elsewhere - // so lets use it and cache the fact that we found - // a complete type for this die - dwarf->GetDIEToType()[die.GetDIE()] = type_sp.get(); - clang::DeclContext *defn_decl_ctx = GetCachedClangDeclContextForDIE( - dwarf->DebugInfo()->GetDIE(DIERef(type_sp->GetID()))); - if (defn_decl_ctx) - LinkDeclContextToDIE(defn_decl_ctx, die); - return type_sp; - } - - } DEBUG_PRINTF ("0x%8.8" PRIx64 ": %s (\"%s\")\n", die.GetID(), DW_TAG_value_to_name(tag), type_name_cstr); CompilerType enumerator_clang_type; @@ -1258,7 +1130,7 @@ DWARFASTParserClang::ParseTypeFromDWARF if (class_type) { bool alternate_defn = false; - if (class_type->GetID() != decl_ctx_die.GetID() || decl_ctx_die.GetContainingDWOModuleDIE()) + if (class_type->GetID() != decl_ctx_die.GetID()) { alternate_defn = true; @@ -1926,33 +1798,6 @@ DWARFASTParserClang::ParseTemplateParame } bool -DWARFASTParserClang::CanCompleteType (const lldb_private::CompilerType &compiler_type) -{ - if (m_clang_ast_importer_ap) - return ClangASTContext::CanImport(compiler_type, GetClangASTImporter()); - else - return false; -} - -bool -DWARFASTParserClang::CompleteType (const lldb_private::CompilerType &compiler_type) -{ - if (CanCompleteType(compiler_type)) - { - if (ClangASTContext::Import(compiler_type, GetClangASTImporter())) - { - ClangASTContext::CompleteTagDeclarationDefinition(compiler_type); - return true; - } - else - { - ClangASTContext::SetHasExternalStorage (compiler_type.GetOpaqueQualType(), false); - } - } - return false; -} - -bool DWARFASTParserClang::CompleteTypeFromDWARF (const DWARFDIE &die, lldb_private::Type *type, CompilerType &clang_type) @@ -2023,17 +1868,25 @@ DWARFASTParserClang::CompleteTypeFromDWA DWARFDIECollection member_function_dies; DelayedPropertyList delayed_properties; - ParseChildMembers (sc, - die, - clang_type, - class_language, - base_classes, - member_accessibilities, - member_function_dies, - delayed_properties, - default_accessibility, - is_a_class, - layout_info); + if (!ParseChildMembers (sc, + die, + clang_type, + class_language, + base_classes, + member_accessibilities, + member_function_dies, + delayed_properties, + default_accessibility, + is_a_class, + layout_info)) + { + auto module = dwarf->GetObjectFile()->GetModule(); + module->ReportError (":: Class %s has members with incomplete type.", die.GetName()); + if (die.GetCU()->GetProducer() == DWARFCompileUnit::eProducerClang) + module->ReportError(":: Try compiling the source file with -fno-limit-debug-info."); + + return false; + } // Now parse any methods if there were any... size_t num_functions = member_function_dies.Size(); @@ -2124,14 +1977,7 @@ DWARFASTParserClang::CompleteTypeFromDWA if (die.GetCU()->GetProducer() == DWARFCompileUnit::eProducerClang) module->ReportError (":: Try compiling the source file with -fno-limit-debug-info."); - // We have no choice other than to pretend that the base class - // is complete. If we don't do this, clang will crash when we - // call setBases() inside of "clang_type.SetBaseClassesForClassType()" - // below. Since we provide layout assistance, all ivars in this - // class and other classes will be fine, this is the best we can do - // short of crashing. - ClangASTContext::StartTagDeclarationDefinition (base_class_type); - ClangASTContext::CompleteTagDeclarationDefinition (base_class_type); + return false; } } } @@ -2574,6 +2420,7 @@ DWARFASTParserClang::ParseChildMembers ( if (!parent_die) return 0; + uint32_t incomplete_member_info_count = 0; uint32_t member_idx = 0; BitfieldInfo last_field_info; @@ -2907,8 +2754,8 @@ DWARFASTParserClang::ParseChildMembers ( } CompilerType member_clang_type = member_type->GetLayoutCompilerType (); - if (!member_clang_type.IsCompleteType()) - member_clang_type.GetCompleteType(); + if (!member_clang_type.IsCompleteType() && !member_clang_type.GetCompleteType()) + incomplete_member_info_count += 1; { // Older versions of clang emit array[0] and array[1] in the same way (<rdar://problem/12566646>). @@ -2942,30 +2789,6 @@ DWARFASTParserClang::ParseChildMembers ( } } - if (ClangASTContext::IsCXXClassType(member_clang_type) && member_clang_type.GetCompleteType() == false) - { - if (die.GetCU()->GetProducer() == DWARFCompileUnit::eProducerClang) - module_sp->ReportError ("DWARF DIE at 0x%8.8x (class %s) has a member variable 0x%8.8x (%s) whose type is a forward declaration, not a complete definition.\nTry compiling the source file with -fno-limit-debug-info", - parent_die.GetOffset(), - parent_die.GetName(), - die.GetOffset(), - name); - else - module_sp->ReportError ("DWARF DIE at 0x%8.8x (class %s) has a member variable 0x%8.8x (%s) whose type is a forward declaration, not a complete definition.\nPlease file a bug against the compiler and include the preprocessed output for %s", - parent_die.GetOffset(), - parent_die.GetName(), - die.GetOffset(), - name, - sc.comp_unit ? sc.comp_unit->GetPath().c_str() : "the source file"); - // We have no choice other than to pretend that the member class - // is complete. If we don't do this, clang will crash when trying - // to layout the class. Since we provide layout assistance, all - // ivars in this class and other classes will be fine, this is - // the best we can do short of crashing. - ClangASTContext::StartTagDeclarationDefinition(member_clang_type); - ClangASTContext::CompleteTagDeclarationDefinition(member_clang_type); - } - field_decl = ClangASTContext::AddFieldToRecordType (class_clang_type, name, member_clang_type, @@ -3155,7 +2978,7 @@ DWARFASTParserClang::ParseChildMembers ( } } - return true; + return incomplete_member_info_count == 0; } Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.h?rev=254502&r1=254501&r2=254502&view=diff ============================================================================== --- lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.h (original) +++ lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.h Wed Dec 2 05:35:54 2015 @@ -47,12 +47,6 @@ public: const DWARFDIE &die) override; bool - CanCompleteType (const lldb_private::CompilerType &compiler_type) override; - - bool - CompleteType (const lldb_private::CompilerType &compiler_type) override; - - bool CompleteTypeFromDWARF (const DWARFDIE &die, lldb_private::Type *type, lldb_private::CompilerType &compiler_type) override; @@ -181,19 +175,6 @@ protected: void LinkDeclToDIE (clang::Decl *decl, const DWARFDIE &die); - lldb_private::ClangASTImporter & - GetClangASTImporter(); - - lldb::TypeSP - ParseTypeFromDWO (const DWARFDIE &die, lldb_private::Log *log); - - //---------------------------------------------------------------------- - // Return true if this type is a declaration to a type in an external - // module. - //---------------------------------------------------------------------- - lldb::ModuleSP - GetModuleForType (const DWARFDIE &die); - typedef llvm::SmallPtrSet<const DWARFDebugInfoEntry *, 4> DIEPointerSet; typedef llvm::DenseMap<const DWARFDebugInfoEntry *, clang::DeclContext *> DIEToDeclContextMap; //typedef llvm::DenseMap<const clang::DeclContext *, DIEPointerSet> DeclContextToDIEMap; @@ -207,7 +188,6 @@ protected: DIEToDeclContextMap m_die_to_decl_ctx; DeclContextToDIEMap m_decl_ctx_to_die; RecordDeclToLayoutMap m_record_decl_to_layout_map; - std::unique_ptr<lldb_private::ClangASTImporter> m_clang_ast_importer_ap; }; #endif // SymbolFileDWARF_DWARFASTParserClang_h_ Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDIE.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDIE.cpp?rev=254502&r1=254501&r2=254502&view=diff ============================================================================== --- lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDIE.cpp (original) +++ lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDIE.cpp Wed Dec 2 05:35:54 2015 @@ -22,11 +22,8 @@ #include "lldb/Core/Module.h" #include "lldb/Symbol/ObjectFile.h" -#include "lldb/Symbol/Type.h" #include "lldb/Symbol/TypeSystem.h" -using namespace lldb_private; - DIERef DWARFDIE::GetDIERef() const { @@ -310,51 +307,6 @@ DWARFDIE::GetDWARFDeclContext (DWARFDecl } } -void -DWARFDIE::GetDWOContext (std::vector<CompilerContext> &context) const -{ - const dw_tag_t tag = Tag(); - if (tag == DW_TAG_compile_unit) - return; - DWARFDIE parent = GetParent(); - if (parent) - parent.GetDWOContext(context); - switch (tag) - { - case DW_TAG_module: - context.push_back(CompilerContext(CompilerContextKind::Module, ConstString(GetName()))); - break; - case DW_TAG_namespace: - context.push_back(CompilerContext(CompilerContextKind::Namespace, ConstString(GetName()))); - break; - case DW_TAG_structure_type: - context.push_back(CompilerContext(CompilerContextKind::Structure, ConstString(GetName()))); - break; - case DW_TAG_union_type: - context.push_back(CompilerContext(CompilerContextKind::Union, ConstString(GetName()))); - break; - case DW_TAG_class_type: - context.push_back(CompilerContext(CompilerContextKind::Class, ConstString(GetName()))); - break; - case DW_TAG_enumeration_type: - context.push_back(CompilerContext(CompilerContextKind::Enumeration, ConstString(GetName()))); - break; - case DW_TAG_subprogram: - context.push_back(CompilerContext(CompilerContextKind::Function, ConstString(GetPubname()))); - break; - case DW_TAG_variable: - context.push_back(CompilerContext(CompilerContextKind::Variable, ConstString(GetPubname()))); - break; - case DW_TAG_typedef: - context.push_back(CompilerContext(CompilerContextKind::Typedef, ConstString(GetName()))); - break; - default: - assert(!"remove this prior to checkin"); - break; - } -} - - DWARFDIE DWARFDIE::GetParentDeclContextDIE () const @@ -419,45 +371,6 @@ DWARFDIE::IsStructOrClass () const return tag == DW_TAG_class_type || tag == DW_TAG_structure_type; } - -DWARFDIE -DWARFDIE::GetContainingDWOModuleDIE () const -{ - if (IsValid()) - { - DWARFDIE top_module_die; - // Now make sure this DIE is scoped in a DW_TAG_module tag and return true if so - for (DWARFDIE parent = GetParent(); parent.IsValid(); parent = parent.GetParent()) - { - const dw_tag_t tag = parent.Tag(); - if (tag == DW_TAG_module) - top_module_die = parent; - else if (tag == DW_TAG_compile_unit) - break; - } - - return top_module_die; - } - return DWARFDIE(); -} - -lldb::ModuleSP -DWARFDIE::GetContainingDWOModule () const -{ - if (IsValid()) - { - DWARFDIE dwo_module_die = GetContainingDWOModuleDIE(); - - if (dwo_module_die) - { - const char *module_name = dwo_module_die.GetName(); - if (module_name) - return GetDWARF()->GetDWOModule (lldb_private::ConstString(module_name)); - } - } - return lldb::ModuleSP(); -} - bool DWARFDIE::HasChildren () const { Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDIE.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDIE.h?rev=254502&r1=254501&r2=254502&view=diff ============================================================================== --- lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDIE.h (original) +++ lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFDIE.h Wed Dec 2 05:35:54 2015 @@ -126,12 +126,6 @@ public: m_die = nullptr; } - lldb::ModuleSP - GetContainingDWOModule () const; - - DWARFDIE - GetContainingDWOModuleDIE () const; - //---------------------------------------------------------------------- // Accessing information about a DIE //---------------------------------------------------------------------- @@ -223,9 +217,6 @@ public: void GetDWARFDeclContext (DWARFDeclContext &dwarf_decl_ctx) const; - void - GetDWOContext (std::vector<lldb_private::CompilerContext> &context) const; - //---------------------------------------------------------------------- // Getting attribute values from the DIE. // 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=254502&r1=254501&r2=254502&view=diff ============================================================================== --- lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp (original) +++ lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp Wed Dec 2 05:35:54 2015 @@ -1077,9 +1077,9 @@ SymbolFileDWARF::ParseImportedModules (c if (ClangModulesDeclVendor::LanguageSupportsClangModules(sc.comp_unit->GetLanguage())) { UpdateExternalModuleListIfNeeded(); - for (const auto &pair : m_external_type_modules) + for (const std::pair<uint64_t, const ClangModuleInfo> &external_type_module : m_external_type_modules) { - imported_modules.push_back(pair.first); + imported_modules.push_back(external_type_module.second.m_name); } } } @@ -1515,32 +1515,13 @@ bool SymbolFileDWARF::HasForwardDeclForClangType (const CompilerType &compiler_type) { CompilerType compiler_type_no_qualifiers = ClangASTContext::RemoveFastQualifiers(compiler_type); - if (GetForwardDeclClangTypeToDie().count (compiler_type_no_qualifiers.GetOpaqueQualType())) - { - return true; - } - TypeSystem *type_system = compiler_type.GetTypeSystem(); - if (type_system) - { - DWARFASTParser *dwarf_ast = type_system->GetDWARFParser(); - if (dwarf_ast) - return dwarf_ast->CanCompleteType(compiler_type); - } - return false; + return GetForwardDeclClangTypeToDie().count (compiler_type_no_qualifiers.GetOpaqueQualType()); } bool SymbolFileDWARF::CompleteType (CompilerType &compiler_type) { - TypeSystem *type_system = compiler_type.GetTypeSystem(); - if (type_system) - { - DWARFASTParser *dwarf_ast = type_system->GetDWARFParser(); - if (dwarf_ast && dwarf_ast->CanCompleteType(compiler_type)) - return dwarf_ast->CompleteType(compiler_type); - } - // We have a struct/union/class/enum that needs to be fully resolved. CompilerType compiler_type_no_qualifiers = ClangASTContext::RemoveFastQualifiers(compiler_type); auto die_it = GetForwardDeclClangTypeToDie().find (compiler_type_no_qualifiers.GetOpaqueQualType()); @@ -1660,17 +1641,6 @@ SymbolFileDWARF::GetFunction (const DWAR return false; } -lldb::ModuleSP -SymbolFileDWARF::GetDWOModule (ConstString name) -{ - UpdateExternalModuleListIfNeeded(); - const auto &pos = m_external_type_modules.find(name); - if (pos != m_external_type_modules.end()) - return pos->second; - else - return lldb::ModuleSP(); -} - void SymbolFileDWARF::UpdateExternalModuleListIfNeeded() { @@ -1688,24 +1658,37 @@ SymbolFileDWARF::UpdateExternalModuleLis const DWARFDIE die = dwarf_cu->GetCompileUnitDIEOnly(); if (die && die.HasChildren() == false) { - const char *name = die.GetAttributeValueAsString(DW_AT_name, nullptr); - - if (name) + const uint64_t name_strp = die.GetAttributeValueAsUnsigned (DW_AT_name, UINT64_MAX); + const uint64_t dwo_path_strp = die.GetAttributeValueAsUnsigned (DW_AT_GNU_dwo_name, UINT64_MAX); + + if (name_strp != UINT64_MAX) { - ConstString const_name(name); - if (m_external_type_modules.find(const_name) == m_external_type_modules.end()) + if (m_external_type_modules.find(dwo_path_strp) == m_external_type_modules.end()) { - ModuleSP module_sp; - const char *dwo_path = die.GetAttributeValueAsString(DW_AT_GNU_dwo_name, nullptr); - if (dwo_path) + const char *name = get_debug_str_data().PeekCStr(name_strp); + const char *dwo_path = get_debug_str_data().PeekCStr(dwo_path_strp); + if (name || dwo_path) { - ModuleSpec dwo_module_spec; - dwo_module_spec.GetFileSpec().SetFile(dwo_path, false); - dwo_module_spec.GetArchitecture() = m_obj_file->GetModule()->GetArchitecture(); - //printf ("Loading dwo = '%s'\n", dwo_path); - Error error = ModuleList::GetSharedModule (dwo_module_spec, module_sp, NULL, NULL, NULL); + ModuleSP module_sp; + if (dwo_path) + { + ModuleSpec dwo_module_spec; + dwo_module_spec.GetFileSpec().SetFile(dwo_path, false); + dwo_module_spec.GetArchitecture() = m_obj_file->GetModule()->GetArchitecture(); + //printf ("Loading dwo = '%s'\n", dwo_path); + Error error = ModuleList::GetSharedModule (dwo_module_spec, module_sp, NULL, NULL, NULL); + } + + if (dwo_path_strp != LLDB_INVALID_UID) + { + m_external_type_modules[dwo_path_strp] = ClangModuleInfo { ConstString(name), module_sp }; + } + else + { + // This hack should be removed promptly once clang emits both. + m_external_type_modules[name_strp] = ClangModuleInfo { ConstString(name), module_sp }; + } } - m_external_type_modules[const_name] = module_sp; } } } @@ -2987,104 +2970,6 @@ SymbolFileDWARF::FindTypes (const Symbol } return num_matches; } - else - { - UpdateExternalModuleListIfNeeded(); - - for (const auto &pair : m_external_type_modules) - { - ModuleSP external_module_sp = pair.second; - if (external_module_sp) - { - SymbolVendor *sym_vendor = external_module_sp->GetSymbolVendor(); - if (sym_vendor) - { - const uint32_t num_external_matches = sym_vendor->FindTypes (sc, - name, - parent_decl_ctx, - append, - max_matches, - types); - if (num_external_matches) - return num_external_matches; - } - } - } - } - - return 0; -} - - -size_t -SymbolFileDWARF::FindTypes (const std::vector<CompilerContext> &context, - bool append, - TypeMap& types) -{ - if (!append) - types.Clear(); - - if (context.empty()) - return 0; - - DIEArray die_offsets; - - ConstString name = context.back().name; - - if (m_using_apple_tables) - { - if (m_apple_types_ap.get()) - { - const char *name_cstr = name.GetCString(); - m_apple_types_ap->FindByName (name_cstr, die_offsets); - } - } - else - { - if (!m_indexed) - Index (); - - m_type_index.Find (name, die_offsets); - } - - const size_t num_die_matches = die_offsets.size(); - - if (num_die_matches) - { - size_t num_matches = 0; - DWARFDebugInfo* debug_info = DebugInfo(); - for (size_t i=0; i<num_die_matches; ++i) - { - const DIERef& die_ref = die_offsets[i]; - DWARFDIE die = debug_info->GetDIE (die_ref); - - if (die) - { - std::vector<CompilerContext> die_context; - die.GetDWOContext(die_context); - if (die_context != context) - continue; - - Type *matching_type = ResolveType (die, true, true); - if (matching_type) - { - // We found a type pointer, now find the shared pointer form our type list - types.InsertUnique (matching_type->shared_from_this()); - ++num_matches; - } - } - else - { - if (m_using_apple_tables) - { - GetObjectFile()->GetModule()->ReportErrorIfModifyDetected ("the DWARF debug information has been modified (.apple_types accelerator table had bad die 0x%8.8x for '%s')\n", - die_ref.die_offset, name.GetCString()); - } - } - - } - return num_matches; - } return 0; } 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=254502&r1=254501&r2=254502&view=diff ============================================================================== --- lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h (original) +++ lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h Wed Dec 2 05:35:54 2015 @@ -211,11 +211,6 @@ public: uint32_t max_matches, lldb_private::TypeMap& types) override; - size_t - FindTypes (const std::vector<lldb_private::CompilerContext> &context, - bool append, - lldb_private::TypeMap& types) override; - lldb_private::TypeList * GetTypeList () override; @@ -311,9 +306,6 @@ public: virtual lldb_private::DWARFExpression::LocationListFormat GetLocationListFormat() const; - lldb::ModuleSP - GetDWOModule (lldb_private::ConstString name); - protected: typedef llvm::DenseMap<const DWARFDebugInfoEntry *, lldb_private::Type *> DIEToTypePtr; typedef llvm::DenseMap<const DWARFDebugInfoEntry *, lldb::VariableSP> DIEToVariableSP; @@ -491,7 +483,12 @@ protected: typedef std::set<lldb_private::Type *> TypeSet; - typedef std::map<lldb_private::ConstString, lldb::ModuleSP> ExternalTypeModuleMap; + typedef struct { + lldb_private::ConstString m_name; + lldb::ModuleSP m_module_sp; + } ClangModuleInfo; + + typedef std::map<uint64_t, ClangModuleInfo> ExternalTypeModuleMap; void GetTypes (const DWARFDIE &die, Modified: lldb/trunk/source/Symbol/ClangASTContext.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/ClangASTContext.cpp?rev=254502&r1=254501&r2=254502&view=diff ============================================================================== --- lldb/trunk/source/Symbol/ClangASTContext.cpp (original) +++ lldb/trunk/source/Symbol/ClangASTContext.cpp Wed Dec 2 05:35:54 2015 @@ -2297,6 +2297,9 @@ ClangASTContext::GetCompleteDecl (clang: if (tag_decl->isCompleteDefinition()) return true; + if (!tag_decl->hasExternalLexicalStorage()) + return false; + ast_source->CompleteType(tag_decl); return !tag_decl->getTypeForDecl()->isIncompleteType(); @@ -2448,110 +2451,81 @@ GetCompleteQualType (clang::ASTContext * case clang::Type::ConstantArray: case clang::Type::IncompleteArray: case clang::Type::VariableArray: - { - const clang::ArrayType *array_type = llvm::dyn_cast<clang::ArrayType>(qual_type.getTypePtr()); - - if (array_type) - return GetCompleteQualType (ast, array_type->getElementType(), allow_completion); - } + { + const clang::ArrayType *array_type = llvm::dyn_cast<clang::ArrayType>(qual_type.getTypePtr()); + + if (array_type) + return GetCompleteQualType (ast, array_type->getElementType(), allow_completion); + } break; case clang::Type::Record: + case clang::Type::Enum: + { + const clang::TagType *tag_type = llvm::dyn_cast<clang::TagType>(qual_type.getTypePtr()); + if (tag_type) { - clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl(); - if (cxx_record_decl) + clang::TagDecl *tag_decl = tag_type->getDecl(); + if (tag_decl) { - bool fields_loaded = cxx_record_decl->hasLoadedFieldsFromExternalStorage(); - if (cxx_record_decl->isCompleteDefinition() && fields_loaded) + if (tag_decl->isCompleteDefinition()) return true; - + if (!allow_completion) return false; - - // Call the field_begin() accessor to for it to use the external source - // to load the fields... - clang::ExternalASTSource *external_ast_source = ast->getExternalSource(); - if (external_ast_source) - { - external_ast_source->CompleteType(cxx_record_decl); - if (cxx_record_decl->isCompleteDefinition()) - { - cxx_record_decl->setHasLoadedFieldsFromExternalStorage (true); - cxx_record_decl->field_begin(); - return cxx_record_decl->hasLoadedFieldsFromExternalStorage(); - } - } - } - return false; - } - break; - - case clang::Type::Enum: - { - const clang::TagType *tag_type = llvm::dyn_cast<clang::TagType>(qual_type.getTypePtr()); - if (tag_type) - { - clang::TagDecl *tag_decl = tag_type->getDecl(); - if (tag_decl) + + if (tag_decl->hasExternalLexicalStorage()) { - if (tag_decl->getDefinition()) - return true; - - if (!allow_completion) - return false; - - if (tag_decl->hasExternalLexicalStorage()) + if (ast) { - if (ast) + clang::ExternalASTSource *external_ast_source = ast->getExternalSource(); + if (external_ast_source) { - clang::ExternalASTSource *external_ast_source = ast->getExternalSource(); - if (external_ast_source) - { - external_ast_source->CompleteType(tag_decl); - return !tag_type->isIncompleteType(); - } + external_ast_source->CompleteType(tag_decl); + return !tag_type->isIncompleteType(); } } - return false; } + return false; } - } + + } break; case clang::Type::ObjCObject: case clang::Type::ObjCInterface: + { + const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type); + if (objc_class_type) { - const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type); - if (objc_class_type) + clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); + // We currently can't complete objective C types through the newly added ASTContext + // because it only supports TagDecl objects right now... + if (class_interface_decl) { - clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); - // We currently can't complete objective C types through the newly added ASTContext - // because it only supports TagDecl objects right now... - if (class_interface_decl) + if (class_interface_decl->getDefinition()) + return true; + + if (!allow_completion) + return false; + + if (class_interface_decl->hasExternalLexicalStorage()) { - if (class_interface_decl->getDefinition()) - return true; - - if (!allow_completion) - return false; - - if (class_interface_decl->hasExternalLexicalStorage()) + if (ast) { - if (ast) + clang::ExternalASTSource *external_ast_source = ast->getExternalSource(); + if (external_ast_source) { - clang::ExternalASTSource *external_ast_source = ast->getExternalSource(); - if (external_ast_source) - { - external_ast_source->CompleteType (class_interface_decl); - return !objc_class_type->isIncompleteType(); - } + external_ast_source->CompleteType (class_interface_decl); + return !objc_class_type->isIncompleteType(); } } - return false; } + return false; } } + } break; case clang::Type::Typedef: @@ -2562,10 +2536,7 @@ GetCompleteQualType (clang::ASTContext * case clang::Type::Paren: return GetCompleteQualType (ast, llvm::cast<clang::ParenType>(qual_type)->desugar(), allow_completion); - - case clang::Type::Attributed: - return GetCompleteQualType (ast, llvm::cast<clang::AttributedType>(qual_type)->getModifiedType(), allow_completion); - + default: break; } @@ -7189,16 +7160,6 @@ ClangASTContext::GetAsRecordDecl (const return nullptr; } -clang::TagDecl * -ClangASTContext::GetAsTagDecl (const CompilerType& type) -{ - clang::QualType qual_type = GetCanonicalQualType(type); - if (qual_type.isNull()) - return nullptr; - else - return qual_type->getAsTagDecl(); -} - clang::CXXRecordDecl * ClangASTContext::GetAsCXXRecordDecl (lldb::opaque_compiler_type_t type) { @@ -8076,64 +8037,6 @@ ClangASTContext::AddMethodToObjCObjectTy } bool -ClangASTContext::GetHasExternalStorage (const CompilerType &type) -{ - if (IsClangType(type)) - return false; - - clang::QualType qual_type (GetCanonicalQualType(type)); - - const clang::Type::TypeClass type_class = qual_type->getTypeClass(); - switch (type_class) - { - case clang::Type::Record: - { - clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl(); - if (cxx_record_decl) - return cxx_record_decl->hasExternalLexicalStorage () || cxx_record_decl->hasExternalVisibleStorage(); - } - break; - - case clang::Type::Enum: - { - clang::EnumDecl *enum_decl = llvm::cast<clang::EnumType>(qual_type)->getDecl(); - if (enum_decl) - return enum_decl->hasExternalLexicalStorage () || enum_decl->hasExternalVisibleStorage(); - } - break; - - case clang::Type::ObjCObject: - case clang::Type::ObjCInterface: - { - const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr()); - assert (objc_class_type); - if (objc_class_type) - { - clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); - - if (class_interface_decl) - return class_interface_decl->hasExternalLexicalStorage () || class_interface_decl->hasExternalVisibleStorage (); - } - } - break; - - case clang::Type::Typedef: - return GetHasExternalStorage (CompilerType(type.GetTypeSystem(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr())); - - case clang::Type::Elaborated: - return GetHasExternalStorage (CompilerType(type.GetTypeSystem(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr())); - - case clang::Type::Paren: - return GetHasExternalStorage (CompilerType(type.GetTypeSystem(), llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr())); - - default: - break; - } - return false; -} - - -bool ClangASTContext::SetHasExternalStorage (lldb::opaque_compiler_type_t type, bool has_extern) { if (!type) @@ -8203,174 +8106,39 @@ ClangASTContext::SetHasExternalStorage ( } -bool -ClangASTContext::CanImport (const CompilerType &type, lldb_private::ClangASTImporter &importer) -{ - if (IsClangType(type)) - { - // TODO: remove external completion BOOL - // CompleteAndFetchChildren should get the Decl out and check for the - - clang::QualType qual_type(GetCanonicalQualType(RemoveFastQualifiers(type))); - - const clang::Type::TypeClass type_class = qual_type->getTypeClass(); - switch (type_class) - { - case clang::Type::Record: - { - const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl(); - if (cxx_record_decl) - { - if (importer.ResolveDeclOrigin (cxx_record_decl, NULL, NULL)) - return true; - } - } - break; - - case clang::Type::Enum: - { - clang::EnumDecl *enum_decl = llvm::cast<clang::EnumType>(qual_type)->getDecl(); - if (enum_decl) - { - if (importer.ResolveDeclOrigin (enum_decl, NULL, NULL)) - return true; - } - } - break; - - case clang::Type::ObjCObject: - case clang::Type::ObjCInterface: - { - const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type); - if (objc_class_type) - { - clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); - // We currently can't complete objective C types through the newly added ASTContext - // because it only supports TagDecl objects right now... - if (class_interface_decl) - { - if (importer.ResolveDeclOrigin (class_interface_decl, NULL, NULL)) - return true; - } - } - } - break; - - - case clang::Type::Typedef: - return CanImport(CompilerType (type.GetTypeSystem(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr()), importer); - - case clang::Type::Elaborated: - return CanImport(CompilerType (type.GetTypeSystem(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr()), importer); - - case clang::Type::Paren: - return CanImport(CompilerType (type.GetTypeSystem(), llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr()), importer); +#pragma mark TagDecl - default: - break; - } - } - return false; -} bool -ClangASTContext::Import (const CompilerType &type, lldb_private::ClangASTImporter &importer) +ClangASTContext::StartTagDeclarationDefinition (const CompilerType &type) { - if (IsClangType(type)) + if (type) { - // TODO: remove external completion BOOL - // CompleteAndFetchChildren should get the Decl out and check for the - - clang::QualType qual_type(GetCanonicalQualType(RemoveFastQualifiers(type))); - - const clang::Type::TypeClass type_class = qual_type->getTypeClass(); - switch (type_class) + + clang::QualType qual_type (GetQualType(type)); + const clang::Type *t = qual_type.getTypePtr(); + if (t) { - case clang::Type::Record: + const clang::TagType *tag_type = llvm::dyn_cast<clang::TagType>(t); + if (tag_type) { - const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl(); - if (cxx_record_decl) + clang::TagDecl *tag_decl = tag_type->getDecl(); + if (tag_decl) { - if (importer.ResolveDeclOrigin (cxx_record_decl, NULL, NULL)) - return importer.CompleteAndFetchChildren(qual_type); - } - } - break; - - case clang::Type::Enum: - { - clang::EnumDecl *enum_decl = llvm::cast<clang::EnumType>(qual_type)->getDecl(); - if (enum_decl) - { - if (importer.ResolveDeclOrigin (enum_decl, NULL, NULL)) - return importer.CompleteAndFetchChildren(qual_type); + tag_decl->startDefinition(); + return true; } } - break; - - case clang::Type::ObjCObject: - case clang::Type::ObjCInterface: + + const clang::ObjCObjectType *object_type = llvm::dyn_cast<clang::ObjCObjectType>(t); + if (object_type) { - const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type); - if (objc_class_type) + clang::ObjCInterfaceDecl *interface_decl = object_type->getInterface(); + if (interface_decl) { - clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); - // We currently can't complete objective C types through the newly added ASTContext - // because it only supports TagDecl objects right now... - if (class_interface_decl) - { - if (importer.ResolveDeclOrigin (class_interface_decl, NULL, NULL)) - return importer.CompleteAndFetchChildren(qual_type); - } + interface_decl->startDefinition(); + return true; } } - break; - - - case clang::Type::Typedef: - return Import (CompilerType(type.GetTypeSystem(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr()), importer); - - case clang::Type::Elaborated: - return Import (CompilerType(type.GetTypeSystem(),llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr()), importer); - - case clang::Type::Paren: - return Import (CompilerType(type.GetTypeSystem(),llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr()), importer); - - default: - break; - } - } - return false; -} - - -#pragma mark TagDecl - -bool -ClangASTContext::StartTagDeclarationDefinition (const CompilerType &type) -{ - clang::QualType qual_type (ClangASTContext::GetQualType(type)); - if (!qual_type.isNull()) - { - const clang::TagType *tag_type = qual_type->getAs<clang::TagType>(); - if (tag_type) - { - clang::TagDecl *tag_decl = tag_type->getDecl(); - if (tag_decl) - { - tag_decl->startDefinition(); - return true; - } - } - - const clang::ObjCObjectType *object_type = qual_type->getAs<clang::ObjCObjectType>(); - if (object_type) - { - clang::ObjCInterfaceDecl *interface_decl = object_type->getInterface(); - if (interface_decl) - { - interface_decl->startDefinition(); - return true; - } } } return false; @@ -8379,22 +8147,26 @@ ClangASTContext::StartTagDeclarationDefi bool ClangASTContext::CompleteTagDeclarationDefinition (const CompilerType& type) { - clang::QualType qual_type (ClangASTContext::GetQualType(type)); - if (!qual_type.isNull()) + if (type) { + clang::QualType qual_type (GetQualType(type)); + if (qual_type.isNull()) + return false; + ClangASTContext *lldb_ast = llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem()); + if (lldb_ast == nullptr) + return false; + clang::ASTContext *ast = lldb_ast->getASTContext(); + clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl(); if (cxx_record_decl) { - if (!cxx_record_decl->isCompleteDefinition()) - cxx_record_decl->completeDefinition(); - cxx_record_decl->setHasLoadedFieldsFromExternalStorage(true); - cxx_record_decl->setHasExternalLexicalStorage (false); - cxx_record_decl->setHasExternalVisibleStorage (false); + cxx_record_decl->completeDefinition(); + return true; } - const clang::EnumType *enutype = qual_type->getAs<clang::EnumType>(); + const clang::EnumType *enutype = llvm::dyn_cast<clang::EnumType>(qual_type.getTypePtr()); if (enutype) { @@ -8402,33 +8174,25 @@ ClangASTContext::CompleteTagDeclarationD if (enum_decl) { - if (!enum_decl->isCompleteDefinition()) + /// TODO This really needs to be fixed. + + unsigned NumPositiveBits = 1; + unsigned NumNegativeBits = 0; + + clang::QualType promotion_qual_type; + // If the enum integer type is less than an integer in bit width, + // then we must promote it to an integer size. + if (ast->getTypeSize(enum_decl->getIntegerType()) < ast->getTypeSize(ast->IntTy)) { - ClangASTContext *lldb_ast = llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem()); - if (lldb_ast == nullptr) - return false; - clang::ASTContext *ast = lldb_ast->getASTContext(); - - /// TODO This really needs to be fixed. - - unsigned NumPositiveBits = 1; - unsigned NumNegativeBits = 0; - - clang::QualType promotion_qual_type; - // If the enum integer type is less than an integer in bit width, - // then we must promote it to an integer size. - if (ast->getTypeSize(enum_decl->getIntegerType()) < ast->getTypeSize(ast->IntTy)) - { - if (enum_decl->getIntegerType()->isSignedIntegerType()) - promotion_qual_type = ast->IntTy; - else - promotion_qual_type = ast->UnsignedIntTy; - } + if (enum_decl->getIntegerType()->isSignedIntegerType()) + promotion_qual_type = ast->IntTy; else - promotion_qual_type = enum_decl->getIntegerType(); - - enum_decl->completeDefinition(enum_decl->getIntegerType(), promotion_qual_type, NumPositiveBits, NumNegativeBits); + promotion_qual_type = ast->UnsignedIntTy; } + else + promotion_qual_type = enum_decl->getIntegerType(); + + enum_decl->completeDefinition(enum_decl->getIntegerType(), promotion_qual_type, NumPositiveBits, NumNegativeBits); return true; } } @@ -9212,72 +8976,6 @@ ClangASTContext::DumpTypeDescription (ll } } -void -ClangASTContext::DumpTypeName (const CompilerType &type) -{ - if (IsClangType(type)) - { - clang::QualType qual_type(GetCanonicalQualType(RemoveFastQualifiers(type))); - - const clang::Type::TypeClass type_class = qual_type->getTypeClass(); - switch (type_class) - { - case clang::Type::Record: - { - const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl(); - if (cxx_record_decl) - printf("class %s", cxx_record_decl->getName().str().c_str()); - } - break; - - case clang::Type::Enum: - { - clang::EnumDecl *enum_decl = llvm::cast<clang::EnumType>(qual_type)->getDecl(); - if (enum_decl) - { - printf("enum %s", enum_decl->getName().str().c_str()); - } - } - break; - - case clang::Type::ObjCObject: - case clang::Type::ObjCInterface: - { - const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type); - if (objc_class_type) - { - clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); - // We currently can't complete objective C types through the newly added ASTContext - // because it only supports TagDecl objects right now... - if (class_interface_decl) - printf("@class %s", class_interface_decl->getName().str().c_str()); - } - } - break; - - - case clang::Type::Typedef: - printf("typedef %s", llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getName().str().c_str()); - break; - - case clang::Type::Elaborated: - printf("elaborated "); - return DumpTypeName (CompilerType (type.GetTypeSystem(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr())); - - case clang::Type::Paren: - printf("paren "); - return DumpTypeName (CompilerType (type.GetTypeSystem(), llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr())); - - default: - printf("ClangASTContext::DumpTypeName() type_class = %u", type_class); - break; - } - } - -} - - - clang::ClassTemplateDecl * ClangASTContext::ParseClassTemplateDecl (clang::DeclContext *decl_ctx, lldb::AccessType access_type, Modified: lldb/trunk/source/Symbol/ClangASTImporter.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/ClangASTImporter.cpp?rev=254502&r1=254501&r2=254502&view=diff ============================================================================== --- lldb/trunk/source/Symbol/ClangASTImporter.cpp (original) +++ lldb/trunk/source/Symbol/ClangASTImporter.cpp Wed Dec 2 05:35:54 2015 @@ -67,31 +67,6 @@ ClangASTImporter::CopyType (clang::ASTCo return CopyType (dst_ast, src_ast, QualType::getFromOpaquePtr(type)).getAsOpaquePtr(); } -CompilerType -ClangASTImporter::CopyType (ClangASTContext &dst_ast, - const CompilerType &src_type) -{ - clang::ASTContext *dst_clang_ast = dst_ast.getASTContext(); - if (dst_clang_ast) - { - ClangASTContext *src_ast = llvm::dyn_cast_or_null<ClangASTContext>(src_type.GetTypeSystem()); - if (src_ast) - { - clang::ASTContext *src_clang_ast = src_ast->getASTContext(); - if (src_clang_ast) - { - lldb::opaque_compiler_type_t dst_clang_type = CopyType(dst_clang_ast, - src_clang_ast, - src_type.GetOpaqueQualType()); - - if (dst_clang_type) - return CompilerType(&dst_ast, dst_clang_type); - } - } - } - return CompilerType(); -} - clang::Decl * ClangASTImporter::CopyDecl (clang::ASTContext *dst_ast, clang::ASTContext *src_ast, @@ -454,68 +429,6 @@ ClangASTImporter::CompleteObjCInterfaceD } bool -ClangASTImporter::CompleteAndFetchChildren (clang::QualType type) -{ - if (!RequireCompleteType(type)) - return false; - - if (const TagType *tag_type = type->getAs<TagType>()) - { - TagDecl *tag_decl = tag_type->getDecl(); - - DeclOrigin decl_origin = GetDeclOrigin(tag_decl); - - if (!decl_origin.Valid()) - return false; - - MinionSP minion_sp (GetMinion(&tag_decl->getASTContext(), decl_origin.ctx)); - - TagDecl *origin_tag_decl = llvm::dyn_cast<TagDecl>(decl_origin.decl); - - for (Decl *origin_child_decl : origin_tag_decl->decls()) - { - minion_sp->Import(origin_child_decl); - } - - if (RecordDecl *record_decl = dyn_cast<RecordDecl>(origin_tag_decl)) - { - record_decl->setHasLoadedFieldsFromExternalStorage(true); - } - - return true; - } - - if (const ObjCObjectType *objc_object_type = type->getAs<ObjCObjectType>()) - { - if (ObjCInterfaceDecl *objc_interface_decl = objc_object_type->getInterface()) - { - DeclOrigin decl_origin = GetDeclOrigin(objc_interface_decl); - - if (!decl_origin.Valid()) - return false; - - MinionSP minion_sp (GetMinion(&objc_interface_decl->getASTContext(), decl_origin.ctx)); - - ObjCInterfaceDecl *origin_interface_decl = llvm::dyn_cast<ObjCInterfaceDecl>(decl_origin.decl); - - for (Decl *origin_child_decl : origin_interface_decl->decls()) - { - minion_sp->Import(origin_child_decl); - } - - return true; - } - else - { - return false; - } - } - - return true; -} - - -bool ClangASTImporter::RequireCompleteType (clang::QualType type) { if (type.isNull()) Modified: lldb/trunk/source/Symbol/ClangExternalASTSourceCallbacks.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/ClangExternalASTSourceCallbacks.cpp?rev=254502&r1=254501&r2=254502&view=diff ============================================================================== --- lldb/trunk/source/Symbol/ClangExternalASTSourceCallbacks.cpp (original) +++ lldb/trunk/source/Symbol/ClangExternalASTSourceCallbacks.cpp Wed Dec 2 05:35:54 2015 @@ -41,7 +41,6 @@ #endif #include "lldb/Core/Log.h" -#include "clang/AST/Decl.h" using namespace clang; using namespace lldb_private; @@ -161,16 +160,3 @@ ClangExternalASTSourceCallbacks::layoutR return false; } -void -ClangExternalASTSourceCallbacks::FindExternalLexicalDecls (const clang::DeclContext *decl_ctx, - llvm::function_ref<bool(clang::Decl::Kind)> IsKindWeWant, - llvm::SmallVectorImpl<clang::Decl *> &decls) -{ - if (m_callback_tag_decl && decl_ctx) - { - clang::TagDecl *tag_decl = llvm::dyn_cast<clang::TagDecl>(const_cast<clang::DeclContext *>(decl_ctx)); - if (tag_decl) - CompleteType(tag_decl); - } -} - Modified: lldb/trunk/source/Symbol/SymbolFile.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/SymbolFile.cpp?rev=254502&r1=254501&r2=254502&view=diff ============================================================================== --- lldb/trunk/source/Symbol/SymbolFile.cpp (original) +++ lldb/trunk/source/Symbol/SymbolFile.cpp Wed Dec 2 05:35:54 2015 @@ -142,11 +142,3 @@ SymbolFile::FindTypes (const SymbolConte return 0; } - -size_t -SymbolFile::FindTypes (const std::vector<CompilerContext> &context, bool append, TypeMap& types) -{ - if (!append) - types.Clear(); - return 0; -} Modified: lldb/trunk/source/Symbol/SymbolVendor.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/SymbolVendor.cpp?rev=254502&r1=254501&r2=254502&view=diff ============================================================================== --- lldb/trunk/source/Symbol/SymbolVendor.cpp (original) +++ lldb/trunk/source/Symbol/SymbolVendor.cpp Wed Dec 2 05:35:54 2015 @@ -361,21 +361,6 @@ SymbolVendor::FindTypes (const SymbolCon } size_t -SymbolVendor::FindTypes (const std::vector<CompilerContext> &context, bool append, TypeMap& types) -{ - ModuleSP module_sp(GetModule()); - if (module_sp) - { - lldb_private::Mutex::Locker locker(module_sp->GetMutex()); - if (m_sym_file_ap.get()) - return m_sym_file_ap->FindTypes(context, append, types); - } - if (!append) - types.Clear(); - return 0; -} - -size_t SymbolVendor::GetTypes (SymbolContextScope *sc_scope, uint32_t type_mask, lldb_private::TypeList &type_list) Modified: lldb/trunk/source/Symbol/Type.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/Type.cpp?rev=254502&r1=254501&r2=254502&view=diff ============================================================================== --- lldb/trunk/source/Symbol/Type.cpp (original) +++ lldb/trunk/source/Symbol/Type.cpp Wed Dec 2 05:35:54 2015 @@ -7,12 +7,8 @@ // //===----------------------------------------------------------------------===// -// C Includes -#include <stdio.h> - -// C++ Includes // Other libraries and framework includes -// Project includes + #include "lldb/Core/DataExtractor.h" #include "lldb/Core/DataBufferHeap.h" #include "lldb/Core/Module.h" @@ -40,27 +36,6 @@ using namespace lldb; using namespace lldb_private; -void -CompilerContext::Dump() const -{ - switch (type) - { - case CompilerContextKind::Invalid: printf("Invalid"); break; - case CompilerContextKind::TranslationUnit: printf("TranslationUnit"); break; - case CompilerContextKind::Module: printf("Module"); break; - case CompilerContextKind::Namespace: printf("Namespace"); break; - case CompilerContextKind::Class: printf("Class"); break; - case CompilerContextKind::Structure: printf("Structure"); break; - case CompilerContextKind::Union: printf("Union"); break; - case CompilerContextKind::Function: printf("Function"); break; - case CompilerContextKind::Variable: printf("Variable"); break; - case CompilerContextKind::Enumeration: printf("Enumeration"); break; - case CompilerContextKind::Typedef: printf("Typedef"); break; - default: printf("???(%u)", type); - } - printf("(\"%s\")\n", name.GetCString()); -} - class TypeAppendVisitor { public: @@ -87,13 +62,6 @@ TypeListImpl::Append (const lldb_private type_list.ForEach(cb); } -SymbolFileType::SymbolFileType (SymbolFile &symbol_file, const lldb::TypeSP &type_sp) : - UserID (type_sp ? type_sp->GetID() : LLDB_INVALID_UID), - m_symbol_file (symbol_file), - m_type_sp (type_sp) -{ -} - Type * SymbolFileType::GetType () _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits