14#ifndef LLVM_CLANG_BASIC_FILEMANAGER_H
15#define LLVM_CLANG_BASIC_FILEMANAGER_H
21#include "llvm/ADT/DenseMap.h"
22#include "llvm/ADT/IntrusiveRefCntPtr.h"
23#include "llvm/ADT/PointerUnion.h"
24#include "llvm/ADT/SmallVector.h"
25#include "llvm/ADT/StringMap.h"
26#include "llvm/ADT/StringRef.h"
27#include "llvm/Support/Allocator.h"
28#include "llvm/Support/ErrorOr.h"
29#include "llvm/Support/FileSystem.h"
30#include "llvm/Support/VirtualFileSystem.h"
55 llvm::SpecificBumpPtrAllocator<FileEntry> FilesAlloc;
56 llvm::SpecificBumpPtrAllocator<DirectoryEntry> DirsAlloc;
59 llvm::DenseMap<llvm::sys::fs::UniqueID, DirectoryEntry *> UniqueRealDirs;
62 llvm::DenseMap<llvm::sys::fs::UniqueID, FileEntry *> UniqueRealFiles;
85 llvm::StringMap<llvm::ErrorOr<DirectoryEntry &>, llvm::BumpPtrAllocator>
93 llvm::StringMap<llvm::ErrorOr<FileEntryRef::MapValue>, llvm::BumpPtrAllocator>
100 std::unique_ptr<llvm::StringMap<llvm::ErrorOr<FileEntryRef::MapValue>>>
101 SeenBypassFileEntries;
107 llvm::DenseMap<const void *, llvm::StringRef> CanonicalNames;
110 llvm::BumpPtrAllocator CanonicalNameStorage;
114 unsigned NextFileUID;
117 unsigned NumDirLookups = 0;
118 unsigned NumFileLookups = 0;
119 unsigned NumDirCacheMisses = 0;
120 unsigned NumFileCacheMisses = 0;
122 std::error_code getStatValue(StringRef Path, llvm::vfs::Status &Status,
123 bool isFile, std::unique_ptr<llvm::vfs::File> *F,
128 void addAncestorsAsVirtualDirs(StringRef Path);
135 llvm::ErrorOr<FileEntryRef> getFileRefImpl(StringRef Filename,
bool OpenFile,
136 bool CacheFailure,
bool IsText);
140 llvm::ErrorOr<DirectoryEntryRef> getDirectoryRefImpl(StringRef DirName,
145 llvm::ErrorOr<DirectoryEntryRef> getDirectoryFromFile(StringRef Filename,
171 bool CacheFailure =
true) {
172 auto Ref = getDirectoryRefImpl(DirName, CacheFailure);
175 return llvm::createFileError(DirName, Ref.getError());
180 bool CacheFailure =
true) {
181 if (
auto Ref = getDirectoryRefImpl(DirName, CacheFailure))
201 bool OpenFile =
false,
202 bool CacheFailure =
true,
203 bool IsText =
true) {
204 auto Ref = getFileRefImpl(Filename, OpenFile, CacheFailure, IsText);
207 return llvm::createFileError(Filename, Ref.getError());
220 bool OpenFile =
false,
221 bool CacheFailure =
true,
222 bool IsText =
true) {
223 if (
auto Ref = getFileRefImpl(Filename, OpenFile, CacheFailure, IsText))
243 this->FS = std::move(FS);
251 time_t ModificationTime);
268 llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>>
270 bool RequiresNullTerminator =
true,
271 std::optional<int64_t> MaybeLimit = std::nullopt,
273 llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>>
275 bool RequiresNullTerminator =
true,
276 std::optional<int64_t> MaybeLimit = std::nullopt,
277 bool IsText =
true)
const {
278 return getBufferForFileImpl(Filename,
279 MaybeLimit.value_or(-1),
280 isVolatile, RequiresNullTerminator, IsText);
284 llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>>
285 getBufferForFileImpl(StringRef Filename, int64_t FileSize,
bool isVolatile,
286 bool RequiresNullTerminator,
bool IsText)
const;
288 DirectoryEntry *&getRealDirEntry(
const llvm::vfs::Status &Status);
307 bool Canonicalize =
false)
const;
Defines interfaces for clang::DirectoryEntry and clang::DirectoryEntryRef.
Defines interfaces for clang::FileEntry and clang::FileEntryRef.
Defines the clang::FileSystemOptions interface.
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
A reference to a DirectoryEntry that includes the name of the directory as it was accessed by the Fil...
Cached information about one directory (either on disk or in the virtual file system).
A reference to a FileEntry that includes the name of the file as it was accessed by the FileManager's...
Cached information about one file (either on disk or in the virtual file system).
Implements support for file system lookup, file system caching, and directory search management.
void AddStats(const FileManager &Other)
Import statistics from a child FileManager and add them to this current FileManager.
void trackVFSUsage(bool Active)
Enable or disable tracking of VFS usage.
llvm::vfs::FileSystem & getVirtualFileSystem() const
llvm::ErrorOr< std::unique_ptr< llvm::MemoryBuffer > > getBufferForFile(FileEntryRef Entry, bool isVolatile=false, bool RequiresNullTerminator=true, std::optional< int64_t > MaybeLimit=std::nullopt, bool IsText=true)
Open the specified file as a MemoryBuffer, returning a new MemoryBuffer if successful,...
llvm::Expected< DirectoryEntryRef > getDirectoryRef(StringRef DirName, bool CacheFailure=true)
Lookup, cache, and verify the specified directory (real or virtual).
FileManager(const FileSystemOptions &FileSystemOpts, IntrusiveRefCntPtr< llvm::vfs::FileSystem > FS=nullptr)
Construct a file manager, optionally with a custom VFS.
llvm::Expected< FileEntryRef > getSTDIN()
Get the FileEntryRef for stdin, returning an error if stdin cannot be read.
llvm::Expected< FileEntryRef > getFileRef(StringRef Filename, bool OpenFile=false, bool CacheFailure=true, bool IsText=true)
Lookup, cache, and verify the specified file (real or virtual).
StringRef getCanonicalName(DirectoryEntryRef Dir)
Retrieve the canonical name for a given directory.
FileSystemOptions & getFileSystemOpts()
Returns the current file system options.
llvm::IntrusiveRefCntPtr< llvm::vfs::FileSystem > getVirtualFileSystemPtr() const
const FileSystemOptions & getFileSystemOpts() const
FileEntryRef getVirtualFileRef(StringRef Filename, off_t Size, time_t ModificationTime)
Retrieve a file entry for a "virtual" file that acts as if there were a file with the given name on d...
bool FixupRelativePath(SmallVectorImpl< char > &Path) const
If path is not absolute and FileSystemOptions set the working directory, the path is modified to be r...
bool makeAbsolutePath(SmallVectorImpl< char > &Path, bool Canonicalize=false) const
Makes Path absolute taking into account FileSystemOptions and the working directory option,...
size_t getNumUniqueRealFiles() const
Returns the number of unique real file entries cached by the file manager.
llvm::ErrorOr< std::unique_ptr< llvm::MemoryBuffer > > getBufferForFile(StringRef Filename, bool isVolatile=false, bool RequiresNullTerminator=true, std::optional< int64_t > MaybeLimit=std::nullopt, bool IsText=true) const
OptionalFileEntryRef getBypassFile(FileEntryRef VFE)
Retrieve a FileEntry that bypasses VFE, which is expected to be a virtual file entry,...
static bool fixupRelativePath(const FileSystemOptions &FileSystemOpts, SmallVectorImpl< char > &Path)
void setVirtualFileSystem(IntrusiveRefCntPtr< llvm::vfs::FileSystem > FS)
OptionalFileEntryRef getOptionalFileRef(StringRef Filename, bool OpenFile=false, bool CacheFailure=true, bool IsText=true)
Get a FileEntryRef if it exists, without doing anything on error.
OptionalDirectoryEntryRef getOptionalDirectoryRef(StringRef DirName, bool CacheFailure=true)
Get a DirectoryEntryRef if it exists, without doing anything on error.
Keeps track of options that affect how file operations are performed.
The JSON file list parser is used to communicate input to InstallAPI.
CustomizableOptional< FileEntryRef > OptionalFileEntryRef
CustomizableOptional< DirectoryEntryRef > OptionalDirectoryEntryRef
@ Other
Other implicit parameter.
Diagnostic wrappers for TextAPI types for error reporting.