aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2013-07-10 17:16:40 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2013-07-10 17:16:40 +0000
commitac2de33d2aaa076dc54ce2cea675bcca5b50261e (patch)
treee6e772d229275c7201d1c3afa62097f0931a115a
parent43ae5e85f829df883dd364c0b9612bbe90f3ad97 (diff)
downloadexternal_llvm-ac2de33d2aaa076dc54ce2cea675bcca5b50261e.zip
external_llvm-ac2de33d2aaa076dc54ce2cea675bcca5b50261e.tar.gz
external_llvm-ac2de33d2aaa076dc54ce2cea675bcca5b50261e.tar.bz2
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
-rw-r--r--include/llvm/Support/FileSystem.h14
-rw-r--r--lib/Support/Unix/Path.inc15
-rw-r--r--lib/Support/Windows/Path.inc21
3 files changed, 14 insertions, 36 deletions
diff --git a/include/llvm/Support/FileSystem.h b/include/llvm/Support/FileSystem.h
index 8380d50..df37379 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 433d187..83879ff 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 7359994..ed93f3d 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<wchar_t, 128> 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))