diff options
author | Chandler Carruth <chandlerc@gmail.com> | 2015-03-26 04:27:10 +0000 |
---|---|---|
committer | Chandler Carruth <chandlerc@gmail.com> | 2015-03-26 04:27:10 +0000 |
commit | 8a3d24dcf82fa19e822a95f51679af2a7a65d580 (patch) | |
tree | cceaede49e2b59136797277372e2c832e9b8f74e | |
parent | 65ebb4ac8a7119a16e5a00b075e5b382fd4e434c (diff) | |
download | bcm5719-llvm-8a3d24dcf82fa19e822a95f51679af2a7a65d580.tar.gz bcm5719-llvm-8a3d24dcf82fa19e822a95f51679af2a7a65d580.zip |
[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.
llvm-svn: 233251
-rw-r--r-- | clang/include/clang/Serialization/ASTWriter.h | 6 | ||||
-rw-r--r-- | clang/lib/Serialization/ASTWriter.cpp | 64 | ||||
-rw-r--r-- | clang/lib/Serialization/ASTWriterDecl.cpp | 4 | ||||
-rw-r--r-- | clang/test/Modules/stress1.cpp | 2 |
4 files changed, 5 insertions, 71 deletions
diff --git a/clang/include/clang/Serialization/ASTWriter.h b/clang/include/clang/Serialization/ASTWriter.h index 068815ee90f..6720141fb91 100644 --- a/clang/include/clang/Serialization/ASTWriter.h +++ b/clang/include/clang/Serialization/ASTWriter.h @@ -509,9 +509,6 @@ private: bool isLookupResultExternal(StoredDeclsList &Result, DeclContext *DC); bool isLookupResultEntirelyExternal(StoredDeclsList &Result, DeclContext *DC); - template<typename Visitor> - void visitLocalLookupResults(const DeclContext *DC, Visitor AddLookupResult); - uint32_t GenerateNameLookupTable(const DeclContext *DC, llvm::SmallVectorImpl<char> &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/clang/lib/Serialization/ASTWriter.cpp b/clang/lib/Serialization/ASTWriter.cpp index fabc0d46989..9f0626f060c 100644 --- a/clang/lib/Serialization/ASTWriter.cpp +++ b/clang/lib/Serialization/ASTWriter.cpp @@ -3710,57 +3710,6 @@ bool ASTWriter::isLookupResultEntirelyExternal(StoredDeclsList &Result, return true; } -template<typename Visitor> -void ASTWriter::visitLocalLookupResults(const DeclContext *ConstDC, - Visitor AddLookupResult) { - // FIXME: We need to build the lookups table, which is logically const. - DeclContext *DC = const_cast<DeclContext*>(ConstDC); - assert(DC == DC->getPrimaryContext() && "only primary DC has lookup table"); - - SmallVector<DeclarationName, 16> 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<Decl>(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<char> &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<CXXRecordDecl>(D); - AddUpdatedDeclContext(RD->getPrimaryContext()); + UpdatedDeclContexts.insert(RD->getPrimaryContext()); AddCXXDefinitionData(RD, Record); Record.push_back(WriteDeclContextLexicalBlock( *Context, const_cast<CXXRecordDecl *>(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/clang/lib/Serialization/ASTWriterDecl.cpp b/clang/lib/Serialization/ASTWriterDecl.cpp index 1324f2c8c7f..f4268460350 100644 --- a/clang/lib/Serialization/ASTWriterDecl.cpp +++ b/clang/lib/Serialization/ASTWriterDecl.cpp @@ -243,7 +243,7 @@ void ASTDeclWriter::VisitDecl(Decl *D) { while (auto *NS = dyn_cast<NamespaceDecl>(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/clang/test/Modules/stress1.cpp b/clang/test/Modules/stress1.cpp index 827721c5c87..55d9533b7ae 100644 --- a/clang/test/Modules/stress1.cpp +++ b/clang/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 \ |