From ac2de33d2aaa076dc54ce2cea675bcca5b50261e Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Wed, 10 Jul 2013 17:16:40 +0000 Subject: [PATCH] Use status to implement file_size. The status function is already using a syscall that returns the file size. Remember it and implement file_size as a simple wrapper. No functionally change, but clients that already use status now can avoid calling file_size. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@186016 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Support/FileSystem.h | 14 +++++++++++++- lib/Support/Unix/Path.inc | 15 +-------------- lib/Support/Windows/Path.inc | 21 --------------------- 3 files changed, 14 insertions(+), 36 deletions(-) diff --git a/include/llvm/Support/FileSystem.h b/include/llvm/Support/FileSystem.h index 8380d5046d9..df37379d335 100644 --- a/include/llvm/Support/FileSystem.h +++ b/include/llvm/Support/FileSystem.h @@ -153,6 +153,7 @@ class file_status time_t fs_st_mtime; uid_t fs_st_uid; gid_t fs_st_gid; + off_t fs_st_size; #elif defined (LLVM_ON_WIN32) uint32_t LastWriteTimeHigh; uint32_t LastWriteTimeLow; @@ -180,6 +181,7 @@ public: #if defined(LLVM_ON_UNIX) uint32_t getUser() const { return fs_st_uid; } uint32_t getGroup() const { return fs_st_gid; } + uint64_t getSize() const { return fs_st_size; } #elif defined (LLVM_ON_WIN32) uint32_t getUser() const { return 9999; // Not applicable to Windows, so... @@ -187,6 +189,9 @@ public: uint32_t getGroup() const { return 9999; // Not applicable to Windows, so... } + uint64_t getSize() const { + return (uint64_t(FileSizeHigh) << 32) + FileSizeLow; + } #endif // setters @@ -435,7 +440,14 @@ inline bool equivalent(const Twine &A, const Twine &B) { /// @param result Set to the size of the file in \a path. /// @returns errc::success if result has been successfully set, otherwise a /// platform specific error_code. -error_code file_size(const Twine &path, uint64_t &result); +inline error_code file_size(const Twine &Path, uint64_t &Result) { + file_status Status; + error_code EC = status(Path, Status); + if (EC) + return EC; + Result = Status.getSize(); + return error_code::success(); +} /// @brief Does status represent a directory? /// diff --git a/lib/Support/Unix/Path.inc b/lib/Support/Unix/Path.inc index 433d187ffda..83879ff68d1 100644 --- a/lib/Support/Unix/Path.inc +++ b/lib/Support/Unix/Path.inc @@ -529,20 +529,6 @@ error_code equivalent(const Twine &A, const Twine &B, bool &result) { return error_code::success(); } -error_code file_size(const Twine &path, uint64_t &result) { - SmallString<128> path_storage; - StringRef p = path.toNullTerminatedStringRef(path_storage); - - struct stat status; - if (::stat(p.begin(), &status) == -1) - return error_code(errno, system_category()); - if (!S_ISREG(status.st_mode)) - return make_error_code(errc::operation_not_permitted); - - result = status.st_size; - return error_code::success(); -} - error_code getUniqueID(const Twine Path, uint64_t &Result) { SmallString<128> Storage; StringRef P = Path.toNullTerminatedStringRef(Storage); @@ -591,6 +577,7 @@ error_code status(const Twine &path, file_status &result) { result.fs_st_mtime = status.st_mtime; result.fs_st_uid = status.st_uid; result.fs_st_gid = status.st_gid; + result.fs_st_size = status.st_size; return error_code::success(); } diff --git a/lib/Support/Windows/Path.inc b/lib/Support/Windows/Path.inc index 735999422ec..ed93f3d050b 100644 --- a/lib/Support/Windows/Path.inc +++ b/lib/Support/Windows/Path.inc @@ -555,27 +555,6 @@ error_code equivalent(const Twine &A, const Twine &B, bool &result) { return error_code::success(); } -error_code file_size(const Twine &path, uint64_t &result) { - SmallString<128> path_storage; - SmallVector path_utf16; - - if (error_code ec = UTF8ToUTF16(path.toStringRef(path_storage), - path_utf16)) - return ec; - - WIN32_FILE_ATTRIBUTE_DATA FileData; - if (!::GetFileAttributesExW(path_utf16.begin(), - ::GetFileExInfoStandard, - &FileData)) - return windows_error(::GetLastError()); - - result = - (uint64_t(FileData.nFileSizeHigh) << (sizeof(FileData.nFileSizeLow) * 8)) - + FileData.nFileSizeLow; - - return error_code::success(); -} - error_code getUniqueID(const Twine Path, uint64_t &Result) { file_status Status; if (error_code E = status(Path, Status))