[cfe-commits] r108016 - in /cfe/trunk/lib/Frontend: PCHReaderDecl.cpp PCHWriterDecl.cpp

Argyrios Kyrtzidis akyrtzi at gmail.com
Fri Jul 9 14:11:43 PDT 2010


Author: akirtzidis
Date: Fri Jul  9 16:11:43 2010
New Revision: 108016

URL: http://llvm.org/viewvc/llvm-project?rev=108016&view=rev
Log:
Reorganize how ClassTemplate[Partial]SpecializationDecls are read/written to avoid the
possibility of adding an unitialized one into the folding set.

Modified:
    cfe/trunk/lib/Frontend/PCHReaderDecl.cpp
    cfe/trunk/lib/Frontend/PCHWriterDecl.cpp

Modified: cfe/trunk/lib/Frontend/PCHReaderDecl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/PCHReaderDecl.cpp?rev=108016&r1=108015&r2=108016&view=diff
==============================================================================
--- cfe/trunk/lib/Frontend/PCHReaderDecl.cpp (original)
+++ cfe/trunk/lib/Frontend/PCHReaderDecl.cpp Fri Jul  9 16:11:43 2010
@@ -873,36 +873,15 @@
   if (PrevDecl == 0) {
     // This ClassTemplateDecl owns a CommonPtr; read it.
 
+    // FoldingSets are filled in VisitClassTemplateSpecializationDecl.
     unsigned size = Record[Idx++];
-    while (size--) {
-      ClassTemplateSpecializationDecl *CTSD
-         = cast<ClassTemplateSpecializationDecl>(Reader.GetDecl(Record[Idx++]));
-      llvm::SmallVector<TemplateArgument, 8> TemplArgs;
-      Reader.ReadTemplateArgumentList(TemplArgs, Record, Idx);
-      llvm::FoldingSetNodeID ID;
-      void *InsertPos = 0;
-      ClassTemplateSpecializationDecl::Profile(ID, TemplArgs.data(),
-                                               TemplArgs.size(),
-                                               *Reader.getContext());
-      D->getSpecializations().FindNodeOrInsertPos(ID, InsertPos);
-      D->getSpecializations().InsertNode(CTSD, InsertPos);
-    }
+    while (size--)
+      cast<ClassTemplateSpecializationDecl>(Reader.GetDecl(Record[Idx++]));
 
     size = Record[Idx++];
-    while (size--) {
-      ClassTemplatePartialSpecializationDecl *CTSD
-         = cast<ClassTemplatePartialSpecializationDecl>(
+    while (size--)
+      cast<ClassTemplatePartialSpecializationDecl>(
                                                  Reader.GetDecl(Record[Idx++]));
-      llvm::SmallVector<TemplateArgument, 8> TemplArgs;
-      Reader.ReadTemplateArgumentList(TemplArgs, Record, Idx);
-      llvm::FoldingSetNodeID ID;
-      void *InsertPos = 0;
-      ClassTemplatePartialSpecializationDecl::Profile(ID, TemplArgs.data(),
-                                                      TemplArgs.size(),
-                                                      *Reader.getContext());
-      D->getPartialSpecializations().FindNodeOrInsertPos(ID, InsertPos);
-      D->getPartialSpecializations().InsertNode(CTSD, InsertPos);
-    }
 
     // InjectedClassNameType is computed.
 
@@ -944,6 +923,21 @@
   if (POI.isValid())
     D->setPointOfInstantiation(POI);
   D->setSpecializationKind((TemplateSpecializationKind)Record[Idx++]);
+
+  if (Record[Idx++]) { // IsKeptInFoldingSet.
+    ClassTemplateDecl *CanonPattern
+                       = cast<ClassTemplateDecl>(Reader.GetDecl(Record[Idx++]));
+    if (ClassTemplatePartialSpecializationDecl *Partial
+            = dyn_cast<ClassTemplatePartialSpecializationDecl>(D)) {
+      ClassTemplatePartialSpecializationDecl *Inserted
+          = CanonPattern->getPartialSpecializations().GetOrInsertNode(Partial);
+      assert(Inserted == Partial && "Already inserted!");
+    } else {
+      ClassTemplateSpecializationDecl *Inserted
+          = CanonPattern->getSpecializations().GetOrInsertNode(D);
+      assert(Inserted == D && "Already inserted!");
+    }
+  }
 }
 
 void PCHDeclReader::VisitClassTemplatePartialSpecializationDecl(

Modified: cfe/trunk/lib/Frontend/PCHWriterDecl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/PCHWriterDecl.cpp?rev=108016&r1=108015&r2=108016&view=diff
==============================================================================
--- cfe/trunk/lib/Frontend/PCHWriterDecl.cpp (original)
+++ cfe/trunk/lib/Frontend/PCHWriterDecl.cpp Fri Jul  9 16:11:43 2010
@@ -233,7 +233,8 @@
   case FunctionDecl::TK_FunctionTemplateSpecialization: {
     FunctionTemplateSpecializationInfo *
       FTSInfo = D->getTemplateSpecializationInfo();
-    Writer.AddDeclRef(FTSInfo->getTemplate(), Record);
+    // We want it canonical to guarantee that it has a Common*.
+    Writer.AddDeclRef(FTSInfo->getTemplate()->getCanonicalDecl(), Record);
     Record.push_back(FTSInfo->getTemplateSpecializationKind());
     
     // Template arguments.
@@ -826,6 +827,10 @@
   Writer.AddTemplateParameterList(D->getTemplateParameters(), Record);
 }
 
+static bool IsKeptInFoldingSet(ClassTemplateSpecializationDecl *D) {
+  return D->getTypeForDecl()->getAsCXXRecordDecl() == D;
+}
+
 void PCHDeclWriter::VisitClassTemplateDecl(ClassTemplateDecl *D) {
   VisitTemplateDecl(D);
 
@@ -833,27 +838,22 @@
   Writer.AddDeclRef(D->getPreviousDeclaration(), Record);
   if (D->getPreviousDeclaration() == 0) {
     // This ClassTemplateDecl owns the CommonPtr; write it.
+    assert(D->isCanonicalDecl());
 
     typedef llvm::FoldingSet<ClassTemplateSpecializationDecl> CTSDSetTy;
     CTSDSetTy &CTSDSet = D->getSpecializations();
     Record.push_back(CTSDSet.size());
     for (CTSDSetTy::iterator I=CTSDSet.begin(), E = CTSDSet.end(); I!=E; ++I) {
-      ClassTemplateSpecializationDecl *CTSD = &*I; 
-      Writer.AddDeclRef(CTSD, Record);
-      // Write the argument list here because we may get it uninitialized when
-      // reading it back. 
-      Writer.AddTemplateArgumentList(&CTSD->getTemplateArgs(), Record);
+      assert(IsKeptInFoldingSet(&*I));
+      Writer.AddDeclRef(&*I, Record);
     }
 
     typedef llvm::FoldingSet<ClassTemplatePartialSpecializationDecl> CTPSDSetTy;
     CTPSDSetTy &CTPSDSet = D->getPartialSpecializations();
     Record.push_back(CTPSDSet.size());
     for (CTPSDSetTy::iterator I=CTPSDSet.begin(), E=CTPSDSet.end(); I!=E; ++I) {
-      ClassTemplatePartialSpecializationDecl *CTPSD = &*I; 
-      Writer.AddDeclRef(CTPSD, Record);
-      // Write the argument list here because we may get it uninitialized when
-      // reading it back. 
-      Writer.AddTemplateArgumentList(&CTPSD->getTemplateArgs(), Record);
+      assert(IsKeptInFoldingSet(&*I));
+      Writer.AddDeclRef(&*I, Record); 
     }
 
     // InjectedClassNameType is computed, no need to write it.
@@ -891,6 +891,13 @@
   Writer.AddSourceLocation(D->getPointOfInstantiation(), Record);
   Record.push_back(D->getSpecializationKind());
 
+  bool IsInInFoldingSet = IsKeptInFoldingSet(D);
+  Record.push_back(IsInInFoldingSet);
+  if (IsInInFoldingSet) {
+    // When reading, we'll add it to the folding set of this one. 
+    Writer.AddDeclRef(D->getSpecializedTemplate()->getCanonicalDecl(), Record);
+  }
+
   Code = pch::DECL_CLASS_TEMPLATE_SPECIALIZATION;
 }
 





More information about the cfe-commits mailing list