diff options
-rw-r--r-- | include/clang/Serialization/ASTWriter.h | 4 | ||||
-rw-r--r-- | lib/Serialization/ASTWriter.cpp | 7 |
2 files changed, 11 insertions, 0 deletions
diff --git a/include/clang/Serialization/ASTWriter.h b/include/clang/Serialization/ASTWriter.h index 71d20dda5e..d6b1467576 100644 --- a/include/clang/Serialization/ASTWriter.h +++ b/include/clang/Serialization/ASTWriter.h @@ -223,6 +223,10 @@ private: /// to this set, so that we can write out lexical content updates for it. llvm::SmallPtrSet<const NamespaceDecl *, 16> UpdatedNamespaces; + typedef llvm::SmallPtrSet<const Decl *, 16> DeclsToRewriteTy; + /// \brief Decls that will be replaced in the current dependent AST file. + DeclsToRewriteTy DeclsToRewrite; + /// \brief Decls that have been replaced in the current dependent AST file. /// /// When a decl changes fundamentally after being deserialized (this shouldn't diff --git a/lib/Serialization/ASTWriter.cpp b/lib/Serialization/ASTWriter.cpp index 7636f02bdf..c6df2dd95d 100644 --- a/lib/Serialization/ASTWriter.cpp +++ b/lib/Serialization/ASTWriter.cpp @@ -2410,6 +2410,10 @@ void ASTWriter::WriteASTCore(Sema &SemaRef, MemorizeStatCalls *StatCalls, else WriteDecl(Context, DOT.getDecl()); } + for (DeclsToRewriteTy::iterator + I = DeclsToRewrite.begin(), E = DeclsToRewrite.end(); I != E; ++I) { + WriteDecl(Context, const_cast<Decl*>(*I)); + } Stream.ExitBlock(); WritePreprocessor(PP); @@ -2720,6 +2724,9 @@ void ASTWriter::WriteDeclUpdatesBlocks() { const Decl *D = I->first; UpdateRecord &URec = I->second; + if (DeclsToRewrite.count(D)) + continue; // The decl will be written completely,no need to store updates. + uint64_t Offset = Stream.GetCurrentBitNo(); Stream.EmitRecord(DECL_UPDATES, URec); |