diff --git a/clang/include/clang/Lex/HeaderSearch.h b/clang/include/clang/Lex/HeaderSearch.h --- a/clang/include/clang/Lex/HeaderSearch.h +++ b/clang/include/clang/Lex/HeaderSearch.h @@ -727,8 +727,7 @@ /// frameworks. /// /// \returns The module, if found; otherwise, null. - Module *loadFrameworkModule(StringRef Name, - const DirectoryEntry *Dir, + Module *loadFrameworkModule(StringRef Name, DirectoryEntryRef Dir, bool IsSystem); /// Load all of the module maps within the immediate subdirectories @@ -884,7 +883,7 @@ LoadModuleMapResult loadModuleMapFileImpl(const FileEntry *File, bool IsSystem, - const DirectoryEntry *Dir, + DirectoryEntryRef Dir, FileID ID = FileID(), unsigned *Offset = nullptr); @@ -908,8 +907,8 @@ /// /// \returns The result of attempting to load the module map file from the /// named directory. - LoadModuleMapResult loadModuleMapFile(const DirectoryEntry *Dir, - bool IsSystem, bool IsFramework); + LoadModuleMapResult loadModuleMapFile(DirectoryEntryRef Dir, bool IsSystem, + bool IsFramework); }; /// Apply the header search options to get given HeaderSearch object. diff --git a/clang/lib/Lex/HeaderSearch.cpp b/clang/lib/Lex/HeaderSearch.cpp --- a/clang/lib/Lex/HeaderSearch.cpp +++ b/clang/lib/Lex/HeaderSearch.cpp @@ -319,7 +319,8 @@ SmallString<128> FrameworkDirName; FrameworkDirName += Dir.getFrameworkDir()->getName(); llvm::sys::path::append(FrameworkDirName, SearchName + ".framework"); - if (auto FrameworkDir = FileMgr.getDirectory(FrameworkDirName)) { + if (auto FrameworkDir = + FileMgr.getOptionalDirectoryRef(FrameworkDirName)) { bool IsSystem = Dir.getDirCharacteristic() != SrcMgr::C_User; Module = loadFrameworkModule(ModuleName, *FrameworkDir, IsSystem); if (Module) @@ -334,8 +335,10 @@ continue; bool IsSystem = Dir.isSystemHeaderDirectory(); + // Only returns None if not a normal directory, which we just checked + DirectoryEntryRef NormalDir = *Dir.getDirRef(); // Search for a module map file in this directory. - if (loadModuleMapFile(Dir.getDir(), IsSystem, + if (loadModuleMapFile(NormalDir, IsSystem, /*IsFramework*/false) == LMM_NewlyLoaded) { // We just loaded a module map file; check whether the module is // available now. @@ -507,7 +510,7 @@ /// \param DirName The name of the framework directory. /// \param SubmodulePath Will be populated with the submodule path from the /// returned top-level module to the originally named framework. -static const DirectoryEntry * +static Optional getTopFrameworkDir(FileManager &FileMgr, StringRef DirName, SmallVectorImpl &SubmodulePath) { assert(llvm::sys::path::extension(DirName) == ".framework" && @@ -527,12 +530,10 @@ // // Similar issues occur when a top-level framework has moved into an // embedded framework. - const DirectoryEntry *TopFrameworkDir = nullptr; - if (auto TopFrameworkDirOrErr = FileMgr.getDirectory(DirName)) - TopFrameworkDir = *TopFrameworkDirOrErr; + auto TopFrameworkDir = FileMgr.getOptionalDirectoryRef(DirName); if (TopFrameworkDir) - DirName = FileMgr.getCanonicalName(TopFrameworkDir); + DirName = FileMgr.getCanonicalName(*TopFrameworkDir); do { // Get the parent directory name. DirName = llvm::sys::path::parent_path(DirName); @@ -540,7 +541,7 @@ break; // Determine whether this directory exists. - auto Dir = FileMgr.getDirectory(DirName); + auto Dir = FileMgr.getOptionalDirectoryRef(DirName); if (!Dir) break; @@ -1486,13 +1487,13 @@ return false; // Determine whether this directory exists. - auto Dir = FileMgr.getDirectory(DirName); + auto Dir = FileMgr.getOptionalDirectoryRef(DirName); if (!Dir) return false; // Try to load the module map file in this directory. switch (loadModuleMapFile(*Dir, IsSystem, - llvm::sys::path::extension((*Dir)->getName()) == + llvm::sys::path::extension(Dir->getName()) == ".framework")) { case LMM_NewlyLoaded: case LMM_AlreadyLoaded: @@ -1589,15 +1590,16 @@ if (needModuleLookup(RequestingModule, SuggestedModule)) { // Find the top-level framework based on this framework. SmallVector SubmodulePath; - const DirectoryEntry *TopFrameworkDir - = ::getTopFrameworkDir(FileMgr, FrameworkName, SubmodulePath); + Optional TopFrameworkDir = + ::getTopFrameworkDir(FileMgr, FrameworkName, SubmodulePath); + assert(TopFrameworkDir && "Could not find the top-most framework dir"); // Determine the name of the top-level framework. StringRef ModuleName = llvm::sys::path::stem(TopFrameworkDir->getName()); // Load this framework module. If that succeeds, find the suggested module // for this header, if any. - loadFrameworkModule(ModuleName, TopFrameworkDir, IsSystemFramework); + loadFrameworkModule(ModuleName, *TopFrameworkDir, IsSystemFramework); // FIXME: This can find a module not part of ModuleName, which is // important so that we're consistent about whether this header @@ -1628,39 +1630,40 @@ StringRef OriginalModuleMapFile) { // Find the directory for the module. For frameworks, that may require going // up from the 'Modules' directory. - const DirectoryEntry *Dir = nullptr; + Optional Dir; if (getHeaderSearchOpts().ModuleMapFileHomeIsCwd) { - if (auto DirOrErr = FileMgr.getDirectory(".")) - Dir = *DirOrErr; + Dir = FileMgr.getOptionalDirectoryRef("."); } else { if (!OriginalModuleMapFile.empty()) { // We're building a preprocessed module map. Find or invent the directory // that it originally occupied. - auto DirOrErr = FileMgr.getDirectory( + Dir = FileMgr.getOptionalDirectoryRef( llvm::sys::path::parent_path(OriginalModuleMapFile)); - if (DirOrErr) { - Dir = *DirOrErr; - } else { - auto *FakeFile = FileMgr.getVirtualFile(OriginalModuleMapFile, 0, 0); - Dir = FakeFile->getDir(); + if (!Dir) { + auto FakeFile = FileMgr.getVirtualFileRef(OriginalModuleMapFile, 0, 0); + Dir = FakeFile.getDir(); } } else { - Dir = File->getDir(); + // TODO: Replace with `Dir = File.getDir()` when `File` is switched to + // `FileEntryRef`. + Dir = FileMgr.getOptionalDirectoryRef(File->getDir()->getName()); } + assert(Dir && "parent must exist"); StringRef DirName(Dir->getName()); if (llvm::sys::path::filename(DirName) == "Modules") { DirName = llvm::sys::path::parent_path(DirName); if (DirName.endswith(".framework")) - if (auto DirOrErr = FileMgr.getDirectory(DirName)) - Dir = *DirOrErr; + if (auto MaybeDir = FileMgr.getOptionalDirectoryRef(DirName)) + Dir = *MaybeDir; // FIXME: This assert can fail if there's a race between the above check // and the removal of the directory. assert(Dir && "parent must exist"); } } - switch (loadModuleMapFileImpl(File, IsSystem, Dir, ID, Offset)) { + assert(Dir && "module map home directory must exist"); + switch (loadModuleMapFileImpl(File, IsSystem, *Dir, ID, Offset)) { case LMM_AlreadyLoaded: case LMM_NewlyLoaded: return false; @@ -1673,7 +1676,7 @@ HeaderSearch::LoadModuleMapResult HeaderSearch::loadModuleMapFileImpl(const FileEntry *File, bool IsSystem, - const DirectoryEntry *Dir, FileID ID, + DirectoryEntryRef Dir, FileID ID, unsigned *Offset) { assert(File && "expected FileEntry"); @@ -1731,8 +1734,7 @@ return nullptr; } -Module *HeaderSearch::loadFrameworkModule(StringRef Name, - const DirectoryEntry *Dir, +Module *HeaderSearch::loadFrameworkModule(StringRef Name, DirectoryEntryRef Dir, bool IsSystem) { if (Module *Module = ModMap.findModule(Name)) return Module; @@ -1759,14 +1761,14 @@ HeaderSearch::LoadModuleMapResult HeaderSearch::loadModuleMapFile(StringRef DirName, bool IsSystem, bool IsFramework) { - if (auto Dir = FileMgr.getDirectory(DirName)) + if (auto Dir = FileMgr.getOptionalDirectoryRef(DirName)) return loadModuleMapFile(*Dir, IsSystem, IsFramework); return LMM_NoDirectory; } HeaderSearch::LoadModuleMapResult -HeaderSearch::loadModuleMapFile(const DirectoryEntry *Dir, bool IsSystem, +HeaderSearch::loadModuleMapFile(DirectoryEntryRef Dir, bool IsSystem, bool IsFramework) { auto KnownDir = DirectoryHasModuleMap.find(Dir); if (KnownDir != DirectoryHasModuleMap.end()) @@ -1807,8 +1809,7 @@ if (llvm::sys::path::extension(Dir->path()) != ".framework") continue; - auto FrameworkDir = - FileMgr.getDirectory(Dir->path()); + auto FrameworkDir = FileMgr.getOptionalDirectoryRef(Dir->path()); if (!FrameworkDir) continue; @@ -1824,7 +1825,7 @@ continue; // Try to load a module map file for the search directory. - loadModuleMapFile(DL.getDir(), IsSystem, /*IsFramework*/ false); + loadModuleMapFile(*DL.getDirRef(), IsSystem, /*IsFramework*/ false); // Try to load module map files for immediate subdirectories of this // search directory. @@ -1848,7 +1849,7 @@ continue; // Try to load a module map file for the search directory. - loadModuleMapFile(DL.getDir(), DL.isSystemHeaderDirectory(), + loadModuleMapFile(*DL.getDirRef(), DL.isSystemHeaderDirectory(), DL.isFramework()); } }