]> granicus.if.org Git - clang/commitdiff
Switch ASTReader::GetHeaderFileInfo() from a walk over the module
authorDouglas Gregor <dgregor@apple.com>
Thu, 25 Aug 2011 18:14:34 +0000 (18:14 +0000)
committerDouglas Gregor <dgregor@apple.com>
Thu, 25 Aug 2011 18:14:34 +0000 (18:14 +0000)
chain to a proper search.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@138574 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Serialization/ASTReader.h
lib/Serialization/ASTReader.cpp

index 4fab0bd2da7026d6d62c99eabff39ed11b9c5a57..9eb4320d55738f1664a5dc154af1408f9391e4c7 100644 (file)
@@ -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; }
 
index 75f12ec58411168d1b04f8b009a0b7afeb03a078..31b96ea7d69c5fc78e5e3651729e8bd0e3206318 100644 (file)
@@ -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<HeaderFileInfoLookupTable *>(F.HeaderFileInfoTable);
-    if (!Table)
-      continue;
+    llvm::Optional<HeaderFileInfo> 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<HeaderFileInfoVisitor *>(UserData);
+      
+      HeaderFileInfoTrait Trait(This->Reader, M, 
+                                &This->Reader.getPreprocessor().getHeaderSearchInfo(),
+                                M.HeaderFileFrameworkStrings,
+                                This->FE->getName());
+      
+      HeaderFileInfoLookupTable *Table
+        = static_cast<HeaderFileInfoLookupTable *>(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<HeaderFileInfo> getHeaderFileInfo() const { return HFI; }
+  };
+}
 
-    return HFI;
+HeaderFileInfo ASTReader::GetHeaderFileInfo(const FileEntry *FE) {
+  HeaderFileInfoVisitor Visitor(*this, FE);
+  ModuleMgr.visit(&HeaderFileInfoVisitor::visit, &Visitor);
+  if (llvm::Optional<HeaderFileInfo> HFI = Visitor.getHeaderFileInfo()) {
+    if (Listener)
+      Listener->ReadHeaderFileInfo(*HFI, FE->getUID());
+    return *HFI;
   }
   
   return HeaderFileInfo();