forked from OSchip/llvm-project
D40901: Refactor lazy loading of template specializations. NFC
llvm-svn: 320763
This commit is contained in:
parent
27e7f9c809
commit
61f6429e32
|
@ -790,6 +790,8 @@ protected:
|
|||
return SpecIterator<EntryType>(isEnd ? Specs.end() : Specs.begin());
|
||||
}
|
||||
|
||||
void loadLazySpecializationsImpl() const;
|
||||
|
||||
template <class EntryType> typename SpecEntryTraits<EntryType>::DeclType*
|
||||
findSpecializationImpl(llvm::FoldingSetVector<EntryType> &Specs,
|
||||
ArrayRef<TemplateArgument> Args, void *&InsertPos);
|
||||
|
@ -808,6 +810,13 @@ protected:
|
|||
/// was explicitly specialized.
|
||||
llvm::PointerIntPair<RedeclarableTemplateDecl*, 1, bool>
|
||||
InstantiatedFromMember;
|
||||
|
||||
/// \brief If non-null, points to an array of specializations (including
|
||||
/// partial specializations) known only by their external declaration IDs.
|
||||
///
|
||||
/// The first value in the array is the number of specializations/partial
|
||||
/// specializations that follow.
|
||||
uint32_t *LazySpecializations = nullptr;
|
||||
};
|
||||
|
||||
/// \brief Pointer to the common data shared by all declarations of this
|
||||
|
@ -975,13 +984,6 @@ protected:
|
|||
/// require the use of this information.
|
||||
TemplateArgument *InjectedArgs = nullptr;
|
||||
|
||||
/// \brief If non-null, points to an array of specializations known only
|
||||
/// by their external declaration IDs.
|
||||
///
|
||||
/// The first value in the array is the number of of specializations
|
||||
/// that follow.
|
||||
uint32_t *LazySpecializations = nullptr;
|
||||
|
||||
Common() = default;
|
||||
};
|
||||
|
||||
|
@ -2065,13 +2067,6 @@ protected:
|
|||
/// \brief The injected-class-name type for this class template.
|
||||
QualType InjectedClassNameType;
|
||||
|
||||
/// \brief If non-null, points to an array of specializations (including
|
||||
/// partial specializations) known only by their external declaration IDs.
|
||||
///
|
||||
/// The first value in the array is the number of of specializations/
|
||||
/// partial specializations that follow.
|
||||
uint32_t *LazySpecializations = nullptr;
|
||||
|
||||
Common() = default;
|
||||
};
|
||||
|
||||
|
@ -2885,13 +2880,6 @@ protected:
|
|||
llvm::FoldingSetVector<VarTemplatePartialSpecializationDecl>
|
||||
PartialSpecializations;
|
||||
|
||||
/// \brief If non-null, points to an array of specializations (including
|
||||
/// partial specializations) known ownly by their external declaration IDs.
|
||||
///
|
||||
/// The first value in the array is the number of of specializations/
|
||||
/// partial specializations that follow.
|
||||
uint32_t *LazySpecializations = nullptr;
|
||||
|
||||
Common() = default;
|
||||
};
|
||||
|
||||
|
|
|
@ -182,6 +182,19 @@ RedeclarableTemplateDecl::CommonBase *RedeclarableTemplateDecl::getCommonPtr() c
|
|||
return Common;
|
||||
}
|
||||
|
||||
void RedeclarableTemplateDecl::loadLazySpecializationsImpl() const {
|
||||
// Grab the most recent declaration to ensure we've loaded any lazy
|
||||
// redeclarations of this template.
|
||||
CommonBase *CommonBasePtr = getMostRecentDecl()->getCommonPtr();
|
||||
if (CommonBasePtr->LazySpecializations) {
|
||||
ASTContext &Context = getASTContext();
|
||||
uint32_t *Specs = CommonBasePtr->LazySpecializations;
|
||||
CommonBasePtr->LazySpecializations = nullptr;
|
||||
for (uint32_t I = 0, N = *Specs++; I != N; ++I)
|
||||
(void)Context.getExternalSource()->GetExternalDecl(Specs[I]);
|
||||
}
|
||||
}
|
||||
|
||||
template<class EntryType>
|
||||
typename RedeclarableTemplateDecl::SpecEntryTraits<EntryType>::DeclType *
|
||||
RedeclarableTemplateDecl::findSpecializationImpl(
|
||||
|
@ -190,7 +203,7 @@ RedeclarableTemplateDecl::findSpecializationImpl(
|
|||
using SETraits = SpecEntryTraits<EntryType>;
|
||||
|
||||
llvm::FoldingSetNodeID ID;
|
||||
EntryType::Profile(ID,Args, getASTContext());
|
||||
EntryType::Profile(ID, Args, getASTContext());
|
||||
EntryType *Entry = Specs.FindNodeOrInsertPos(ID, InsertPos);
|
||||
return Entry ? SETraits::getDecl(Entry)->getMostRecentDecl() : nullptr;
|
||||
}
|
||||
|
@ -251,18 +264,7 @@ FunctionTemplateDecl::newCommon(ASTContext &C) const {
|
|||
}
|
||||
|
||||
void FunctionTemplateDecl::LoadLazySpecializations() const {
|
||||
// Grab the most recent declaration to ensure we've loaded any lazy
|
||||
// redeclarations of this template.
|
||||
//
|
||||
// FIXME: Avoid walking the entire redeclaration chain here.
|
||||
Common *CommonPtr = getMostRecentDecl()->getCommonPtr();
|
||||
if (CommonPtr->LazySpecializations) {
|
||||
ASTContext &Context = getASTContext();
|
||||
uint32_t *Specs = CommonPtr->LazySpecializations;
|
||||
CommonPtr->LazySpecializations = nullptr;
|
||||
for (uint32_t I = 0, N = *Specs++; I != N; ++I)
|
||||
(void)Context.getExternalSource()->GetExternalDecl(Specs[I]);
|
||||
}
|
||||
loadLazySpecializationsImpl();
|
||||
}
|
||||
|
||||
llvm::FoldingSetVector<FunctionTemplateSpecializationInfo> &
|
||||
|
@ -330,18 +332,7 @@ ClassTemplateDecl *ClassTemplateDecl::CreateDeserialized(ASTContext &C,
|
|||
}
|
||||
|
||||
void ClassTemplateDecl::LoadLazySpecializations() const {
|
||||
// Grab the most recent declaration to ensure we've loaded any lazy
|
||||
// redeclarations of this template.
|
||||
//
|
||||
// FIXME: Avoid walking the entire redeclaration chain here.
|
||||
Common *CommonPtr = getMostRecentDecl()->getCommonPtr();
|
||||
if (CommonPtr->LazySpecializations) {
|
||||
ASTContext &Context = getASTContext();
|
||||
uint32_t *Specs = CommonPtr->LazySpecializations;
|
||||
CommonPtr->LazySpecializations = nullptr;
|
||||
for (uint32_t I = 0, N = *Specs++; I != N; ++I)
|
||||
(void)Context.getExternalSource()->GetExternalDecl(Specs[I]);
|
||||
}
|
||||
loadLazySpecializationsImpl();
|
||||
}
|
||||
|
||||
llvm::FoldingSetVector<ClassTemplateSpecializationDecl> &
|
||||
|
@ -941,21 +932,8 @@ VarTemplateDecl *VarTemplateDecl::CreateDeserialized(ASTContext &C,
|
|||
DeclarationName(), nullptr, nullptr);
|
||||
}
|
||||
|
||||
// TODO: Unify across class, function and variable templates?
|
||||
// May require moving this and Common to RedeclarableTemplateDecl.
|
||||
void VarTemplateDecl::LoadLazySpecializations() const {
|
||||
// Grab the most recent declaration to ensure we've loaded any lazy
|
||||
// redeclarations of this template.
|
||||
//
|
||||
// FIXME: Avoid walking the entire redeclaration chain here.
|
||||
Common *CommonPtr = getMostRecentDecl()->getCommonPtr();
|
||||
if (CommonPtr->LazySpecializations) {
|
||||
ASTContext &Context = getASTContext();
|
||||
uint32_t *Specs = CommonPtr->LazySpecializations;
|
||||
CommonPtr->LazySpecializations = nullptr;
|
||||
for (uint32_t I = 0, N = *Specs++; I != N; ++I)
|
||||
(void)Context.getExternalSource()->GetExternalDecl(Specs[I]);
|
||||
}
|
||||
loadLazySpecializationsImpl();
|
||||
}
|
||||
|
||||
llvm::FoldingSetVector<VarTemplateSpecializationDecl> &
|
||||
|
|
Loading…
Reference in New Issue