aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Redl <sebastian.redl@getdesigned.at>2010-08-05 21:22:19 +0000
committerSebastian Redl <sebastian.redl@getdesigned.at>2010-08-05 21:22:19 +0000
commita7be5065edc93ab52a25b2588a23a41a4beba21e (patch)
tree64599ab94456eff3115e9973870133356dc1ccfa
parente1a48984f91cd8a65932f69be25f8330737e9842 (diff)
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
-rw-r--r--include/clang/AST/Decl.h4
-rw-r--r--include/clang/Frontend/PCHWriter.h15
-rw-r--r--lib/Frontend/PCHWriterDecl.cpp5
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 <map>
@@ -219,6 +220,13 @@ private:
/// record.
llvm::SmallVector<uint64_t, 16> 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<const NamespaceDecl *, 16> UpdatedNamespaces;
+
/// \brief Statements that we've encountered while serializing a
/// declaration or type.
llvm::SmallVector<Stmt *, 16> 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) {