[llvm] 74cb287 - [Support] Windows Filesystem fs::status Conditionally Call GetFileAttributes (#78118)

via llvm-commits llvm-commits at lists.llvm.org
Mon Jan 15 05:08:15 PST 2024


Author: Haydn Trigg
Date: 2024-01-15T08:08:11-05:00
New Revision: 74cb2879ba10dcad7c745ffc4e8ed3092a5c0f15

URL: https://github.com/llvm/llvm-project/commit/74cb2879ba10dcad7c745ffc4e8ed3092a5c0f15
DIFF: https://github.com/llvm/llvm-project/commit/74cb2879ba10dcad7c745ffc4e8ed3092a5c0f15.diff

LOG: [Support] Windows Filesystem fs::status Conditionally Call GetFileAttributes (#78118)

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.

Added: 
    

Modified: 
    llvm/lib/Support/Windows/Path.inc

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Support/Windows/Path.inc b/llvm/lib/Support/Windows/Path.inc
index 2bf68b7972e746f..7f5e76779412c0d 100644
--- a/llvm/lib/Support/Windows/Path.inc
+++ b/llvm/lib/Support/Windows/Path.inc
@@ -777,14 +777,16 @@ 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.


        


More information about the llvm-commits mailing list