27 #ifndef LLVM_SUPPORT_FILESYSTEM_H 28 #define LLVM_SUPPORT_FILESYSTEM_H 33 #include "llvm/Config/llvm-config.h" 45 #include <system_error> 49 #ifdef HAVE_SYS_STAT_H 114 return static_cast<perms>(
static_cast<unsigned short>(l) |
115 static_cast<unsigned short>(r));
118 return static_cast<perms>(
static_cast<unsigned short>(l) &
119 static_cast<unsigned short>(r));
131 return static_cast<perms>(
132 static_cast<unsigned short>(~static_cast<
unsigned short>(x)));
141 UniqueID(uint64_t Device, uint64_t File) : Device(Device), File(File) {}
144 return Device == Other.Device && File == Other.File;
148 return std::tie(Device, File) < std::tie(Other.Device, Other.File);
160 #if defined(LLVM_ON_UNIX) 161 time_t fs_st_atime = 0;
162 time_t fs_st_mtime = 0;
167 off_t fs_st_size = 0;
168 #elif defined (_WIN32) 184 #if defined(LLVM_ON_UNIX) 187 uid_t UID, gid_t GID, off_t
Size)
188 : fs_st_atime(ATime), fs_st_mtime(MTime),
189 fs_st_atime_nsec(ATimeNSec), fs_st_mtime_nsec(MTimeNSec),
190 fs_st_uid(UID), fs_st_gid(GID),
191 fs_st_size(Size), Type(Type), Perms(Perms) {}
192 #elif defined(_WIN32) 197 : LastAccessedTimeHigh(LastAccessTimeHigh),
198 LastAccessedTimeLow(LastAccessTimeLow),
199 LastWriteTimeHigh(LastWriteTimeHigh),
200 LastWriteTimeLow(LastWriteTimeLow), FileSizeHigh(FileSizeHigh),
201 FileSizeLow(FileSizeLow), Type(Type), Perms(Perms) {}
223 #if defined(LLVM_ON_UNIX) 226 uint64_t
getSize()
const {
return fs_st_size; }
227 #elif defined (_WIN32) 236 uint64_t getSize()
const {
237 return (uint64_t(FileSizeHigh) << 32) + FileSizeLow;
250 #if defined(LLVM_ON_UNIX) 252 nlink_t fs_st_nlinks = 0;
254 #elif defined (_WIN32) 266 #if defined(LLVM_ON_UNIX) 270 uid_t UID, gid_t GID, off_t
Size)
273 fs_st_dev(Dev), fs_st_nlinks(Links), fs_st_ino(Ino) {}
274 #elif defined(_WIN32) 282 LastWriteTimeHigh, LastWriteTimeLow, FileSizeHigh,
284 NumLinks(LinkCount), VolumeSerialNumber(VolumeSerialNumber),
285 FileIndexHigh(FileIndexHigh), FileIndexLow(FileIndexLow) {}
327 bool IgnoreExisting =
true,
396 std::error_code
remove(
const Twine &path,
bool IgnoreNonExisting =
true);
527 std::error_code
is_local(
int FD,
bool &result);
533 return !
is_local(Path, Result) && Result;
540 return !
is_local(FD, Result) && Result;
681 std::error_code EC =
status(Path, Status);
685 return std::error_code();
880 return OpenFlags(
unsigned(A) |
unsigned(B));
933 unsigned Mode = 0666);
950 inline std::error_code
973 unsigned Mode = 0666) {
995 unsigned Mode = 0666) {
1015 unsigned Mode = 0666) {
1103 std::error_code &ec);
1107 size_t size()
const;
1112 const char *const_data()
const;
1115 static int alignment();
1136 bool FollowSymlinks;
1143 : Path(Path.str()), Type(Type), FollowSymlinks(FollowSymlinks),
1151 const std::string &
path()
const {
return Path; }
1198 std::shared_ptr<detail::DirIterState> State;
1199 bool FollowSymlinks =
true;
1203 bool follow_symlinks =
true)
1204 : FollowSymlinks(follow_symlinks) {
1205 State = std::make_shared<detail::DirIterState>();
1208 *State, path.
toStringRef(path_storage), FollowSymlinks);
1212 bool follow_symlinks =
true)
1213 : FollowSymlinks(follow_symlinks) {
1214 State = std::make_shared<detail::DirIterState>();
1216 *State, de.
path(), FollowSymlinks);
1232 if (State == RHS.State)
1238 return State->CurrentEntry == RHS.State->CurrentEntry;
1242 return !(*
this == RHS);
1250 std::stack<directory_iterator, std::vector<directory_iterator>>
Stack;
1252 bool HasNoPushRequest =
false;
1260 std::shared_ptr<detail::RecDirIterState> State;
1266 bool follow_symlinks =
true)
1267 : State(
std::make_shared<detail::RecDirIterState>()),
1268 Follow(follow_symlinks) {
1278 if (State->HasNoPushRequest)
1279 State->HasNoPushRequest =
false;
1286 type = status->type();
1291 if (State->Stack.top() != end_itr) {
1299 while (!State->Stack.empty()
1300 && State->Stack.top().increment(ec) == end_itr) {
1306 if (State->Stack.empty())
1317 int level()
const {
return State->Level; }
1325 assert(State &&
"Cannot pop an end iterator!");
1326 assert(State->Level > 0 &&
"Cannot pop an iterator with level < 1");
1335 }
while (!State->Stack.empty()
1336 && State->Stack.top().increment(ec) == end_itr);
1339 if (State->Stack.empty())
1344 void no_push() { State->HasNoPushRequest =
true; }
1347 return State == RHS.State;
1351 return !(*
this == RHS);
1361 #endif // LLVM_SUPPORT_FILESYSTEM_H
const file_t kInvalidFile
const directory_entry & operator*() const
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.
bool can_execute(const Twine &Path)
Can we execute this file?
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...
Represents either an error or a value T.
space_info - Self explanatory.
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...
bool status_known(const basic_file_status &s)
Is status available?
LLVM_ATTRIBUTE_NORETURN void report_fatal_error(Error Err, bool gen_crash_diag=true)
Report a serious error, calling any installed error handler.
This class represents lattice values for constants.
bool operator<(const UniqueID &Other) const
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.
void closeFile(file_t &F)
Close the file object.
std::error_code createUniqueFile(const Twine &Model, int &ResultFD, SmallVectorImpl< char > &ResultPath, unsigned Mode=all_read|all_write)
Create a uniquely named file.
perms permissions() const
std::error_code setLastAccessAndModificationTime(int FD, TimePoint<> AccessTime, TimePoint<> ModificationTime)
Set the file modification and access time.
bool operator>(int64_t V1, const APSInt &V2)
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)
recursive_directory_iterator(const Twine &path, std::error_code &ec, bool follow_symlinks=true)
StringRef toStringRef(SmallVectorImpl< char > &Out) const
This returns the twine as a single StringRef if it can be represented as such.
void pop()
Goes up one level if Level > 0.
This class represents a memory mapped file.
std::error_code current_path(SmallVectorImpl< char > &result)
Get the current path.
bool is_directory(const basic_file_status &status)
Does status represent a directory?
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...
bool is_regular_file(const basic_file_status &status)
Does status represent a regular file?
directory_iterator & increment(std::error_code &ec)
recursive_directory_iterator - Same as directory_iterator except for it recurses down into child dire...
std::error_code remove_directories(const Twine &path, bool IgnoreErrors=true)
Recursively delete a directory.
Represents the result of a call to sys::fs::status().
CD_OpenExisting - When opening a file:
ErrorOr< MD5::MD5Result > md5_contents(int FD)
Compute an MD5 hash of a file's contents.
bool operator<=(int64_t V1, const APSInt &V2)
amode Optimize addressing mode
ErrorOr< perms > getPermissions(const Twine &Path)
Get file permissions.
std::error_code directory_iterator_increment(DirIterState &)
amdgpu Simplify well known AMD library false Value Value const Twine & Name
perms operator &(perms l, perms r)
perms & operator &=(perms &l, perms r)
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
bool operator>=(int64_t V1, const APSInt &V2)
Keeps state for the directory_iterator.
directory_iterator(const Twine &path, std::error_code &ec, bool follow_symlinks=true)
bool operator<(uint32_t Value, UnicodeCharRange Range)
Represents a temporary file.
void make_absolute(const Twine ¤t_directory, SmallVectorImpl< char > &path)
Make path an absolute path.
std::error_code file_size(const Twine &Path, uint64_t &Result)
Get file size.
const directory_entry & operator*() const
Tagged union holding either a T or a Error.
May access map via data and modify it. Written to path.
bool can_write(const Twine &Path)
Can we write this file?
directory_entry CurrentEntry
When a child process is launched, this file should remain open in the child process.
May only access map via const_data as read only.
CD_CreateNew - When opening a file:
std::error_code is_local(const Twine &path, bool &result)
Is the file mounted on a local filesystem?
std::error_code create_link(const Twine &to, const Twine &from)
Create a link from from to to.
std::stack< directory_iterator, std::vector< directory_iterator > > Stack
directory_iterator(const directory_entry &de, std::error_code &ec, bool follow_symlinks=true)
Delete the file on close. Only makes a difference on windows.
The file should be opened in text mode on platforms that make this distinction.
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 operator!=(const directory_iterator &RHS) const
Represents the result of a call to directory_iterator::status().
std::error_code copy_file(const Twine &From, const Twine &To)
Copy the contents of From to To.
bool operator!=(const directory_entry &RHS) const
const directory_entry * operator->() const
std::error_code real_path(const Twine &path, SmallVectorImpl< char > &output, bool expand_tilde=false)
Collapse all .
initializer< Ty > init(const Ty &Val)
UniqueID(uint64_t Device, uint64_t File)
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
The instances of the Type class are immutable: once they are created, they are never changed...
void no_push()
Does not go down into the current directory_entry.
file_status(file_type Type)
void expand_tilde(const Twine &path, SmallVectorImpl< char > &output)
Expands ~ expressions to the user's home directory.
std::error_code status(const Twine &path, file_status &result, bool follow=true)
Get file status as if by POSIX stat().
recursive_directory_iterator & increment(std::error_code &ec)
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...
bool operator!=(const UniqueID &Other) const
std::error_code getUniqueID(const Twine Path, UniqueID &Result)
std::error_code resize_file(int FD, uint64_t Size)
Resize path to size.
const directory_entry * operator->() const
file_type get_file_type(const Twine &Path, bool Follow=true)
Does status represent a directory?
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)
std::error_code create_hard_link(const Twine &to, const Twine &from)
Create a hard link from from to to, or return an error.
basic_file_status(file_type Type)
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...
perms operator|(perms l, perms r)
Force files Atime to be updated on access. Only makes a difference on windows.
const std::string & path() const
std::error_code rename(const Twine &from, const Twine &to)
Rename from to to.
Keeps state for the recursive_directory_iterator.
auto size(R &&Range, typename std::enable_if< std::is_same< typename std::iterator_traits< decltype(Range.begin())>::iterator_category, std::random_access_iterator_tag >::value, void >::type *=nullptr) -> decltype(std::distance(Range.begin(), Range.end()))
Get the size of a range.
std::error_code directory_iterator_construct(DirIterState &, StringRef, bool)
BlockVerifier::State From
bool operator==(const recursive_directory_iterator &RHS) const
The file should be opened in append mode.
std::error_code createUniqueDirectory(const Twine &Prefix, SmallVectorImpl< char > &ResultPath)
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.
directory_entry(const Twine &Path, bool FollowSymlinks=true, file_type Type=file_type::type_unknown, basic_file_status Status=basic_file_status())
std::error_code setPermissions(const Twine &Path, perms Permissions)
Set file permissions.
bool is_other(const basic_file_status &status)
Does this status represent something that exists but is not a directory or regular file...
uint32_t getGroup() const
std::error_code set_current_path(const Twine &path)
Set the current path.
ErrorOr< space_info > disk_space(const Twine &Path)
Get disk space usage information.
std::error_code directory_iterator_destruct(DirIterState &)
directory_iterator - Iterates through the entries in path.
bool operator!=(const recursive_directory_iterator &RHS) const
file_type
An enumeration for the file system's view of the type.
std::error_code createTemporaryFile(const Twine &Prefix, StringRef Suffix, int &ResultFD, SmallVectorImpl< char > &ResultPath)
Create a file in the system temporary directory.
void permissions(perms p)
bool operator==(const directory_iterator &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.
uint64_t getDevice() const
std::error_code create_directory(const Twine &path, bool IgnoreExisting=true, perms Perms=owner_all|group_all)
Create the directory in path.
bool operator==(const UniqueID &Other) const
std::error_code getPotentiallyUniqueFileName(const Twine &Model, SmallVectorImpl< char > &ResultPath)
Get a unique name, not currently exisiting in the filesystem.
Provides ErrorOr<T> smart pointer.
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
bool equivalent(file_status A, file_status B)
Do file_status's represent the same thing?
CD_CreateAlways - When opening a file:
perms & operator|=(perms &l, perms r)
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...
int level() const
Gets the current level. Starting path is at level 0.
Lightweight error class with error context and mandatory checking.
bool no_push_request() const
Returns true if no_push has been called for this directory_entry.
directory_entry - A single entry in a directory.
std::error_code access(const Twine &Path, AccessMode Mode)
Can the file be accessed?
StringRef - Represent a constant reference to a string, i.e.
CD_OpenAlways - When opening a file:
bool operator==(const directory_entry &RHS) const
bool is_symlink_file(const basic_file_status &status)
Does status represent a symlink file?
bool exists(const basic_file_status &status)
Does file exist?
std::chrono::time_point< std::chrono::system_clock, D > TimePoint
A time point on the system clock.