[libcxx-commits] [libcxx] Get cxx03 headers working on z/OS (PR #132992)

Sean Perry via libcxx-commits libcxx-commits at lists.llvm.org
Wed Oct 29 10:53:38 PDT 2025


https://github.com/perry-ca updated https://github.com/llvm/llvm-project/pull/132992

>From f87f19b48a55c637d31bd5c839b9ee70d9a151af Mon Sep 17 00:00:00 2001
From: Sean Perry <perry at ca.ibm.com>
Date: Tue, 25 Mar 2025 16:07:45 -0400
Subject: [PATCH] Get cxx03 headers working on z/OS

---
 libcxx/include/CMakeLists.txt                 |   5 -
 .../__cxx03/__locale_dir/locale_base_api.h    |   2 +-
 .../__locale_dir/locale_base_api/ibm.h        | 108 ------------------
 .../__cxx03/__support/ibm/gettod_zos.h        |  52 ---------
 .../__cxx03/__support/ibm/locale_mgmt_zos.h   |  53 ---------
 .../include/__cxx03/__support/ibm/nanosleep.h |  55 ---------
 .../__cxx03/__thread/support/pthread.h        |   2 +-
 libcxx/src/chrono.cpp                         |   2 +-
 .../support}/ibm/gettod_zos.h                 |   0
 9 files changed, 3 insertions(+), 276 deletions(-)
 delete mode 100644 libcxx/include/__cxx03/__locale_dir/locale_base_api/ibm.h
 delete mode 100644 libcxx/include/__cxx03/__support/ibm/gettod_zos.h
 delete mode 100644 libcxx/include/__cxx03/__support/ibm/locale_mgmt_zos.h
 delete mode 100644 libcxx/include/__cxx03/__support/ibm/nanosleep.h
 rename libcxx/{include/__support => src/support}/ibm/gettod_zos.h (100%)

