diff options
author | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2010-10-20 16:22:49 +0000 |
---|---|---|
committer | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2010-10-20 16:22:49 +0000 |
commit | 3e8a614b15b74f7126c3d82b399efd95be06f014 (patch) | |
tree | 7863e3478ec6f108a26a304eeea768e1a0c74af1 | |
parent | e0f83863595f5725791d88a799d20dbae38bed4a (diff) |
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
-rw-r--r-- | lib/Serialization/ASTReaderDecl.cpp | 17 |
1 files 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<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; |