[clang] a40db55 - Lex: Migrate HeaderSearch::LoadedModuleMaps to FileEntryRef
Duncan P. N. Exon Smith via cfe-commits
cfe-commits at lists.llvm.org
Mon Dec 14 14:35:27 PST 2020
Author: Duncan P. N. Exon Smith
Date: 2020-12-14T14:35:11-08:00
New Revision: a40db5502b2515a6f2f1676b5d7a655ae0f41179
URL: https://github.com/llvm/llvm-project/commit/a40db5502b2515a6f2f1676b5d7a655ae0f41179
DIFF: https://github.com/llvm/llvm-project/commit/a40db5502b2515a6f2f1676b5d7a655ae0f41179.diff
LOG: Lex: Migrate HeaderSearch::LoadedModuleMaps to FileEntryRef
Migrate `HeaderSearch::LoadedModuleMaps` and a number of APIs over to
`FileEntryRef`. This should have no functionality change. Note that two
`FileEntryRef`s hash the same if they point at the same `FileEntry`.
Differential Revision: https://reviews.llvm.org/D92975
Added:
Modified:
clang-tools-extra/modularize/ModularizeUtilities.cpp
clang/include/clang/Lex/HeaderSearch.h
clang/include/clang/Lex/ModuleMap.h
clang/lib/Frontend/FrontendAction.cpp
clang/lib/Lex/HeaderSearch.cpp
clang/lib/Lex/ModuleMap.cpp
Removed:
################################################################################
diff --git a/clang-tools-extra/modularize/ModularizeUtilities.cpp b/clang-tools-extra/modularize/ModularizeUtilities.cpp
index 200370c135df..7470c324bbdb 100644
--- a/clang-tools-extra/modularize/ModularizeUtilities.cpp
+++ b/clang-tools-extra/modularize/ModularizeUtilities.cpp
@@ -258,22 +258,22 @@ std::error_code ModularizeUtilities::loadProblemHeaderList(
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
index 93d6ea72270a..8ea81226cf77 100644
--- a/clang/include/clang/Lex/HeaderSearch.h
+++ b/clang/include/clang/Lex/HeaderSearch.h
@@ -239,7 +239,7 @@ class HeaderSearch {
/// Set of module map files we've already loaded, and a flag indicating
/// whether they were valid or not.
- llvm::DenseMap<const FileEntry *, bool> LoadedModuleMaps;
+ llvm::DenseMap<FileEntryRef, bool> LoadedModuleMaps;
/// Uniqued set of framework names, which is used to track which
/// headers were included as framework headers.
@@ -560,8 +560,8 @@ class HeaderSearch {
/// 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<FileEntryRef> 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 @@ class HeaderSearch {
/// 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 @@ class HeaderSearch {
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
index 6827408f10a3..1d7ce5fc2320 100644
--- a/clang/include/clang/Lex/ModuleMap.h
+++ b/clang/include/clang/Lex/ModuleMap.h
@@ -684,9 +684,9 @@ class ModuleMap {
/// 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
index 231787326243..d3891ebccec6 100644
--- a/clang/lib/Frontend/FrontendAction.cpp
+++ b/clang/lib/Frontend/FrontendAction.cpp
@@ -432,7 +432,7 @@ static bool loadModuleMapForModuleBuild(CompilerInstance &CI, bool IsSystem,
// Map the current input to a file.
FileID ModuleMapID = SrcMgr.getMainFileID();
- const FileEntry *ModuleMap = SrcMgr.getFileEntryForID(ModuleMapID);
+ Optional<FileEntryRef> 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 @@ static bool loadModuleMapForModuleBuild(CompilerInstance &CI, bool IsSystem,
}
// 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 @@ bool FrontendAction::BeginSourceFile(CompilerInstance &CI,
// 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
index 99c92e91aad5..3cc8ce449ca3 100644
--- a/clang/lib/Lex/HeaderSearch.cpp
+++ b/clang/lib/Lex/HeaderSearch.cpp
@@ -1499,22 +1499,20 @@ bool HeaderSearch::findUsableModuleForFrameworkHeader(
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<FileEntryRef> 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 @@ bool HeaderSearch::loadModuleMapFile(const FileEntry *File, bool IsSystem,
Dir = FakeFile->getDir();
}
} else {
- Dir = File->getDir();
+ Dir = File.getDir();
}
StringRef DirName(Dir->getName());
@@ -1563,11 +1561,9 @@ bool HeaderSearch::loadModuleMapFile(const FileEntry *File, bool IsSystem,
}
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 @@ HeaderSearch::loadModuleMapFileImpl(const FileEntry *File, bool IsSystem,
}
// Try to load a corresponding private module map.
- if (const FileEntry *PMMFile = getPrivateModuleMap(File, FileMgr)) {
- if (ModMap.parseModuleMapFile(PMMFile, IsSystem, Dir)) {
+ if (Optional<FileEntryRef> PMMFile = getPrivateModuleMap(File, FileMgr)) {
+ if (ModMap.parseModuleMapFile(*PMMFile, IsSystem, Dir)) {
LoadedModuleMaps[File] = false;
return LMM_InvalidModuleMap;
}
@@ -1591,24 +1587,24 @@ HeaderSearch::loadModuleMapFileImpl(const FileEntry *File, bool IsSystem,
return LMM_NewlyLoaded;
}
-const FileEntry *
+Optional<FileEntryRef>
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 @@ HeaderSearch::lookupModuleMapFile(const DirectoryEntry *Dir, bool IsFramework) {
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 @@ HeaderSearch::loadModuleMapFile(const DirectoryEntry *Dir, bool IsSystem,
if (KnownDir != DirectoryHasModuleMap.end())
return KnownDir->second ? LMM_AlreadyLoaded : LMM_InvalidModuleMap;
- if (const FileEntry *ModuleMapFile = lookupModuleMapFile(Dir, IsFramework)) {
+ if (Optional<FileEntryRef> 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
index bbda1f15a702..152fc9e52ca8 100644
--- a/clang/lib/Lex/ModuleMap.cpp
+++ b/clang/lib/Lex/ModuleMap.cpp
@@ -973,9 +973,9 @@ Module *ModuleMap::inferFrameworkModule(const DirectoryEntry *FrameworkDir,
// 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<FileEntryRef> ModMapFile =
+ HeaderInfo.lookupModuleMapFile(*ParentDir, IsFrameworkDir)) {
+ parseModuleMapFile(*ModMapFile, Attrs.IsSystem, *ParentDir);
inferred = InferredDirectories.find(*ParentDir);
}
@@ -2163,12 +2163,12 @@ void ModuleMapParser::parseExternModuleDecl() {
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 @@ bool ModuleMapParser::parseModuleMapFile() {
} 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) {
More information about the cfe-commits
mailing list