Author: gclayton Date: Tue Aug 18 17:32:36 2015 New Revision: 245376 URL: http://llvm.org/viewvc/llvm-project?rev=245376&view=rev Log: More abstraction to get almost all clang specific DWARF parsing code into ClangASTContext.
Modified: lldb/trunk/include/lldb/Symbol/ClangASTContext.h lldb/trunk/include/lldb/Symbol/SymbolFile.h lldb/trunk/include/lldb/Symbol/TypeSystem.h lldb/trunk/lldb.xcodeproj/project.pbxproj 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 lldb/trunk/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.cpp lldb/trunk/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.h lldb/trunk/source/Symbol/ClangASTContext.cpp lldb/trunk/source/Symbol/Type.cpp lldb/trunk/source/Symbol/TypeSystem.cpp Modified: lldb/trunk/include/lldb/Symbol/ClangASTContext.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Symbol/ClangASTContext.h?rev=245376&r1=245375&r2=245376&view=diff ============================================================================== --- lldb/trunk/include/lldb/Symbol/ClangASTContext.h (original) +++ lldb/trunk/include/lldb/Symbol/ClangASTContext.h Tue Aug 18 17:32:36 2015 @@ -525,21 +525,29 @@ public: const DWARFDebugInfoEntry *die) override; bool - ResolveClangOpaqueTypeDefinition (SymbolFileDWARF *dwarf, - DWARFCompileUnit *dwarf_cu, - const DWARFDebugInfoEntry* die, - Type *type, - CompilerType &clang_type) override; + CompleteTypeFromDWARF (SymbolFileDWARF *dwarf, + DWARFCompileUnit *dwarf_cu, + const DWARFDebugInfoEntry* die, + lldb_private::Type *type, + CompilerType &clang_type) override; - bool - LayoutRecordType (SymbolFileDWARF *dwarf, - const clang::RecordDecl *record_decl, - uint64_t &bit_size, - uint64_t &alignment, - llvm::DenseMap<const clang::FieldDecl *, uint64_t> &field_offsets, - llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits> &base_offsets, - llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits> &vbase_offsets) override; + //------------------------------------------------------------------ + // ClangASTContext callbacks for external source lookups. + //------------------------------------------------------------------ + static void + CompleteTagDecl (void *baton, clang::TagDecl *); + + static void + CompleteObjCInterfaceDecl (void *baton, clang::ObjCInterfaceDecl *); + static bool + LayoutRecordType(void *baton, + const clang::RecordDecl *record_decl, + uint64_t &size, + uint64_t &alignment, + llvm::DenseMap<const clang::FieldDecl *, uint64_t> &field_offsets, + llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits> &base_offsets, + llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits> &vbase_offsets); bool DIEIsInNamespace (const ClangNamespaceDecl *namespace_decl, @@ -1204,6 +1212,30 @@ protected: DWARFCompileUnit* dst_cu, const DWARFDebugInfoEntry *dst_class_die, DWARFDIECollection &failures); + + clang::DeclContext * + GetCachedClangDeclContextForDIE (const DWARFDebugInfoEntry *die) + { + DIEToDeclContextMap::iterator pos = m_die_to_decl_ctx.find(die); + if (pos != m_die_to_decl_ctx.end()) + return pos->second; + else + return NULL; + } + + void + LinkDeclContextToDIE (clang::DeclContext *decl_ctx, + const DWARFDebugInfoEntry *die) + { + m_die_to_decl_ctx[die] = decl_ctx; + // There can be many DIEs for a single decl context + m_decl_ctx_to_die[decl_ctx].insert(die); + } + + typedef llvm::SmallPtrSet<const DWARFDebugInfoEntry *, 4> DIEPointerSet; + typedef llvm::DenseMap<const DWARFDebugInfoEntry *, clang::DeclContext *> DIEToDeclContextMap; + typedef llvm::DenseMap<const clang::DeclContext *, DIEPointerSet> DeclContextToDIEMap; + //------------------------------------------------------------------ // Classes that inherit from ClangASTContext can see and modify these //------------------------------------------------------------------ @@ -1225,7 +1257,13 @@ protected: void * m_callback_baton; uint32_t m_pointer_byte_size; bool m_ast_owned; + // DWARF Parsing related ivars RecordDeclToLayoutMap m_record_decl_to_layout_map; + DIEToDeclContextMap m_die_to_decl_ctx; + DeclContextToDIEMap m_decl_ctx_to_die; + clang::TranslationUnitDecl * m_clang_tu_decl; + + private: //------------------------------------------------------------------ Modified: lldb/trunk/include/lldb/Symbol/SymbolFile.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Symbol/SymbolFile.h?rev=245376&r1=245375&r2=245376&view=diff ============================================================================== --- lldb/trunk/include/lldb/Symbol/SymbolFile.h (original) +++ lldb/trunk/include/lldb/Symbol/SymbolFile.h Tue Aug 18 17:32:36 2015 @@ -129,7 +129,7 @@ public: virtual size_t ParseTypes (const SymbolContext& sc) = 0; virtual size_t ParseVariablesForContext (const SymbolContext& sc) = 0; virtual Type* ResolveTypeUID (lldb::user_id_t type_uid) = 0; - virtual bool ResolveClangOpaqueTypeDefinition (CompilerType &clang_type) = 0; + virtual bool CompleteType (CompilerType &clang_type) = 0; virtual clang::DeclContext* GetClangDeclContextForTypeUID (const lldb_private::SymbolContext &sc, lldb::user_id_t type_uid) { return NULL; } virtual clang::DeclContext* GetClangDeclContextContainingTypeUID (lldb::user_id_t type_uid) { return NULL; } virtual uint32_t ResolveSymbolContext (const Address& so_addr, uint32_t resolve_scope, SymbolContext& sc) = 0; Modified: lldb/trunk/include/lldb/Symbol/TypeSystem.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Symbol/TypeSystem.h?rev=245376&r1=245375&r2=245376&view=diff ============================================================================== --- lldb/trunk/include/lldb/Symbol/TypeSystem.h (original) +++ lldb/trunk/include/lldb/Symbol/TypeSystem.h Tue Aug 18 17:32:36 2015 @@ -56,20 +56,27 @@ public: const DWARFDebugInfoEntry *die) = 0; virtual bool - ResolveClangOpaqueTypeDefinition (SymbolFileDWARF *dwarf, - DWARFCompileUnit *dwarf_cu, - const DWARFDebugInfoEntry* die, - Type *type, - CompilerType &clang_type) = 0; + CompleteTypeFromDWARF (SymbolFileDWARF *dwarf, + DWARFCompileUnit *dwarf_cu, + const DWARFDebugInfoEntry* die, + lldb_private::Type *type, + CompilerType &clang_type) + { + return false; + } - virtual bool - LayoutRecordType (SymbolFileDWARF *dwarf, - const clang::RecordDecl *record_decl, - uint64_t &bit_size, - uint64_t &alignment, - llvm::DenseMap<const clang::FieldDecl *, uint64_t> &field_offsets, - llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits> &base_offsets, - llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits> &vbase_offsets) = 0; + virtual SymbolFile * + GetSymbolFile () const + { + return m_sym_file; + } + + // Returns true if the symbol file changed during the set accessor. + virtual void + SetSymbolFile (SymbolFile *sym_file) + { + m_sym_file = sym_file; + } virtual bool DIEIsInNamespace (const ClangNamespaceDecl *namespace_decl, @@ -401,6 +408,9 @@ public: virtual bool IsReferenceType (void * type, CompilerType *pointee_type, bool* is_rvalue) = 0; +protected: + SymbolFile *m_sym_file; + }; } // namespace lldb_private Modified: lldb/trunk/lldb.xcodeproj/project.pbxproj URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/lldb.xcodeproj/project.pbxproj?rev=245376&r1=245375&r2=245376&view=diff ============================================================================== --- lldb/trunk/lldb.xcodeproj/project.pbxproj (original) +++ lldb/trunk/lldb.xcodeproj/project.pbxproj Tue Aug 18 17:32:36 2015 @@ -3118,12 +3118,12 @@ 260C89D710F57C5600BB2B04 /* DWARFLocationList.cpp */, 260C89D810F57C5600BB2B04 /* DWARFLocationList.h */, 26A0DA4D140F721D006DA411 /* HashedNameToDIE.h */, + 26109B3B1155D70100CC3529 /* LogChannelDWARF.cpp */, + 26109B3C1155D70100CC3529 /* LogChannelDWARF.h */, 2618D9EA12406FE600F2B8FE /* NameToDIE.cpp */, 2618D957124056C700F2B8FE /* NameToDIE.h */, 260C89D910F57C5600BB2B04 /* SymbolFileDWARF.cpp */, 260C89DA10F57C5600BB2B04 /* SymbolFileDWARF.h */, - 26109B3B1155D70100CC3529 /* LogChannelDWARF.cpp */, - 26109B3C1155D70100CC3529 /* LogChannelDWARF.h */, 260C89DB10F57C5600BB2B04 /* SymbolFileDWARFDebugMap.cpp */, 260C89DC10F57C5600BB2B04 /* SymbolFileDWARFDebugMap.h */, 26B8B42212EEC52A00A831B2 /* UniqueDWARFASTType.h */, 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=245376&r1=245375&r2=245376&view=diff ============================================================================== --- lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp (original) +++ lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp Tue Aug 18 17:32:36 2015 @@ -48,7 +48,6 @@ #include "lldb/Interpreter/OptionValueProperties.h" #include "lldb/Symbol/Block.h" -#include "lldb/Symbol/ClangExternalASTSourceCallbacks.h" #include "lldb/Symbol/CompileUnit.h" #include "lldb/Symbol/LineTable.h" #include "lldb/Symbol/ObjectFile.h" @@ -504,7 +503,6 @@ SymbolFileDWARF::SymbolFileDWARF(ObjectF UserID (0), // Used by SymbolFileDWARFDebugMap to when this class parses .o files to contain the .o file index/ID m_debug_map_module_wp (), m_debug_map_symfile (NULL), - m_clang_tu_decl (NULL), m_flags(), m_data_debug_abbrev (), m_data_debug_aranges (), @@ -533,7 +531,6 @@ SymbolFileDWARF::SymbolFileDWARF(ObjectF m_type_index(), m_namespace_index(), m_indexed (false), - m_is_external_ast_source (false), m_using_apple_tables (false), m_fetched_external_modules (false), m_supports_DW_AT_APPLE_objc_complete_type (eLazyBoolCalculate), @@ -544,12 +541,6 @@ SymbolFileDWARF::SymbolFileDWARF(ObjectF SymbolFileDWARF::~SymbolFileDWARF() { - if (m_is_external_ast_source) - { - ModuleSP module_sp (m_obj_file->GetModule()); - if (module_sp) - module_sp->GetClangASTContext().RemoveExternalSource (); - } } static const ConstString & @@ -572,20 +563,8 @@ SymbolFileDWARF::GetClangASTContext () { if (GetDebugMapSymfile ()) return m_debug_map_symfile->GetClangASTContext (); - - ClangASTContext &ast = m_obj_file->GetModule()->GetClangASTContext(); - if (!m_is_external_ast_source) - { - m_is_external_ast_source = true; - llvm::IntrusiveRefCntPtr<clang::ExternalASTSource> ast_source_ap ( - new ClangExternalASTSourceCallbacks (SymbolFileDWARF::CompleteTagDecl, - SymbolFileDWARF::CompleteObjCInterfaceDecl, - SymbolFileDWARF::FindExternalVisibleDeclsByName, - SymbolFileDWARF::LayoutRecordType, - this)); - ast.SetExternalSource (ast_source_ap); - } - return ast; + else + return m_obj_file->GetModule()->GetClangASTContext(); } TypeSystem * @@ -595,22 +574,12 @@ SymbolFileDWARF::GetTypeSystemForLanguag if (debug_map_symfile) return debug_map_symfile->GetTypeSystemForLanguage (language); else - { - TypeSystem *type_system = m_obj_file->GetModule()->GetTypeSystemForLanguage (language); - - if (type_system && type_system->AsClangASTContext()) - { - // Get the ClangAST so that we register the ClangExternalASTSource callbacks if needed... - GetClangASTContext(); - } - return type_system; - } + return m_obj_file->GetModule()->GetTypeSystemForLanguage (language); } void SymbolFileDWARF::InitializeObject() { - // Install our external AST source callbacks so we can complete Clang types. ModuleSP module_sp (m_obj_file->GetModule()); if (module_sp) { @@ -661,6 +630,12 @@ SymbolFileDWARF::InitializeObject() else m_apple_objc_ap.reset(); } + + // Set the symbol file to this file if we don't have a debug map symbol + // file as our main symbol file. This allows the clang ASTContext to complete + // types using this symbol file when it needs to complete classes and structures. + if (GetDebugMapSymfile () == nullptr) + GetClangASTContext().SetSymbolFile(this); } bool @@ -1588,7 +1563,7 @@ SymbolFileDWARF::HasForwardDeclForClangT bool -SymbolFileDWARF::ResolveClangOpaqueTypeDefinition (CompilerType &clang_type) +SymbolFileDWARF::CompleteType (CompilerType &clang_type) { // We have a struct/union/class/enum that needs to be fully resolved. CompilerType clang_type_no_qualifiers = ClangASTContext::RemoveFastQualifiers(clang_type); @@ -1604,19 +1579,7 @@ SymbolFileDWARF::ResolveClangOpaqueTypeD // are done. m_forward_decl_clang_type_to_die.erase (clang_type_no_qualifiers.GetOpaqueQualType()); - ClangASTContext* ast = clang_type.GetTypeSystem()->AsClangASTContext(); - if (ast == NULL) - { - // Not a clang type - return true; - } - - // Disable external storage for this type so we don't get anymore - // clang::ExternalASTSource queries for this type. - ast->SetHasExternalStorage (clang_type.GetOpaqueQualType(), false); - DWARFDebugInfo* debug_info = DebugInfo(); - DWARFCompileUnit *dwarf_cu = debug_info->GetCompileUnitContainingDIE (die->GetOffset()).get(); Type *type = m_die_to_type.lookup (die); @@ -1634,7 +1597,7 @@ SymbolFileDWARF::ResolveClangOpaqueTypeD TypeSystem *type_system = GetTypeSystemForLanguage(dwarf_cu->GetLanguageType()); if (type_system) - return type_system->ResolveClangOpaqueTypeDefinition(this, dwarf_cu, die, type, clang_type); + return type_system->CompleteTypeFromDWARF (this, dwarf_cu, die, type, clang_type); return false; } @@ -4577,24 +4540,6 @@ SymbolFileDWARF::GetPluginVersion() } void -SymbolFileDWARF::CompleteTagDecl (void *baton, clang::TagDecl *decl) -{ - SymbolFileDWARF *symbol_file_dwarf = (SymbolFileDWARF *)baton; - CompilerType clang_type = symbol_file_dwarf->GetClangASTContext().GetTypeForDecl (decl); - if (clang_type) - symbol_file_dwarf->ResolveClangOpaqueTypeDefinition (clang_type); -} - -void -SymbolFileDWARF::CompleteObjCInterfaceDecl (void *baton, clang::ObjCInterfaceDecl *decl) -{ - SymbolFileDWARF *symbol_file_dwarf = (SymbolFileDWARF *)baton; - CompilerType clang_type = symbol_file_dwarf->GetClangASTContext().GetTypeForDecl (decl); - if (clang_type) - symbol_file_dwarf->ResolveClangOpaqueTypeDefinition (clang_type); -} - -void SymbolFileDWARF::DumpIndexes () { StreamFile s(stdout, false); @@ -4612,111 +4557,6 @@ SymbolFileDWARF::DumpIndexes () s.Printf("\nNamespaces:\n"); m_namespace_index.Dump (&s); } -void -SymbolFileDWARF::SearchDeclContext (const clang::DeclContext *decl_context, - const char *name, - llvm::SmallVectorImpl <clang::NamedDecl *> *results) -{ - DeclContextToDIEMap::iterator iter = m_decl_ctx_to_die.find(decl_context); - - if (iter == m_decl_ctx_to_die.end()) - return; - - for (DIEPointerSet::iterator pos = iter->second.begin(), end = iter->second.end(); pos != end; ++pos) - { - const DWARFDebugInfoEntry *context_die = *pos; - - if (!results) - return; - - DWARFDebugInfo* info = DebugInfo(); - - DIEArray die_offsets; - - DWARFCompileUnit* dwarf_cu = NULL; - const DWARFDebugInfoEntry* die = NULL; - - if (m_using_apple_tables) - { - if (m_apple_types_ap.get()) - m_apple_types_ap->FindByName (name, die_offsets); - } - else - { - if (!m_indexed) - Index (); - - m_type_index.Find (ConstString(name), die_offsets); - } - - const size_t num_matches = die_offsets.size(); - - if (num_matches) - { - for (size_t i = 0; i < num_matches; ++i) - { - const dw_offset_t die_offset = die_offsets[i]; - die = info->GetDIEPtrWithCompileUnitHint (die_offset, &dwarf_cu); - - if (die->GetParent() != context_die) - continue; - - Type *matching_type = ResolveType (dwarf_cu, die); - - clang::QualType qual_type = ClangASTContext::GetQualType(matching_type->GetClangForwardType()); - - if (const clang::TagType *tag_type = llvm::dyn_cast<clang::TagType>(qual_type.getTypePtr())) - { - clang::TagDecl *tag_decl = tag_type->getDecl(); - results->push_back(tag_decl); - } - else if (const clang::TypedefType *typedef_type = llvm::dyn_cast<clang::TypedefType>(qual_type.getTypePtr())) - { - clang::TypedefNameDecl *typedef_decl = typedef_type->getDecl(); - results->push_back(typedef_decl); - } - } - } - } -} - -void -SymbolFileDWARF::FindExternalVisibleDeclsByName (void *baton, - const clang::DeclContext *decl_context, - clang::DeclarationName decl_name, - llvm::SmallVectorImpl <clang::NamedDecl *> *results) -{ - - switch (decl_context->getDeclKind()) - { - case clang::Decl::Namespace: - case clang::Decl::TranslationUnit: - { - SymbolFileDWARF *symbol_file_dwarf = (SymbolFileDWARF *)baton; - symbol_file_dwarf->SearchDeclContext (decl_context, decl_name.getAsString().c_str(), results); - } - break; - default: - break; - } -} - -bool -SymbolFileDWARF::LayoutRecordType(void *baton, const clang::RecordDecl *record_decl, uint64_t &size, - uint64_t &alignment, - llvm::DenseMap<const clang::FieldDecl *, uint64_t> &field_offsets, - llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits> &base_offsets, - llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits> &vbase_offsets) -{ - if (baton) - { - SymbolFileDWARF *symbol_file_dwarf = (SymbolFileDWARF *)baton; - TypeSystem *type_system = symbol_file_dwarf->GetTypeSystemForLanguage(eLanguageTypeC_plus_plus); - if (type_system) - return type_system->LayoutRecordType (symbol_file_dwarf, record_decl, size, alignment, field_offsets, base_offsets, vbase_offsets); - } - return false; -} SymbolFileDWARFDebugMap * SymbolFileDWARF::GetDebugMapSymfile () 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=245376&r1=245375&r2=245376&view=diff ============================================================================== --- lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h (original) +++ lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h Tue Aug 18 17:32:36 2015 @@ -115,7 +115,7 @@ public: size_t ParseVariablesForContext (const lldb_private::SymbolContext& sc) override; lldb_private::Type* ResolveTypeUID(lldb::user_id_t type_uid) override; - bool ResolveClangOpaqueTypeDefinition (lldb_private::CompilerType& clang_type) override; + bool CompleteType (lldb_private::CompilerType& clang_type) override; lldb_private::Type* ResolveType (DWARFCompileUnit* dwarf_cu, const DWARFDebugInfoEntry* type_die, bool assert_not_being_parsed = true); lldb_private::Type* GetCachedTypeForDIE (const DWARFDebugInfoEntry* type_die) const; @@ -149,26 +149,6 @@ public: //------------------------------------------------------------------ - // ClangASTContext callbacks for external source lookups. - //------------------------------------------------------------------ - static void - CompleteTagDecl (void *baton, clang::TagDecl *); - - static void - CompleteObjCInterfaceDecl (void *baton, clang::ObjCInterfaceDecl *); - - static void - FindExternalVisibleDeclsByName (void *baton, - const clang::DeclContext *DC, - clang::DeclarationName Name, - llvm::SmallVectorImpl <clang::NamedDecl *> *results); - - static bool LayoutRecordType(void *baton, const clang::RecordDecl *record_decl, uint64_t &size, uint64_t &alignment, - llvm::DenseMap<const clang::FieldDecl *, uint64_t> &field_offsets, - llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits> &base_offsets, - llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits> &vbase_offsets); - - //------------------------------------------------------------------ // PluginInterface protocol //------------------------------------------------------------------ lldb_private::ConstString @@ -208,24 +188,9 @@ public: static bool SupportedVersion(uint16_t version); - clang::DeclContext * - GetCachedClangDeclContextForDIE (const DWARFDebugInfoEntry *die) - { - DIEToDeclContextMap::iterator pos = m_die_to_decl_ctx.find(die); - if (pos != m_die_to_decl_ctx.end()) - return pos->second; - else - return NULL; - } - const DWARFDebugInfoEntry * GetDeclContextDIEContainingDIE (const DWARFCompileUnit *cu, const DWARFDebugInfoEntry *die); - void - SearchDeclContext (const clang::DeclContext *decl_context, - const char *name, - llvm::SmallVectorImpl <clang::NamedDecl *> *results); - lldb_private::Flags& GetFlags () { @@ -400,14 +365,6 @@ protected: UniqueDWARFASTTypeMap & GetUniqueDWARFASTTypeMap (); - - void LinkDeclContextToDIE (clang::DeclContext *decl_ctx, - const DWARFDebugInfoEntry *die) - { - m_die_to_decl_ctx[die] = decl_ctx; - // There can be many DIEs for a single decl context - m_decl_ctx_to_die[decl_ctx].insert(die); - } bool UserIDMatches (lldb::user_id_t uid) const @@ -457,7 +414,6 @@ protected: lldb::ModuleWP m_debug_map_module_wp; SymbolFileDWARFDebugMap * m_debug_map_symfile; - clang::TranslationUnitDecl * m_clang_tu_decl; lldb_private::Flags m_flags; lldb_private::DWARFDataExtractor m_dwarf_data; lldb_private::DWARFDataExtractor m_data_debug_abbrev; @@ -493,22 +449,16 @@ protected: 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, m_fetched_external_modules:1; lldb_private::LazyBool m_supports_DW_AT_APPLE_objc_complete_type; std::unique_ptr<DWARFDebugRanges> m_ranges; UniqueDWARFASTTypeMap m_unique_ast_type_map; - typedef llvm::SmallPtrSet<const DWARFDebugInfoEntry *, 4> DIEPointerSet; - typedef llvm::DenseMap<const DWARFDebugInfoEntry *, clang::DeclContext *> DIEToDeclContextMap; - typedef llvm::DenseMap<const clang::DeclContext *, DIEPointerSet> DeclContextToDIEMap; typedef llvm::DenseMap<const DWARFDebugInfoEntry *, lldb_private::Type *> DIEToTypePtr; typedef llvm::DenseMap<const DWARFDebugInfoEntry *, lldb::VariableSP> DIEToVariableSP; typedef llvm::DenseMap<const DWARFDebugInfoEntry *, lldb::clang_type_t> DIEToClangType; typedef llvm::DenseMap<lldb::clang_type_t, const DWARFDebugInfoEntry *> ClangTypeToDIE; - DIEToDeclContextMap m_die_to_decl_ctx; - DeclContextToDIEMap m_decl_ctx_to_die; DIEToTypePtr m_die_to_type; DIEToVariableSP m_die_to_variable_sp; DIEToClangType m_forward_decl_die_to_clang_type; 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=245376&r1=245375&r2=245376&view=diff ============================================================================== --- lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp (original) +++ lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp Tue Aug 18 17:32:36 2015 @@ -24,7 +24,6 @@ #endif #include "lldb/Core/Timer.h" -#include "lldb/Symbol/ClangExternalASTSourceCallbacks.h" #include "lldb/Symbol/CompileUnit.h" #include "lldb/Symbol/LineTable.h" #include "lldb/Symbol/ObjectFile.h" @@ -298,15 +297,9 @@ SymbolFileDWARFDebugMap::~SymbolFileDWAR void SymbolFileDWARFDebugMap::InitializeObject() { - // Install our external AST source callbacks so we can complete Clang types. - llvm::IntrusiveRefCntPtr<clang::ExternalASTSource> ast_source_ap ( - new ClangExternalASTSourceCallbacks (SymbolFileDWARFDebugMap::CompleteTagDecl, - SymbolFileDWARFDebugMap::CompleteObjCInterfaceDecl, - NULL, - SymbolFileDWARFDebugMap::LayoutRecordType, - this)); - - GetClangASTContext().SetExternalSource (ast_source_ap); + // Set the symbol file to this file. This allows the clang ASTContext to complete + // types using this symbol file when it needs to complete classes and structures. + GetClangASTContext().SetSymbolFile(this); } void @@ -788,10 +781,22 @@ SymbolFileDWARFDebugMap::ResolveTypeUID( } bool -SymbolFileDWARFDebugMap::ResolveClangOpaqueTypeDefinition (CompilerType& clang_type) +SymbolFileDWARFDebugMap::CompleteType (CompilerType& clang_type) { - // We have a struct/union/class/enum that needs to be fully resolved. - return false; + bool success = false; + if (clang_type) + { + ForEachSymbolFile([&](SymbolFileDWARF *oso_dwarf) -> bool { + if (oso_dwarf->HasForwardDeclForClangType (clang_type)) + { + oso_dwarf->CompleteType (clang_type); + success = true; + return true; + } + return false; + }); + } + return success; } uint32_t @@ -1428,60 +1433,6 @@ SymbolFileDWARFDebugMap::SetCompileUnit } } - -void -SymbolFileDWARFDebugMap::CompleteTagDecl (void *baton, clang::TagDecl *decl) -{ - SymbolFileDWARFDebugMap *symbol_file_dwarf = (SymbolFileDWARFDebugMap *)baton; - CompilerType clang_type = symbol_file_dwarf->GetClangASTContext().GetTypeForDecl (decl); - if (clang_type) - { - symbol_file_dwarf->ForEachSymbolFile([&](SymbolFileDWARF *oso_dwarf) -> bool { - if (oso_dwarf->HasForwardDeclForClangType (clang_type)) - { - oso_dwarf->ResolveClangOpaqueTypeDefinition (clang_type); - return true; - } - return false; - }); - } -} - -void -SymbolFileDWARFDebugMap::CompleteObjCInterfaceDecl (void *baton, clang::ObjCInterfaceDecl *decl) -{ - SymbolFileDWARFDebugMap *symbol_file_dwarf = (SymbolFileDWARFDebugMap *)baton; - CompilerType clang_type = symbol_file_dwarf->GetClangASTContext().GetTypeForDecl (decl); - if (clang_type) - { - symbol_file_dwarf->ForEachSymbolFile([&](SymbolFileDWARF *oso_dwarf) -> bool { - if (oso_dwarf->HasForwardDeclForClangType (clang_type)) - { - oso_dwarf->ResolveClangOpaqueTypeDefinition (clang_type); - return true; - } - return false; - }); - } -} - -bool -SymbolFileDWARFDebugMap::LayoutRecordType(void *baton, const clang::RecordDecl *record_decl, uint64_t &size, - uint64_t &alignment, - llvm::DenseMap<const clang::FieldDecl *, uint64_t> &field_offsets, - llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits> &base_offsets, - llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits> &vbase_offsets) -{ - SymbolFileDWARFDebugMap *symbol_file_dwarf = (SymbolFileDWARFDebugMap *)baton; - bool laid_out = false; - symbol_file_dwarf->ForEachSymbolFile([&](SymbolFileDWARF *oso_dwarf) -> bool { - return (laid_out = SymbolFileDWARF::LayoutRecordType (oso_dwarf, record_decl, size, alignment, field_offsets, base_offsets, vbase_offsets)); - }); - return laid_out; -} - - - clang::DeclContext* SymbolFileDWARFDebugMap::GetClangDeclContextContainingTypeUID (lldb::user_id_t type_uid) { 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=245376&r1=245375&r2=245376&view=diff ============================================================================== --- lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h (original) +++ lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h Tue Aug 18 17:32:36 2015 @@ -57,7 +57,6 @@ public: ~SymbolFileDWARFDebugMap () override; uint32_t CalculateAbilities () override; - void InitializeObject() override; //------------------------------------------------------------------ @@ -78,7 +77,7 @@ public: lldb_private::Type* ResolveTypeUID (lldb::user_id_t type_uid) override; clang::DeclContext* GetClangDeclContextContainingTypeUID (lldb::user_id_t type_uid) override; clang::DeclContext* GetClangDeclContextForTypeUID (const lldb_private::SymbolContext &sc, lldb::user_id_t type_uid) override; - bool ResolveClangOpaqueTypeDefinition (lldb_private::CompilerType& clang_type) override; + bool CompleteType (lldb_private::CompilerType& clang_type) override; uint32_t ResolveSymbolContext (const lldb_private::Address& so_addr, uint32_t resolve_scope, lldb_private::SymbolContext& sc) override; uint32_t ResolveSymbolContext (const lldb_private::FileSpec& file_spec, uint32_t line, bool check_inlines, uint32_t resolve_scope, lldb_private::SymbolContextList& sc_list) override; uint32_t FindGlobalVariables (const lldb_private::ConstString &name, const lldb_private::ClangNamespaceDecl *namespace_decl, bool append, uint32_t max_matches, lldb_private::VariableList& variables) override; @@ -94,21 +93,6 @@ public: uint32_t type_mask, lldb_private::TypeList &type_list) override; - - //------------------------------------------------------------------ - // ClangASTContext callbacks for external source lookups. - //------------------------------------------------------------------ - static void - CompleteTagDecl (void *baton, clang::TagDecl *); - - static void - CompleteObjCInterfaceDecl (void *baton, clang::ObjCInterfaceDecl *); - - static bool LayoutRecordType(void *baton, const clang::RecordDecl *record_decl, uint64_t &size, uint64_t &alignment, - llvm::DenseMap<const clang::FieldDecl *, uint64_t> &field_offsets, - llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits> &base_offsets, - llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits> &vbase_offsets); - //------------------------------------------------------------------ // PluginInterface protocol //------------------------------------------------------------------ Modified: lldb/trunk/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.cpp?rev=245376&r1=245375&r2=245376&view=diff ============================================================================== --- lldb/trunk/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.cpp (original) +++ lldb/trunk/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.cpp Tue Aug 18 17:32:36 2015 @@ -300,7 +300,7 @@ SymbolFileSymtab::ResolveTypeUID(lldb::u } bool -SymbolFileSymtab::ResolveClangOpaqueTypeDefinition (lldb_private::CompilerType& clang_opaque_type) +SymbolFileSymtab::CompleteType (lldb_private::CompilerType& clang_opaque_type) { return false; } Modified: lldb/trunk/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.h?rev=245376&r1=245375&r2=245376&view=diff ============================================================================== --- lldb/trunk/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.h (original) +++ lldb/trunk/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.h Tue Aug 18 17:32:36 2015 @@ -82,7 +82,7 @@ public: ResolveTypeUID(lldb::user_id_t type_uid); virtual bool - ResolveClangOpaqueTypeDefinition (lldb_private::CompilerType& clang_type); + CompleteType (lldb_private::CompilerType& clang_type); virtual uint32_t ResolveSymbolContext (const lldb_private::Address& so_addr, uint32_t resolve_scope, lldb_private::SymbolContext& sc); Modified: lldb/trunk/source/Symbol/ClangASTContext.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/ClangASTContext.cpp?rev=245376&r1=245375&r2=245376&view=diff ============================================================================== --- lldb/trunk/source/Symbol/ClangASTContext.cpp (original) +++ lldb/trunk/source/Symbol/ClangASTContext.cpp Tue Aug 18 17:32:36 2015 @@ -71,6 +71,7 @@ #include "lldb/Core/UniqueCStringMap.h" #include "lldb/Expression/ASTDumper.h" #include "lldb/Symbol/ClangASTContext.h" +#include "lldb/Symbol/ClangExternalASTSourceCallbacks.h" #include "lldb/Symbol/ClangExternalASTSourceCommon.h" #include "lldb/Symbol/VerifyDecl.h" #include "lldb/Target/ExecutionContext.h" @@ -293,22 +294,25 @@ ParseLangArgs (LangOptions &Opts, InputK ClangASTContext::ClangASTContext (const char *target_triple) : - m_target_triple(), - m_ast_ap(), - m_language_options_ap(), - m_source_manager_ap(), - m_diagnostics_engine_ap(), - m_target_options_rp(), - m_target_info_ap(), - m_identifier_table_ap(), - m_selector_table_ap(), - m_builtins_ap(), + m_target_triple (), + m_ast_ap (), + m_language_options_ap (), + m_source_manager_ap (), + m_diagnostics_engine_ap (), + m_target_options_rp (), + m_target_info_ap (), + m_identifier_table_ap (), + m_selector_table_ap (), + m_builtins_ap (), m_callback_tag_decl (nullptr), m_callback_objc_decl (nullptr), m_callback_baton (nullptr), m_pointer_byte_size (0), - m_ast_owned(false) - + m_ast_owned (false), + m_record_decl_to_layout_map (), + m_die_to_decl_ctx (), + m_decl_ctx_to_die (), + m_clang_tu_decl (nullptr) { if (target_triple && target_triple[0]) SetTargetTriple (target_triple); @@ -445,6 +449,13 @@ ClangASTContext::getASTContext() } GetASTMap().Insert(m_ast_ap.get(), this); + + llvm::IntrusiveRefCntPtr<clang::ExternalASTSource> ast_source_ap (new ClangExternalASTSourceCallbacks (ClangASTContext::CompleteTagDecl, + ClangASTContext::CompleteObjCInterfaceDecl, + nullptr, + ClangASTContext::LayoutRecordType, + this)); + SetExternalSource (ast_source_ap); } return m_ast_ap.get(); } @@ -9076,11 +9087,11 @@ ClangASTContext::ParseClassTemplateDecl } bool -ClangASTContext::ResolveClangOpaqueTypeDefinition (SymbolFileDWARF *dwarf, - DWARFCompileUnit *dwarf_cu, - const DWARFDebugInfoEntry* die, - lldb_private::Type *type, - CompilerType &clang_type) +ClangASTContext::CompleteTypeFromDWARF (SymbolFileDWARF *dwarf, + DWARFCompileUnit *dwarf_cu, + const DWARFDebugInfoEntry* die, + lldb_private::Type *type, + CompilerType &clang_type) { // Disable external storage for this type so we don't get anymore // clang::ExternalASTSource queries for this type. @@ -9298,7 +9309,7 @@ ClangASTContext::ResolveClangOpaqueTypeD if (module_sp) { module_sp->LogMessage (log, - "SymbolFileDWARF::ResolveClangOpaqueTypeDefinition (clang_type = %p) caching layout info for record_decl = %p, bit_size = %" PRIu64 ", alignment = %" PRIu64 ", field_offsets[%u], base_offsets[%u], vbase_offsets[%u])", + "ClangASTContext::CompleteTypeFromDWARF (clang_type = %p) caching layout info for record_decl = %p, bit_size = %" PRIu64 ", alignment = %" PRIu64 ", field_offsets[%u], base_offsets[%u], vbase_offsets[%u])", static_cast<void*>(clang_type.GetOpaqueQualType()), static_cast<void*>(record_decl), layout_info.bit_size, @@ -9314,7 +9325,7 @@ ClangASTContext::ResolveClangOpaqueTypeD for (idx = 0, pos = layout_info.field_offsets.begin(); pos != end; ++pos, ++idx) { module_sp->LogMessage(log, - "SymbolFileDWARF::ResolveClangOpaqueTypeDefinition (clang_type = %p) field[%u] = { bit_offset=%u, name='%s' }", + "ClangASTContext::CompleteTypeFromDWARF (clang_type = %p) field[%u] = { bit_offset=%u, name='%s' }", static_cast<void *>(clang_type.GetOpaqueQualType()), idx, static_cast<uint32_t>(pos->second), @@ -9328,7 +9339,7 @@ ClangASTContext::ResolveClangOpaqueTypeD for (idx = 0, base_pos = layout_info.base_offsets.begin(); base_pos != base_end; ++base_pos, ++idx) { module_sp->LogMessage(log, - "SymbolFileDWARF::ResolveClangOpaqueTypeDefinition (clang_type = %p) base[%u] = { byte_offset=%u, name='%s' }", + "ClangASTContext::CompleteTypeFromDWARF (clang_type = %p) base[%u] = { byte_offset=%u, name='%s' }", clang_type.GetOpaqueQualType(), idx, (uint32_t)base_pos->second.getQuantity(), base_pos->first->getNameAsString().c_str()); } @@ -9339,7 +9350,7 @@ ClangASTContext::ResolveClangOpaqueTypeD for (idx = 0, vbase_pos = layout_info.vbase_offsets.begin(); vbase_pos != vbase_end; ++vbase_pos, ++idx) { module_sp->LogMessage(log, - "SymbolFileDWARF::ResolveClangOpaqueTypeDefinition (clang_type = %p) vbase[%u] = { byte_offset=%u, name='%s' }", + "ClangASTContext::CompleteTypeFromDWARF (clang_type = %p) vbase[%u] = { byte_offset=%u, name='%s' }", static_cast<void *>(clang_type.GetOpaqueQualType()), idx, static_cast<uint32_t>(vbase_pos->second.getQuantity()), vbase_pos->first->getNameAsString().c_str()); @@ -9375,9 +9386,34 @@ ClangASTContext::ResolveClangOpaqueTypeD return false; } +void +ClangASTContext::CompleteTagDecl (void *baton, clang::TagDecl *decl) +{ + ClangASTContext *ast = (ClangASTContext *)baton; + SymbolFile *sym_file = ast->GetSymbolFile(); + if (sym_file) + { + CompilerType clang_type = GetTypeForDecl (decl); + if (clang_type) + sym_file->CompleteType (clang_type); + } +} + +void +ClangASTContext::CompleteObjCInterfaceDecl (void *baton, clang::ObjCInterfaceDecl *decl) +{ + ClangASTContext *ast = (ClangASTContext *)baton; + SymbolFile *sym_file = ast->GetSymbolFile(); + if (sym_file) + { + CompilerType clang_type = GetTypeForDecl (decl); + if (clang_type) + sym_file->CompleteType (clang_type); + } +} bool -ClangASTContext::LayoutRecordType(SymbolFileDWARF *dwarf, +ClangASTContext::LayoutRecordType(void *baton, const clang::RecordDecl *record_decl, uint64_t &bit_size, uint64_t &alignment, @@ -9385,18 +9421,19 @@ ClangASTContext::LayoutRecordType(Symbol llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits> &base_offsets, llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits> &vbase_offsets) { - RecordDeclToLayoutMap::iterator pos = m_record_decl_to_layout_map.find (record_decl); + ClangASTContext *ast = (ClangASTContext *)baton; + RecordDeclToLayoutMap::iterator pos = ast->m_record_decl_to_layout_map.find (record_decl); bool success = false; base_offsets.clear(); vbase_offsets.clear(); - if (pos != m_record_decl_to_layout_map.end()) + if (pos != ast->m_record_decl_to_layout_map.end()) { bit_size = pos->second.bit_size; alignment = pos->second.alignment; field_offsets.swap(pos->second.field_offsets); base_offsets.swap (pos->second.base_offsets); vbase_offsets.swap (pos->second.vbase_offsets); - m_record_decl_to_layout_map.erase(pos); + ast->m_record_decl_to_layout_map.erase(pos); success = true; } else @@ -10642,7 +10679,7 @@ ClangASTContext::GetClangDeclContextForD DWARFCompileUnit *cu, const DWARFDebugInfoEntry *die) { - clang::DeclContext *clang_decl_ctx = dwarf->GetCachedClangDeclContextForDIE (die); + clang::DeclContext *clang_decl_ctx = GetCachedClangDeclContextForDIE (die); if (clang_decl_ctx) return clang_decl_ctx; // If this DIE has a specification, or an abstract origin, then trace to those. @@ -10662,7 +10699,7 @@ ClangASTContext::GetClangDeclContextForD bool assert_not_being_parsed = true; dwarf->ResolveTypeUID (cu, die, assert_not_being_parsed); - clang_decl_ctx = dwarf->GetCachedClangDeclContextForDIE (die); + clang_decl_ctx = GetCachedClangDeclContextForDIE (die); return clang_decl_ctx; } @@ -10709,7 +10746,7 @@ ClangASTContext::ResolveNamespaceDIE (Sy { // See if we already parsed this namespace DIE and associated it with a // uniqued namespace declaration - clang::NamespaceDecl *namespace_decl = static_cast<clang::NamespaceDecl *>(dwarf->m_die_to_decl_ctx[die]); + clang::NamespaceDecl *namespace_decl = static_cast<clang::NamespaceDecl *>(m_die_to_decl_ctx[die]); if (namespace_decl) return namespace_decl; else @@ -10742,7 +10779,7 @@ ClangASTContext::ResolveNamespaceDIE (Sy } if (namespace_decl) - dwarf->LinkDeclContextToDIE((clang::DeclContext*)namespace_decl, die); + LinkDeclContextToDIE((clang::DeclContext*)namespace_decl, die); return namespace_decl; } } @@ -10755,8 +10792,8 @@ ClangASTContext::GetClangDeclContextCont const DWARFDebugInfoEntry *die, const DWARFDebugInfoEntry **decl_ctx_die_copy) { - if (dwarf->m_clang_tu_decl == NULL) - dwarf->m_clang_tu_decl = getASTContext()->getTranslationUnitDecl(); + if (m_clang_tu_decl == NULL) + m_clang_tu_decl = getASTContext()->getTranslationUnitDecl(); const DWARFDebugInfoEntry *decl_ctx_die = dwarf->GetDeclContextDIEContainingDIE (cu, die); @@ -10766,14 +10803,14 @@ ClangASTContext::GetClangDeclContextCont if (decl_ctx_die) { - SymbolFileDWARF::DIEToDeclContextMap::iterator pos = dwarf->m_die_to_decl_ctx.find (decl_ctx_die); - if (pos != dwarf->m_die_to_decl_ctx.end()) + DIEToDeclContextMap::iterator pos = m_die_to_decl_ctx.find (decl_ctx_die); + if (pos != m_die_to_decl_ctx.end()) return pos->second; switch (decl_ctx_die->Tag()) { case DW_TAG_compile_unit: - return dwarf->m_clang_tu_decl; + return m_clang_tu_decl; case DW_TAG_namespace: return ResolveNamespaceDIE (dwarf, cu, decl_ctx_die); @@ -10788,7 +10825,7 @@ ClangASTContext::GetClangDeclContextCont clang::DeclContext *decl_ctx = GetDeclContextForType(type->GetClangForwardType()); if (decl_ctx) { - dwarf->LinkDeclContextToDIE (decl_ctx, decl_ctx_die); + LinkDeclContextToDIE (decl_ctx, decl_ctx_die); if (decl_ctx) return decl_ctx; } @@ -10800,7 +10837,7 @@ ClangASTContext::GetClangDeclContextCont break; } } - return dwarf->m_clang_tu_decl; + return m_clang_tu_decl; } @@ -11377,7 +11414,7 @@ ClangASTContext::ParseTypeFromDWARF (con // Store a forward declaration to this class type in case any // parameters in any class methods need it for the clang // types for function prototypes. - dwarf->LinkDeclContextToDIE(GetDeclContextForType(clang_type), die); + LinkDeclContextToDIE(GetDeclContextForType(clang_type), die); type_sp.reset (new Type (dwarf->MakeUserID(die->GetOffset()), dwarf, type_name_const_str, @@ -11470,7 +11507,7 @@ ClangASTContext::ParseTypeFromDWARF (con // Leave this as a forward declaration until we need // to know the details of the type. lldb_private::Type // will automatically call the SymbolFile virtual function - // "SymbolFileDWARF::ResolveClangOpaqueTypeDefinition(Type *)" + // "SymbolFileDWARF::CompleteType(Type *)" // When the definition needs to be defined. dwarf->m_forward_decl_die_to_clang_type[die] = clang_type.GetOpaqueQualType(); dwarf->m_forward_decl_clang_type_to_die[ClangASTContext::RemoveFastQualifiers(clang_type).GetOpaqueQualType()] = die; @@ -11555,7 +11592,7 @@ ClangASTContext::ParseTypeFromDWARF (con enumerator_clang_type = GetEnumerationIntegerType (clang_type.GetOpaqueQualType()); } - dwarf->LinkDeclContextToDIE(ClangASTContext::GetDeclContextForType(clang_type), die); + LinkDeclContextToDIE(ClangASTContext::GetDeclContextForType(clang_type), die); type_sp.reset( new Type (dwarf->MakeUserID(die->GetOffset()), dwarf, @@ -11787,7 +11824,7 @@ ClangASTContext::ParseTypeFromDWARF (con type_handled = objc_method_decl != NULL; if (type_handled) { - dwarf->LinkDeclContextToDIE(ClangASTContext::GetAsDeclContext(objc_method_decl), die); + LinkDeclContextToDIE(ClangASTContext::GetAsDeclContext(objc_method_decl), die); SetMetadataAsUserID (objc_method_decl, dwarf->MakeUserID(die->GetOffset())); } else @@ -11868,7 +11905,7 @@ ClangASTContext::ParseTypeFromDWARF (con clang::DeclContext *spec_clang_decl_ctx = GetClangDeclContextForDIE (dwarf, sc, dwarf_cu, spec_die); if (spec_clang_decl_ctx) { - dwarf->LinkDeclContextToDIE(spec_clang_decl_ctx, die); + LinkDeclContextToDIE(spec_clang_decl_ctx, die); } else { @@ -11891,7 +11928,7 @@ ClangASTContext::ParseTypeFromDWARF (con clang::DeclContext *abs_clang_decl_ctx = GetClangDeclContextForDIE (dwarf, sc, dwarf_cu, abs_die); if (abs_clang_decl_ctx) { - dwarf->LinkDeclContextToDIE (abs_clang_decl_ctx, die); + LinkDeclContextToDIE (abs_clang_decl_ctx, die); } else { @@ -11947,7 +11984,7 @@ ClangASTContext::ParseTypeFromDWARF (con if (type_handled) { - dwarf->LinkDeclContextToDIE(ClangASTContext::GetAsDeclContext(cxx_method_decl), die); + LinkDeclContextToDIE(ClangASTContext::GetAsDeclContext(cxx_method_decl), die); Host::SetCrashDescription (NULL); @@ -12028,7 +12065,7 @@ ClangASTContext::ParseTypeFromDWARF (con // } // Add the decl to our DIE to decl context map assert (function_decl); - dwarf->LinkDeclContextToDIE(function_decl, die); + LinkDeclContextToDIE(function_decl, die); if (!function_param_decls.empty()) SetFunctionParameters (function_decl, &function_param_decls.front(), @@ -12401,14 +12438,14 @@ ClangASTContext::CopyUniqueClassMethodTy src_die = src_name_to_die.GetValueAtIndexUnchecked (idx); dst_die = dst_name_to_die.GetValueAtIndexUnchecked (idx); - clang::DeclContext *src_decl_ctx = src_symfile->m_die_to_decl_ctx[src_die]; + clang::DeclContext *src_decl_ctx = src_symfile->GetClangASTContext().m_die_to_decl_ctx[src_die]; if (src_decl_ctx) { if (log) log->Printf ("uniquing decl context %p from 0x%8.8x for 0x%8.8x", static_cast<void*>(src_decl_ctx), src_die->GetOffset(), dst_die->GetOffset()); - dst_symfile->LinkDeclContextToDIE (src_decl_ctx, dst_die); + dst_symfile->GetClangASTContext().LinkDeclContextToDIE (src_decl_ctx, dst_die); } else { @@ -12452,7 +12489,7 @@ ClangASTContext::CopyUniqueClassMethodTy if (src_die && (src_die->Tag() == dst_die->Tag())) { - clang::DeclContext *src_decl_ctx = src_symfile->m_die_to_decl_ctx[src_die]; + clang::DeclContext *src_decl_ctx = src_symfile->GetClangASTContext().m_die_to_decl_ctx[src_die]; if (src_decl_ctx) { if (log) @@ -12460,7 +12497,7 @@ ClangASTContext::CopyUniqueClassMethodTy static_cast<void*>(src_decl_ctx), src_die->GetOffset(), dst_die->GetOffset()); - dst_symfile->LinkDeclContextToDIE (src_decl_ctx, dst_die); + dst_symfile->GetClangASTContext().LinkDeclContextToDIE (src_decl_ctx, dst_die); } else { @@ -12514,14 +12551,14 @@ ClangASTContext::CopyUniqueClassMethodTy if (dst_die) { // Both classes have the artificial types, link them - clang::DeclContext *src_decl_ctx = dst_symfile->m_die_to_decl_ctx[src_die]; + clang::DeclContext *src_decl_ctx = dst_symfile->GetClangASTContext().m_die_to_decl_ctx[src_die]; if (src_decl_ctx) { if (log) log->Printf ("uniquing decl context %p from 0x%8.8x for 0x%8.8x", static_cast<void*>(src_decl_ctx), src_die->GetOffset(), dst_die->GetOffset()); - dst_symfile->LinkDeclContextToDIE (src_decl_ctx, dst_die); + dst_symfile->GetClangASTContext().LinkDeclContextToDIE (src_decl_ctx, dst_die); } else { Modified: lldb/trunk/source/Symbol/Type.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/Type.cpp?rev=245376&r1=245375&r2=245376&view=diff ============================================================================== --- lldb/trunk/source/Symbol/Type.cpp (original) +++ lldb/trunk/source/Symbol/Type.cpp Tue Aug 18 17:32:36 2015 @@ -611,7 +611,7 @@ Type::ResolveClangType (ResolveState cla if (!m_clang_type.IsDefined ()) { // We have a forward declaration, we need to resolve it to a complete definition. - m_symbol_file->ResolveClangOpaqueTypeDefinition (m_clang_type); + m_symbol_file->CompleteType (m_clang_type); } } } Modified: lldb/trunk/source/Symbol/TypeSystem.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/TypeSystem.cpp?rev=245376&r1=245375&r2=245376&view=diff ============================================================================== --- lldb/trunk/source/Symbol/TypeSystem.cpp (original) +++ lldb/trunk/source/Symbol/TypeSystem.cpp Tue Aug 18 17:32:36 2015 @@ -10,7 +10,8 @@ using namespace lldb_private; -TypeSystem::TypeSystem() +TypeSystem::TypeSystem() : + m_sym_file (nullptr) { } _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits