diff options
author | Douglas Gregor <dgregor@apple.com> | 2012-01-07 09:11:48 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2012-01-07 09:11:48 +0000 |
commit | f5c9f9fd6f5e2850b9b0f19283430245b696c6e5 (patch) | |
tree | eaf11351dbbffd667d8f3cbf539cf784d629e925 /lib/AST/DeclBase.cpp | |
parent | 72899c34e3d1abfffa241ad0ce5c4bf175e5ea51 (diff) |
Switch NamespaceDecl from its own hand-rolled redeclaration chain over
to Redeclarable<NamespaceDecl>, so that we benefit from the improveed
redeclaration deserialization and merging logic provided by
Redeclarable<T>. Otherwise, no functionality change.
As a drive-by fix, collapse the "inline" bit into the low bit of the
original namespace/anonymous namespace, saving 8 bytes per
NamespaceDecl on x86_64.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@147729 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/AST/DeclBase.cpp')
-rw-r--r-- | lib/AST/DeclBase.cpp | 32 |
1 files changed, 20 insertions, 12 deletions
diff --git a/lib/AST/DeclBase.cpp b/lib/AST/DeclBase.cpp index 3fc507ebdb..0312cfbc4a 100644 --- a/lib/AST/DeclBase.cpp +++ b/lib/AST/DeclBase.cpp @@ -839,15 +839,21 @@ DeclContext *DeclContext::getPrimaryContext() { } } -DeclContext *DeclContext::getNextContext() { - switch (DeclKind) { - case Decl::Namespace: - // Return the next namespace - return static_cast<NamespaceDecl*>(this)->getNextNamespace(); - - default: - return 0; +void +DeclContext::collectAllContexts(llvm::SmallVectorImpl<DeclContext *> &Contexts){ + Contexts.clear(); + + if (DeclKind != Decl::Namespace) { + Contexts.push_back(this); + return; } + + NamespaceDecl *Self = static_cast<NamespaceDecl *>(this); + for (NamespaceDecl *N = Self->getMostRecentDeclaration(); N; + N = N->getPreviousDeclaration()) + Contexts.push_back(N); + + std::reverse(Contexts.begin(), Contexts.end()); } std::pair<Decl *, Decl *> @@ -1067,15 +1073,17 @@ void DeclContext::addDeclInternal(Decl *D) { /// declarations in DCtx (and any other contexts linked to it or /// transparent contexts nested within it). void DeclContext::buildLookup(DeclContext *DCtx) { - for (; DCtx; DCtx = DCtx->getNextContext()) { - for (decl_iterator D = DCtx->decls_begin(), - DEnd = DCtx->decls_end(); + llvm::SmallVector<DeclContext *, 2> Contexts; + DCtx->collectAllContexts(Contexts); + for (unsigned I = 0, N = Contexts.size(); I != N; ++I) { + for (decl_iterator D = Contexts[I]->decls_begin(), + DEnd = Contexts[I]->decls_end(); D != DEnd; ++D) { // Insert this declaration into the lookup structure, but only // if it's semantically in its decl context. During non-lazy // lookup building, this is implicitly enforced by addDecl. if (NamedDecl *ND = dyn_cast<NamedDecl>(*D)) - if (D->getDeclContext() == DCtx) + if (D->getDeclContext() == Contexts[I]) makeDeclVisibleInContextImpl(ND, false); // If this declaration is itself a transparent declaration context or |