[llvm] Windows Filesystem fs::status Conditionally Call GetFileAttributes (PR #78118)
via llvm-commits
llvm-commits at lists.llvm.org
Sun Jan 14 18:47:16 PST 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-llvm-support
@llvm/pr-subscribers-platform-windows
Author: Haydn Trigg (HaydnTrigg)
<details>
<summary>Changes</summary>
Rather than conditionally using the output from GetFileAttributesW move the branch to avoid calling GetFileAttributesW entirely if not required. This avoids hitting IO an extra time for a small performance improvement.
---
Full diff: https://github.com/llvm/llvm-project/pull/78118.diff
1 Files Affected:
- (modified) llvm/lib/Support/Windows/Path.inc (+9-8)
``````````diff
diff --git a/llvm/lib/Support/Windows/Path.inc b/llvm/lib/Support/Windows/Path.inc
index 2bf68b7972e746..6598586545ddd0 100644
--- a/llvm/lib/Support/Windows/Path.inc
+++ b/llvm/lib/Support/Windows/Path.inc
@@ -777,14 +777,15 @@ std::error_code status(const Twine &path, file_status &result, bool Follow) {
if (std::error_code ec = widenPath(path8, path_utf16))
return ec;
- DWORD attr = ::GetFileAttributesW(path_utf16.begin());
- if (attr == INVALID_FILE_ATTRIBUTES)
- return getStatus(INVALID_HANDLE_VALUE, result);
-
- DWORD Flags = FILE_FLAG_BACKUP_SEMANTICS;
- // Handle reparse points.
- if (!Follow && (attr & FILE_ATTRIBUTE_REPARSE_POINT))
- Flags |= FILE_FLAG_OPEN_REPARSE_POINT;
+ if (!Follow) {
+ DWORD attr = ::GetFileAttributesW(path_utf16.begin());
+ if (attr == INVALID_FILE_ATTRIBUTES)
+ return getStatus(INVALID_HANDLE_VALUE, result);
+
+ // Handle reparse points.
+ if (attr & FILE_ATTRIBUTE_REPARSE_POINT)
+ Flags |= FILE_FLAG_OPEN_REPARSE_POINT;
+ }
ScopedFileHandle h(
::CreateFileW(path_utf16.begin(), 0, // Attributes only.
``````````
</details>
https://github.com/llvm/llvm-project/pull/78118
More information about the llvm-commits
mailing list