[libcxx] Define _LIBCPP_HAS_C8RTOMB_MBRTOC8 to true if compiling with clang#152724
[libcxx] Define _LIBCPP_HAS_C8RTOMB_MBRTOC8 to true if compiling with clang#152724
_LIBCPP_HAS_C8RTOMB_MBRTOC8 to true if compiling with clang#152724Conversation
Starting from picolibc 1.8.9, the `char8_t` related functions are provided. This patch adds logic to detect the underlying picolibc version and define the `_LIBCPP_HAS_C8RTOMB_MBRTOC8 macro` accordingly.
|
@llvm/pr-subscribers-libcxx Author: Victor Campos (vhscampos) ChangesStarting from picolibc 1.8.9, the This patch adds logic to detect the underlying picolibc version and define the Full diff: https://github.com/llvm/llvm-project/pull/152724.diff 2 Files Affected:
diff --git a/libcxx/include/__config b/libcxx/include/__config
index 77a71b6cf1cae..ab87ed4787b84 100644
--- a/libcxx/include/__config
+++ b/libcxx/include/__config
@@ -1027,8 +1027,12 @@ typedef __char32_t char32_t;
# else
# define _LIBCPP_HAS_C8RTOMB_MBRTOC8 0
# endif
-# else
-# define _LIBCPP_HAS_C8RTOMB_MBRTOC8 0
+# elif defined (_LIBCPP_PICOLIBC_PREREQ)
+# if _LIBCPP_PICOLIBC_PREREQ(1, 8, 9) && defined(__cpp_char8_t)
+# define _LIBCPP_HAS_C8RTOMB_MBRTOC8 1
+# else
+# define _LIBCPP_HAS_C8RTOMB_MBRTOC8 0
+# endif
# endif
// There are a handful of public standard library types that are intended to
diff --git a/libcxx/include/__configuration/platform.h b/libcxx/include/__configuration/platform.h
index f3c199dee172b..4f581a352038f 100644
--- a/libcxx/include/__configuration/platform.h
+++ b/libcxx/include/__configuration/platform.h
@@ -47,6 +47,10 @@
// user code. Move code paths that need _NEWLIB_VERSION to another customization mechanism.
#if __has_include(<picolibc.h>)
# include <picolibc.h>
+# define _LIBCPP_PICOLIBC_VERSION_INT(maj, min, patch) (maj * 10000 + min * 100 + patch)
+# define _LIBCPP_PICOLIBC_PREREQ(maj, min, patch) \
+ _LIBCPP_PICOLIBC_VERSION_INT(__PICOLIBC__, __PICOLIBC_MINOR__, __PICOLIBC_PATCHLEVEL__) >= \
+ _LIBCPP_PICOLIBC_VERSION_INT(maj, min, patch)
#endif
#ifndef __BYTE_ORDER__
|
|
✅ With the latest revision this PR passed the C/C++ code formatter. |
PR llvm/llvm-project#152724 adds logic to define the `_LIBCPP_HAS_C8RTOMB_MBRTOC8` macro depending on the picolibc support for `char8_t` functions. With this change we don't need a downstream patch anymore.
PR llvm/llvm-project#152724 adds logic to define the `_LIBCPP_HAS_C8RTOMB_MBRTOC8` macro depending on the picolibc support for `char8_t` functions. With this change we don't need a downstream patch anymore.
philnik777
left a comment
There was a problem hiding this comment.
I think it would be better to refactor _LIBCPP_HAS_C8RTOMB_MBRTOC8 so that it's true unless we know it to be false (and also unconditionally make it true with Clang).
|
@philnik777 I don't understand the two suggestions you made. Can you please give more details? Thank you |
|
|
I've refactored in a way that the macro is true "by default" as you suggested. However, with regards to always setting it to true if compiling with clang, that causes a libcxx test to fail (link: )The value of macro I couldn't think of a way to modify the test in order to have the macro true for clang. |
We should probably just XFAIL the test on platforms that haven't fully implemented the interface. @ldionne any thoughts? |
|
Handling every case is brittle because I can't run the CI jobs locally, e.g. on AIX. Sorry for the high traffic. |
|
@philnik777 Can you please have another look? |
- Define macro unconditionally when the compiler is clang. - Remove preprocessor logic that isn't needed anymore. - Define new libcxx test feature for the AIX platform. - Mark tests as xfail in the platforms whose C library doesn't support the char8_t functions.
|
@philnik777 I've changed it around to unconditionally define the macro for clang, and then xfail tests in platforms whose C library doesn't provide support. The CI premerge failures AFAIK are unrelated to the patch. |
_LIBCPP_HAS_C8RTOMB_MBRTOC8 to true if compiling with clang
libcxx/test/std/strings/c.strings/no_c8rtomb_mbrtoc8.verify.cpp
Outdated
Show resolved
Hide resolved
- Move clang's case to the top. - Extract char8_t part of the tests into its own files. - Remove test that has little use. - Undo the creation of a feature just for the AIX platform.
libcxx/test/std/depr/depr.c.headers/uchar_h_char8_t.compile.pass.cpp
Outdated
Show resolved
Hide resolved
|
@philnik777 @ldionne
I don't know how to specify xfails to capture the conditions of these failures, or if it's even possible. If I xfail it on Linux across the board, I think it will unexpectedly pass on downstream runners that have a newer glibc. I'm lost here. Do you have any recommendations to make progress on this? |
|
If you can write out in pseudocode what your ideal XFAIL would be, I can try to figure it out. I've spent a lot of time in these test frameworks, for better or worse. |
|
For inspecting glibc, is a feature check, and there is a functionglibc_version_less_than that could help.
But I get the impression it has to be more than just "glibc >= some verison". |
|
@DavidSpickett Thanks for your comment. Inspired by your idea I created a new lit feature to check the glibc version if glibc is indeed the C library in use. Now I believe the xfails are correct. The failing CI jobs are unrelated. @philnik777 for your attention, please. If can have another look to see if everything is ok. |
|
Since the PR had received approval before my latest changes, I will merge it. If you find any issues with it after the merge, I’m happy to revert it and make any necessary changes. |
…C8RTOMB_MBRTOC8 With the merging of llvm/llvm-project#152724 upstream, the downstream patch is not required anymore.
…C8RTOMB_MBRTOC8 (#603) With the merging of llvm/llvm-project#152724 upstream, the downstream patch is not required anymore.
|
This patch was reverted in #165268 because it was merged with a broken pre-commit CI. Please re-open the PR and make sure the CI is happy before merging. If you have problem with getting the CI happy feel free to ask. |
…rue if compiling with clang" (#165268) Reverts llvm/llvm-project#152724 The PR was merged with broken pre-commit CI.
…th clang (llvm#152724) Define `_LIBCPP_HAS_C8RTOMB_MBRTOC8` to `1` if compiling with clang. Some tests involving functionality from `uchar.h`/`cuchar` fail when the platform or the supporting C library does not provide support for the corresponding features. These have been xfailed. This patch will enable the adoption of newer picolibc versions.
…iling with clang" (llvm#165268) Reverts llvm#152724 The PR was merged with broken pre-commit CI.
|
My apologies. I was very careful, but obviously not enough. I am working on the patch again. |
…th clang (llvm#152724) Define `_LIBCPP_HAS_C8RTOMB_MBRTOC8` to `1` if compiling with clang. Some tests involving functionality from `uchar.h`/`cuchar` fail when the platform or the supporting C library does not provide support for the corresponding features. These have been xfailed. This patch will enable the adoption of newer picolibc versions.
…iling with clang" (llvm#165268) Reverts llvm#152724 The PR was merged with broken pre-commit CI.
…th clang (llvm#152724) Define `_LIBCPP_HAS_C8RTOMB_MBRTOC8` to `1` if compiling with clang. Some tests involving functionality from `uchar.h`/`cuchar` fail when the platform or the supporting C library does not provide support for the corresponding features. These have been xfailed. This patch will enable the adoption of newer picolibc versions.
…iling with clang" (llvm#165268) Reverts llvm#152724 The PR was merged with broken pre-commit CI.
Define
_LIBCPP_HAS_C8RTOMB_MBRTOC8to1if compiling with clang.Some tests involving functionality from
uchar.h/cucharfail when the platform or the supporting C library does not provide support for the corresponding features. These have been xfailed.This patch will enable the adoption of newer picolibc versions.