From 69e9464340af6889c163bd867c2b5b8812b7985a Mon Sep 17 00:00:00 2001 From: Douglas Gregor Date: Thu, 25 Aug 2011 18:14:34 +0000 Subject: [PATCH] Switch ASTReader::GetHeaderFileInfo() from a walk over the module chain to a proper search. llvm-svn: 138574 --- clang/include/clang/Serialization/ASTReader.h | 6 ++ clang/lib/Serialization/ASTReader.cpp | 63 +++++++++++++------ 2 files changed, 49 insertions(+), 20 deletions(-) diff --git a/clang/include/clang/Serialization/ASTReader.h b/clang/include/clang/Serialization/ASTReader.h index 4fab0bd2da70..9eb4320d5573 100644 --- a/clang/include/clang/Serialization/ASTReader.h +++ b/clang/include/clang/Serialization/ASTReader.h @@ -1194,6 +1194,12 @@ public: /// \brief Retrieve the module manager. ModuleManager &getModuleManager() { return ModuleMgr; } + /// \brief Retrieve the preprocessor. + Preprocessor &getPreprocessor() const { + assert(PP && "ASTReader does not have a preprocessor"); + return *PP; + } + /// \brief Retrieve the name of the original source file name const std::string &getOriginalSourceFile() { return OriginalFileName; } diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp index 75f12ec58411..31b96ea7d69c 100644 --- a/clang/lib/Serialization/ASTReader.cpp +++ b/clang/lib/Serialization/ASTReader.cpp @@ -3273,30 +3273,53 @@ PreprocessedEntity *ASTReader::ReadPreprocessedEntityAtOffset(uint64_t Offset) { return LoadPreprocessedEntity(*Loc.F); } -HeaderFileInfo ASTReader::GetHeaderFileInfo(const FileEntry *FE) { - for (ModuleIterator I = ModuleMgr.begin(), E = ModuleMgr.end(); I != E; ++I) { - Module &F = *(*I); - - HeaderFileInfoTrait Trait(*this, F, &PP->getHeaderSearchInfo(), - F.HeaderFileFrameworkStrings, - FE->getName()); +namespace { + /// \brief Visitor used to search for information about a header file. + class HeaderFileInfoVisitor { + ASTReader &Reader; + const FileEntry *FE; - HeaderFileInfoLookupTable *Table - = static_cast(F.HeaderFileInfoTable); - if (!Table) - continue; + llvm::Optional HFI; - // Look in the on-disk hash table for an entry for this file name. - HeaderFileInfoLookupTable::iterator Pos = Table->find(FE->getName(), - &Trait); - if (Pos == Table->end()) - continue; + public: + HeaderFileInfoVisitor(ASTReader &Reader, const FileEntry *FE) + : Reader(Reader), FE(FE) { } + + static bool visit(Module &M, void *UserData) { + HeaderFileInfoVisitor *This + = static_cast(UserData); + + HeaderFileInfoTrait Trait(This->Reader, M, + &This->Reader.getPreprocessor().getHeaderSearchInfo(), + M.HeaderFileFrameworkStrings, + This->FE->getName()); + + HeaderFileInfoLookupTable *Table + = static_cast(M.HeaderFileInfoTable); + if (!Table) + return false; - HeaderFileInfo HFI = *Pos; - if (Listener) - Listener->ReadHeaderFileInfo(HFI, FE->getUID()); + // Look in the on-disk hash table for an entry for this file name. + HeaderFileInfoLookupTable::iterator Pos = Table->find(This->FE->getName(), + &Trait); + if (Pos == Table->end()) + return false; + + This->HFI = *Pos; + return true; + } + + llvm::Optional getHeaderFileInfo() const { return HFI; } + }; +} - return HFI; +HeaderFileInfo ASTReader::GetHeaderFileInfo(const FileEntry *FE) { + HeaderFileInfoVisitor Visitor(*this, FE); + ModuleMgr.visit(&HeaderFileInfoVisitor::visit, &Visitor); + if (llvm::Optional HFI = Visitor.getHeaderFileInfo()) { + if (Listener) + Listener->ReadHeaderFileInfo(*HFI, FE->getUID()); + return *HFI; } return HeaderFileInfo(); -- GitLab