From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Daniel Bertalan Date: Thu, 14 Apr 2022 10:17:13 +0200 Subject: [PATCH] [libc++] Add support for SerenityOS This commit teaches libc++ about what features are available in our LibC, namely: * We do not have locale support, so no-op shims should be used in place of the C locale API. * The number of errno constants defined by us is given by the value of the `ELAST` macro. * Multithreading is implemented though the pthread library. * Use libc++'s builtin character type table instead of the one provided by LibC as there's a lot of extra porting work to convince the rest of locale.cpp to use our character type table properly. --- libcxx/include/CMakeLists.txt | 1 + libcxx/include/__config | 6 ++++-- libcxx/include/__locale | 2 ++ libcxx/include/__support/serenity/xlocale.h | 24 +++++++++++++++++++++ libcxx/include/locale | 2 +- libcxx/src/include/config_elast.h | 2 ++ 6 files changed, 34 insertions(+), 3 deletions(-) create mode 100644 libcxx/include/__support/serenity/xlocale.h diff --git a/libcxx/include/CMakeLists.txt b/libcxx/include/CMakeLists.txt index 53700fc9e..67d50bdbc 100644 --- a/libcxx/include/CMakeLists.txt +++ b/libcxx/include/CMakeLists.txt @@ -365,6 +365,7 @@ set(files __support/musl/xlocale.h __support/newlib/xlocale.h __support/openbsd/xlocale.h + __support/serenity/xlocale.h __support/solaris/floatingpoint.h __support/solaris/wchar.h __support/solaris/xlocale.h diff --git a/libcxx/include/__config b/libcxx/include/__config index 458d0c1b8..69f627294 100644 --- a/libcxx/include/__config +++ b/libcxx/include/__config @@ -1146,7 +1146,8 @@ extern "C" _LIBCPP_FUNC_VIS void __sanitizer_annotate_contiguous_container( defined(__APPLE__) || \ defined(__sun__) || \ defined(__MVS__) || \ - defined(_AIX) + defined(_AIX) || \ + defined(__serenity__) # define _LIBCPP_HAS_THREAD_API_PTHREAD # elif defined(__Fuchsia__) // TODO(44575): Switch to C11 thread API when possible. @@ -1225,7 +1226,8 @@ extern "C" _LIBCPP_FUNC_VIS void __sanitizer_annotate_contiguous_container( #if defined(__BIONIC__) || defined(__NuttX__) || \ defined(__Fuchsia__) || defined(__wasi__) || \ - defined(_LIBCPP_HAS_MUSL_LIBC) || defined(__OpenBSD__) + defined(_LIBCPP_HAS_MUSL_LIBC) || defined(__OpenBSD__) || \ + defined(__serenity__) #define _LIBCPP_PROVIDES_DEFAULT_RUNE_TABLE #endif diff --git a/libcxx/include/__locale b/libcxx/include/__locale index 51f35eece..6f25098a2 100644 --- a/libcxx/include/__locale +++ b/libcxx/include/__locale @@ -44,6 +44,8 @@ # include <__support/musl/xlocale.h> #elif defined(_LIBCPP_HAS_MUSL_LIBC) # include <__support/musl/xlocale.h> +#elif defined(__serenity__) +# include <__support/serenity/xlocale.h> #endif #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) diff --git a/libcxx/include/__support/serenity/xlocale.h b/libcxx/include/__support/serenity/xlocale.h new file mode 100644 index 000000000..0f939d2f6 --- /dev/null +++ b/libcxx/include/__support/serenity/xlocale.h @@ -0,0 +1,24 @@ +//===----------------------------------------------------------------------===// +// +// 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_SUPPORT_SERENITY_XLOCALE_H +#define _LIBCPP_SUPPORT_SERENITY_XLOCALE_H + +#if defined(__serenity__) + +#include +#include +#include +#include +#include <__support/xlocale/__nop_locale_mgmt.h> +#include <__support/xlocale/__posix_l_fallback.h> +#include <__support/xlocale/__strtonum_fallback.h> + +#endif // __serenity__ + +#endif diff --git a/libcxx/include/locale b/libcxx/include/locale index 7c2d2361f..229ca7258 100644 --- a/libcxx/include/locale +++ b/libcxx/include/locale @@ -206,7 +206,7 @@ template class messages_byname; #if defined(__unix__) || (defined(__APPLE__) && defined(__MACH__)) // Most unix variants have catopen. These are the specific ones that don't. -# if !defined(__BIONIC__) && !defined(_NEWLIB_VERSION) +# if !defined(__BIONIC__) && !defined(_NEWLIB_VERSION) && !defined(__serenity__) # define _LIBCPP_HAS_CATOPEN 1 # include # endif diff --git a/libcxx/src/include/config_elast.h b/libcxx/src/include/config_elast.h index 0ed53a3b2..7fffd937e 100644 --- a/libcxx/src/include/config_elast.h +++ b/libcxx/src/include/config_elast.h @@ -33,6 +33,8 @@ #define _LIBCPP_ELAST 4095 #elif defined(__APPLE__) // No _LIBCPP_ELAST needed on Apple +#elif defined(__serenity__) +// No _LIBCPP_ELAST needed on SerenityOS #elif defined(__sun__) #define _LIBCPP_ELAST ESTALE #elif defined(__MVS__)