[llvm] [SystemZ][z/OS] Fix compile errors cused by sys::fs::file_t (PR #225539)

Kai Nacke via llvm-commits llvm-commits at lists.llvm.org
Wed Sep 23 06:52:53 PDT 2026


https://github.com/redstar updated https://github.com/llvm/llvm-project/pull/225539

>From 6765411ead970552a8b2b538e0d3b05e775e2b05 Mon Sep 17 00:00:00 2001
From: Kai Nacke <kai.peter.nacke at ibm.com>
Date: Tue, 22 Sep 2026 18:01:31 -0400
Subject: [PATCH 1/2] [SystemZ][z/OS] Fix compile errors cused by
 sys::fs::file_t

Follow-up to #224859: some calls/prototypes are guarded on z/OS,
and also need to be updated. This change fixes various compile
errors.
---
 llvm/include/llvm/Support/AutoConvert.h | 36 ++++++++++++++-----------
 llvm/lib/Support/AutoConvert.cpp        | 20 ++++++++------
 llvm/lib/Support/Unix/Path.inc          |  5 ++--
 3 files changed, 35 insertions(+), 26 deletions(-)

diff --git a/llvm/include/llvm/Support/AutoConvert.h b/llvm/include/llvm/Support/AutoConvert.h
index 3c025cb605f2c4..d391b8af58501e 100644
--- a/llvm/include/llvm/Support/AutoConvert.h
+++ b/llvm/include/llvm/Support/AutoConvert.h
@@ -20,6 +20,7 @@
 #ifdef __cplusplus
 #include "llvm/ADT/Twine.h"
 #include "llvm/Support/Error.h"
+#include "llvm/Support/File.h"
 #include <system_error>
 #endif /* __cplusplus */
 
@@ -46,15 +47,17 @@ namespace llvm {
 #ifdef __MVS__
 
 /** \brief Set the tag information for a file descriptor. */
-std::error_code setzOSFileTag(int FD, int CCSID, bool IsText);
+std::error_code setzOSFileTag(sys::fs::file_t FD, int CCSID, bool IsText);
 
 /** \brief Get the the tag ccsid for a file name or a file descriptor. */
-ErrorOr<__ccsid_t> getzOSFileTag(const Twine &FileName, const int FD = -1);
+ErrorOr<__ccsid_t> getzOSFileTag(const Twine &FileName,
+                                 const sys::fs::file_t FD = -1);
 
 /** \brief Query the file tag to determine if it needs conversion to UTF-8
  *  codepage.
  */
-ErrorOr<bool> needzOSConversion(const Twine &FileName, const int FD = -1);
+ErrorOr<bool> needzOSConversion(const Twine &FileName,
+                                const sys::fs::file_t FD = -1);
 
 /** Copy the tag attributes from \a source to \a destination.
  *
@@ -64,52 +67,53 @@ ErrorOr<bool> needzOSConversion(const Twine &FileName, const int FD = -1);
  *          otherwise returns a specific error_code.
  */
 std::error_code copyFileTagAttributes(const std::string &Source,
-                                      const int DestinationFD);
+                                      const sys::fs::file_t DestinationFD);
 
 #endif /* __MVS__*/
 
-inline std::error_code disableAutoConversion(int FD) {
+inline std::error_code disableAutoConversion(sys::fs::file_t FD) {
 #ifdef __MVS__
-  if (::disablezOSAutoConversion(FD) == -1)
+  if (::disablezOSAutoConversion(FD.get()) == -1)
     return errnoAsErrorCode();
 #endif
   return std::error_code();
 }
 
-inline std::error_code enableAutoConversion(int FD) {
+inline std::error_code enableAutoConversion(sys::fs::file_t FD) {
 #ifdef __MVS__
-  if (::enablezOSAutoConversion(FD) == -1)
+  if (::enablezOSAutoConversion(FD.get()) == -1)
     return errnoAsErrorCode();
 #endif
   return std::error_code();
 }
 
-inline std::error_code enableAutoConversion(int FD, int ccsid) {
+inline std::error_code enableAutoConversion(sys::fs::file_t FD, int ccsid) {
 #ifdef __MVS__
-  if (::enablezOSAutoConversionCcsid(FD, ccsid) == -1)
+  if (::enablezOSAutoConversionCcsid(FD.get(), ccsid) == -1)
     return errnoAsErrorCode();
 #endif
   return std::error_code();
 }
 
-inline std::error_code restoreStdHandleAutoConversion(int FD) {
+inline std::error_code restoreStdHandleAutoConversion(sys::fs::file_t FD) {
 #ifdef __MVS__
-  if (::restorezOSStdHandleAutoConversion(FD) == -1)
+  if (::restorezOSStdHandleAutoConversion(FD.get()) == -1)
     return errnoAsErrorCode();
 #endif
   return std::error_code();
 }
 
-inline std::error_code setFileTag(int FD, int CCSID, bool IsText) {
+inline std::error_code setFileTag(sys::fs::file_t FD, int CCSID, bool IsText) {
 #ifdef __MVS__
-  return setzOSFileTag(FD, CCSID, IsText);
+  return setzOSFileTag(FD.get(), CCSID, IsText);
 #endif
   return std::error_code();
 }
 
-inline ErrorOr<bool> needConversion(const Twine &FileName, const int FD = -1) {
+inline ErrorOr<bool> needConversion(const Twine &FileName,
+                                    const sys::fs::file_t FD = -1) {
 #ifdef __MVS__
-  return needzOSConversion(FileName, FD);
+  return needzOSConversion(FileName, FD.get());
 #endif
   return false;
 }
diff --git a/llvm/lib/Support/AutoConvert.cpp b/llvm/lib/Support/AutoConvert.cpp
index 4f534bb7ac187e..11d345de13797c 100644
--- a/llvm/lib/Support/AutoConvert.cpp
+++ b/llvm/lib/Support/AutoConvert.cpp
@@ -94,7 +94,8 @@ int enablezOSAutoConversionCcsid(int FD, int ccsid) {
   return fcntl(FD, F_CONTROL_CVT, &cvt);
 }
 
-std::error_code llvm::setzOSFileTag(int FD, int CCSID, bool IsText) {
+std::error_code llvm::setzOSFileTag(sys::fs::file_t FD, int CCSID,
+                                    bool IsText) {
   assert((!IsText || (CCSID != FT_UNTAGGED && CCSID != FT_BINARY)) &&
          "FT_UNTAGGED and FT_BINARY are not allowed for text files");
   struct file_tag Tag;
@@ -103,7 +104,7 @@ std::error_code llvm::setzOSFileTag(int FD, int CCSID, bool IsText) {
   Tag.ft_deferred = 0;
   Tag.ft_rsvflags = 0;
 
-  if (fcntl(FD, F_SETTAG, &Tag) == -1) {
+  if (fcntl(FD.get(), F_SETTAG, &Tag) == -1) {
     if (errno == ENOSYS)
       // Some file systems do not support filetags.
       // Ignore ENOSYS error to allow compilation.
@@ -114,7 +115,8 @@ std::error_code llvm::setzOSFileTag(int FD, int CCSID, bool IsText) {
   return std::error_code();
 }
 
-ErrorOr<__ccsid_t> llvm::getzOSFileTag(const Twine &FileName, const int FD) {
+ErrorOr<__ccsid_t> llvm::getzOSFileTag(const Twine &FileName,
+                                       const sys::fs::file_t FD) {
   // If we have a file descriptor, use it to find out file tagging. Otherwise we
   // need to use stat() with the file path.
   if (FD != -1) {
@@ -123,7 +125,7 @@ ErrorOr<__ccsid_t> llvm::getzOSFileTag(const Twine &FileName, const int FD) {
         0,        // pccsid
         0,        // fccsid
     };
-    if (fcntl(FD, F_CONTROL_CVT, &Query) == -1)
+    if (fcntl(FD.get(), F_CONTROL_CVT, &Query) == -1)
       return std::error_code(errno, std::generic_category());
     return Query.fccsid;
   }
@@ -133,7 +135,8 @@ ErrorOr<__ccsid_t> llvm::getzOSFileTag(const Twine &FileName, const int FD) {
   return Attr.st_tag.ft_ccsid;
 }
 
-ErrorOr<bool> llvm::needzOSConversion(const Twine &FileName, const int FD) {
+ErrorOr<bool> llvm::needzOSConversion(const Twine &FileName,
+                                      const sys::fs::file_t FD) {
   ErrorOr<__ccsid_t> Ccsid = getzOSFileTag(FileName, FD);
   if (std::error_code EC = Ccsid.getError())
     return EC;
@@ -150,14 +153,15 @@ ErrorOr<bool> llvm::needzOSConversion(const Twine &FileName, const int FD) {
   }
 }
 
-std::error_code llvm::copyFileTagAttributes(const std::string &Source,
-                                            const int DestinationFD) {
+std::error_code
+llvm::copyFileTagAttributes(const std::string &Source,
+                            const sys::fs::file_t DestinationFD) {
   struct stat SourceAttributes;
   if (stat(Source.c_str(), &SourceAttributes) == -1)
     return std::error_code(errno, std::generic_category());
 
   if (SourceAttributes.st_tag.ft_txtflag)
-    if (enablezOSAutoConversionCcsid(DestinationFD,
+    if (enablezOSAutoConversionCcsid(DestinationFD.get(),
                                      SourceAttributes.st_tag.ft_ccsid) == -1)
       return errnoAsErrorCode();
 
diff --git a/llvm/lib/Support/Unix/Path.inc b/llvm/lib/Support/Unix/Path.inc
index 4592252769d56b..04bd21e6aa2902 100644
--- a/llvm/lib/Support/Unix/Path.inc
+++ b/llvm/lib/Support/Unix/Path.inc
@@ -1308,9 +1308,10 @@ Expected<size_t> readNativeFileSlice(file_t FD, MutableArrayRef<char> Buf,
   ssize_t NumRead =
       sys::RetryAfterSignal(-1, ::pread, FD.get(), Buf.data(), Size, Offset);
 #else
-  if (lseek(FD, Offset, SEEK_SET) == -1)
+  if (lseek(FD.get(), Offset, SEEK_SET) == -1)
     return errorCodeToError(errnoAsErrorCode());
-  ssize_t NumRead = sys::RetryAfterSignal(-1, ::read, FD, Buf.data(), Size);
+  ssize_t NumRead =
+      sys::RetryAfterSignal(-1, ::read, FD.get(), Buf.data(), Size);
 #endif
   if (NumRead == -1)
     return errorCodeToError(errnoAsErrorCode());

>From e202f77b8ca99b2330c8ec5a9d7590463c4dc4c0 Mon Sep 17 00:00:00 2001
From: Kai Nacke <kai.peter.nacke at ibm.com>
Date: Wed, 23 Sep 2026 09:52:09 -0400
Subject: [PATCH 2/2] Fix the error on Windows.

---
 llvm/include/llvm/Support/AutoConvert.h | 22 ++++++++++++++++++----
 1 file changed, 18 insertions(+), 4 deletions(-)

diff --git a/llvm/include/llvm/Support/AutoConvert.h b/llvm/include/llvm/Support/AutoConvert.h
index d391b8af58501e..b72b695dc6f171 100644
--- a/llvm/include/llvm/Support/AutoConvert.h
+++ b/llvm/include/llvm/Support/AutoConvert.h
@@ -79,14 +79,21 @@ inline std::error_code disableAutoConversion(sys::fs::file_t FD) {
   return std::error_code();
 }
 
-inline std::error_code enableAutoConversion(sys::fs::file_t FD) {
+inline std::error_code enableAutoConversion(int FD) {
 #ifdef __MVS__
-  if (::enablezOSAutoConversion(FD.get()) == -1)
+  if (::enablezOSAutoConversion(FD) == -1)
     return errnoAsErrorCode();
 #endif
   return std::error_code();
 }
 
+inline std::error_code enableAutoConversion(sys::fs::file_t FD) {
+#ifdef __MVS__
+  return enableAutoConversion(FD.get());
+#endif
+  return std::error_code();
+}
+
 inline std::error_code enableAutoConversion(sys::fs::file_t FD, int ccsid) {
 #ifdef __MVS__
   if (::enablezOSAutoConversionCcsid(FD.get(), ccsid) == -1)
@@ -95,14 +102,21 @@ inline std::error_code enableAutoConversion(sys::fs::file_t FD, int ccsid) {
   return std::error_code();
 }
 
-inline std::error_code restoreStdHandleAutoConversion(sys::fs::file_t FD) {
+inline std::error_code restoreStdHandleAutoConversion(int FD) {
 #ifdef __MVS__
-  if (::restorezOSStdHandleAutoConversion(FD.get()) == -1)
+  if (::restorezOSStdHandleAutoConversion(FD) == -1)
     return errnoAsErrorCode();
 #endif
   return std::error_code();
 }
 
+inline std::error_code restoreStdHandleAutoConversion(sys::fs::file_t FD) {
+#ifdef __MVS__
+  return restoreStdHandleAutoConversion(FD.get());
+#endif
+  return std::error_code();
+}
+
 inline std::error_code setFileTag(sys::fs::file_t FD, int CCSID, bool IsText) {
 #ifdef __MVS__
   return setzOSFileTag(FD.get(), CCSID, IsText);



More information about the llvm-commits mailing list