[clang] ac40a2d - Serialization: Change InputFile to use FileEntryRef and add getVirtualFileRef, NFC
Duncan P. N. Exon Smith via cfe-commits
cfe-commits at lists.llvm.org
Mon Nov 30 14:05:00 PST 2020
Author: Duncan P. N. Exon Smith
Date: 2020-11-30T14:04:48-08:00
New Revision: ac40a2d8f16b8a8c68fc811d67f647740e965cb8
URL: https://github.com/llvm/llvm-project/commit/ac40a2d8f16b8a8c68fc811d67f647740e965cb8
DIFF: https://github.com/llvm/llvm-project/commit/ac40a2d8f16b8a8c68fc811d67f647740e965cb8.diff
LOG: Serialization: Change InputFile to use FileEntryRef and add getVirtualFileRef, NFC
Change the `InputFile` class to store `Optional<FileEntryRef>` instead
of `FileEntry*`. This paged in a few API changes:
- Added `FileManager::getVirtualFileRef`, and converted `getVirtualFile`
to a wrapper of it.
- Updated `SourceManager::bypassFileContentsOverride` to take
`FileEntryRef` and return `Optional<FileEntryRef>`
(`ASTReader::getInputFile` is the only caller).
Differential Revision: https://reviews.llvm.org/D90053
Added:
Modified:
clang/include/clang/Basic/FileManager.h
clang/include/clang/Basic/SourceManager.h
clang/include/clang/Serialization/ModuleFile.h
clang/lib/Basic/FileManager.cpp
clang/lib/Basic/SourceManager.cpp
clang/lib/Serialization/ASTReader.cpp
Removed:
################################################################################
diff --git a/clang/include/clang/Basic/FileManager.h b/clang/include/clang/Basic/FileManager.h
index d7135a4f0ac3..449aec2b3541 100644
--- a/clang/include/clang/Basic/FileManager.h
+++ b/clang/include/clang/Basic/FileManager.h
@@ -239,6 +239,9 @@ class FileManager : public RefCountedBase<FileManager> {
/// if there were a file with the given name on disk.
///
/// The file itself is not accessed.
+ FileEntryRef getVirtualFileRef(StringRef Filename, off_t Size,
+ time_t ModificationTime);
+
const FileEntry *getVirtualFile(StringRef Filename, off_t Size,
time_t ModificationTime);
diff --git a/clang/include/clang/Basic/SourceManager.h b/clang/include/clang/Basic/SourceManager.h
index b231644330ed..459bd088f0d7 100644
--- a/clang/include/clang/Basic/SourceManager.h
+++ b/clang/include/clang/Basic/SourceManager.h
@@ -35,6 +35,7 @@
#define LLVM_CLANG_BASIC_SOURCEMANAGER_H
#include "clang/Basic/Diagnostic.h"
+#include "clang/Basic/FileEntry.h"
#include "clang/Basic/SourceLocation.h"
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/BitVector.h"
@@ -60,8 +61,6 @@ namespace clang {
class ASTReader;
class ASTWriter;
class FileManager;
-class FileEntry;
-class FileEntryRef;
class LineTableInfo;
class SourceManager;
@@ -982,11 +981,11 @@ class SourceManager : public RefCountedBase<SourceManager> {
}
/// Bypass the overridden contents of a file. This creates a new FileEntry
- /// and initializes the content cache for it. Returns nullptr if there is no
+ /// and initializes the content cache for it. Returns None if there is no
/// such file in the filesystem.
///
/// This should be called before parsing has begun.
- const FileEntry *bypassFileContentsOverride(const FileEntry &File);
+ Optional<FileEntryRef> bypassFileContentsOverride(FileEntryRef File);
/// Specify that a file is transient.
void setFileIsTransient(const FileEntry *SourceFile);
diff --git a/clang/include/clang/Serialization/ModuleFile.h b/clang/include/clang/Serialization/ModuleFile.h
index a309c1143350..a641a26661ae 100644
--- a/clang/include/clang/Serialization/ModuleFile.h
+++ b/clang/include/clang/Serialization/ModuleFile.h
@@ -67,13 +67,13 @@ class InputFile {
OutOfDate = 2,
NotFound = 3
};
- llvm::PointerIntPair<const FileEntry *, 2, unsigned> Val;
+ llvm::PointerIntPair<const FileEntryRef::MapEntry *, 2, unsigned> Val;
public:
InputFile() = default;
- InputFile(const FileEntry *File,
- bool isOverridden = false, bool isOutOfDate = false) {
+ InputFile(FileEntryRef File, bool isOverridden = false,
+ bool isOutOfDate = false) {
assert(!(isOverridden && isOutOfDate) &&
"an overridden cannot be out-of-date");
unsigned intVal = 0;
@@ -81,7 +81,7 @@ class InputFile {
intVal = Overridden;
else if (isOutOfDate)
intVal = OutOfDate;
- Val.setPointerAndInt(File, intVal);
+ Val.setPointerAndInt(&File.getMapEntry(), intVal);
}
static InputFile getNotFound() {
@@ -90,7 +90,11 @@ class InputFile {
return File;
}
- const FileEntry *getFile() const { return Val.getPointer(); }
+ OptionalFileEntryRefDegradesToFileEntryPtr getFile() const {
+ if (auto *P = Val.getPointer())
+ return FileEntryRef(*P);
+ return None;
+ }
bool isOverridden() const { return Val.getInt() == Overridden; }
bool isOutOfDate() const { return Val.getInt() == OutOfDate; }
bool isNotFound() const { return Val.getInt() == NotFound; }
diff --git a/clang/lib/Basic/FileManager.cpp b/clang/lib/Basic/FileManager.cpp
index 38d9403eadb9..ef0c69ae0107 100644
--- a/clang/lib/Basic/FileManager.cpp
+++ b/clang/lib/Basic/FileManager.cpp
@@ -335,9 +335,13 @@ FileManager::getFileRef(StringRef Filename, bool openFile, bool CacheFailure) {
return ReturnedRef;
}
-const FileEntry *
-FileManager::getVirtualFile(StringRef Filename, off_t Size,
- time_t ModificationTime) {
+const FileEntry *FileManager::getVirtualFile(StringRef Filename, off_t Size,
+ time_t ModificationTime) {
+ return &getVirtualFileRef(Filename, Size, ModificationTime).getFileEntry();
+}
+
+FileEntryRef FileManager::getVirtualFileRef(StringRef Filename, off_t Size,
+ time_t ModificationTime) {
++NumFileLookups;
// See if there is already an entry in the map for an existing file.
@@ -345,12 +349,10 @@ FileManager::getVirtualFile(StringRef Filename, off_t Size,
{Filename, std::errc::no_such_file_or_directory}).first;
if (NamedFileEnt.second) {
FileEntryRef::MapValue Value = *NamedFileEnt.second;
- FileEntry *FE;
- if (LLVM_LIKELY(FE = Value.V.dyn_cast<FileEntry *>()))
- return FE;
- return &FileEntryRef(*reinterpret_cast<const FileEntryRef::MapEntry *>(
- Value.V.get<const void *>()))
- .getFileEntry();
+ if (LLVM_LIKELY(Value.V.is<FileEntry *>()))
+ return FileEntryRef(NamedFileEnt);
+ return FileEntryRef(*reinterpret_cast<const FileEntryRef::MapEntry *>(
+ Value.V.get<const void *>()));
}
// We've not seen this before, or the file is cached as non-existent.
@@ -389,7 +391,7 @@ FileManager::getVirtualFile(StringRef Filename, off_t Size,
// FIXME: Surely this should add a reference by the new name, and return
// it instead...
if (UFE->isValid())
- return UFE;
+ return FileEntryRef(NamedFileEnt);
UFE->UniqueID = Status.getUniqueID();
UFE->IsNamedPipe = Status.getType() == llvm::sys::fs::file_type::fifo_file;
@@ -407,7 +409,7 @@ FileManager::getVirtualFile(StringRef Filename, off_t Size,
UFE->UID = NextFileUID++;
UFE->IsValid = true;
UFE->File.reset();
- return UFE;
+ return FileEntryRef(NamedFileEnt);
}
llvm::Optional<FileEntryRef> FileManager::getBypassFile(FileEntryRef VF) {
diff --git a/clang/lib/Basic/SourceManager.cpp b/clang/lib/Basic/SourceManager.cpp
index dde44715b9e4..b71b2be0cc41 100644
--- a/clang/lib/Basic/SourceManager.cpp
+++ b/clang/lib/Basic/SourceManager.cpp
@@ -698,19 +698,17 @@ void SourceManager::overrideFileContents(const FileEntry *SourceFile,
getOverriddenFilesInfo().OverriddenFiles[SourceFile] = NewFile;
}
-const FileEntry *
-SourceManager::bypassFileContentsOverride(const FileEntry &File) {
- assert(isFileOverridden(&File));
- llvm::Optional<FileEntryRef> BypassFile =
- FileMgr.getBypassFile(File.getLastRef());
+Optional<FileEntryRef>
+SourceManager::bypassFileContentsOverride(FileEntryRef File) {
+ assert(isFileOverridden(&File.getFileEntry()));
+ llvm::Optional<FileEntryRef> BypassFile = FileMgr.getBypassFile(File);
// If the file can't be found in the FS, give up.
if (!BypassFile)
- return nullptr;
+ return None;
- const FileEntry *FE = &BypassFile->getFileEntry();
- (void)getOrCreateContentCache(FE);
- return FE;
+ (void)getOrCreateContentCache(&BypassFile->getFileEntry());
+ return BypassFile;
}
void SourceManager::setFileIsTransient(const FileEntry *File) {
diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp
index 4a6cf7fe63ca..6206ea552838 100644
--- a/clang/lib/Serialization/ASTReader.cpp
+++ b/clang/lib/Serialization/ASTReader.cpp
@@ -2296,27 +2296,25 @@ InputFile ASTReader::getInputFile(ModuleFile &F, unsigned ID, bool Complain) {
StringRef Filename = FI.Filename;
uint64_t StoredContentHash = FI.ContentHash;
- const FileEntry *File = nullptr;
- if (auto FE = FileMgr.getFile(Filename, /*OpenFile=*/false))
- File = *FE;
+ OptionalFileEntryRefDegradesToFileEntryPtr File =
+ expectedToOptional(FileMgr.getFileRef(Filename, /*OpenFile=*/false));
// If we didn't find the file, resolve it relative to the
// original directory from which this AST file was created.
- if (File == nullptr && !F.OriginalDir.empty() && !F.BaseDirectory.empty() &&
+ if (!File && !F.OriginalDir.empty() && !F.BaseDirectory.empty() &&
F.OriginalDir != F.BaseDirectory) {
std::string Resolved = resolveFileRelativeToOriginalDir(
std::string(Filename), F.OriginalDir, F.BaseDirectory);
if (!Resolved.empty())
- if (auto FE = FileMgr.getFile(Resolved))
- File = *FE;
+ File = expectedToOptional(FileMgr.getFileRef(Resolved));
}
// For an overridden file, create a virtual file with the stored
// size/timestamp.
- if ((Overridden || Transient) && File == nullptr)
- File = FileMgr.getVirtualFile(Filename, StoredSize, StoredTime);
+ if ((Overridden || Transient) && !File)
+ File = FileMgr.getVirtualFileRef(Filename, StoredSize, StoredTime);
- if (File == nullptr) {
+ if (!File) {
if (Complain) {
std::string ErrorStr = "could not find file '";
ErrorStr += Filename;
@@ -2418,7 +2416,7 @@ InputFile ASTReader::getInputFile(ModuleFile &F, unsigned ID, bool Complain) {
// FIXME: If the file is overridden and we've already opened it,
// issue an error (or split it into a separate FileEntry).
- InputFile IF = InputFile(File, Overridden || Transient, IsOutOfDate);
+ InputFile IF = InputFile(*File, Overridden || Transient, IsOutOfDate);
// Note that we've loaded this input file.
F.InputFilesLoaded[ID-1] = IF;
@@ -9274,7 +9272,7 @@ void ASTReader::visitTopLevelModuleMaps(
InputFileInfo IFI = readInputFileInfo(MF, I + 1);
if (IFI.TopLevelModuleMap)
// FIXME: This unnecessarily re-reads the InputFileInfo.
- if (auto *FE = getInputFile(MF, I + 1).getFile())
+ if (auto FE = getInputFile(MF, I + 1).getFile())
Visitor(FE);
}
}
More information about the cfe-commits
mailing list