diff --git a/clang-tools-extra/modularize/ModularizeUtilities.cpp b/clang-tools-extra/modularize/ModularizeUtilities.cpp --- a/clang-tools-extra/modularize/ModularizeUtilities.cpp +++ b/clang-tools-extra/modularize/ModularizeUtilities.cpp @@ -258,22 +258,22 @@ std::error_code ModularizeUtilities::loadModuleMap( llvm::StringRef InputPath) { // Get file entry for module.modulemap file. - auto ModuleMapEntryOrErr = - SourceMgr->getFileManager().getFile(InputPath); + auto ExpectedModuleMapEntry = + SourceMgr->getFileManager().getFileRef(InputPath); // return error if not found. - if (!ModuleMapEntryOrErr) { + if (!ExpectedModuleMapEntry) { llvm::errs() << "error: File \"" << InputPath << "\" not found.\n"; - return ModuleMapEntryOrErr.getError(); + return errorToErrorCode(ExpectedModuleMapEntry.takeError()); } - const FileEntry *ModuleMapEntry = *ModuleMapEntryOrErr; + FileEntryRef ModuleMapEntry = *ExpectedModuleMapEntry; // Because the module map parser uses a ForwardingDiagnosticConsumer, // which doesn't forward the BeginSourceFile call, we do it explicitly here. DC.BeginSourceFile(*LangOpts, nullptr); // Figure out the home directory for the module map file. - const DirectoryEntry *Dir = ModuleMapEntry->getDir(); + const DirectoryEntry *Dir = ModuleMapEntry.getDir(); StringRef DirName(Dir->getName()); if (llvm::sys::path::filename(DirName) == "Modules") { DirName = llvm::sys::path::parent_path(DirName); 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 @@ -239,7 +239,7 @@ /// Set of module map files we've already loaded, and a flag indicating /// whether they were valid or not. - llvm::DenseMap LoadedModuleMaps; + llvm::DenseMap LoadedModuleMaps; /// Uniqued set of framework names, which is used to track which /// headers were included as framework headers. @@ -560,8 +560,8 @@ /// Try to find a module map file in the given directory, returning /// \c nullptr if none is found. - const FileEntry *lookupModuleMapFile(const DirectoryEntry *Dir, - bool IsFramework); + Optional lookupModuleMapFile(const DirectoryEntry *Dir, + bool IsFramework); /// Determine whether there is a module map that may map the header /// with the given file name to a (sub)module. @@ -603,8 +603,8 @@ /// used to resolve paths within the module (this is required when /// building the module from preprocessed source). /// \returns true if an error occurred, false otherwise. - bool loadModuleMapFile(const FileEntry *File, bool IsSystem, - FileID ID = FileID(), unsigned *Offset = nullptr, + bool loadModuleMapFile(FileEntryRef File, bool IsSystem, FileID ID = FileID(), + unsigned *Offset = nullptr, StringRef OriginalModuleMapFile = StringRef()); /// Collect the set of all known, top-level modules. @@ -794,8 +794,7 @@ LMM_InvalidModuleMap }; - LoadModuleMapResult loadModuleMapFileImpl(const FileEntry *File, - bool IsSystem, + LoadModuleMapResult loadModuleMapFileImpl(FileEntryRef File, bool IsSystem, const DirectoryEntry *Dir, FileID ID = FileID(), unsigned *Offset = nullptr); diff --git a/clang/include/clang/Lex/ModuleMap.h b/clang/include/clang/Lex/ModuleMap.h --- a/clang/include/clang/Lex/ModuleMap.h +++ b/clang/include/clang/Lex/ModuleMap.h @@ -684,9 +684,9 @@ /// that caused us to load this module map file, if any. /// /// \returns true if an error occurred, false otherwise. - bool parseModuleMapFile(const FileEntry *File, bool IsSystem, - const DirectoryEntry *HomeDir, - FileID ID = FileID(), unsigned *Offset = nullptr, + bool parseModuleMapFile(FileEntryRef File, bool IsSystem, + const DirectoryEntry *HomeDir, FileID ID = FileID(), + unsigned *Offset = nullptr, SourceLocation ExternModuleLoc = SourceLocation()); /// Dump the contents of the module map, for debugging purposes. diff --git a/clang/lib/Frontend/FrontendAction.cpp b/clang/lib/Frontend/FrontendAction.cpp --- a/clang/lib/Frontend/FrontendAction.cpp +++ b/clang/lib/Frontend/FrontendAction.cpp @@ -432,7 +432,7 @@ // Map the current input to a file. FileID ModuleMapID = SrcMgr.getMainFileID(); - const FileEntry *ModuleMap = SrcMgr.getFileEntryForID(ModuleMapID); + Optional ModuleMap = SrcMgr.getFileEntryRefForID(ModuleMapID); // If the module map is preprocessed, handle the initial line marker; // line directives are not part of the module map syntax in general. @@ -445,7 +445,7 @@ } // Load the module map file. - if (HS.loadModuleMapFile(ModuleMap, IsSystem, ModuleMapID, &Offset, + if (HS.loadModuleMapFile(*ModuleMap, IsSystem, ModuleMapID, &Offset, PresumedModuleMapFile)) return true; @@ -807,7 +807,7 @@ // If we were asked to load any module map files, do so now. for (const auto &Filename : CI.getFrontendOpts().ModuleMapFiles) { - if (auto File = CI.getFileManager().getFile(Filename)) + if (auto File = CI.getFileManager().getOptionalFileRef(Filename)) CI.getPreprocessor().getHeaderSearchInfo().loadModuleMapFile( *File, /*IsSystem*/false); else 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 @@ -1499,22 +1499,20 @@ return true; } -static const FileEntry *getPrivateModuleMap(const FileEntry *File, - FileManager &FileMgr) { - StringRef Filename = llvm::sys::path::filename(File->getName()); - SmallString<128> PrivateFilename(File->getDir()->getName()); +static Optional getPrivateModuleMap(FileEntryRef File, + FileManager &FileMgr) { + StringRef Filename = llvm::sys::path::filename(File.getName()); + SmallString<128> PrivateFilename(File.getDir().getName()); if (Filename == "module.map") llvm::sys::path::append(PrivateFilename, "module_private.map"); else if (Filename == "module.modulemap") llvm::sys::path::append(PrivateFilename, "module.private.modulemap"); else - return nullptr; - if (auto File = FileMgr.getFile(PrivateFilename)) - return *File; - return nullptr; + return None; + return FileMgr.getOptionalFileRef(PrivateFilename); } -bool HeaderSearch::loadModuleMapFile(const FileEntry *File, bool IsSystem, +bool HeaderSearch::loadModuleMapFile(FileEntryRef File, bool IsSystem, FileID ID, unsigned *Offset, StringRef OriginalModuleMapFile) { // Find the directory for the module. For frameworks, that may require going @@ -1536,7 +1534,7 @@ Dir = FakeFile->getDir(); } } else { - Dir = File->getDir(); + Dir = File.getDir(); } StringRef DirName(Dir->getName()); @@ -1563,11 +1561,9 @@ } HeaderSearch::LoadModuleMapResult -HeaderSearch::loadModuleMapFileImpl(const FileEntry *File, bool IsSystem, +HeaderSearch::loadModuleMapFileImpl(FileEntryRef File, bool IsSystem, const DirectoryEntry *Dir, FileID ID, unsigned *Offset) { - assert(File && "expected FileEntry"); - // Check whether we've already loaded this module map, and mark it as being // loaded in case we recursively try to load it from itself. auto AddResult = LoadedModuleMaps.insert(std::make_pair(File, true)); @@ -1580,8 +1576,8 @@ } // Try to load a corresponding private module map. - if (const FileEntry *PMMFile = getPrivateModuleMap(File, FileMgr)) { - if (ModMap.parseModuleMapFile(PMMFile, IsSystem, Dir)) { + if (Optional PMMFile = getPrivateModuleMap(File, FileMgr)) { + if (ModMap.parseModuleMapFile(*PMMFile, IsSystem, Dir)) { LoadedModuleMaps[File] = false; return LMM_InvalidModuleMap; } @@ -1591,24 +1587,24 @@ return LMM_NewlyLoaded; } -const FileEntry * +Optional HeaderSearch::lookupModuleMapFile(const DirectoryEntry *Dir, bool IsFramework) { if (!HSOpts->ImplicitModuleMaps) - return nullptr; + return None; // For frameworks, the preferred spelling is Modules/module.modulemap, but // module.map at the framework root is also accepted. SmallString<128> ModuleMapFileName(Dir->getName()); if (IsFramework) llvm::sys::path::append(ModuleMapFileName, "Modules"); llvm::sys::path::append(ModuleMapFileName, "module.modulemap"); - if (auto F = FileMgr.getFile(ModuleMapFileName)) - return *F; + if (auto F = FileMgr.getOptionalFileRef(ModuleMapFileName)) + return F; // Continue to allow module.map ModuleMapFileName = Dir->getName(); llvm::sys::path::append(ModuleMapFileName, "module.map"); - if (auto F = FileMgr.getFile(ModuleMapFileName)) - return *F; + if (auto F = FileMgr.getOptionalFileRef(ModuleMapFileName)) + return F; // For frameworks, allow to have a private module map with a preferred // spelling when a public module map is absent. @@ -1616,10 +1612,10 @@ ModuleMapFileName = Dir->getName(); llvm::sys::path::append(ModuleMapFileName, "Modules", "module.private.modulemap"); - if (auto F = FileMgr.getFile(ModuleMapFileName)) - return *F; + if (auto F = FileMgr.getOptionalFileRef(ModuleMapFileName)) + return F; } - return nullptr; + return None; } Module *HeaderSearch::loadFrameworkModule(StringRef Name, @@ -1663,9 +1659,10 @@ if (KnownDir != DirectoryHasModuleMap.end()) return KnownDir->second ? LMM_AlreadyLoaded : LMM_InvalidModuleMap; - if (const FileEntry *ModuleMapFile = lookupModuleMapFile(Dir, IsFramework)) { + if (Optional ModuleMapFile = + lookupModuleMapFile(Dir, IsFramework)) { LoadModuleMapResult Result = - loadModuleMapFileImpl(ModuleMapFile, IsSystem, Dir); + loadModuleMapFileImpl(*ModuleMapFile, IsSystem, Dir); // Add Dir explicitly in case ModuleMapFile is in a subdirectory. // E.g. Foo.framework/Modules/module.modulemap // ^Dir ^ModuleMapFile diff --git a/clang/lib/Lex/ModuleMap.cpp b/clang/lib/Lex/ModuleMap.cpp --- a/clang/lib/Lex/ModuleMap.cpp +++ b/clang/lib/Lex/ModuleMap.cpp @@ -973,9 +973,9 @@ // We haven't looked here before. Load a module map, if there is // one. bool IsFrameworkDir = Parent.endswith(".framework"); - if (const FileEntry *ModMapFile = - HeaderInfo.lookupModuleMapFile(*ParentDir, IsFrameworkDir)) { - parseModuleMapFile(ModMapFile, Attrs.IsSystem, *ParentDir); + if (Optional ModMapFile = + HeaderInfo.lookupModuleMapFile(*ParentDir, IsFrameworkDir)) { + parseModuleMapFile(*ModMapFile, Attrs.IsSystem, *ParentDir); inferred = InferredDirectories.find(*ParentDir); } @@ -2163,12 +2163,12 @@ llvm::sys::path::append(ModuleMapFileName, FileName); FileNameRef = ModuleMapFileName; } - if (auto File = SourceMgr.getFileManager().getFile(FileNameRef)) + if (auto File = SourceMgr.getFileManager().getOptionalFileRef(FileNameRef)) Map.parseModuleMapFile( *File, /*IsSystem=*/false, Map.HeaderInfo.getHeaderSearchOpts().ModuleMapFileHomeIsCwd ? Directory - : (*File)->getDir(), + : File->getDir(), FileID(), nullptr, ExternLoc); } @@ -2984,7 +2984,7 @@ } while (true); } -bool ModuleMap::parseModuleMapFile(const FileEntry *File, bool IsSystem, +bool ModuleMap::parseModuleMapFile(FileEntryRef File, bool IsSystem, const DirectoryEntry *Dir, FileID ID, unsigned *Offset, SourceLocation ExternModuleLoc) {