зеркало из https://github.com/microsoft/clang-1.git
Make the deserialization of Sema::PendingInstantiations lazy. At this
point, ASTReader::InitializeSema() has very little interesting work, *except* issues stemming from preloaded declarations. That's something we'll still need to cope with. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@136378 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
f3546eeef1
Коммит
6e4a3f5c59
|
@ -27,6 +27,7 @@ struct ObjCMethodList;
|
||||||
class Scope;
|
class Scope;
|
||||||
class Sema;
|
class Sema;
|
||||||
class TypedefNameDecl;
|
class TypedefNameDecl;
|
||||||
|
class ValueDecl;
|
||||||
class VarDecl;
|
class VarDecl;
|
||||||
|
|
||||||
/// \brief A simple structure that captures a vtable use for the purposes of
|
/// \brief A simple structure that captures a vtable use for the purposes of
|
||||||
|
@ -162,6 +163,17 @@ public:
|
||||||
/// source should take care not to introduce the same vtables repeatedly.
|
/// source should take care not to introduce the same vtables repeatedly.
|
||||||
virtual void ReadUsedVTables(SmallVectorImpl<ExternalVTableUse> &VTables) {}
|
virtual void ReadUsedVTables(SmallVectorImpl<ExternalVTableUse> &VTables) {}
|
||||||
|
|
||||||
|
/// \brief Read the set of pending instantiations known to the external
|
||||||
|
/// Sema source.
|
||||||
|
///
|
||||||
|
/// The external source should append its own pending instantiations to the
|
||||||
|
/// given vector. Note that this routine may be invoked multiple times; the
|
||||||
|
/// external source should take care not to introduce the same instantiations
|
||||||
|
/// repeatedly.
|
||||||
|
virtual void ReadPendingInstantiations(
|
||||||
|
SmallVectorImpl<std::pair<ValueDecl *,
|
||||||
|
SourceLocation> > &Pending) {}
|
||||||
|
|
||||||
// isa/cast/dyn_cast support
|
// isa/cast/dyn_cast support
|
||||||
static bool classof(const ExternalASTSource *Source) {
|
static bool classof(const ExternalASTSource *Source) {
|
||||||
return Source->SemaSource;
|
return Source->SemaSource;
|
||||||
|
|
|
@ -1406,6 +1406,10 @@ public:
|
||||||
|
|
||||||
virtual void ReadUsedVTables(SmallVectorImpl<ExternalVTableUse> &VTables);
|
virtual void ReadUsedVTables(SmallVectorImpl<ExternalVTableUse> &VTables);
|
||||||
|
|
||||||
|
virtual void ReadPendingInstantiations(
|
||||||
|
SmallVectorImpl<std::pair<ValueDecl *,
|
||||||
|
SourceLocation> > &Pending);
|
||||||
|
|
||||||
/// \brief Load a selector from disk, registering its ID if it exists.
|
/// \brief Load a selector from disk, registering its ID if it exists.
|
||||||
void LoadSelector(Selector Sel);
|
void LoadSelector(Selector Sel);
|
||||||
|
|
||||||
|
|
|
@ -3229,6 +3229,14 @@ NamedDecl *Sema::FindInstantiatedDecl(SourceLocation Loc, NamedDecl *D,
|
||||||
/// \brief Performs template instantiation for all implicit template
|
/// \brief Performs template instantiation for all implicit template
|
||||||
/// instantiations we have seen until this point.
|
/// instantiations we have seen until this point.
|
||||||
void Sema::PerformPendingInstantiations(bool LocalOnly) {
|
void Sema::PerformPendingInstantiations(bool LocalOnly) {
|
||||||
|
// Load pending instantiations from the external source.
|
||||||
|
if (!LocalOnly && ExternalSource) {
|
||||||
|
SmallVector<std::pair<ValueDecl *, SourceLocation>, 4> Pending;
|
||||||
|
ExternalSource->ReadPendingInstantiations(Pending);
|
||||||
|
PendingInstantiations.insert(PendingInstantiations.begin(),
|
||||||
|
Pending.begin(), Pending.end());
|
||||||
|
}
|
||||||
|
|
||||||
while (!PendingLocalImplicitInstantiations.empty() ||
|
while (!PendingLocalImplicitInstantiations.empty() ||
|
||||||
(!LocalOnly && !PendingInstantiations.empty())) {
|
(!LocalOnly && !PendingInstantiations.empty())) {
|
||||||
PendingImplicitInstantiation Inst;
|
PendingImplicitInstantiation Inst;
|
||||||
|
|
|
@ -4405,15 +4405,6 @@ void ASTReader::InitializeSema(Sema &S) {
|
||||||
SemaObj->StdBadAlloc = SemaDeclRefs[1];
|
SemaObj->StdBadAlloc = SemaDeclRefs[1];
|
||||||
}
|
}
|
||||||
|
|
||||||
// If there were any pending implicit instantiations, deserialize them
|
|
||||||
// and add them to Sema's queue of such instantiations.
|
|
||||||
for (unsigned Idx = 0, N = PendingInstantiations.size(); Idx < N;) {
|
|
||||||
ValueDecl *D = cast<ValueDecl>(GetDecl(PendingInstantiations[Idx++]));
|
|
||||||
SourceLocation Loc
|
|
||||||
= SourceLocation::getFromRawEncoding(PendingInstantiations[Idx++]);
|
|
||||||
SemaObj->PendingInstantiations.push_back(std::make_pair(D, Loc));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!FPPragmaOptions.empty()) {
|
if (!FPPragmaOptions.empty()) {
|
||||||
assert(FPPragmaOptions.size() == 1 && "Wrong number of FP_PRAGMA_OPTIONS");
|
assert(FPPragmaOptions.size() == 1 && "Wrong number of FP_PRAGMA_OPTIONS");
|
||||||
SemaObj->FPFeatures.fp_contract = FPPragmaOptions[0];
|
SemaObj->FPFeatures.fp_contract = FPPragmaOptions[0];
|
||||||
|
@ -4660,6 +4651,17 @@ void ASTReader::ReadUsedVTables(SmallVectorImpl<ExternalVTableUse> &VTables) {
|
||||||
VTableUses.clear();
|
VTableUses.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ASTReader::ReadPendingInstantiations(
|
||||||
|
SmallVectorImpl<std::pair<ValueDecl *, SourceLocation> > &Pending) {
|
||||||
|
for (unsigned Idx = 0, N = PendingInstantiations.size(); Idx < N;) {
|
||||||
|
ValueDecl *D = cast<ValueDecl>(GetDecl(PendingInstantiations[Idx++]));
|
||||||
|
SourceLocation Loc
|
||||||
|
= SourceLocation::getFromRawEncoding(PendingInstantiations[Idx++]);
|
||||||
|
Pending.push_back(std::make_pair(D, Loc));
|
||||||
|
}
|
||||||
|
PendingInstantiations.clear();
|
||||||
|
}
|
||||||
|
|
||||||
void ASTReader::LoadSelector(Selector Sel) {
|
void ASTReader::LoadSelector(Selector Sel) {
|
||||||
// It would be complicated to avoid reading the methods anyway. So don't.
|
// It would be complicated to avoid reading the methods anyway. So don't.
|
||||||
ReadMethodPool(Sel);
|
ReadMethodPool(Sel);
|
||||||
|
|
Загрузка…
Ссылка в новой задаче