Go to the documentation of this file.
14 #ifndef LLVM_SUPPORT_VIRTUALFILESYSTEM_H
15 #define LLVM_SUPPORT_VIRTUALFILESYSTEM_H
34 #include <system_error>
41 class MemoryBufferRef;
84 const Twine &NewName);
134 bool RequiresNullTerminator =
true,
bool IsVolatile =
false) = 0;
137 virtual std::error_code
close() = 0;
182 std::shared_ptr<detail::DirIterImpl> Impl;
187 assert(Impl.get() !=
nullptr &&
"requires non-null implementation");
188 if (Impl->CurrentEntry.path().empty())
197 assert(Impl &&
"attempting to increment past end");
198 EC = Impl->increment();
199 if (Impl->CurrentEntry.path().empty())
208 if (Impl &&
RHS.Impl)
209 return Impl->CurrentEntry.path() ==
RHS.Impl->CurrentEntry.path();
210 return !Impl && !
RHS.Impl;
213 return !(*
this ==
RHS);
223 std::stack<directory_iterator, std::vector<directory_iterator>>
Stack;
233 std::shared_ptr<detail::RecDirIterState>
238 std::error_code &EC);
250 return State ==
Other.State;
253 return !(*
this ==
RHS);
258 assert(!State->Stack.empty() &&
259 "Cannot get level without any iteration state");
260 return State->Stack.size() - 1;
263 void no_push() { State->HasNoPushRequest =
true; }
282 bool RequiresNullTerminator =
true,
bool IsVolatile =
false);
287 std::error_code &EC) = 0;
306 virtual std::error_code
isLocal(
const Twine &Path,
bool &Result);
323 unsigned IndentLevel = 0)
const {
327 #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
333 unsigned IndentLevel)
const {
335 OS <<
"FileSystem\n";
339 for (
unsigned i = 0;
i < IndentLevel; ++
i)
385 std::error_code
isLocal(
const Twine &Path,
bool &Result)
override;
417 unsigned IndentLevel)
const override;
429 return FS->status(Path);
433 return FS->openFileForRead(Path);
436 return FS->dir_begin(Dir, EC);
439 return FS->getCurrentWorkingDirectory();
442 return FS->setCurrentWorkingDirectory(Path);
446 return FS->getRealPath(Path, Output);
449 return FS->isLocal(Path, Result);
458 virtual void anchor();
463 class InMemoryDirectory;
471 std::unique_ptr<llvm::MemoryBuffer>
Buffer;
492 explicit operator bool()
const {
return static_cast<bool>(
Value); }
493 operator std::error_code()
const {
return Value.getError(); }
502 std::unique_ptr<detail::InMemoryDirectory> Root;
503 std::string WorkingDirectory;
504 bool UseNormalizedPaths =
true;
510 bool addFile(
const Twine &Path, time_t ModificationTime,
511 std::unique_ptr<llvm::MemoryBuffer> Buffer,
512 std::optional<uint32_t>
User, std::optional<uint32_t> Group,
513 std::optional<llvm::sys::fs::file_type>
Type,
514 std::optional<llvm::sys::fs::perms> Perms,
MakeNodeFn MakeNode);
520 size_t SymlinkDepth = 0)
const;
534 bool addFile(
const Twine &Path, time_t ModificationTime,
535 std::unique_ptr<llvm::MemoryBuffer> Buffer,
536 std::optional<uint32_t>
User = std::nullopt,
537 std::optional<uint32_t> Group = std::nullopt,
538 std::optional<llvm::sys::fs::file_type>
Type = std::nullopt,
539 std::optional<llvm::sys::fs::perms> Perms = std::nullopt);
566 time_t ModificationTime,
567 std::optional<uint32_t>
User = std::nullopt,
568 std::optional<uint32_t> Group = std::nullopt,
569 std::optional<llvm::sys::fs::perms> Perms = std::nullopt);
579 std::optional<uint32_t>
User = std::nullopt,
580 std::optional<uint32_t> Group = std::nullopt,
581 std::optional<llvm::sys::fs::file_type>
Type = std::nullopt,
582 std::optional<llvm::sys::fs::perms> Perms = std::nullopt);
595 return WorkingDirectory;
605 std::error_code
isLocal(
const Twine &Path,
bool &Result)
override;
610 unsigned IndentLevel)
const override;
618 std::unique_ptr<FileSystem>
621 StringRef YAMLFilePath,
void *DiagContext =
nullptr,
625 template <
typename T1,
typename T2>
777 virtual ~Entry() =
default;
785 std::vector<std::unique_ptr<Entry>> Contents;
818 std::string ExternalContentsPath;
824 :
Entry(K, Name), ExternalContentsPath(ExternalContentsPath),
832 return UseName ==
NK_NotSet ? GlobalUseExternalName
839 switch (
E->getKind()) {
882 std::optional<std::string> ExternalRedirect;
892 if (isa<DirectoryRemapEntry>(
E))
894 if (
auto *FE = dyn_cast<FileEntry>(
E))
895 return FE->getExternalContentsPath();
913 const Twine &OriginalPath)
const;
938 return (lhs ==
"/" && rhs ==
"\\") || (lhs ==
"\\" && rhs ==
"/");
942 std::vector<std::unique_ptr<Entry>> Roots;
945 std::string WorkingDirectory;
954 std::string OverlayFileDir;
966 bool IsRelativeOverlay =
false;
970 bool UseExternalNames =
true;
1003 static std::unique_ptr<RedirectingFileSystem>
1004 create(std::unique_ptr<MemoryBuffer> Buffer,
1009 static std::unique_ptr<RedirectingFileSystem>
1010 create(
ArrayRef<std::pair<std::string, std::string>> RemappedFiles,
1011 bool UseExternalNames,
FileSystem &ExternalFS);
1023 std::error_code
isLocal(
const Twine &Path,
bool &Result)
override;
1039 std::vector<llvm::StringRef>
getRoots()
const;
1045 unsigned IndentLevel)
const override;
1052 std::unique_ptr<llvm::MemoryBuffer> Buffer,
1055 void *DiagContext =
nullptr,
1059 std::vector<YAMLVFSEntry> Mappings;
1060 std::optional<bool> IsCaseSensitive;
1061 std::optional<bool> IsOverlayRelative;
1062 std::optional<bool> UseExternalNames;
1063 std::string OverlayDir;
1074 IsCaseSensitive = CaseSensitive;
1080 IsOverlayRelative =
true;
1081 OverlayDir.assign(OverlayDirectory.
str());
1092 #endif // LLVM_SUPPORT_VIRTUALFILESYSTEM_H
virtual llvm::ErrorOr< std::unique_ptr< llvm::MemoryBuffer > > getBuffer(const Twine &Name, int64_t FileSize=-1, bool RequiresNullTerminator=true, bool IsVolatile=false)=0
Get the contents of the file as a MemoryBuffer.
Directory iterator implementation for RedirectingFileSystem's directory entries.
std::error_code setCurrentWorkingDirectory(const Twine &Path) override
Set the working directory.
virtual directory_iterator dir_begin(const Twine &Dir, std::error_code &EC)=0
Get a directory_iterator for Dir.
#define LLVM_DUMP_METHOD
Mark debug helper function definitions like dump() that should not be stripped from debug builds.
bool isRegularFile() const
std::error_code setCurrentWorkingDirectory(const Twine &Path) override
Set the working directory.
This is an optimization pass for GlobalISel generic memory operations.
Entry * getLastContent() const
llvm::ErrorOr< std::string > getCurrentWorkingDirectory() const override
Get the working directory of this file system.
NameKind getUseName() const
directory_entry CurrentEntry
bool useExternalName(bool GlobalUseExternalName) const
Whether to use the external path as the name for this file or directory.
static bool classof(const Entry *E)
directory_iterator dir_begin(const Twine &Dir, std::error_code &EC) override
Get a directory_iterator for Dir.
std::unique_ptr< FileSystem > createPhysicalFileSystem()
Create an vfs::FileSystem for the 'real' file system, as seen by the operating system.
llvm::ErrorOr< std::string > getCurrentWorkingDirectory() const override
Get the working directory of this file system.
Entry * E
The entry the looked-up path corresponds to.
FileEntry(StringRef Name, StringRef ExternalContentsPath, NameKind UseName)
directory_iterator dir_begin(const Twine &Dir, std::error_code &EC) override
Get a directory_iterator for Dir.
const_range overlays_range() const
This currently compiles esp xmm0 movsd esp eax eax esp ret We should use not the dag combiner This is because dagcombine2 needs to be able to see through the X86ISD::Wrapper which DAGCombine can t really do The code for turning x load into a single vector load is target independent and should be moved to the dag combiner The code for turning x load into a vector load can only handle a direct load from a global or a direct load from the stack It should be generalized to handle any load from P
recursive_directory_iterator()=default
Construct an 'end' iterator.
iterator contents_begin()
void setFallthrough(bool Fallthrough)
Sets the redirection kind to Fallthrough if true or RedirectOnly otherwise.
virtual void printImpl(raw_ostream &OS, PrintType Type, unsigned IndentLevel) const
A directory in the vfs that maps to a directory in the external file system.
bool operator!=(const directory_iterator &RHS) const
std::error_code getRealPath(const Twine &Path, SmallVectorImpl< char > &Output) const override
Gets real path of Path e.g.
static std::unique_ptr< RedirectingFileSystem > create(std::unique_ptr< MemoryBuffer > Buffer, SourceMgr::DiagHandlerTy DiagHandler, StringRef YAMLFilePath, void *DiagContext, IntrusiveRefCntPtr< FileSystem > ExternalFS)
Parses Buffer, which is expected to be in YAML format and returns a virtual file system representing ...
Target - Wrapper for Target specific information.
bool useNormalizedPaths() const
Return true if this file system normalizes . and .. in paths.
InMemoryFileSystem(bool UseNormalizedPaths=true)
An interface for virtual file systems to provide an iterator over the (non-recursive) contents of a d...
std::error_code getRealPath(const Twine &Path, SmallVectorImpl< char > &Output) const override
Canonicalizes Path by combining with the current working directory and normalizing the path (e....
StringRef getName() const
virtual llvm::ErrorOr< Status > status(const Twine &Path)=0
Get the status of the entry at Path, if one exists.
virtual std::error_code setCurrentWorkingDirectory(const Twine &Path)=0
Set the working directory.
A file in the vfs that maps to a file in the external file system.
The instances of the Type class are immutable: once they are created, they are never changed.
reverse_iterator overlays_rend()
Get an iterator pointing one-past the most recently added file system.
An input iterator over the entries in a virtual path, similar to llvm::sys::fs::directory_iterator.
llvm::ErrorOr< std::string > getCurrentWorkingDirectory() const override
Get the working directory of this file system.
const_reverse_iterator overlays_rbegin() const
std::error_code isLocal(const Twine &Path, bool &Result) override
Is the file mounted on a local filesystem?
NamedNodeOrError(llvm::SmallString< 128 > Name, const detail::InMemoryNode *Node)
int level() const
Gets the current level. Starting path is at level 0.
llvm::sys::fs::perms Perms
static void makeAbsolute(SmallVectorImpl< char > &Path)
Make Path absolute.
The result of a status operation.
NamedNodeOrError(llvm::errc EC)
llvm::sys::fs::UniqueID DirUID
ErrorOr< std::unique_ptr< File > > openFileForRead(const Twine &Path) override
Get a File object for the file at Path, if one exists.
void setOverlayFileDir(StringRef PrefixDir)
NamedNodeOrError(std::error_code EC)
std::error_code getRealPath(const Twine &Path, SmallVectorImpl< char > &Output) const override
Gets real path of Path e.g.
A virtual file system parsed from a YAML file.
Entry(EntryKind K, StringRef Name)
std::error_code isLocal(const Twine &Path, bool &Result) override
Is the file mounted on a local filesystem?
virtual std::error_code isLocal(const Twine &Path, bool &Result)
Is the file mounted on a local filesystem?
std::chrono::time_point< std::chrono::system_clock, D > TimePoint
A time point on the system clock.
iterator overlays_end()
Get an iterator pointing one-past the least recently added file system.
FileSystemList::reverse_iterator iterator
void printImpl(raw_ostream &OS, PrintType Type, unsigned IndentLevel) const override
directory_entry(std::string Path, llvm::sys::fs::file_type Type)
LLVM_DUMP_METHOD void dump() const
llvm::sys::fs::perms getPermissions() const
bool addSymbolicLink(const Twine &NewLink, const Twine &Target, time_t ModificationTime, std::optional< uint32_t > User=std::nullopt, std::optional< uint32_t > Group=std::nullopt, std::optional< llvm::sys::fs::perms > Perms=std::nullopt)
Add a symbolic link.
llvm::ErrorOr< Status > status(const Twine &Path) override
Get the status of the entry at Path, if one exists.
std::error_code getRealPath(const Twine &Path, SmallVectorImpl< char > &Output) const override
Gets real path of Path e.g.
static Status copyWithNewName(const Status &In, const Twine &NewName)
Get a copy of a Status with a different name.
bool operator==(const recursive_directory_iterator &Other) const
StringRef getExternalContentsPath() const
DirectoryEntry(StringRef Name, std::vector< std::unique_ptr< Entry >> Contents, Status S)
Constructs a directory entry with explicitly specified contents.
llvm::ErrorOr< std::unique_ptr< llvm::MemoryBuffer > > getBufferForFile(const Twine &Name, int64_t FileSize=-1, bool RequiresNullTerminator=true, bool IsVolatile=false)
This is a convenience method that opens a file, gets its content and then closes the file.
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
const detail::InMemoryNode * operator*() const
void collectVFSFromYAML(std::unique_ptr< llvm::MemoryBuffer > Buffer, llvm::SourceMgr::DiagHandlerTy DiagHandler, StringRef YAMLFilePath, SmallVectorImpl< YAMLVFSEntry > &CollectedEntries, void *DiagContext=nullptr, IntrusiveRefCntPtr< FileSystem > ExternalFS=getRealFileSystem())
Collect all pairs of <virtual path, real path> entries from the YAMLFilePath.
std::unique_ptr< llvm::MemoryBuffer > Buffer
directory_iterator & increment(std::error_code &EC)
Equivalent to operator++, with an error code.
iterator overlays_begin()
Get an iterator pointing to the most recently added file system.
virtual llvm::ErrorOr< std::unique_ptr< File > > openFileForRead(const Twine &Path)=0
Get a File object for the file at Path, if one exists.
virtual std::error_code increment()=0
Sets CurrentEntry to the next entry in the directory on success, to directory_entry() at end,...
std::error_code getError() const
std::error_code setCurrentWorkingDirectory(const Twine &Path) override
Set the working directory.
~InMemoryFileSystem() override
const_reverse_iterator overlays_rend() const
A thread-safe version of RefCountedBase.
void addContent(std::unique_ptr< Entry > Content)
llvm::StringRef path() const
EntryKind getKind() const
This class implements an extremely fast bulk output stream that can only output to a stream.
reverse_iterator overlays_rbegin()
Get an iterator pointing to the least recently added file system.
RemapEntry(EntryKind K, StringRef Name, StringRef ExternalContentsPath, NameKind UseName)
bool exists(const Twine &Path)
Check whether a file exists. Provided for convenience.
std::unique_ptr< FileSystem > getVFSFromYAML(std::unique_ptr< llvm::MemoryBuffer > Buffer, llvm::SourceMgr::DiagHandlerTy DiagHandler, StringRef YAMLFilePath, void *DiagContext=nullptr, IntrusiveRefCntPtr< FileSystem > ExternalFS=getRealFileSystem())
Gets a FileSystem for a virtual file system described in YAML format.
file_type
An enumeration for the file system's view of the type.
decltype(Contents)::iterator iterator
A member of a directory, yielded by a directory_iterator.
std::vector< ExecutorAddr > LookupResult
@ OverlayDir
The roots are relative to the directory where the Overlay YAML file.
static bool classof(const Entry *E)
The in memory file system is a tree of Nodes.
static constexpr size_t MaxSymlinkDepth
Arbitrary max depth to search through symlinks.
bool equals(StringRef RHS) const
equals - Check for string equality, this is more efficient than compare() when the relative ordering ...
virtual llvm::ErrorOr< std::string > getName()
Get the name of the file.
constexpr bool is_style_posix(Style S)
Check if S uses POSIX path rules.
An efficient, type-erasing, non-owning reference to a callable.
Represents the result of a call to sys::fs::status().
bool addFileNoOwn(const Twine &Path, time_t ModificationTime, const llvm::MemoryBufferRef &Buffer, std::optional< uint32_t > User=std::nullopt, std::optional< uint32_t > Group=std::nullopt, std::optional< llvm::sys::fs::file_type > Type=std::nullopt, std::optional< llvm::sys::fs::perms > Perms=std::nullopt)
Add a buffer to the VFS with a path.
StringRef getName() const
Returns the name that should be used for this file or directory.
IntrusiveRefCntPtr< FileSystem > getRealFileSystem()
Gets an vfs::FileSystem for the 'real' file system, as seen by the operating system.
virtual llvm::ErrorOr< std::string > getCurrentWorkingDirectory() const =0
Get the working directory of this file system.
void printIndent(raw_ostream &OS, unsigned IndentLevel) const
llvm::ErrorOr< Status > status(const Twine &Path) override
Get the status of the entry at Path, if one exists.
recursive_directory_iterator & increment(std::error_code &EC)
Equivalent to operator++, with an error code.
FileSystemList::const_iterator const_reverse_iterator
static Status copyWithNewSize(const Status &In, uint64_t NewSize)
Get a copy of a Status with a different size.
virtual void setPath(const Twine &Path)
A file or directory in the vfs that is mapped to a file or directory in the external filesystem.
DirectoryEntry(StringRef Name, Status S)
Constructs an empty directory entry.
static ErrorOr< std::unique_ptr< File > > getWithPath(ErrorOr< std::unique_ptr< File >> Result, const Twine &P)
llvm::sys::fs::file_type Type
RootRelativeKind
The type of relative path used by Roots.
compiles ldr LCPI1_0 ldr ldr mov lsr tst moveq r1 ldr LCPI1_1 and r0 bx lr It would be better to do something like to fold the shift into the conditional move
@ Fallback
Lookup the provided path first and if that fails, "fallback" to a lookup of the redirected path.
std::string toString() const
void(*)(const SMDiagnostic &, void *Context) DiagHandlerTy
Clients that want to handle their own diagnostics in a custom way can register a function pointer+con...
FileSystem & getUnderlyingFS() const
directory_iterator dir_begin(const Twine &Dir, std::error_code &EC) override
Get a directory_iterator for Dir.
@ Fallthrough
Lookup the redirected path first (ie.
typename SuperClass::const_iterator const_iterator
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
YAMLVFSEntry(T1 &&VPath, T2 &&RPath, bool IsDirectory=false)
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
@ CWD
The roots are relative to the current working directory.
llvm::ErrorOr< std::unique_ptr< File > > openFileForRead(const Twine &Path) override
Get a File object for the file at Path, if one exists.
const_iterator overlays_end() const
A helper class to hold the common YAML parsing state.
bool addHardLink(const Twine &NewLink, const Twine &Target)
Add a hard link to a file.
llvm::ErrorOr< Status > status(const Twine &Path) override
Get the status of the entry at Path, if one exists.
directory_iterator()=default
Construct an 'end' iterator.
llvm::sys::fs::UniqueID getNextVirtualUniqueID()
Get a globally unique ID for a virtual file or directory.
void setCaseSensitivity(bool CaseSensitive)
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
static void DiagHandler(const SMDiagnostic &Diag, void *Context)
std::vector< llvm::StringRef > getRoots() const
A directory in the vfs with explicitly specified contents.
StringRef - Represent a constant reference to a string, i.e.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
StringRef getName() const
add sub stmia L5 ldr r0 bl L_printf $stub Instead of a and a wouldn t it be better to do three moves *Return an aggregate type is even return S
void printImpl(raw_ostream &OS, PrintType Type, unsigned IndentLevel) const override
llvm::sys::fs::UniqueID getUniqueID() const
A file system that allows overlaying one AbstractFileSystem on top of another.
void write(llvm::raw_ostream &OS)
bool ExposesExternalVFSPath
Whether this entity has an external path different from the virtual path, and the external path is ex...
llvm::sys::fs::file_type type() const
bool operator!=(const recursive_directory_iterator &RHS) const
void setOverlayDir(StringRef OverlayDirectory)
StringRef getOverlayFileDir() const
directory_iterator(std::shared_ptr< detail::DirIterImpl > I)
static bool classof(const Entry *E)
An input iterator over the recursive contents of a virtual path, similar to llvm::sys::fs::recursive_...
FileSystemList::iterator reverse_iterator
void setUseExternalNames(bool UseExtNames)
virtual std::error_code close()=0
Closes the file.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
void print(raw_ostream &OS, PrintType Type=PrintType::Contents, unsigned IndentLevel=0) const
DirectoryRemapEntry(StringRef Name, StringRef ExternalContentsPath, NameKind UseName)
FileSystemList::const_reverse_iterator const_iterator
The virtual file system interface.
const_iterator overlays_begin() const
An in-memory file system.
const directory_entry * operator->() const
Adaptor from InMemoryDir::iterator to directory_iterator.
LookupResult(Entry *E, sys::path::const_iterator Start, sys::path::const_iterator End)
void printImpl(raw_ostream &OS, PrintType Type, unsigned IndentLevel) const override
directory_entry()=default
llvm::ErrorOr< std::string > getCurrentWorkingDirectory() const override
Get the working directory of this file system.
const directory_entry * operator->() const
ErrorOr< LookupResult > lookupPath(StringRef Path) const
Looks up Path in Roots and returns a LookupResult giving the matched entry and, if the entry was a Fi...
directory_iterator dir_begin(const Twine &Dir, std::error_code &EC) override
Get a directory_iterator for Dir.
const directory_entry & operator*() const
virtual llvm::ErrorOr< Status > status()=0
Get the status of the file.
void addFileMapping(StringRef VirtualPath, StringRef RealPath)
void setRedirection(RedirectingFileSystem::RedirectKind Kind)
std::stack< directory_iterator, std::vector< directory_iterator > > Stack
std::optional< StringRef > getExternalRedirect() const
If the found Entry maps the the input path to a path in the external file system (i....
std::error_code setCurrentWorkingDirectory(const Twine &Path) override
Set the working directory.
By default, this delegates all calls to the underlying file system.
std::error_code isLocal(const Twine &Path, bool &Result) override
Is the file mounted on a local filesystem?
virtual ~File()
Destroy the file after closing it (if open).
void pushOverlay(IntrusiveRefCntPtr< FileSystem > FS)
Pushes a file system on top of the stack.
llvm::sys::TimePoint getLastModificationTime() const
llvm::ErrorOr< std::unique_ptr< File > > openFileForRead(const Twine &Path) override
Get a File object for the file at Path, if one exists.
bool equals_insensitive(StringRef RHS) const
Check for string equality, ignoring case.
std::optional< std::vector< StOtherPiece > > Other
const std::vector< YAMLVFSEntry > & getMappings() const
static bool classof(const Entry *E)
void printEntry(raw_ostream &OS, Entry *E, unsigned IndentLevel=0) const
typename SuperClass::iterator iterator
std::error_code status(const Twine &path, file_status &result, bool follow=true)
Get file status as if by POSIX stat().
Represents either an error or a value T.
Represents the result of a path lookup into the RedirectingFileSystem.
void addDirectoryMapping(StringRef VirtualPath, StringRef RealPath)
llvm::sys::fs::file_type getType() const
Keeps state for the recursive_directory_iterator.
A range adaptor for a pair of iterators.
bool operator==(const directory_iterator &RHS) const
const directory_entry & operator*() const
uint32_t getGroup() const
auto reverse(ContainerTy &&C)
virtual std::error_code getRealPath(const Twine &Path, SmallVectorImpl< char > &Output) const
Gets real path of Path e.g.
std::string str() const
str - Get the contents as an std::string.
virtual std::error_code makeAbsolute(SmallVectorImpl< char > &Path) const
Make Path an absolute path.
ProxyFileSystem(IntrusiveRefCntPtr< FileSystem > FS)
BlockVerifier::State From
bool equivalent(const Status &Other) const
std::error_code isLocal(const Twine &Path, bool &Result) override
Is the file mounted on a local filesystem?
llvm::ErrorOr< std::unique_ptr< File > > openFileForRead(const Twine &Path) override
Get a File object for the file at Path, if one exists.
LLVM Value Representation.
Status makeStatus() const
bool isStatusKnown() const
A smart pointer to a reference-counted object that inherits from RefCountedBase or ThreadSafeRefCount...
A single file or directory in the VFS.
@ RedirectOnly
Only lookup the redirected path, do not lookup the originally provided path.
RedirectKind
The type of redirection to perform.
OverlayFileSystem(IntrusiveRefCntPtr< FileSystem > Base)