From: Douglas Gregor Date: Thu, 25 Aug 2011 18:03:05 +0000 (+0000) Subject: Switch the forward walk through the module chain over to a depth-first X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b95cd09db90317121b107ac2a7ff88bff746e264;p=clang Switch the forward walk through the module chain over to a depth-first search in ASTReader::ReadPreprocessedEntities(). git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@138572 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Serialization/ASTReader.cpp b/lib/Serialization/ASTReader.cpp index 9b23e9ab4f..75f12ec584 100644 --- a/lib/Serialization/ASTReader.cpp +++ b/lib/Serialization/ASTReader.cpp @@ -3230,16 +3230,37 @@ bool ASTReader::ParseLanguageOptions( return false; } -void ASTReader::ReadPreprocessedEntities() { - for (ModuleIterator I = ModuleMgr.begin(), E = ModuleMgr.end(); I != E; ++I) { - Module &F = *(*I); - if (!F.PreprocessorDetailCursor.getBitStreamReader()) - continue; +namespace { + /// \brief Visitor used by ASTReader::ReadPreprocessedEntities() to load + /// all of the preprocessed entities within a module. + class ReadPreprocessedEntitiesVisitor { + ASTReader &Reader; + + public: + explicit ReadPreprocessedEntitiesVisitor(ASTReader &Reader) + : Reader(Reader) { } + + static bool visit(Module &M, bool Preorder, void *UserData) { + if (Preorder) + return false; + + ReadPreprocessedEntitiesVisitor *This + = static_cast(UserData); + + if (!M.PreprocessorDetailCursor.getBitStreamReader()) + return false; + + SavedStreamPosition SavedPosition(M.PreprocessorDetailCursor); + M.PreprocessorDetailCursor.JumpToBit(M.PreprocessorDetailStartOffset); + while (This->Reader.LoadPreprocessedEntity(M)) { } + return false; + } + }; +} - SavedStreamPosition SavedPosition(F.PreprocessorDetailCursor); - F.PreprocessorDetailCursor.JumpToBit(F.PreprocessorDetailStartOffset); - while (LoadPreprocessedEntity(F)) { } - } +void ASTReader::ReadPreprocessedEntities() { + ReadPreprocessedEntitiesVisitor Visitor(*this); + ModuleMgr.visitDepthFirst(&ReadPreprocessedEntitiesVisitor::visit, &Visitor); } PreprocessedEntity *ASTReader::ReadPreprocessedEntityAtOffset(uint64_t Offset) {