From 3e8a614b15b74f7126c3d82b399efd95be06f014 Mon Sep 17 00:00:00 2001 From: Argyrios Kyrtzidis Date: Wed, 20 Oct 2010 16:22:49 +0000 Subject: [PATCH] Minor optimization; Try to iterator over redeclarations only when necessary. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@116930 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Serialization/ASTReaderDecl.cpp | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/lib/Serialization/ASTReaderDecl.cpp b/lib/Serialization/ASTReaderDecl.cpp index 38672a6536..af7043b270 100644 --- a/lib/Serialization/ASTReaderDecl.cpp +++ b/lib/Serialization/ASTReaderDecl.cpp @@ -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 PrevRedecls; PrevRedecls.insert(D); CXXRecordDecl *Redecl = cast(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; -- 2.40.0