Go to the documentation of this file.
26 #ifndef LLVM_SUPPORT_FILESYSTEM_H
27 #define LLVM_SUPPORT_FILESYSTEM_H
32 #include "llvm/Config/llvm-config.h"
45 #include <system_error>
48 #ifdef HAVE_SYS_STAT_H
113 return static_cast<perms>(
static_cast<unsigned short>(
l) |
114 static_cast<unsigned short>(r));
117 return static_cast<perms>(
static_cast<unsigned short>(
l) &
118 static_cast<unsigned short>(r));
130 return static_cast<perms>(
131 static_cast<unsigned short>(~static_cast<unsigned short>(
x)));
139 #if defined(LLVM_ON_UNIX)
147 #elif defined (_WIN32)
163 #if defined(LLVM_ON_UNIX)
166 uid_t UID, gid_t GID, off_t Size)
171 #elif defined(_WIN32)
176 : LastAccessedTimeHigh(LastAccessTimeHigh),
177 LastAccessedTimeLow(LastAccessTimeLow),
178 LastWriteTimeHigh(LastWriteTimeHigh),
179 LastWriteTimeLow(LastWriteTimeLow), FileSizeHigh(FileSizeHigh),
202 #if defined(LLVM_ON_UNIX)
206 #elif defined (_WIN32)
216 return (
uint64_t(FileSizeHigh) << 32) + FileSizeLow;
229 #if defined(LLVM_ON_UNIX)
231 nlink_t fs_st_nlinks = 0;
233 #elif defined (_WIN32)
245 #if defined(LLVM_ON_UNIX)
249 uid_t UID, gid_t GID, off_t Size)
252 fs_st_dev(Dev), fs_st_nlinks(Links), fs_st_ino(Ino) {}
253 #elif defined(_WIN32)
261 LastWriteTimeHigh, LastWriteTimeLow, FileSizeHigh,
263 NumLinks(LinkCount), VolumeSerialNumber(VolumeSerialNumber),
264 FileIndexHigh(FileIndexHigh), FileIndexLow(FileIndexLow) {}
306 bool IgnoreExisting =
true,
375 std::error_code
remove(
const Twine &path,
bool IgnoreNonExisting =
true);
423 return std::error_code();
527 return !
is_local(Path, Result) && Result;
534 return !
is_local(FD, Result) && Result;
644 std::error_code
status(
int FD, file_status &Result);
696 Result =
Status.getSize();
697 return std::error_code();
871 bool RemoveOnClose =
false;
985 unsigned Mode = 0666);
1064 inline std::error_code
1087 unsigned Mode = 0666) {
1109 unsigned Mode = 0666) {
1129 unsigned Mode = 0666) {
1190 std::chrono::milliseconds Timeout = std::chrono::milliseconds(0));
1250 return std::error_code();
1280 void *Mapping =
nullptr;
1288 Mapping = Copied.Mapping;
1290 FileHandle = Copied.FileHandle;
1301 void dontNeedImpl();
1310 moveFromImpl(Moved);
1319 std::error_code &ec);
1324 explicit operator bool()
const {
return Mapping; }
1333 size_t size()
const;
1362 bool FollowSymlinks =
true;
1369 : Path(Path.str()),
Type(
Type), FollowSymlinks(FollowSymlinks),
1377 const std::string &
path()
const {
return Path; }
1424 std::shared_ptr<detail::DirIterState> State;
1425 bool FollowSymlinks =
true;
1429 bool follow_symlinks =
true)
1430 : FollowSymlinks(follow_symlinks) {
1431 State = std::make_shared<detail::DirIterState>();
1434 *State, path.
toStringRef(path_storage), FollowSymlinks);
1438 bool follow_symlinks =
true)
1439 : FollowSymlinks(follow_symlinks) {
1440 State = std::make_shared<detail::DirIterState>();
1442 *State, de.
path(), FollowSymlinks);
1458 if (State ==
RHS.State)
1464 return State->CurrentEntry ==
RHS.State->CurrentEntry;
1468 return !(*
this ==
RHS);
1476 std::stack<directory_iterator, std::vector<directory_iterator>>
Stack;
1486 std::shared_ptr<detail::RecDirIterState> State;
1492 bool follow_symlinks =
true)
1493 : State(
std::make_shared<detail::RecDirIterState>()),
1494 Follow(follow_symlinks) {
1504 if (State->HasNoPushRequest)
1505 State->HasNoPushRequest =
false;
1517 if (State->Stack.top() != end_itr) {
1525 while (!State->Stack.empty()
1526 && State->Stack.top().increment(ec) == end_itr) {
1532 if (State->Stack.empty())
1543 int level()
const {
return State->Level; }
1551 assert(State &&
"Cannot pop an end iterator!");
1552 assert(State->Level > 0 &&
"Cannot pop an iterator with level < 1");
1561 }
while (!State->Stack.empty()
1562 && State->Stack.top().increment(ec) == end_itr);
1565 if (State->Stack.empty())
1570 void no_push() { State->HasNoPushRequest =
true; }
1573 return State ==
RHS.State;
1577 return !(*
this ==
RHS);
1587 #endif // LLVM_SUPPORT_FILESYSTEM_H
void createUniquePath(const Twine &Model, SmallVectorImpl< char > &ResultPath, bool MakeAbsolute)
Create a potentially unique file name but does not create it.
void replace_filename(const Twine &Filename, file_type Type, basic_file_status Status=basic_file_status())
const directory_entry * operator->() const
FileLocker & operator=(FileLocker &&L)
std::error_code openFileForWrite(const Twine &Name, int &ResultFD, CreationDisposition Disp=CD_CreateAlways, OpenFlags Flags=OF_None, unsigned Mode=0666)
Opens the file with the given name in a write-only or read-write mode, returning its open file descri...
Represents the result of a call to directory_iterator::status().
This is an optimization pass for GlobalISel generic memory operations.
std::error_code current_path(SmallVectorImpl< char > &result)
Get the current path.
perms & operator&=(perms &l, perms r)
FileLocker(FileLocker &&L)
space_info - Self explanatory.
std::error_code resize_file_before_mapping_readwrite(int FD, uint64_t Size)
Resize FD to Size before mapping mapped_file_region::readwrite.
bool no_push_request() const
Returns true if no_push has been called for this directory_entry.
basic_file_status(file_type Type, perms Perms, time_t ATime, uint32_t ATimeNSec, time_t MTime, uint32_t MTimeNSec, uid_t UID, gid_t GID, off_t Size)
bool operator<=(const directory_entry &RHS) const
basic_file_status(file_type Type)
uint32_t fs_st_atime_nsec
std::error_code getUniqueID(const Twine Path, UniqueID &Result)
@ priv
May modify via data, but changes are lost on destruction.
const directory_entry * operator->() const
bool operator>=(const directory_entry &RHS) const
std::error_code getPotentiallyUniqueTempFileName(const Twine &Prefix, StringRef Suffix, SmallVectorImpl< char > &ResultPath)
Get a unique temporary file name, not currently exisiting in the filesystem.
std::error_code createUniqueFile(const Twine &Model, int &ResultFD, SmallVectorImpl< char > &ResultPath, OpenFlags Flags=OF_None, unsigned Mode=all_read|all_write)
Create a uniquely named file.
directory_entry CurrentEntry
recursive_directory_iterator()=default
The instances of the Type class are immutable: once they are created, they are never changed.
@ CD_OpenExisting
CD_OpenExisting - When opening a file:
std::error_code access(const Twine &Path, AccessMode Mode)
Can the file be accessed?
bool operator==(const directory_iterator &RHS) const
Tagged union holding either a T or a Error.
std::error_code setLastAccessAndModificationTime(int FD, TimePoint<> AccessTime, TimePoint<> ModificationTime)
Set the file modification and access time.
bool is_regular_file(const basic_file_status &status)
Does status represent a regular file?
void pop()
Goes up one level if Level > 0.
std::error_code set_current_path(const Twine &path)
Set the current path.
the resulting code requires compare and branches when and if * p
Expected< size_t > readNativeFile(file_t FileHandle, MutableArrayRef< char > Buf)
Reads Buf.size() bytes from FileHandle into Buf.
std::error_code directory_iterator_construct(DirIterState &, StringRef, bool)
@ readonly
May only access map via const_data as read only.
void permissions(perms p)
uint32_t getGroup() const
std::error_code unlockFile(int FD)
Unlock the file.
std::chrono::time_point< std::chrono::system_clock, D > TimePoint
A time point on the system clock.
It looks like we only need to define PPCfmarto for these because according to these instructions perform RTO on fma s result
bool operator!=(const recursive_directory_iterator &RHS) const
bool equivalent(file_status A, file_status B)
Do file_status's represent the same thing?
@ OF_CRLF
The file should use a carriage linefeed '\r '.
Keeps state for the directory_iterator.
bool operator==(const recursive_directory_iterator &RHS) const
std::error_code is_local(const Twine &path, bool &result)
Is the file mounted on a local filesystem?
directory_entry()=default
std::error_code create_link(const Twine &to, const Twine &from)
Create a link from from to to.
directory_iterator()=default
Construct end iterator.
const directory_entry & operator*() const
TempFile & operator=(TempFile &&Other)
directory_entry(const Twine &Path, bool FollowSymlinks=true, file_type Type=file_type::type_unknown, basic_file_status Status=basic_file_status())
Expected< file_t > openNativeFile(const Twine &Name, CreationDisposition Disp, FileAccess Access, OpenFlags Flags, unsigned Mode=0666)
Opens a file with the specified creation disposition, access mode, and flags and returns a platform-s...
Clang compiles this i1 i64 store i64 i64 store i64 i64 store i64 i64 store i64 align Which gets codegen d xmm0 movaps rbp movaps rbp movaps rbp movaps rbp rbp rbp rbp rbp It would be better to have movq s of instead of the movaps s LLVM produces ret int
std::error_code directory_iterator_destruct(DirIterState &)
std::error_code createUniqueDirectory(const Twine &Prefix, SmallVectorImpl< char > &ResultPath)
std::error_code real_path(const Twine &path, SmallVectorImpl< char > &output, bool expand_tilde=false)
Collapse all .
This requires reassociating to forms of expressions that are already something that reassoc doesn t think about yet These two functions should generate the same code on big endian int * l
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
TimePoint getLastAccessedTime() const
The file access time as reported from the underlying file system.
std::error_code create_directories(const Twine &path, bool IgnoreExisting=true, perms Perms=owner_all|group_all)
Create all the non-existent directories in path.
recursive_directory_iterator(const Twine &path, std::error_code &ec, bool follow_symlinks=true)
void report_fatal_error(Error Err, bool gen_crash_diag=true)
Report a serious error, calling any installed error handler.
file_type get_file_type(const Twine &Path, bool Follow=true)
Does status represent a directory?
directory_entry - A single entry in a directory.
Expected< file_t > openNativeFileForRead(const Twine &Name, OpenFlags Flags=OF_None, SmallVectorImpl< char > *RealPath=nullptr)
Opens the file with the given name in a read-only mode, returning its open file descriptor.
file_type
An enumeration for the file system's view of the type.
RAII class that facilitates file locking.
bool operator==(const directory_entry &RHS) const
std::error_code openFileForReadWrite(const Twine &Name, int &ResultFD, CreationDisposition Disp, OpenFlags Flags, unsigned Mode=0666)
Opens the file with the given name in a write-only or read-write mode, returning its open file descri...
std::error_code create_hard_link(const Twine &to, const Twine &from)
Create a hard link from from to to, or return an error.
std::error_code changeFileOwnership(int FD, uint32_t Owner, uint32_t Group)
Change ownership of a file.
Error readNativeFileToEOF(file_t FileHandle, SmallVectorImpl< char > &Buffer, ssize_t ChunkSize=DefaultReadChunkSize)
Reads from FileHandle until EOF, appending to Buffer in chunks of size ChunkSize.
@ OF_TextWithCRLF
The file should be opened in text mode and use a carriage linefeed '\r '.
bool can_write(const Twine &Path)
Can we write this file?
file_status(file_type Type)
perms & operator|=(perms &l, perms r)
mapped_file_region(mapped_file_region &&Moved)
basic_file_status()=default
bool is_other(const basic_file_status &status)
Does this status represent something that exists but is not a directory or regular file?
Represents the result of a call to sys::fs::status().
AMD64 Optimization Manual has some nice information about optimizing integer multiplication by a constant How much of it applies to Intel s X86 implementation There are definite trade offs to xmm0 cvttss2siq rdx jb L3 subss xmm0 rax cvttss2siq rdx xorq rdx rax ret instead of xmm1 cvttss2siq rcx movaps xmm2 subss xmm2 cvttss2siq rax rdx xorq rax ucomiss xmm0 cmovb rax ret Seems like the jb branch has high likelihood of being taken It would have saved a few instructions It s not possible to reference and DH registers in an instruction requiring REX prefix divb and mulb both produce results in AH If isel emits a CopyFromReg which gets turned into a movb and that can be allocated a r8b r15b To get around isel emits a CopyFromReg from AX and then right shift it down by and truncate it It s not pretty but it works We need some register allocation magic to make the hack go which would often require a callee saved register Callees usually need to keep this value live for most of their body so it doesn t add a significant burden on them We currently implement this in however this is suboptimal because it means that it would be quite awkward to implement the optimization for callers A better implementation would be to relax the LLVM IR rules for sret arguments to allow a function with an sret argument to have a non void return type
bool exists(const basic_file_status &status)
Does file exist?
friend bool equivalent(file_status A, file_status B)
Do file_status's represent the same thing?
std::error_code getPotentiallyUniqueFileName(const Twine &Model, SmallVectorImpl< char > &ResultPath)
Get a unique name, not currently exisiting in the filesystem.
@ OF_Text
The file should be opened in text mode on platforms like z/OS that make this distinction.
std::error_code openFile(const Twine &Name, int &ResultFD, CreationDisposition Disp, FileAccess Access, OpenFlags Flags, unsigned Mode=0666)
Opens a file with the specified creation disposition, access mode, and flags and returns a file descr...
std::error_code lockFile(int FD)
Lock the file.
multiplies can be turned into SHL s
@ OF_Delete
The returned handle can be used for deleting the file.
std::error_code remove_directories(const Twine &path, bool IgnoreErrors=true)
Recursively delete a directory.
mapped_file_region & operator=(mapped_file_region &&Moved)
const char * const_data() const
Get a const view of the data.
bool status_known(const basic_file_status &s)
Is status available?
file_t getStdoutHandle()
Return an open handle to standard out.
@ CD_OpenAlways
CD_OpenAlways - When opening a file:
Expected< file_t > openNativeFileForReadWrite(const Twine &Name, CreationDisposition Disp, OpenFlags Flags, unsigned Mode=0666)
Opens the file with the given name in a write-only or read-write mode, returning its open file descri...
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
bool is_symlink_file(const basic_file_status &status)
Does status represent a symlink file?
std::error_code closeFile(file_t &F)
Close the file object.
directory_iterator & increment(std::error_code &ec)
void expand_tilde(const Twine &path, SmallVectorImpl< char > &output)
Expands ~ expressions to the user's home directory.
std::error_code setPermissions(const Twine &Path, perms Permissions)
Set file permissions.
ErrorOr< basic_file_status > status() const
void make_absolute(const Twine ¤t_directory, SmallVectorImpl< char > &path)
Make path an absolute path.
std::error_code create_directory(const Twine &path, bool IgnoreExisting=true, perms Perms=owner_all|group_all)
Create the directory in path.
@ CD_CreateAlways
CD_CreateAlways - When opening a file:
Expected< file_t > openNativeFileForWrite(const Twine &Name, CreationDisposition Disp, OpenFlags Flags, unsigned Mode=0666)
Opens the file with the given name in a write-only or read-write mode, returning its open file descri...
@ readwrite
May access map via data and modify it. Written to path.
std::error_code resize_file(int FD, uint64_t Size)
Resize path to size.
const file_t kInvalidFile
perms operator|(perms l, perms r)
std::error_code remove(const Twine &path, bool IgnoreNonExisting=true)
Remove path.
Expected< size_t > readNativeFileSlice(file_t FileHandle, MutableArrayRef< char > Buf, uint64_t Offset)
Reads Buf.size() bytes from FileHandle at offset Offset into Buf.
std::error_code createTemporaryFile(const Twine &Prefix, StringRef Suffix, int &ResultFD, SmallVectorImpl< char > &ResultPath, OpenFlags Flags=OF_None)
Create a file in the system temporary directory.
StringRef - Represent a constant reference to a string, i.e.
ErrorOr< perms > getPermissions(const Twine &Path)
Get file permissions.
bool operator<(const directory_entry &RHS) 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
std::error_code rename(const Twine &from, const Twine &to)
Rename from to to.
bool operator!=(const directory_entry &RHS) const
perms permissions() const
UniqueID getUniqueID() const
file_t getStdinHandle()
Return an open handle to standard in.
A raw_ostream that writes to a file descriptor.
recursive_directory_iterator & increment(std::error_code &ec)
@ OF_UpdateAtime
Force files Atime to be updated on access.
uint32_t fs_st_mtime_nsec
directory_iterator(const directory_entry &de, std::error_code &ec, bool follow_symlinks=true)
*Add support for compiling functions in both ARM and Thumb mode
file_t convertFDToNativeFile(int FD)
Converts from a Posix file descriptor number to a native file handle.
file_t getStderrHandle()
Return an open handle to standard error.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
std::stack< directory_iterator, std::vector< directory_iterator > > Stack
Lightweight error class with error context and mandatory checking.
int level() const
Gets the current level. Starting path is at level 0.
std::string getMainExecutable(const char *argv0, void *MainExecAddr)
Return the path to the main executable, given the value of argv[0] from program startup and the addre...
bool is_directory(const basic_file_status &status)
Does status represent a directory?
std::error_code directory_iterator_increment(DirIterState &)
bool operator>(const directory_entry &RHS) const
directory_iterator - Iterates through the entries in path.
This class represents a memory mapped file.
ErrorOr< MD5::MD5Result > md5_contents(int FD)
Compute an MD5 hash of a file's contents.
std::error_code file_size(const Twine &Path, uint64_t &Result)
Get file size.
std::optional< std::vector< StOtherPiece > > Other
recursive_directory_iterator - Same as directory_iterator except for it recurses down into child dire...
unsigned getUmask()
Get file creation mode mask of the process.
void no_push()
Does not go down into the current directory_entry.
const std::string & path() const
std::error_code status(const Twine &path, file_status &result, bool follow=true)
Get file status as if by POSIX stat().
@ OF_Append
The file should be opened in append mode.
Represents either an error or a value T.
directory_iterator(const Twine &path, std::error_code &ec, bool follow_symlinks=true)
uint32_t getLinkCount() const
file_status(file_type Type, perms Perms, dev_t Dev, nlink_t Links, ino_t Ino, time_t ATime, uint32_t ATimeNSec, time_t MTime, uint32_t MTimeNSec, uid_t UID, gid_t GID, off_t Size)
StringRef toStringRef(SmallVectorImpl< char > &Out) const
This returns the twine as a single StringRef if it can be represented as such.
@ CD_CreateNew
CD_CreateNew - When opening a file:
Represents a temporary file.
BlockVerifier::State From
mapped_file_region()=default
static Expected< TempFile > create(const Twine &Model, unsigned Mode=all_read|all_write, OpenFlags ExtraFlags=OF_None)
This creates a temporary file with createUniqueFile and schedules it for deletion with sys::RemoveFil...
TimePoint getLastModificationTime() const
The file modification time as reported from the underlying file system.
@ OF_ChildInherit
When a child process is launched, this file should remain open in the child process.
std::error_code tryLockFile(int FD, std::chrono::milliseconds Timeout=std::chrono::milliseconds(0))
Try to locks the file during the specified time.
bool can_execute(const Twine &Path)
Can we execute this file?
const directory_entry & operator*() const
bool operator!=(const directory_iterator &RHS) const
std::error_code copy_file(const Twine &From, const Twine &To)
Copy the contents of From to To.
ErrorOr< space_info > disk_space(const Twine &Path)
Get disk space usage information.
Keeps state for the recursive_directory_iterator.
perms operator&(perms l, perms r)
std::error_code openFileForRead(const Twine &Name, int &ResultFD, OpenFlags Flags=OF_None, SmallVectorImpl< char > *RealPath=nullptr)
Opens the file with the given name in a read-only mode, returning its open file descriptor.