diff --git a/clang/include/clang/Tooling/DependencyScanning/DependencyScanningFilesystem.h b/clang/include/clang/Tooling/DependencyScanning/DependencyScanningFilesystem.h --- a/clang/include/clang/Tooling/DependencyScanning/DependencyScanningFilesystem.h +++ b/clang/include/clang/Tooling/DependencyScanning/DependencyScanningFilesystem.h @@ -225,10 +225,16 @@ StringRef Filename, llvm::sys::fs::UniqueID UID, SharedStat *&SharedStat, llvm::Optional> &Lock); + /// The information requested from \c getOrCreateFileSystemEntry. + enum RequestedInformation { + RI_Status, + RI_Contents, + }; + /// Get the full filesystem entry for \p Path from local cache, populating it /// if necessary. llvm::ErrorOr - getOrCreateFileSystemEntry(StringRef Path); + getOrCreateFileSystemEntry(StringRef Path, RequestedInformation RI); /// The global cache shared between worker threads. DependencyScanningFilesystemSharedCache &SharedCache; diff --git a/clang/lib/Tooling/DependencyScanning/DependencyScanningFilesystem.cpp b/clang/lib/Tooling/DependencyScanning/DependencyScanningFilesystem.cpp --- a/clang/lib/Tooling/DependencyScanning/DependencyScanningFilesystem.cpp +++ b/clang/lib/Tooling/DependencyScanning/DependencyScanningFilesystem.cpp @@ -290,7 +290,7 @@ llvm::ErrorOr DependencyScanningWorkerFilesystem::getOrCreateFileSystemEntry( - StringRef Filename) { + StringRef Filename, RequestedInformation RI) { SharedStat *SharedStat = nullptr; llvm::Optional> GuardLock; @@ -304,6 +304,12 @@ llvm::sys::fs::UniqueID UID = (*LocalStat)->getUniqueID(); if (!shouldMinimize(Filename)) { + if (RI == RI_Status) { + // If the caller wants a status of a file that doesn't need minimization, + // reading it is not necessary. + return FileSystemEntryResult(*LocalStat, nullptr, nullptr); + } + const OriginalContents *LocalOriginalContents = getOrCreateLocalOriginalContents(Filename, UID, SharedStat, GuardLock); return FileSystemEntryResult(*LocalStat, LocalOriginalContents, nullptr); @@ -321,7 +327,7 @@ DependencyScanningWorkerFilesystem::status(const Twine &Path) { SmallString<256> OwnedFilename; StringRef Filename = Path.toStringRef(OwnedFilename); - auto Result = getOrCreateFileSystemEntry(Filename); + auto Result = getOrCreateFileSystemEntry(Filename, RI_Status); if (!Result) return Result.getError(); return Result->Status; @@ -381,7 +387,7 @@ SmallString<256> OwnedFilename; StringRef Filename = Path.toStringRef(OwnedFilename); - auto Result = getOrCreateFileSystemEntry(Filename); + auto Result = getOrCreateFileSystemEntry(Filename, RI_Contents); if (!Result) return Result.getError(); if (!Result->Status)