From: Chandler Carruth Date: Thu, 26 Mar 2015 04:27:10 +0000 (+0000) Subject: [Modules] Delete a bunch of complex code for ensuring visible decls in X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=938847c101744983f89de82062b29814f13026f0;p=clang [Modules] Delete a bunch of complex code for ensuring visible decls in updated decl contexts get emitted. Since this code was added, we have newer vastly simpler code for handling this. The code I'm removing was very expensive and also generated unstable order of declarations which made module outputs non-deterministic. All of the tests continue to pass for me and I'm able to check the difference between the .pcm files after merging modules together. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@233251 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Serialization/ASTWriter.h b/include/clang/Serialization/ASTWriter.h index 068815ee90..6720141fb9 100644 --- a/include/clang/Serialization/ASTWriter.h +++ b/include/clang/Serialization/ASTWriter.h @@ -509,9 +509,6 @@ private: bool isLookupResultExternal(StoredDeclsList &Result, DeclContext *DC); bool isLookupResultEntirelyExternal(StoredDeclsList &Result, DeclContext *DC); - template - void visitLocalLookupResults(const DeclContext *DC, Visitor AddLookupResult); - uint32_t GenerateNameLookupTable(const DeclContext *DC, llvm::SmallVectorImpl &LookupTable); uint64_t WriteDeclContextLexicalBlock(ASTContext &Context, DeclContext *DC); @@ -737,9 +734,6 @@ public: /// \brief Add a version tuple to the given record void AddVersionTuple(const VersionTuple &Version, RecordDataImpl &Record); - /// \brief Mark a declaration context as needing an update. - void AddUpdatedDeclContext(const DeclContext *DC); - void RewriteDecl(const Decl *D) { DeclsToRewrite.insert(D); } diff --git a/lib/Serialization/ASTWriter.cpp b/lib/Serialization/ASTWriter.cpp index fabc0d4698..9f0626f060 100644 --- a/lib/Serialization/ASTWriter.cpp +++ b/lib/Serialization/ASTWriter.cpp @@ -3710,57 +3710,6 @@ bool ASTWriter::isLookupResultEntirelyExternal(StoredDeclsList &Result, return true; } -template -void ASTWriter::visitLocalLookupResults(const DeclContext *ConstDC, - Visitor AddLookupResult) { - // FIXME: We need to build the lookups table, which is logically const. - DeclContext *DC = const_cast(ConstDC); - assert(DC == DC->getPrimaryContext() && "only primary DC has lookup table"); - - SmallVector ExternalNames; - for (auto &Lookup : *DC->buildLookup()) { - if (isLookupResultExternal(Lookup.second, DC)) { - // If there are no local declarations in our lookup result, we don't - // need to write an entry for the name at all unless we're rewriting - // the decl context. If we can't write out a lookup set without - // performing more deserialization, just skip this entry. - if (!isRewritten(cast(DC)) && - isLookupResultEntirelyExternal(Lookup.second, DC)) - continue; - - // We don't know for sure what declarations are found by this name, - // because the external source might have a different set from the set - // that are in the lookup map, and we can't update it now without - // risking invalidating our lookup iterator. So add it to a queue to - // deal with later. - ExternalNames.push_back(Lookup.first); - continue; - } - - AddLookupResult(Lookup.first, Lookup.second.getLookupResult()); - } - - // Add the names we needed to defer. Note, this shouldn't add any new decls - // to the list we need to serialize: any new declarations we find here should - // be imported from an external source. - // FIXME: What if the external source isn't an ASTReader? - for (const auto &Name : ExternalNames) - AddLookupResult(Name, DC->lookup(Name)); -} - -void ASTWriter::AddUpdatedDeclContext(const DeclContext *DC) { - if (UpdatedDeclContexts.insert(DC).second && WritingAST) { - // Ensure we emit all the visible declarations. - // FIXME: This code is almost certainly wrong. It is at least failing to - // visit all the decls it should. - visitLocalLookupResults(DC, [&](DeclarationName Name, - DeclContext::lookup_result Result) { - for (auto *Decl : Result) - GetDeclRef(getDeclForLocalLookup(getLangOpts(), Decl)); - }); - } -} - uint32_t ASTWriter::GenerateNameLookupTable(const DeclContext *ConstDC, llvm::SmallVectorImpl &LookupTable) { @@ -4388,15 +4337,6 @@ void ASTWriter::WriteASTCore(Sema &SemaRef, getIdentifierRef(&Table.get(BuiltinNames[I])); } - // If we saw any DeclContext updates before we started writing the AST file, - // make sure all visible decls in those DeclContexts are written out. - if (!UpdatedDeclContexts.empty()) { - auto OldUpdatedDeclContexts = std::move(UpdatedDeclContexts); - UpdatedDeclContexts.clear(); - for (auto *DC : OldUpdatedDeclContexts) - AddUpdatedDeclContext(DC); - } - // Build a record containing all of the tentative definitions in this file, in // TentativeDefinitions order. Generally, this record will be empty for // headers. @@ -4861,7 +4801,7 @@ void ASTWriter::WriteDeclUpdatesBlocks(RecordDataImpl &OffsetsRecord) { case UPD_CXX_INSTANTIATED_CLASS_DEFINITION: { auto *RD = cast(D); - AddUpdatedDeclContext(RD->getPrimaryContext()); + UpdatedDeclContexts.insert(RD->getPrimaryContext()); AddCXXDefinitionData(RD, Record); Record.push_back(WriteDeclContextLexicalBlock( *Context, const_cast(RD))); @@ -5923,7 +5863,7 @@ void ASTWriter::AddedVisibleDecl(const DeclContext *DC, const Decl *D) { assert(!getDefinitiveDeclContext(DC) && "DeclContext not definitive!"); assert(!WritingAST && "Already writing the AST!"); - AddUpdatedDeclContext(DC); + UpdatedDeclContexts.insert(DC); UpdatingVisibleDecls.push_back(D); } diff --git a/lib/Serialization/ASTWriterDecl.cpp b/lib/Serialization/ASTWriterDecl.cpp index 1324f2c8c7..f426846035 100644 --- a/lib/Serialization/ASTWriterDecl.cpp +++ b/lib/Serialization/ASTWriterDecl.cpp @@ -243,7 +243,7 @@ void ASTDeclWriter::VisitDecl(Decl *D) { while (auto *NS = dyn_cast(DC->getRedeclContext())) { if (!NS->isFromASTFile()) break; - Writer.AddUpdatedDeclContext(NS->getPrimaryContext()); + Writer.UpdatedDeclContexts.insert(NS->getPrimaryContext()); if (!NS->isInlineNamespace()) break; DC = NS->getParent(); @@ -978,7 +978,7 @@ void ASTDeclWriter::VisitNamespaceDecl(NamespaceDecl *D) { if (Writer.hasChain() && !D->isOriginalNamespace() && D->getOriginalNamespace()->isFromASTFile()) { NamespaceDecl *NS = D->getOriginalNamespace(); - Writer.AddUpdatedDeclContext(NS); + Writer.UpdatedDeclContexts.insert(NS); // Make sure all visible decls are written. They will be recorded later. if (StoredDeclsMap *Map = NS->buildLookup()) { diff --git a/test/Modules/stress1.cpp b/test/Modules/stress1.cpp index 827721c5c8..55d9533b7a 100644 --- a/test/Modules/stress1.cpp +++ b/test/Modules/stress1.cpp @@ -60,7 +60,7 @@ // RUN: -emit-module -fmodule-name=merge00 -o %t/merge00_check.pcm \ // RUN: Inputs/stress1/module.modulemap // -// FIXME: diff %t/merge00.pcm %t/merge00_check.pcm +// RUN: diff %t/merge00.pcm %t/merge00_check.pcm // // RUN: %clang_cc1 -fmodules -x c++ -std=c++11 \ // RUN: -I Inputs/stress1 \