diff --git a/libcxx/include/CMakeLists.txt b/libcxx/include/CMakeLists.txt
index a021b9bb44d67..6ad637787e06f 100644
--- a/libcxx/include/CMakeLists.txt
+++ b/libcxx/include/CMakeLists.txt
@@ -732,7 +732,6 @@ set(files
   __string/char_traits.h
   __string/constexpr_c_functions.h
   __string/extern_template_lists.h
-  __support/ibm/gettod_zos.h
   __support/ibm/locale_mgmt_zos.h
   __support/ibm/nanosleep.h
   __support/xlocale/__nop_locale_mgmt.h
@@ -1562,7 +1561,6 @@ set(files
   __cxx03/__locale_dir/locale_base_api/bsd_locale_defaults.h
   __cxx03/__locale_dir/locale_base_api/bsd_locale_fallbacks.h
   __cxx03/__locale_dir/locale_base_api/fuchsia.h
-  __cxx03/__locale_dir/locale_base_api/ibm.h
   __cxx03/__locale_dir/locale_base_api/locale_guard.h
   __cxx03/__locale_dir/locale_base_api/musl.h
   __cxx03/__locale_dir/locale_base_api/newlib.h
@@ -1765,9 +1763,6 @@ set(files
   __cxx03/__string/char_traits.h
   __cxx03/__string/constexpr_c_functions.h
   __cxx03/__string/extern_template_lists.h
-  __cxx03/__support/ibm/gettod_zos.h
-  __cxx03/__support/ibm/locale_mgmt_zos.h
-  __cxx03/__support/ibm/nanosleep.h
   __cxx03/__support/xlocale/__nop_locale_mgmt.h
   __cxx03/__support/xlocale/__posix_l_fallback.h
   __cxx03/__support/xlocale/__strtonum_fallback.h
diff --git a/libcxx/include/__cxx03/__locale_dir/locale_base_api.h b/libcxx/include/__cxx03/__locale_dir/locale_base_api.h
index a20f0952f52c3..03f24630af6ca 100644
--- a/libcxx/include/__cxx03/__locale_dir/locale_base_api.h
+++ b/libcxx/include/__cxx03/__locale_dir/locale_base_api.h
@@ -12,7 +12,7 @@
 #if defined(_LIBCPP_MSVCRT_LIKE)
 #  include <__cxx03/__locale_dir/locale_base_api/win32.h>
 #elif defined(_AIX) || defined(__MVS__)
-#  include <__cxx03/__locale_dir/locale_base_api/ibm.h>
+#  include <__locale_dir/locale_base_api/ibm.h>
 #elif defined(__ANDROID__)
 #  include <__cxx03/__locale_dir/locale_base_api/android.h>
 #elif defined(__sun__)
diff --git a/libcxx/include/__cxx03/__locale_dir/locale_base_api/ibm.h b/libcxx/include/__cxx03/__locale_dir/locale_base_api/ibm.h
deleted file mode 100644
index 0fab9d24d84b6..0000000000000
--- a/libcxx/include/__cxx03/__locale_dir/locale_base_api/ibm.h
+++ /dev/null
@@ -1,108 +0,0 @@
-// -*- C++ -*-
-//===-----------------------------------------------------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP___CXX03___LOCALE_LOCALE_BASE_API_IBM_H
-#define _LIBCPP___CXX03___LOCALE_LOCALE_BASE_API_IBM_H
-
-#if defined(__MVS__)
-#  include <__cxx03/__support/ibm/locale_mgmt_zos.h>
-#endif // defined(__MVS__)
-
-#include <__cxx03/locale.h>
-#include <__cxx03/stdarg.h>
-#include <__cxx03/stdio.h>
-
-#include "cstdlib"
-
-#if defined(__MVS__)
-#  include <__cxx03/wctype.h>
-// POSIX routines
-#  include <__cxx03/__support/xlocale/__posix_l_fallback.h>
-#endif // defined(__MVS__)
-
-namespace {
-
-struct __setAndRestore {
-  explicit __setAndRestore(locale_t locale) {
-    if (locale == (locale_t)0) {
-      __cloc   = newlocale(LC_ALL_MASK, "C", /* base */ (locale_t)0);
-      __stored = uselocale(__cloc);
-    } else {
-      __stored = uselocale(locale);
-    }
-  }
-
-  ~__setAndRestore() {
-    uselocale(__stored);
-    if (__cloc)
-      freelocale(__cloc);
-  }
-
-private:
-  locale_t __stored = (locale_t)0;
-  locale_t __cloc   = (locale_t)0;
-};
-
-} // namespace
-
-// The following are not POSIX routines.  These are quick-and-dirty hacks
-// to make things pretend to work
-inline _LIBCPP_HIDE_FROM_ABI long long strtoll_l(const char* __nptr, char** __endptr, int __base, locale_t locale) {
-  __setAndRestore __newloc(locale);
-  return ::strtoll(__nptr, __endptr, __base);
-}
-
-inline _LIBCPP_HIDE_FROM_ABI double strtod_l(const char* __nptr, char** __endptr, locale_t locale) {
-  __setAndRestore __newloc(locale);
-  return ::strtod(__nptr, __endptr);
-}
-
-inline _LIBCPP_HIDE_FROM_ABI float strtof_l(const char* __nptr, char** __endptr, locale_t locale) {
-  __setAndRestore __newloc(locale);
-  return ::strtof(__nptr, __endptr);
-}
-
-inline _LIBCPP_HIDE_FROM_ABI long double strtold_l(const char* __nptr, char** __endptr, locale_t locale) {
-  __setAndRestore __newloc(locale);
-  return ::strtold(__nptr, __endptr);
-}
-
-inline _LIBCPP_HIDE_FROM_ABI unsigned long long
-strtoull_l(const char* __nptr, char** __endptr, int __base, locale_t locale) {
-  __setAndRestore __newloc(locale);
-  return ::strtoull(__nptr, __endptr, __base);
-}
-
-inline _LIBCPP_HIDE_FROM_ABI
-_LIBCPP_ATTRIBUTE_FORMAT(__printf__, 2, 0) int vasprintf(char** strp, const char* fmt, va_list ap) {
-  const size_t buff_size = 256;
-  if ((*strp = (char*)malloc(buff_size)) == NULL) {
-    return -1;
-  }
-
-  va_list ap_copy;
-  // va_copy may not be provided by the C library in C++03 mode.
-#if defined(_LIBCPP_CXX03_LANG) && __has_builtin(__builtin_va_copy)
-  __builtin_va_copy(ap_copy, ap);
-#else
-  va_copy(ap_copy, ap);
-#endif
-  int str_size = vsnprintf(*strp, buff_size, fmt, ap_copy);
-  va_end(ap_copy);
-
-  if ((size_t)str_size >= buff_size) {
-    if ((*strp = (char*)realloc(*strp, str_size + 1)) == NULL) {
-      return -1;
-    }
-    str_size = vsnprintf(*strp, str_size + 1, fmt, ap);
-  }
-  return str_size;
-}
-
-#endif // _LIBCPP___CXX03___LOCALE_LOCALE_BASE_API_IBM_H
diff --git a/libcxx/include/__cxx03/__support/ibm/gettod_zos.h b/libcxx/include/__cxx03/__support/ibm/gettod_zos.h
deleted file mode 100644
index 3bb9b942a3903..0000000000000
--- a/libcxx/include/__cxx03/__support/ibm/gettod_zos.h
+++ /dev/null
@@ -1,52 +0,0 @@
-// -*- C++ -*-
-//===----------------------------------------------------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP___CXX03___SUPPORT_IBM_GETTOD_ZOS_H
-#define _LIBCPP___CXX03___SUPPORT_IBM_GETTOD_ZOS_H
-
-#include <__cxx03/time.h>
-
-inline _LIBCPP_HIDE_FROM_ABI int gettimeofdayMonotonic(struct timespec64* Output) {
-  // The POSIX gettimeofday() function is not available on z/OS. Therefore,
-  // we will call stcke and other hardware instructions in implement equivalent.
-  // Note that nanoseconds alone will overflow when reaching new epoch in 2042.
-
-  struct _t {
-    uint64_t Hi;
-    uint64_t Lo;
-  };
-  struct _t Value = {0, 0};
-  uint64_t CC     = 0;
-  asm(" stcke %0\n"
-      " ipm %1\n"
-      " srlg %1,%1,28\n"
-      : "=m"(Value), "+r"(CC)::);
-
-  if (CC != 0) {
-    errno = EMVSTODNOTSET;
-    return CC;
-  }
-  uint64_t us = (Value.Hi >> 4);
-  uint64_t ns = ((Value.Hi & 0x0F) << 8) + (Value.Lo >> 56);
-  ns          = (ns * 1000) >> 12;
-  us          = us - 2208988800000000;
-
-  register uint64_t DivPair0 asm("r0"); // dividend (upper half), remainder
-  DivPair0 = 0;
-  register uint64_t DivPair1 asm("r1"); // dividend (lower half), quotient
-  DivPair1         = us;
-  uint64_t Divisor = 1000000;
-  asm(" dlgr %0,%2" : "+r"(DivPair0), "+r"(DivPair1) : "r"(Divisor) :);
-
-  Output->tv_sec  = DivPair1;
-  Output->tv_nsec = DivPair0 * 1000 + ns;
-  return 0;
-}
-
-#endif // _LIBCPP___CXX03___SUPPORT_IBM_GETTOD_ZOS_H
diff --git a/libcxx/include/__cxx03/__support/ibm/locale_mgmt_zos.h b/libcxx/include/__cxx03/__support/ibm/locale_mgmt_zos.h
deleted file mode 100644
index 9fa8f8c9088e1..0000000000000
--- a/libcxx/include/__cxx03/__support/ibm/locale_mgmt_zos.h
+++ /dev/null
@@ -1,53 +0,0 @@
-// -*- C++ -*-
-//===----------------------------------------------------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP___CXX03___SUPPORT_IBM_LOCALE_MGMT_ZOS_H
-#define _LIBCPP___CXX03___SUPPORT_IBM_LOCALE_MGMT_ZOS_H
-
-#if defined(__MVS__)
-#  include <__cxx03/locale.h>
-#  include <__cxx03/string>
-
-#  ifdef __cplusplus
-extern "C" {
-#  endif
-
-#  define _LC_MAX LC_MESSAGES /* highest real category */
-#  define _NCAT (_LC_MAX + 1) /* maximum + 1 */
-
-#  define _CATMASK(n) (1 << (n))
-#  define LC_COLLATE_MASK _CATMASK(LC_COLLATE)
-#  define LC_CTYPE_MASK _CATMASK(LC_CTYPE)
-#  define LC_MONETARY_MASK _CATMASK(LC_MONETARY)
-#  define LC_NUMERIC_MASK _CATMASK(LC_NUMERIC)
-#  define LC_TIME_MASK _CATMASK(LC_TIME)
-#  define LC_MESSAGES_MASK _CATMASK(LC_MESSAGES)
-#  define LC_ALL_MASK (_CATMASK(_NCAT) - 1)
-
-typedef struct locale_struct {
-  int category_mask;
-  std::string lc_collate;
-  std::string lc_ctype;
-  std::string lc_monetary;
-  std::string lc_numeric;
-  std::string lc_time;
-  std::string lc_messages;
-}* locale_t;
-
-// z/OS does not have newlocale, freelocale and uselocale.
-// The functions below are workarounds in single thread mode.
-locale_t newlocale(int category_mask, const char* locale, locale_t base);
-void freelocale(locale_t locobj);
-locale_t uselocale(locale_t newloc);
-
-#  ifdef __cplusplus
-}
-#  endif
-#endif // defined(__MVS__)
-#endif // _LIBCPP___CXX03___SUPPORT_IBM_LOCALE_MGMT_ZOS_H
diff --git a/libcxx/include/__cxx03/__support/ibm/nanosleep.h b/libcxx/include/__cxx03/__support/ibm/nanosleep.h
deleted file mode 100644
index 1b6883bbcc111..0000000000000
--- a/libcxx/include/__cxx03/__support/ibm/nanosleep.h
+++ /dev/null
@@ -1,55 +0,0 @@
-// -*- C++ -*-
-//===----------------------------------------------------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP___CXX03___SUPPORT_IBM_NANOSLEEP_H
-#define _LIBCPP___CXX03___SUPPORT_IBM_NANOSLEEP_H
-
-#include <__cxx03/unistd.h>
-
-inline int nanosleep(const struct timespec* __req, struct timespec* __rem) {
-  // The nanosleep() function is not available on z/OS. Therefore, we will call
-  // sleep() to sleep for whole seconds and usleep() to sleep for any remaining
-  // fraction of a second. Any remaining nanoseconds will round up to the next
-  // microsecond.
-  if (__req->tv_sec < 0 || __req->tv_nsec < 0 || __req->tv_nsec > 999999999) {
-    errno = EINVAL;
-    return -1;
-  }
-  long __micro_sec = (__req->tv_nsec + 999) / 1000;
-  time_t __sec     = __req->tv_sec;
-  if (__micro_sec > 999999) {
-    ++__sec;
-    __micro_sec -= 1000000;
-  }
-  __sec = static_cast<time_t>(sleep(static_cast<unsigned int>(__sec)));
-  if (__sec) {
-    if (__rem) {
-      // Updating the remaining time to sleep in case of unsuccessful call to sleep().
-      __rem->tv_sec  = __sec;
-      __rem->tv_nsec = __micro_sec * 1000;
-    }
-    errno = EINTR;
-    return -1;
-  }
-  if (__micro_sec) {
-    int __rt = usleep(static_cast<unsigned int>(__micro_sec));
-    if (__rt != 0 && __rem) {
-      // The usleep() does not provide the amount of remaining time upon its failure,
-      // so the time slept will be ignored.
-      __rem->tv_sec  = 0;
-      __rem->tv_nsec = __micro_sec * 1000;
-      // The errno is already set.
-      return -1;
-    }
-    return __rt;
-  }
-  return 0;
-}
-
-#endif // _LIBCPP___CXX03___SUPPORT_IBM_NANOSLEEP_H
diff --git a/libcxx/include/__cxx03/__thread/support/pthread.h b/libcxx/include/__cxx03/__thread/support/pthread.h
index 4dc7a4980de2b..5d044ebb78275 100644
--- a/libcxx/include/__cxx03/__thread/support/pthread.h
+++ b/libcxx/include/__cxx03/__thread/support/pthread.h
@@ -19,7 +19,7 @@
 #include <sched.h>
 
 #ifdef __MVS__
-#  include <__cxx03/__support/ibm/nanosleep.h>
+#  include <__support/ibm/nanosleep.h>
 #endif
 
 // Some platforms require <bits/atomic_wide_counter.h> in order for
diff --git a/libcxx/src/chrono.cpp b/libcxx/src/chrono.cpp
index 20387ea76124b..c85a0162dc2b2 100644
--- a/libcxx/src/chrono.cpp
+++ b/libcxx/src/chrono.cpp
@@ -17,7 +17,7 @@
 #include <chrono>
 
 #if defined(__MVS__)
-#  include <__support/ibm/gettod_zos.h> // gettimeofdayMonotonic
+#  include <support/ibm/gettod_zos.h> // gettimeofdayMonotonic
 #endif
 
 #include "include/apple_availability.h"
diff --git a/libcxx/include/__support/ibm/gettod_zos.h b/libcxx/src/support/ibm/gettod_zos.h
similarity index 100%
rename from libcxx/include/__support/ibm/gettod_zos.h
rename to libcxx/src/support/ibm/gettod_zos.h



More information about the libcxx-commits mailing list