From: Douglas Gregor Date: Mon, 19 Dec 2011 20:51:16 +0000 (+0000) Subject: Remove ASTReader's PendingForwardRefs, which is now handled by the X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=21cf08b7e0c03266f37f436c2afd8521c643b31a;p=clang Remove ASTReader's PendingForwardRefs, which is now handled by the (more general) fix-up of definition data pointers. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@146903 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Serialization/ASTReader.h b/include/clang/Serialization/ASTReader.h index 507b75f33c..bbeacb4f22 100644 --- a/include/clang/Serialization/ASTReader.h +++ b/include/clang/Serialization/ASTReader.h @@ -328,16 +328,7 @@ private: /// \brief Updates to the visible declarations of declaration contexts that /// haven't been loaded yet. DeclContextVisibleUpdatesPending PendingVisibleUpdates; - - typedef SmallVector ForwardRefs; - typedef llvm::DenseMap - PendingForwardRefsMap; - /// \brief Forward references that have a definition but the definition decl - /// is still initializing. When the definition gets read it will update - /// the DefinitionData pointer of all pending references. - PendingForwardRefsMap PendingForwardRefs; - /// \brief The set of C++ or Objective-C classes that have forward /// declarations that have not yet been linked to their definitions. llvm::SmallPtrSet PendingDefinitions; diff --git a/lib/Serialization/ASTReader.cpp b/lib/Serialization/ASTReader.cpp index 2b417522bc..bc4fa668b3 100644 --- a/lib/Serialization/ASTReader.cpp +++ b/lib/Serialization/ASTReader.cpp @@ -6149,9 +6149,6 @@ void ASTReader::FinishedDeserializing() { finishPendingActions(); PendingDeclChainsKnown.clear(); - - assert(PendingForwardRefs.size() == 0 && - "Some forward refs did not get linked to the definition!"); } --NumCurrentElementsDeserializing; } diff --git a/lib/Serialization/ASTReaderDecl.cpp b/lib/Serialization/ASTReaderDecl.cpp index bd6a5a5e06..77ea318dc0 100644 --- a/lib/Serialization/ASTReaderDecl.cpp +++ b/lib/Serialization/ASTReaderDecl.cpp @@ -615,32 +615,10 @@ void ASTDeclReader::VisitObjCInterfaceDecl(ObjCInterfaceDecl *ID) { // We will rebuild this list lazily. ID->setIvarList(0); - // If there are any pending forward references, make their definition data - // pointers point at the newly-allocated data. - ASTReader::PendingForwardRefsMap::iterator - FindI = Reader.PendingForwardRefs.find(ID); - if (FindI != Reader.PendingForwardRefs.end()) { - ASTReader::ForwardRefs &Refs = FindI->second; - for (ASTReader::ForwardRefs::iterator I = Refs.begin(), - E = Refs.end(); - I != E; ++I) - cast(*I)->Data = ID->Data; -#ifndef NDEBUG - // We later check whether PendingForwardRefs is empty to make sure all - // pending references were linked. - Reader.PendingForwardRefs.erase(ID); -#endif - - // Note that we have deserialized a definition. - Reader.PendingDefinitions.insert(ID); - } - } else if (Def) { - if (Def->Data) { - ID->Data = Def->Data; - } else { - // The definition is still initializing. - Reader.PendingForwardRefs[Def].push_back(ID); - } + // Note that we have deserialized a definition. + Reader.PendingDefinitions.insert(ID); + } else if (Def && Def->Data) { + ID->Data = Def->Data; } } @@ -1018,31 +996,11 @@ void ASTDeclReader::InitializeCXXDefinitionData(CXXRecordDecl *D, if (D == DefinitionDecl) { D->DefinitionData = new (C) struct CXXRecordDecl::DefinitionData(D); ReadCXXDefinitionData(*D->DefinitionData, Record, Idx); - // We read the definition info. Check if there are pending forward - // references that need to point to this DefinitionData pointer. - ASTReader::PendingForwardRefsMap::iterator - FindI = Reader.PendingForwardRefs.find(D); - if (FindI != Reader.PendingForwardRefs.end()) { - ASTReader::ForwardRefs &Refs = FindI->second; - for (ASTReader::ForwardRefs::iterator - I = Refs.begin(), E = Refs.end(); I != E; ++I) - cast(*I)->DefinitionData = D->DefinitionData; -#ifndef NDEBUG - // We later check whether PendingForwardRefs is empty to make sure all - // pending references were linked. - Reader.PendingForwardRefs.erase(D); -#endif - } - + // Note that we have deserialized a definition. Reader.PendingDefinitions.insert(D); - } else if (DefinitionDecl) { - if (DefinitionDecl->DefinitionData) { - D->DefinitionData = DefinitionDecl->DefinitionData; - } else { - // The definition is still initializing. - Reader.PendingForwardRefs[DefinitionDecl].push_back(D); - } + } else if (DefinitionDecl && DefinitionDecl->DefinitionData) { + D->DefinitionData = DefinitionDecl->DefinitionData; } } @@ -2244,12 +2202,8 @@ void ASTDeclReader::UpdateDecl(Decl *D, ModuleFile &ModuleFile, ObjCInterfaceDecl *ID = cast(D); ObjCInterfaceDecl *Def = Reader.ReadDeclAs(ModuleFile, Record, Idx); - if (Def->Data) { + if (Def->Data) ID->Data = Def->Data; - } else { - // The definition is still initializing. - Reader.PendingForwardRefs[Def].push_back(ID); - } break; } }