[clang] [llvm] [SystemZ][z/OS] Refactor AutoConvert.h to remove MVS guard (PR #143174)
Abhina Sree via llvm-commits
llvm-commits at lists.llvm.org
Fri Jun 6 10:19:21 PDT 2025
https://github.com/abhina-sree updated https://github.com/llvm/llvm-project/pull/143174
>From 101542e2ea0b58482937819a94dc5d0db81e91a5 Mon Sep 17 00:00:00 2001
From: Abhina Sreeskantharajan <Abhina.Sreeskantharajan at ibm.com>
Date: Fri, 6 Jun 2025 12:16:52 -0400
Subject: [PATCH] refactor AutoConvert.h to remove MVS guard
---
clang/tools/c-index-test/c-index-test.c | 4 ++--
llvm/include/llvm/Support/AutoConvert.h | 3 +--
llvm/lib/Support/AutoConvert.cpp | 31 +++++++++++++++++++------
llvm/lib/Support/InitLLVM.cpp | 9 +++----
llvm/lib/Support/MemoryBuffer.cpp | 9 +++----
llvm/lib/Support/raw_ostream.cpp | 10 ++++----
llvm/utils/count/count.c | 6 +++--
7 files changed, 43 insertions(+), 29 deletions(-)
diff --git a/clang/tools/c-index-test/c-index-test.c b/clang/tools/c-index-test/c-index-test.c
index 4a887cd0c1e2e..3922aa9c31386 100644
--- a/clang/tools/c-index-test/c-index-test.c
+++ b/clang/tools/c-index-test/c-index-test.c
@@ -5199,13 +5199,13 @@ static void flush_atexit(void) {
int main(int argc, const char **argv) {
thread_info client_data;
-#ifdef __MVS__
+ // On z/OS we need to enable auto conversion
if (enablezOSAutoConversion(fileno(stdout)) == -1)
fprintf(stderr, "Setting conversion on stdout failed\n");
+ // On z/OS we need to enable auto conversion
if (enablezOSAutoConversion(fileno(stderr)) == -1)
fprintf(stderr, "Setting conversion on stderr failed\n");
-#endif
atexit(flush_atexit);
diff --git a/llvm/include/llvm/Support/AutoConvert.h b/llvm/include/llvm/Support/AutoConvert.h
index 352493e9be25f..7f8f6f96b4847 100644
--- a/llvm/include/llvm/Support/AutoConvert.h
+++ b/llvm/include/llvm/Support/AutoConvert.h
@@ -16,6 +16,7 @@
#ifdef __MVS__
#include <_Ccsid.h>
+#endif
#ifdef __cplusplus
#include "llvm/Support/ErrorOr.h"
#include <system_error>
@@ -66,6 +67,4 @@ ErrorOr<bool> needzOSConversion(const char *FileName, const int FD = -1);
} /* namespace llvm */
#endif /* __cplusplus */
-#endif /* __MVS__ */
-
#endif /* LLVM_SUPPORT_AUTOCONVERT_H */
diff --git a/llvm/lib/Support/AutoConvert.cpp b/llvm/lib/Support/AutoConvert.cpp
index f7918548df1d0..3c82454f2a3ac 100644
--- a/llvm/lib/Support/AutoConvert.cpp
+++ b/llvm/lib/Support/AutoConvert.cpp
@@ -11,8 +11,6 @@
//
//===----------------------------------------------------------------------===//
-#ifdef __MVS__
-
#include "llvm/Support/AutoConvert.h"
#include "llvm/Support/Error.h"
#include <cassert>
@@ -25,6 +23,9 @@ using namespace llvm;
static int savedStdHandleAutoConversionMode[3] = {-1, -1, -1};
int disablezOSAutoConversion(int FD) {
+#ifndef __MVS__
+ return 0;
+#else
static const struct f_cnvrt Convert = {
SETCVTOFF, // cvtcmd
0, // pccsid
@@ -32,9 +33,13 @@ int disablezOSAutoConversion(int FD) {
};
return fcntl(FD, F_CONTROL_CVT, &Convert);
+#endif
}
int restorezOSStdHandleAutoConversion(int FD) {
+#ifndef __MVS__
+ return 0;
+#else
assert(FD == STDIN_FILENO || FD == STDOUT_FILENO || FD == STDERR_FILENO);
if (savedStdHandleAutoConversionMode[FD] == -1)
return 0;
@@ -44,9 +49,13 @@ int restorezOSStdHandleAutoConversion(int FD) {
0, // fccsid
};
return (fcntl(FD, F_CONTROL_CVT, &Cvt));
+#endif
}
int enablezOSAutoConversion(int FD) {
+#ifndef __MVS__
+ return 0;
+#else
struct f_cnvrt Query = {
QUERYCVT, // cvtcmd
0, // pccsid
@@ -81,30 +90,35 @@ int enablezOSAutoConversion(int FD) {
// Assume untagged files to be IBM-1047 encoded.
Query.fccsid = (Query.fccsid == FT_UNTAGGED) ? CCSID_IBM_1047 : Query.fccsid;
return fcntl(FD, F_CONTROL_CVT, &Query);
+#endif
}
std::error_code llvm::disablezOSAutoConversion(int FD) {
+#ifdef __MVS__
if (::disablezOSAutoConversion(FD) == -1)
return errnoAsErrorCode();
-
+#endif
return std::error_code();
}
std::error_code llvm::enablezOSAutoConversion(int FD) {
+#ifdef __MVS__
if (::enablezOSAutoConversion(FD) == -1)
return errnoAsErrorCode();
-
+#endif
return std::error_code();
}
std::error_code llvm::restorezOSStdHandleAutoConversion(int FD) {
+#ifdef __MVS__
if (::restorezOSStdHandleAutoConversion(FD) == -1)
return errnoAsErrorCode();
-
+#endif
return std::error_code();
}
std::error_code llvm::setzOSFileTag(int FD, int CCSID, bool Text) {
+#ifdef __MVS__
assert((!Text || (CCSID != FT_UNTAGGED && CCSID != FT_BINARY)) &&
"FT_UNTAGGED and FT_BINARY are not allowed for text files");
struct file_tag Tag;
@@ -115,6 +129,7 @@ std::error_code llvm::setzOSFileTag(int FD, int CCSID, bool Text) {
if (fcntl(FD, F_SETTAG, &Tag) == -1)
return errnoAsErrorCode();
+#endif
return std::error_code();
}
@@ -138,6 +153,9 @@ ErrorOr<__ccsid_t> llvm::getzOSFileTag(const char *FileName, const int FD) {
}
ErrorOr<bool> llvm::needzOSConversion(const char *FileName, const int FD) {
+#ifndef __MVS__
+ return false;
+#else
ErrorOr<__ccsid_t> Ccsid = getzOSFileTag(FileName, FD);
if (std::error_code EC = Ccsid.getError())
return EC;
@@ -152,6 +170,5 @@ ErrorOr<bool> llvm::needzOSConversion(const char *FileName, const int FD) {
default:
return true;
}
+#endif
}
-
-#endif //__MVS__
diff --git a/llvm/lib/Support/InitLLVM.cpp b/llvm/lib/Support/InitLLVM.cpp
index 50f7a43cc34a7..c7613dda0a3ea 100644
--- a/llvm/lib/Support/InitLLVM.cpp
+++ b/llvm/lib/Support/InitLLVM.cpp
@@ -13,14 +13,12 @@
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/ManagedStatic.h"
#include "llvm/Support/Signals.h"
+#include <unistd.h>
#ifdef _WIN32
#include "llvm/Support/Windows/WindowsSupport.h"
#endif
-#ifdef __MVS__
-#include <unistd.h>
-
void CleanupStdHandles(void *Cookie) {
llvm::raw_ostream *Outs = &llvm::outs(), *Errs = &llvm::errs();
Outs->flush();
@@ -29,7 +27,6 @@ void CleanupStdHandles(void *Cookie) {
llvm::restorezOSStdHandleAutoConversion(STDOUT_FILENO);
llvm::restorezOSStdHandleAutoConversion(STDERR_FILENO);
}
-#endif
using namespace llvm;
using namespace llvm::sys;
@@ -41,10 +38,10 @@ InitLLVM::InitLLVM(int &Argc, const char **&Argv,
assert(!Initialized && "InitLLVM was already initialized!");
Initialized = true;
#endif
-#ifdef __MVS__
+
// Bring stdin/stdout/stderr into a known state.
sys::AddSignalHandler(CleanupStdHandles, nullptr);
-#endif
+
if (InstallPipeSignalExitHandler)
// The pipe signal handler must be installed before any other handlers are
// registered. This is because the Unix \ref RegisterHandlers function does
diff --git a/llvm/lib/Support/MemoryBuffer.cpp b/llvm/lib/Support/MemoryBuffer.cpp
index e2044bcc4e4f0..ffa494d5d7727 100644
--- a/llvm/lib/Support/MemoryBuffer.cpp
+++ b/llvm/lib/Support/MemoryBuffer.cpp
@@ -15,6 +15,7 @@
#include "llvm/ADT/SmallString.h"
#include "llvm/Config/config.h"
#include "llvm/Support/Alignment.h"
+#include "llvm/Support/AutoConvert.h"
#include "llvm/Support/Errc.h"
#include "llvm/Support/Error.h"
#include "llvm/Support/ErrorHandling.h"
@@ -34,9 +35,7 @@
#include <io.h>
#endif
-#ifdef __MVS__
-#include "llvm/Support/AutoConvert.h"
-#endif
+
using namespace llvm;
//===----------------------------------------------------------------------===//
@@ -507,7 +506,6 @@ getOpenFileImpl(sys::fs::file_t FD, const Twine &Filename, uint64_t FileSize,
return std::move(Result);
}
-#ifdef __MVS__
ErrorOr<bool> NeedConversion = needzOSConversion(Filename.str().c_str(), FD);
if (std::error_code EC = NeedConversion.getError())
return EC;
@@ -516,9 +514,8 @@ getOpenFileImpl(sys::fs::file_t FD, const Twine &Filename, uint64_t FileSize,
// off the stream.
// Note: This only works with the assumption of reading a full file (i.e,
// Offset == 0 and MapSize == FileSize). Reading a file slice does not work.
- if (Offset == 0 && MapSize == FileSize && *NeedConversion)
+ if (*NeedConversion && Offset == 0 && MapSize == FileSize)
return getMemoryBufferForStream(FD, Filename);
-#endif
auto Buf =
WritableMemoryBuffer::getNewUninitMemBuffer(MapSize, Filename, Alignment);
diff --git a/llvm/lib/Support/raw_ostream.cpp b/llvm/lib/Support/raw_ostream.cpp
index 16631a63d1921..129723dd11653 100644
--- a/llvm/lib/Support/raw_ostream.cpp
+++ b/llvm/lib/Support/raw_ostream.cpp
@@ -894,10 +894,11 @@ void raw_fd_ostream::anchor() {}
raw_fd_ostream &llvm::outs() {
// Set buffer settings to model stdout behavior.
std::error_code EC;
-#ifdef __MVS__
+
+ // On z/OS we need to enable auto conversion
EC = enablezOSAutoConversion(STDOUT_FILENO);
assert(!EC);
-#endif
+
static raw_fd_ostream S("-", EC, sys::fs::OF_None);
assert(!EC);
return S;
@@ -905,10 +906,11 @@ raw_fd_ostream &llvm::outs() {
raw_fd_ostream &llvm::errs() {
// Set standard error to be unbuffered.
-#ifdef __MVS__
+
+ // On z/OS we need to enable auto conversion
std::error_code EC = enablezOSAutoConversion(STDERR_FILENO);
assert(!EC);
-#endif
+
static raw_fd_ostream S(STDERR_FILENO, false, true);
return S;
}
diff --git a/llvm/utils/count/count.c b/llvm/utils/count/count.c
index 9166145fcc10a..a1faa3a642284 100644
--- a/llvm/utils/count/count.c
+++ b/llvm/utils/count/count.c
@@ -11,13 +11,15 @@
#include <stdlib.h>
int main(int argc, char **argv) {
-#ifdef __MVS__
+
+ // On z/OS we need to enable auto conversion
if (enablezOSAutoConversion(fileno(stdin)) == -1)
fprintf(stderr, "Setting conversion on stdin failed\n");
+ // On z/OS we need to enable auto conversion
if (enablezOSAutoConversion(fileno(stderr)) == -1)
fprintf(stdout, "Setting conversion on stderr failed\n");
-#endif
+
size_t Count, NumLines, NumRead;
char Buffer[4096], *End;
More information about the llvm-commits
mailing list