From a7be5065edc93ab52a25b2588a23a41a4beba21e Mon Sep 17 00:00:00 2001 From: Sebastian Redl Date: Thu, 5 Aug 2010 21:22:19 +0000 Subject: [PATCH] Collect namespaces that need updating in a PCH chain. WIP git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@110378 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/AST/Decl.h | 4 ++-- include/clang/Frontend/PCHWriter.h | 15 ++++++++++++++- lib/Frontend/PCHWriterDecl.cpp | 5 +++++ 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/include/clang/AST/Decl.h b/include/clang/AST/Decl.h index 169b74e01b..1a6c5833ff 100644 --- a/include/clang/AST/Decl.h +++ b/include/clang/AST/Decl.h @@ -239,7 +239,7 @@ class NamespaceDecl : public NamedDecl, public DeclContext { // there will be one NamespaceDecl for each declaration. // NextNamespace points to the next extended declaration. // OrigNamespace points to the original namespace declaration. - // OrigNamespace of the first namespace decl points to itself. + // OrigNamespace of the first namespace decl points to its anonymous namespace NamespaceDecl *NextNamespace; /// \brief A pointer to either the original namespace definition for @@ -277,7 +277,7 @@ public: return !getIdentifier(); } - /// \brief Return the next extended namespace declaration or null if this + /// \brief Return the next extended namespace declaration or null if there /// is none. NamespaceDecl *getNextNamespace() { return NextNamespace; } const NamespaceDecl *getNextNamespace() const { return NextNamespace; } diff --git a/include/clang/Frontend/PCHWriter.h b/include/clang/Frontend/PCHWriter.h index 811a506216..9f8b54c2fd 100644 --- a/include/clang/Frontend/PCHWriter.h +++ b/include/clang/Frontend/PCHWriter.h @@ -22,6 +22,7 @@ #include "clang/Frontend/PCHDeserializationListener.h" #include "clang/Sema/SemaConsumer.h" #include "llvm/ADT/DenseMap.h" +#include "llvm/ADT/SmallPtrSet.h" #include "llvm/ADT/SmallVector.h" #include "llvm/Bitcode/BitstreamWriter.h" #include @@ -219,6 +220,13 @@ private: /// record. llvm::SmallVector ExternalDefinitions; + /// \brief Namespaces that have received extensions since their PCH form. + /// + /// Basically, when we're chaining and encountering a namespace, we check if + /// its primary namespace comes from the chain. If it does, we add the primary + /// to this set, so that we can write out lexical content updates for it. + llvm::SmallPtrSet UpdatedNamespaces; + /// \brief Statements that we've encountered while serializing a /// declaration or type. llvm::SmallVector StmtsToEmit; @@ -390,12 +398,17 @@ public: /// \brief Emit a UnresolvedSet structure. void AddUnresolvedSet(const UnresolvedSetImpl &Set, RecordData &Record); - /// brief Emit a C++ base specifier. + /// \brief Emit a C++ base specifier. void AddCXXBaseSpecifier(const CXXBaseSpecifier &Base, RecordData &Record); /// \brief Add a string to the given record. void AddString(const std::string &Str, RecordData &Record); + /// \brief Mark a namespace as needing an update. + void AddUpdatedNamespace(const NamespaceDecl *NS) { + UpdatedNamespaces.insert(NS); + } + /// \brief Note that the identifier II occurs at the given offset /// within the identifier table. void SetIdentifierOffset(const IdentifierInfo *II, uint32_t Offset); diff --git a/lib/Frontend/PCHWriterDecl.cpp b/lib/Frontend/PCHWriterDecl.cpp index 9e9835adb4..a3d47bba58 100644 --- a/lib/Frontend/PCHWriterDecl.cpp +++ b/lib/Frontend/PCHWriterDecl.cpp @@ -600,6 +600,11 @@ void PCHDeclWriter::VisitNamespaceDecl(NamespaceDecl *D) { else Writer.AddDeclRef(D->getOriginalNamespace(), Record); Code = pch::DECL_NAMESPACE; + + if (Writer.hasChain() && !D->isOriginalNamespace() && + D->getOriginalNamespace()->getPCHLevel() > 0) { + Writer.AddUpdatedNamespace(D->getOriginalNamespace()); + } } void PCHDeclWriter::VisitNamespaceAliasDecl(NamespaceAliasDecl *D) { -- 2.40.0