forked from OSchip/llvm-project
Revert "Lex: Migrate HeaderSearch::LoadedModuleMaps to FileEntryRef"
This reverts commita40db5502b
. and follow-upd636b881bb
Somewhat speculative, likely broke check-clang on Windows: https://reviews.llvm.org/D92975#2453482
This commit is contained in:
parent
c9ede6f336
commit
7799ef7121
|
@ -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 ExpectedModuleMapEntry =
|
||||
SourceMgr->getFileManager().getFileRef(InputPath);
|
||||
auto ModuleMapEntryOrErr =
|
||||
SourceMgr->getFileManager().getFile(InputPath);
|
||||
|
||||
// return error if not found.
|
||||
if (!ExpectedModuleMapEntry) {
|
||||
if (!ModuleMapEntryOrErr) {
|
||||
llvm::errs() << "error: File \"" << InputPath << "\" not found.\n";
|
||||
return errorToErrorCode(ExpectedModuleMapEntry.takeError());
|
||||
return ModuleMapEntryOrErr.getError();
|
||||
}
|
||||
FileEntryRef ModuleMapEntry = *ExpectedModuleMapEntry;
|
||||
const FileEntry *ModuleMapEntry = *ModuleMapEntryOrErr;
|
||||
|
||||
// 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);
|
||||
|
|
|
@ -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<FileEntryRef, bool> LoadedModuleMaps;
|
||||
llvm::DenseMap<const FileEntry *, bool> LoadedModuleMaps;
|
||||
|
||||
/// Uniqued set of framework names, which is used to track which
|
||||
/// headers were included as framework headers.
|
||||
|
@ -560,8 +560,8 @@ public:
|
|||
|
||||
/// Try to find a module map file in the given directory, returning
|
||||
/// \c nullptr if none is found.
|
||||
Optional<FileEntryRef> lookupModuleMapFile(const DirectoryEntry *Dir,
|
||||
bool IsFramework);
|
||||
const FileEntry *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 @@ public:
|
|||
/// 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(FileEntryRef File, bool IsSystem, FileID ID = FileID(),
|
||||
unsigned *Offset = nullptr,
|
||||
bool loadModuleMapFile(const FileEntry *File, bool IsSystem,
|
||||
FileID ID = FileID(), unsigned *Offset = nullptr,
|
||||
StringRef OriginalModuleMapFile = StringRef());
|
||||
|
||||
/// Collect the set of all known, top-level modules.
|
||||
|
@ -794,7 +794,8 @@ private:
|
|||
LMM_InvalidModuleMap
|
||||
};
|
||||
|
||||
LoadModuleMapResult loadModuleMapFileImpl(FileEntryRef File, bool IsSystem,
|
||||
LoadModuleMapResult loadModuleMapFileImpl(const FileEntry *File,
|
||||
bool IsSystem,
|
||||
const DirectoryEntry *Dir,
|
||||
FileID ID = FileID(),
|
||||
unsigned *Offset = nullptr);
|
||||
|
|
|
@ -684,9 +684,9 @@ public:
|
|||
/// that caused us to load this module map file, if any.
|
||||
///
|
||||
/// \returns true if an error occurred, false otherwise.
|
||||
bool parseModuleMapFile(FileEntryRef File, bool IsSystem,
|
||||
const DirectoryEntry *HomeDir, FileID ID = FileID(),
|
||||
unsigned *Offset = nullptr,
|
||||
bool parseModuleMapFile(const FileEntry *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.
|
||||
|
|
|
@ -432,7 +432,7 @@ static bool loadModuleMapForModuleBuild(CompilerInstance &CI, bool IsSystem,
|
|||
|
||||
// Map the current input to a file.
|
||||
FileID ModuleMapID = SrcMgr.getMainFileID();
|
||||
Optional<FileEntryRef> ModuleMap = SrcMgr.getFileEntryRefForID(ModuleMapID);
|
||||
const FileEntry *ModuleMap = SrcMgr.getFileEntryForID(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().getOptionalFileRef(Filename))
|
||||
if (auto File = CI.getFileManager().getFile(Filename))
|
||||
CI.getPreprocessor().getHeaderSearchInfo().loadModuleMapFile(
|
||||
*File, /*IsSystem*/false);
|
||||
else
|
||||
|
|
|
@ -1499,20 +1499,22 @@ bool HeaderSearch::findUsableModuleForFrameworkHeader(
|
|||
return true;
|
||||
}
|
||||
|
||||
static Optional<FileEntryRef> getPrivateModuleMap(FileEntryRef File,
|
||||
FileManager &FileMgr) {
|
||||
StringRef Filename = llvm::sys::path::filename(File.getName());
|
||||
SmallString<128> PrivateFilename(File.getDir().getName());
|
||||
static const FileEntry *getPrivateModuleMap(const FileEntry *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 None;
|
||||
return FileMgr.getOptionalFileRef(PrivateFilename);
|
||||
return nullptr;
|
||||
if (auto File = FileMgr.getFile(PrivateFilename))
|
||||
return *File;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
bool HeaderSearch::loadModuleMapFile(FileEntryRef File, bool IsSystem,
|
||||
bool HeaderSearch::loadModuleMapFile(const FileEntry *File, bool IsSystem,
|
||||
FileID ID, unsigned *Offset,
|
||||
StringRef OriginalModuleMapFile) {
|
||||
// Find the directory for the module. For frameworks, that may require going
|
||||
|
@ -1534,7 +1536,7 @@ bool HeaderSearch::loadModuleMapFile(FileEntryRef File, bool IsSystem,
|
|||
Dir = FakeFile->getDir();
|
||||
}
|
||||
} else {
|
||||
Dir = File.getDir();
|
||||
Dir = File->getDir();
|
||||
}
|
||||
|
||||
StringRef DirName(Dir->getName());
|
||||
|
@ -1561,9 +1563,11 @@ bool HeaderSearch::loadModuleMapFile(FileEntryRef File, bool IsSystem,
|
|||
}
|
||||
|
||||
HeaderSearch::LoadModuleMapResult
|
||||
HeaderSearch::loadModuleMapFileImpl(FileEntryRef File, bool IsSystem,
|
||||
HeaderSearch::loadModuleMapFileImpl(const FileEntry *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));
|
||||
|
@ -1576,8 +1580,8 @@ HeaderSearch::loadModuleMapFileImpl(FileEntryRef File, bool IsSystem,
|
|||
}
|
||||
|
||||
// Try to load a corresponding private module map.
|
||||
if (Optional<FileEntryRef> PMMFile = getPrivateModuleMap(File, FileMgr)) {
|
||||
if (ModMap.parseModuleMapFile(*PMMFile, IsSystem, Dir)) {
|
||||
if (const FileEntry *PMMFile = getPrivateModuleMap(File, FileMgr)) {
|
||||
if (ModMap.parseModuleMapFile(PMMFile, IsSystem, Dir)) {
|
||||
LoadedModuleMaps[File] = false;
|
||||
return LMM_InvalidModuleMap;
|
||||
}
|
||||
|
@ -1587,24 +1591,24 @@ HeaderSearch::loadModuleMapFileImpl(FileEntryRef File, bool IsSystem,
|
|||
return LMM_NewlyLoaded;
|
||||
}
|
||||
|
||||
Optional<FileEntryRef>
|
||||
const FileEntry *
|
||||
HeaderSearch::lookupModuleMapFile(const DirectoryEntry *Dir, bool IsFramework) {
|
||||
if (!HSOpts->ImplicitModuleMaps)
|
||||
return None;
|
||||
return nullptr;
|
||||
// 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.getOptionalFileRef(ModuleMapFileName))
|
||||
return F;
|
||||
if (auto F = FileMgr.getFile(ModuleMapFileName))
|
||||
return *F;
|
||||
|
||||
// Continue to allow module.map
|
||||
ModuleMapFileName = Dir->getName();
|
||||
llvm::sys::path::append(ModuleMapFileName, "module.map");
|
||||
if (auto F = FileMgr.getOptionalFileRef(ModuleMapFileName))
|
||||
return F;
|
||||
if (auto F = FileMgr.getFile(ModuleMapFileName))
|
||||
return *F;
|
||||
|
||||
// For frameworks, allow to have a private module map with a preferred
|
||||
// spelling when a public module map is absent.
|
||||
|
@ -1612,10 +1616,10 @@ HeaderSearch::lookupModuleMapFile(const DirectoryEntry *Dir, bool IsFramework) {
|
|||
ModuleMapFileName = Dir->getName();
|
||||
llvm::sys::path::append(ModuleMapFileName, "Modules",
|
||||
"module.private.modulemap");
|
||||
if (auto F = FileMgr.getOptionalFileRef(ModuleMapFileName))
|
||||
return F;
|
||||
if (auto F = FileMgr.getFile(ModuleMapFileName))
|
||||
return *F;
|
||||
}
|
||||
return None;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
Module *HeaderSearch::loadFrameworkModule(StringRef Name,
|
||||
|
@ -1659,10 +1663,9 @@ HeaderSearch::loadModuleMapFile(const DirectoryEntry *Dir, bool IsSystem,
|
|||
if (KnownDir != DirectoryHasModuleMap.end())
|
||||
return KnownDir->second ? LMM_AlreadyLoaded : LMM_InvalidModuleMap;
|
||||
|
||||
if (Optional<FileEntryRef> ModuleMapFile =
|
||||
lookupModuleMapFile(Dir, IsFramework)) {
|
||||
if (const FileEntry *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
|
||||
|
|
|
@ -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 (Optional<FileEntryRef> ModMapFile =
|
||||
HeaderInfo.lookupModuleMapFile(*ParentDir, IsFrameworkDir)) {
|
||||
parseModuleMapFile(*ModMapFile, Attrs.IsSystem, *ParentDir);
|
||||
if (const FileEntry *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().getOptionalFileRef(FileNameRef))
|
||||
if (auto File = SourceMgr.getFileManager().getFile(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(FileEntryRef File, bool IsSystem,
|
||||
bool ModuleMap::parseModuleMapFile(const FileEntry *File, bool IsSystem,
|
||||
const DirectoryEntry *Dir, FileID ID,
|
||||
unsigned *Offset,
|
||||
SourceLocation ExternModuleLoc) {
|
||||
|
|
|
@ -278,10 +278,10 @@ bool ClangModulesDeclVendorImpl::AddModule(const SourceModule &module,
|
|||
HS.getFileMgr().getDirectory(module.search_path.GetStringRef());
|
||||
if (!dir)
|
||||
return error();
|
||||
auto file = HS.lookupModuleMapFile(*dir, is_framework);
|
||||
auto *file = HS.lookupModuleMapFile(*dir, is_framework);
|
||||
if (!file)
|
||||
return error();
|
||||
if (!HS.loadModuleMapFile(*file, is_system))
|
||||
if (!HS.loadModuleMapFile(file, is_system))
|
||||
return error();
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue