summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Support/Path.cpp
diff options
context:
space:
mode:
authorPeter Collingbourne <peter@pcc.me.uk>2017-10-10 22:19:46 +0000
committerPeter Collingbourne <peter@pcc.me.uk>2017-10-10 22:19:46 +0000
commit0dfdb44797fa2ce4273e38f13403b62a5ce0a9b0 (patch)
tree7b4289f7eca8c5267e89a0a1fad53657e56dfe69 /llvm/lib/Support/Path.cpp
parentae5e9ed422be46d63384b7a9efdf925c4507994f (diff)
downloadbcm5719-llvm-0dfdb44797fa2ce4273e38f13403b62a5ce0a9b0.tar.gz
bcm5719-llvm-0dfdb44797fa2ce4273e38f13403b62a5ce0a9b0.zip
Support: Have directory_iterator::status() return FindFirstFileEx/FindNextFile results on Windows.
This allows clients to avoid an unnecessary fs::status() call on each directory entry. Because the information returned by FindFirstFileEx is a subset of the information returned by a regular status() call, I needed to extract a base class from file_status that contains only that information. On my machine, this reduces the time required to enumerate a ThinLTO cache directory containing 520k files from almost 4 minutes to less than 2 seconds. Differential Revision: https://reviews.llvm.org/D38716 llvm-svn: 315378
Diffstat (limited to 'llvm/lib/Support/Path.cpp')
-rw-r--r--llvm/lib/Support/Path.cpp19
1 files changed, 8 insertions, 11 deletions
diff --git a/llvm/lib/Support/Path.cpp b/llvm/lib/Support/Path.cpp
index f30e8a8b0cb..9692acb5283 100644
--- a/llvm/lib/Support/Path.cpp
+++ b/llvm/lib/Support/Path.cpp
@@ -952,11 +952,11 @@ ErrorOr<MD5::MD5Result> md5_contents(const Twine &Path) {
return Result;
}
-bool exists(file_status status) {
+bool exists(const basic_file_status &status) {
return status_known(status) && status.type() != file_type::file_not_found;
}
-bool status_known(file_status s) {
+bool status_known(const basic_file_status &s) {
return s.type() != file_type::status_error;
}
@@ -967,7 +967,7 @@ file_type get_file_type(const Twine &Path, bool Follow) {
return st.type();
}
-bool is_directory(file_status status) {
+bool is_directory(const basic_file_status &status) {
return status.type() == file_type::directory_file;
}
@@ -979,7 +979,7 @@ std::error_code is_directory(const Twine &path, bool &result) {
return std::error_code();
}
-bool is_regular_file(file_status status) {
+bool is_regular_file(const basic_file_status &status) {
return status.type() == file_type::regular_file;
}
@@ -991,7 +991,7 @@ std::error_code is_regular_file(const Twine &path, bool &result) {
return std::error_code();
}
-bool is_symlink_file(file_status status) {
+bool is_symlink_file(const basic_file_status &status) {
return status.type() == file_type::symlink_file;
}
@@ -1003,7 +1003,7 @@ std::error_code is_symlink_file(const Twine &path, bool &result) {
return std::error_code();
}
-bool is_other(file_status status) {
+bool is_other(const basic_file_status &status) {
return exists(status) &&
!is_regular_file(status) &&
!is_directory(status);
@@ -1017,17 +1017,14 @@ std::error_code is_other(const Twine &Path, bool &Result) {
return std::error_code();
}
-void directory_entry::replace_filename(const Twine &filename, file_status st) {
+void directory_entry::replace_filename(const Twine &filename,
+ basic_file_status st) {
SmallString<128> path = path::parent_path(Path);
path::append(path, filename);
Path = path.str();
Status = st;
}
-std::error_code directory_entry::status(file_status &result) const {
- return fs::status(Path, result, FollowSymlinks);
-}
-
ErrorOr<perms> getPermissions(const Twine &Path) {
file_status Status;
if (std::error_code EC = status(Path, Status))
OpenPOWER on IntegriCloud