]> granicus.if.org Git - clang/commitdiff
Minor optimization; Try to iterator over redeclarations only when necessary.
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>
Wed, 20 Oct 2010 16:22:49 +0000 (16:22 +0000)
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>
Wed, 20 Oct 2010 16:22:49 +0000 (16:22 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@116930 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Serialization/ASTReaderDecl.cpp

index 38672a65366d499231fe47fbbb73a0a1011a49d1..af7043b270822b6da6d6d4534e597e91a32d4590 100644 (file)
@@ -769,15 +769,14 @@ void ASTDeclReader::VisitCXXRecordDecl(CXXRecordDecl *D) {
   // We need to allocate the DefinitionData struct ahead of VisitRecordDecl
   // so that the other CXXRecordDecls can get a pointer even when the owner
   // is still initializing.
-  bool OwnsDefinitionData = false;
   enum DataOwnership { Data_NoDefData, Data_Owner, Data_NotOwner };
-  switch ((DataOwnership)Record[Idx++]) {
+  DataOwnership DefOwnership = (DataOwnership)Record[Idx++];
+  switch (DefOwnership) {
   default:
     assert(0 && "Out of sync with ASTDeclWriter or messed up reading");
   case Data_NoDefData:
     break;
   case Data_Owner:
-    OwnsDefinitionData = true;
     D->DefinitionData = new (C) struct CXXRecordDecl::DefinitionData(D);
     break;
   case Data_NotOwner:
@@ -788,11 +787,11 @@ void ASTDeclReader::VisitCXXRecordDecl(CXXRecordDecl *D) {
 
   VisitRecordDecl(D);
 
-  if (D->DefinitionData) {
-    // Synchronize the DefinitionData pointer among all redeclarations.
-    // This synchronization ends up being done multiple times but it's necessary
-    // because a chained PCH may introduce a definition that earlier
-    // redeclarations in another PCH have no information about.
+  // Spread the DefinitionData pointer if it's the definition (it may have
+  // come from a chained PCH and earlier redeclarations don't know it), or
+  // if it just acquired a pointer that it's not supposed to have (a definition
+  // from a chained PCH updated it).
+  if (D->DefinitionData && DefOwnership != Data_NotOwner) {
     llvm::SmallPtrSet<CXXRecordDecl *, 16> PrevRedecls;
     PrevRedecls.insert(D);
     CXXRecordDecl *Redecl = cast<CXXRecordDecl>(D->RedeclLink.getNext());
@@ -806,7 +805,7 @@ void ASTDeclReader::VisitCXXRecordDecl(CXXRecordDecl *D) {
     }
   }
 
-  if (OwnsDefinitionData) {
+  if (DefOwnership == Data_Owner) {
     assert(D->DefinitionData);
     struct CXXRecordDecl::DefinitionData &Data = *D->DefinitionData;