On Oct 28, 2010, at 6:58 AM, Douglas Gregor wrote: > > On Oct 28, 2010, at 12:38 AM, Argyrios Kyrtzidis wrote: > >> Author: akirtzidis >> Date: Thu Oct 28 02:38:42 2010 >> New Revision: 117533 >> >> URL: http://llvm.org/viewvc/llvm-project?rev=117533&view=rev >> Log: >> Use the ASTMutationListener to track added template specializations in a >> chained PCH. > > Comment below... > >> Modified: >> cfe/trunk/include/clang/AST/ASTMutationListener.h >> cfe/trunk/include/clang/AST/DeclTemplate.h >> cfe/trunk/include/clang/Serialization/ASTBitCodes.h >> cfe/trunk/include/clang/Serialization/ASTReader.h >> cfe/trunk/include/clang/Serialization/ASTWriter.h >> cfe/trunk/lib/AST/DeclTemplate.cpp >> cfe/trunk/lib/Serialization/ASTCommon.h >> cfe/trunk/lib/Serialization/ASTReader.cpp >> cfe/trunk/lib/Serialization/ASTReaderDecl.cpp >> cfe/trunk/lib/Serialization/ASTWriter.cpp >> cfe/trunk/lib/Serialization/ASTWriterDecl.cpp >> >> Modified: cfe/trunk/include/clang/AST/ASTMutationListener.h >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/ASTMutationListener.h?rev=117533&r1=117532&r2=117533&view=diff >> ============================================================================== >> --- cfe/trunk/include/clang/AST/ASTMutationListener.h (original) >> +++ cfe/trunk/include/clang/AST/ASTMutationListener.h Thu Oct 28 02:38:42 >> 2010 >> @@ -14,9 +14,11 @@ >> #define LLVM_CLANG_AST_ASTMUTATIONLISTENER_H >> >> namespace clang { >> + class Decl; >> class TagDecl; >> class CXXRecordDecl; >> - class CXXMethodDecl; >> + class ClassTemplateDecl; >> + class ClassTemplateSpecializationDecl; >> >> /// \brief An abstract interface that should be implemented by listeners >> /// that want to be notified when an AST entity gets modified after its >> @@ -30,6 +32,11 @@ >> >> /// \brief An implicit member was added after the definition was completed. >> virtual void AddedCXXImplicitMember(const CXXRecordDecl *RD, const Decl *D) >> {} >> + >> + /// \brief A template specialization (or partial one) was added to the >> + /// template declaration. >> + virtual void AddedCXXTemplateSpecialization(const ClassTemplateDecl *TD, >> + const ClassTemplateSpecializationDecl >> *D) {} >> }; >> >> } // end namespace clang >> >> Modified: cfe/trunk/include/clang/AST/DeclTemplate.h >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/DeclTemplate.h?rev=117533&r1=117532&r2=117533&view=diff >> ============================================================================== >> --- cfe/trunk/include/clang/AST/DeclTemplate.h (original) >> +++ cfe/trunk/include/clang/AST/DeclTemplate.h Thu Oct 28 02:38:42 2010 >> @@ -1697,9 +1697,7 @@ >> >> /// \brief Insert the specified specialization knowing that it is not >> already >> /// in. InsertPos must be obtained from findSpecialization. >> - void AddSpecialization(ClassTemplateSpecializationDecl *D, void >> *InsertPos) { >> - getSpecializations().InsertNode(D, InsertPos); >> - } >> + void AddSpecialization(ClassTemplateSpecializationDecl *D, void >> *InsertPos); >> >> ClassTemplateDecl *getCanonicalDecl() { >> return redeclarable_base::getCanonicalDecl(); >> @@ -1733,9 +1731,7 @@ >> /// \brief Insert the specified partial specialization knowing that it is >> not >> /// already in. InsertPos must be obtained from findPartialSpecialization. >> void AddPartialSpecialization(ClassTemplatePartialSpecializationDecl *D, >> - void *InsertPos) { >> - getPartialSpecializations().InsertNode(D, InsertPos); >> - } >> + void *InsertPos); >> >> /// \brief Return the next partial specialization sequence number. >> unsigned getNextPartialSpecSequenceNumber() { >> >> Modified: cfe/trunk/include/clang/Serialization/ASTBitCodes.h >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Serialization/ASTBitCodes.h?rev=117533&r1=117532&r2=117533&view=diff >> ============================================================================== >> --- cfe/trunk/include/clang/Serialization/ASTBitCodes.h (original) >> +++ cfe/trunk/include/clang/Serialization/ASTBitCodes.h Thu Oct 28 02:38:42 >> 2010 >> @@ -327,17 +327,13 @@ >> /// In practice, this should only be used for the TU and namespaces. >> UPDATE_VISIBLE = 34, >> >> - /// \brief Record code for template specializations introduced after >> - /// serializations of the original template decl. >> - ADDITIONAL_TEMPLATE_SPECIALIZATIONS = 35, >> - >> /// \brief Record for offsets of DECL_UPDATES records for declarations >> /// that were modified after being deserialized and need updates. >> - DECL_UPDATE_OFFSETS = 36, >> + DECL_UPDATE_OFFSETS = 35, >> >> /// \brief Record of updates for a declaration that was modified after >> /// being deserialized. >> - DECL_UPDATES = 37 >> + DECL_UPDATES = 36 >> }; >> >> /// \brief Record types used within a source manager block. >> >> Modified: cfe/trunk/include/clang/Serialization/ASTReader.h >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Serialization/ASTReader.h?rev=117533&r1=117532&r2=117533&view=diff >> ============================================================================== >> --- cfe/trunk/include/clang/Serialization/ASTReader.h (original) >> +++ cfe/trunk/include/clang/Serialization/ASTReader.h Thu Oct 28 02:38:42 >> 2010 >> @@ -458,16 +458,6 @@ >> /// most recent declarations in another AST file. >> FirstLatestDeclIDMap FirstLatestDeclIDs; >> >> - typedef llvm::SmallVector<serialization::DeclID, 4> >> - AdditionalTemplateSpecializations; >> - typedef llvm::DenseMap<serialization::DeclID, >> - AdditionalTemplateSpecializations> >> - AdditionalTemplateSpecializationsMap; >> - >> - /// \brief Additional specializations (including partial) of templates >> that >> - /// were introduced after the template was serialized. >> - AdditionalTemplateSpecializationsMap >> AdditionalTemplateSpecializationsPending; >> - >> /// \brief Read the records that describe the contents of declcontexts. >> bool ReadDeclContextStorage(llvm::BitstreamCursor &Cursor, >> const std::pair<uint64_t, uint64_t> &Offsets, >> >> Modified: cfe/trunk/include/clang/Serialization/ASTWriter.h >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Serialization/ASTWriter.h?rev=117533&r1=117532&r2=117533&view=diff >> ============================================================================== >> --- cfe/trunk/include/clang/Serialization/ASTWriter.h (original) >> +++ cfe/trunk/include/clang/Serialization/ASTWriter.h Thu Oct 28 02:38:42 >> 2010 >> @@ -236,16 +236,6 @@ >> llvm::SmallVector<std::pair<serialization::DeclID, uint64_t>, 16> >> ReplacedDecls; >> >> - typedef llvm::SmallVector<serialization::DeclID, 4> >> - AdditionalTemplateSpecializationsList; >> - typedef llvm::DenseMap<serialization::DeclID, >> - AdditionalTemplateSpecializationsList> >> - AdditionalTemplateSpecializationsMap; >> - >> - /// \brief Additional specializations (including partial) of templates >> that >> - /// were introduced after the template was serialized. >> - AdditionalTemplateSpecializationsMap AdditionalTemplateSpecializations; >> - >> /// \brief Statements that we've encountered while serializing a >> /// declaration or type. >> llvm::SmallVector<Stmt *, 16> StmtsToEmit; >> @@ -296,7 +286,6 @@ >> void WriteDeclUpdatesBlocks(); >> void WriteDeclReplacementsBlock(); >> void WriteDeclContextVisibleUpdate(const DeclContext *DC); >> - void WriteAdditionalTemplateSpecializations(); >> >> unsigned ParmVarDeclAbbrev; >> unsigned DeclContextLexicalAbbrev; >> @@ -459,13 +448,6 @@ >> UpdatedNamespaces.insert(NS); >> } >> >> - /// \brief Record a template specialization or partial specialization of >> - /// a template from a previous PCH file. >> - void AddAdditionalTemplateSpecialization(serialization::DeclID Templ, >> - serialization::DeclID Spec) { >> - AdditionalTemplateSpecializations[Templ].push_back(Spec); >> - } >> - >> /// \brief Note that the identifier II occurs at the given offset >> /// within the identifier table. >> void SetIdentifierOffset(const IdentifierInfo *II, uint32_t Offset); >> @@ -515,6 +497,8 @@ >> // ASTMutationListener implementation. >> virtual void CompletedTagDefinition(const TagDecl *D); >> virtual void AddedCXXImplicitMember(const CXXRecordDecl *RD, const Decl *D); >> + virtual void AddedCXXTemplateSpecialization(const ClassTemplateDecl *TD, >> + const ClassTemplateSpecializationDecl >> *D); >> }; >> >> /// \brief AST and semantic-analysis consumer that generates a >> >> Modified: cfe/trunk/lib/AST/DeclTemplate.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/DeclTemplate.cpp?rev=117533&r1=117532&r2=117533&view=diff >> ============================================================================== >> --- cfe/trunk/lib/AST/DeclTemplate.cpp (original) >> +++ cfe/trunk/lib/AST/DeclTemplate.cpp Thu Oct 28 02:38:42 2010 >> @@ -16,6 +16,7 @@ >> #include "clang/AST/Expr.h" >> #include "clang/AST/ASTContext.h" >> #include "clang/AST/TypeLoc.h" >> +#include "clang/AST/ASTMutationListener.h" >> #include "clang/Basic/IdentifierTable.h" >> #include "llvm/ADT/STLExtras.h" >> using namespace clang; >> @@ -225,6 +226,13 @@ >> return findSpecializationImpl(getSpecializations(), Args, NumArgs, >> InsertPos); >> } >> >> +void ClassTemplateDecl::AddSpecialization(ClassTemplateSpecializationDecl >> *D, >> + void *InsertPos) { >> + getSpecializations().InsertNode(D, InsertPos); >> + if (ASTMutationListener *L = getASTMutationListener()) >> + L->AddedCXXTemplateSpecialization(this, D); >> +} >> + >> ClassTemplatePartialSpecializationDecl * >> ClassTemplateDecl::findPartialSpecialization(const TemplateArgument *Args, >> unsigned NumArgs, >> @@ -233,6 +241,14 @@ >> InsertPos); >> } >> >> +void ClassTemplateDecl::AddPartialSpecialization( >> + >> ClassTemplatePartialSpecializationDecl *D, >> + void *InsertPos) { >> + getPartialSpecializations().InsertNode(D, InsertPos); >> + if (ASTMutationListener *L = getASTMutationListener()) >> + L->AddedCXXTemplateSpecialization(this, D); >> +} >> + >> void ClassTemplateDecl::getPartialSpecializations( >> llvm::SmallVectorImpl<ClassTemplatePartialSpecializationDecl *> >> &PS) { >> llvm::FoldingSet<ClassTemplatePartialSpecializationDecl> &PartialSpecs >> >> Modified: cfe/trunk/lib/Serialization/ASTCommon.h >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTCommon.h?rev=117533&r1=117532&r2=117533&view=diff >> ============================================================================== >> --- cfe/trunk/lib/Serialization/ASTCommon.h (original) >> +++ cfe/trunk/lib/Serialization/ASTCommon.h Thu Oct 28 02:38:42 2010 >> @@ -22,7 +22,8 @@ >> >> enum DeclUpdateKind { >> UPD_CXX_SET_DEFINITIONDATA, >> - UPD_CXX_ADDED_IMPLICIT_MEMBER >> + UPD_CXX_ADDED_IMPLICIT_MEMBER, >> + UPD_CXX_ADDED_TEMPLATE_SPECIALIZATION >> }; >> >> TypeIdx TypeIdxFromBuiltin(const BuiltinType *BT); >> >> Modified: cfe/trunk/lib/Serialization/ASTReader.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReader.cpp?rev=117533&r1=117532&r2=117533&view=diff >> ============================================================================== >> --- cfe/trunk/lib/Serialization/ASTReader.cpp (original) >> +++ cfe/trunk/lib/Serialization/ASTReader.cpp Thu Oct 28 02:38:42 2010 >> @@ -2069,13 +2069,6 @@ >> std::make_pair(&F, Record[I+1]); >> break; >> } >> - >> - case ADDITIONAL_TEMPLATE_SPECIALIZATIONS: { >> - AdditionalTemplateSpecializations &ATS = >> - AdditionalTemplateSpecializationsPending[Record[0]]; >> - ATS.insert(ATS.end(), Record.begin()+1, Record.end()); >> - break; >> - } >> } >> First = false; >> } >> >> Modified: cfe/trunk/lib/Serialization/ASTReaderDecl.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReaderDecl.cpp?rev=117533&r1=117532&r2=117533&view=diff >> ============================================================================== >> --- cfe/trunk/lib/Serialization/ASTReaderDecl.cpp (original) >> +++ cfe/trunk/lib/Serialization/ASTReaderDecl.cpp Thu Oct 28 02:38:42 2010 >> @@ -1553,20 +1553,6 @@ >> } >> } >> } >> - >> - // If this is a template, read additional specializations that may be in a >> - // different part of the chain. >> - if (isa<RedeclarableTemplateDecl>(D)) { >> - AdditionalTemplateSpecializationsMap::iterator F = >> - AdditionalTemplateSpecializationsPending.find(ID); >> - if (F != AdditionalTemplateSpecializationsPending.end()) { >> - for (AdditionalTemplateSpecializations::iterator I = >> F->second.begin(), >> - E = F->second.end(); >> - I != E; ++I) >> - GetDecl(*I); >> - AdditionalTemplateSpecializationsPending.erase(F); >> - } >> - } >> assert(Idx == Record.size()); >> >> // The declaration may have been modified by files later in the chain. >> @@ -1617,6 +1603,10 @@ >> case UPD_CXX_ADDED_IMPLICIT_MEMBER: >> cast<CXXRecordDecl>(D)->addedMember(Reader.GetDecl(Record[Idx++])); >> break; >> + >> + case UPD_CXX_ADDED_TEMPLATE_SPECIALIZATION: >> + // It will be added to the template's specializations set when loaded. >> + Reader.GetDecl(Record[Idx++]); >> } > > While this comment is true, it isn't the complete solution because some > clients need to walk over all of the partial specializations, and they won't > see any partial specializations that come from a chained PCH file. Sorry I > didn't think of this yesterday when I was making the specializations/partial > specializations loading lazy, but we'll need to generalize that mechanism to > make it work with updates, probably by moving the lazy specializations list > into the ASTReader.
Yes, thanks for letting me know. -Argiris > > - Doug _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
