diff options
author | Douglas Gregor <dgregor@apple.com> | 2010-10-27 22:21:36 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2010-10-27 22:21:36 +0000 |
commit | c8e5cf8f725e111965debb7130ef7466c0c73884 (patch) | |
tree | 6bf6d1a55a3bb60a8987e3e1cb0d732c081f1623 /lib/AST/DeclTemplate.cpp | |
parent | 538815592d51cd2dbb2c0ae99f2913808308def5 (diff) |
Make AST deserialization for class template specializations lazier, by
not loading the specializations of a class template until some AST
consumer needs them.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@117498 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/AST/DeclTemplate.cpp')
-rw-r--r-- | lib/AST/DeclTemplate.cpp | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/lib/AST/DeclTemplate.cpp b/lib/AST/DeclTemplate.cpp index d96b830d17..36b92fa022 100644 --- a/lib/AST/DeclTemplate.cpp +++ b/lib/AST/DeclTemplate.cpp @@ -189,6 +189,29 @@ ClassTemplateDecl *ClassTemplateDecl::Create(ASTContext &C, return New; } +void ClassTemplateDecl::LoadLazySpecializations() { + Common *CommonPtr = getCommonPtr(); + if (CommonPtr->LazySpecializations) { + ASTContext &Context = getASTContext(); + uint32_t *Specs = CommonPtr->LazySpecializations; + CommonPtr->LazySpecializations = 0; + for (uint32_t I = 0, N = *Specs++; I != N; ++I) + (void)Context.getExternalSource()->GetExternalDecl(Specs[I]); + } +} + +llvm::FoldingSet<ClassTemplateSpecializationDecl> & +ClassTemplateDecl::getSpecializations() { + LoadLazySpecializations(); + return getCommonPtr()->Specializations; +} + +llvm::FoldingSet<ClassTemplatePartialSpecializationDecl> & +ClassTemplateDecl::getPartialSpecializations() { + LoadLazySpecializations(); + return getCommonPtr()->PartialSpecializations; +} + RedeclarableTemplateDecl::CommonBase * ClassTemplateDecl::newCommon(ASTContext &C) { Common *CommonPtr = new (C) Common; |