diff mbox series

[libstdc++] add _GLIBCXX_CLANG to workaround predefined __clang__

Message ID orle3qjcrh.fsf@lxoliva.fsfla.org
State New
Headers show
Series [libstdc++] add _GLIBCXX_CLANG to workaround predefined __clang__ | expand

Commit Message

Alexandre Oliva May 31, 2024, 2:07 p.m. UTC
A proprietary embedded operating system that uses clang as its primary
compiler ships headers that require __clang__ to be defined.  Defining
that macro causes libstdc++ to adopt workarounds that work for clang
but that break for GCC.

So, introduce a _GLIBCXX_CLANG macro, and a convention to test for it
rather than for __clang__, so that a GCC variant that adds -D__clang__
to satisfy system headers can also -D_GLIBCXX_CLANG=0 to avoid
workarounds that are not meant for GCC.

I've left fast_float and ryu files alone, their tests for __clang__
don't seem to be harmful for GCC, they don't include bits/c++config,
and patching such third-party files would just make trouble for
updating them without visible benefit.

Regstrapping on x86_64-linux-gnu.  Ok to install?

PS: I went for mechanical replacement s/__clang__/_GLIBCXX_CLANG/g which
made c++config slightly more complicated, but I'm open to making
_GLIBCXX_CLANG be defined unconditionally, using nonzero tests for it
elsewhere, if that's preferred.  I figured this would be easier to
validate: I only had to check that the modified headers used other
c++config-defined macros.


for  libstdc++-v3/ChangeLog

	* include/bits/c++config (_GLIBCXX_CLANG): Define or undefine.
	* include/bits/locale_facets_nonio.tcc: Test for it.
	* include/bits/stl_bvector.h: Likewise.
	* include/c_compatibility/stdatomic.h: Likewise.
	* include/experimental/bits/simd.h: Likewise.
	* include/experimental/bits/simd_builtin.h: Likewise.
	* include/experimental/bits/simd_detail.h: Likewise.
	* include/experimental/bits/simd_x86.h: Likewise.
	* include/experimental/simd: Likewise.
	* include/std/complex: Likewise.
	* include/std/ranges: Likewise.
	* include/std/variant: Likewise.
	* include/pstl/pstl_config.h: Likewise, when defined(__GLIBCXX__).
---
 libstdc++-v3/include/bits/c++config                |   13 ++++++++++++-
 libstdc++-v3/include/bits/locale_facets_nonio.tcc  |    2 +-
 libstdc++-v3/include/bits/stl_bvector.h            |    2 +-
 libstdc++-v3/include/c_compatibility/stdatomic.h   |    2 +-
 libstdc++-v3/include/experimental/bits/simd.h      |   14 +++++++-------
 .../include/experimental/bits/simd_builtin.h       |    4 ++--
 .../include/experimental/bits/simd_detail.h        |    8 ++++----
 libstdc++-v3/include/experimental/bits/simd_x86.h  |   12 ++++++------
 libstdc++-v3/include/experimental/simd             |    2 +-
 libstdc++-v3/include/pstl/pstl_config.h            |    4 ++--
 libstdc++-v3/include/std/complex                   |    4 ++--
 libstdc++-v3/include/std/ranges                    |    8 ++++----
 libstdc++-v3/include/std/variant                   |    2 +-
 13 files changed, 44 insertions(+), 33 deletions(-)

Comments

Jonathan Wakely May 31, 2024, 2:50 p.m. UTC | #1
On 31/05/24 11:07 -0300, Alexandre Oliva wrote:
>
>A proprietary embedded operating system that uses clang as its primary
>compiler ships headers that require __clang__ to be defined.  Defining
>that macro causes libstdc++ to adopt workarounds that work for clang
>but that break for GCC.
>
>So, introduce a _GLIBCXX_CLANG macro, and a convention to test for it
>rather than for __clang__, so that a GCC variant that adds -D__clang__
>to satisfy system headers can also -D_GLIBCXX_CLANG=0 to avoid
>workarounds that are not meant for GCC.
>
>I've left fast_float and ryu files alone, their tests for __clang__
>don't seem to be harmful for GCC, they don't include bits/c++config,
>and patching such third-party files would just make trouble for
>updating them without visible benefit.
>
>Regstrapping on x86_64-linux-gnu.  Ok to install?
>
>PS: I went for mechanical replacement s/__clang__/_GLIBCXX_CLANG/g which
>made c++config slightly more complicated, but I'm open to making
>_GLIBCXX_CLANG be defined unconditionally, using nonzero tests for it
>elsewhere, if that's preferred.  I figured this would be easier to
>validate: I only had to check that the modified headers used other
>c++config-defined macros.

I think I prefer your approach to defining it unconditionally to zero
or one.

Comments inline below ...

>for  libstdc++-v3/ChangeLog
>
>	* include/bits/c++config (_GLIBCXX_CLANG): Define or undefine.
>	* include/bits/locale_facets_nonio.tcc: Test for it.
>	* include/bits/stl_bvector.h: Likewise.
>	* include/c_compatibility/stdatomic.h: Likewise.
>	* include/experimental/bits/simd.h: Likewise.
>	* include/experimental/bits/simd_builtin.h: Likewise.
>	* include/experimental/bits/simd_detail.h: Likewise.
>	* include/experimental/bits/simd_x86.h: Likewise.
>	* include/experimental/simd: Likewise.
>	* include/std/complex: Likewise.
>	* include/std/ranges: Likewise.
>	* include/std/variant: Likewise.
>	* include/pstl/pstl_config.h: Likewise, when defined(__GLIBCXX__).
>---
> libstdc++-v3/include/bits/c++config                |   13 ++++++++++++-
> libstdc++-v3/include/bits/locale_facets_nonio.tcc  |    2 +-
> libstdc++-v3/include/bits/stl_bvector.h            |    2 +-
> libstdc++-v3/include/c_compatibility/stdatomic.h   |    2 +-
> libstdc++-v3/include/experimental/bits/simd.h      |   14 +++++++-------
> .../include/experimental/bits/simd_builtin.h       |    4 ++--
> .../include/experimental/bits/simd_detail.h        |    8 ++++----
> libstdc++-v3/include/experimental/bits/simd_x86.h  |   12 ++++++------
> libstdc++-v3/include/experimental/simd             |    2 +-
> libstdc++-v3/include/pstl/pstl_config.h            |    4 ++--
> libstdc++-v3/include/std/complex                   |    4 ++--
> libstdc++-v3/include/std/ranges                    |    8 ++++----
> libstdc++-v3/include/std/variant                   |    2 +-
> 13 files changed, 44 insertions(+), 33 deletions(-)
>
>diff --git a/libstdc++-v3/include/bits/c++config b/libstdc++-v3/include/bits/c++config
>index b57e3f338e92a..6dca2d9467aa5 100644
>--- a/libstdc++-v3/include/bits/c++config
>+++ b/libstdc++-v3/include/bits/c++config
>@@ -481,9 +481,20 @@ _GLIBCXX_END_NAMESPACE_VERSION
> // Define if compatibility should be provided for -mlong-double-64.
> #undef _GLIBCXX_LONG_DOUBLE_COMPAT
>
>+// Use an alternate macro to test for clang, so as to provide an easy
>+// workaround for systems (such as vxworks) whose headers require
>+// __clang__ to be defined, even when compiling with GCC.
>+#if !defined _GLIBCXX_CLANG && defined __clang__
>+# define _GLIBCXX_CLANG __clang__
>+// Turn -D_GLIBCXX_CLANG=0 into -U_GLIBCXX_CLANG, so that
>+// _GLIBCXX_CLANG can be tested as defined, just like __clang__.
>+#elif !_GLIBCXX_CLANG
>+# undef _GLIBCXX_CLANG
>+#endif
>+
> // Define if compatibility should be provided for alternative 128-bit long
> // double formats. Not possible for Clang until __ibm128 is supported.
>-#ifndef __clang__
>+#ifndef _GLIBCXX_CLANG
> #undef _GLIBCXX_LONG_DOUBLE_ALT128_COMPAT
> #endif
>
>diff --git a/libstdc++-v3/include/bits/locale_facets_nonio.tcc b/libstdc++-v3/include/bits/locale_facets_nonio.tcc
>index 8f67be5a6147b..72136f42f0866 100644
>--- a/libstdc++-v3/include/bits/locale_facets_nonio.tcc
>+++ b/libstdc++-v3/include/bits/locale_facets_nonio.tcc
>@@ -1465,7 +1465,7 @@ _GLIBCXX_END_NAMESPACE_LDBL_OR_CXX11
>       ctype<_CharT> const& __ctype = use_facet<ctype<_CharT> >(__loc);
>       __err = ios_base::goodbit;
>       bool __use_state = false;
>-#if __GNUC__ >= 5 && !defined(__clang__)
>+#if __GNUC__ >= 5 && !defined(_GLIBCXX_CLANG)
> #pragma GCC diagnostic push
> #pragma GCC diagnostic ignored "-Wpmf-conversions"
>       // Nasty hack.  The C++ standard mandates that get invokes the do_get
>diff --git a/libstdc++-v3/include/bits/stl_bvector.h b/libstdc++-v3/include/bits/stl_bvector.h
>index d567e26f4e430..52153cadf8f70 100644
>--- a/libstdc++-v3/include/bits/stl_bvector.h
>+++ b/libstdc++-v3/include/bits/stl_bvector.h
>@@ -185,7 +185,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
>     void
>     _M_assume_normalized() const
>     {
>-#if __has_attribute(__assume__) && !defined(__clang__)
>+#if __has_attribute(__assume__) && !defined(_GLIBCXX_CLANG)
>       unsigned int __ofst = _M_offset;
>       __attribute__ ((__assume__ (__ofst < unsigned(_S_word_bit))));
> #endif
>diff --git a/libstdc++-v3/include/c_compatibility/stdatomic.h b/libstdc++-v3/include/c_compatibility/stdatomic.h
>index 52daa16c9b1ed..5403b52a036d1 100644
>--- a/libstdc++-v3/include/c_compatibility/stdatomic.h
>+++ b/libstdc++-v3/include/c_compatibility/stdatomic.h
>@@ -125,7 +125,7 @@ using std::atomic_flag_clear_explicit;
> using std::atomic_thread_fence;
> using std::atomic_signal_fence;
>
>-#elif defined __clang__
>+#elif defined _GLIBCXX_CLANG
> # include_next <stdatomic.h>
> #endif // __cpp_lib_stdatomic_h
> #endif // _GLIBCXX_STDATOMIC_H
>diff --git a/libstdc++-v3/include/experimental/bits/simd.h b/libstdc++-v3/include/experimental/bits/simd.h
>index 7c52462571902..ea034138fd720 100644
>--- a/libstdc++-v3/include/experimental/bits/simd.h
>+++ b/libstdc++-v3/include/experimental/bits/simd.h
>@@ -606,7 +606,7 @@ template <size_t _Bytes>
>     static_assert(_Bytes > 0);
>     if constexpr (_Bytes == sizeof(int))
>       return int();
>-  #ifdef __clang__
>+  #ifdef _GLIBCXX_CLANG

I'd like to hear from Matthias to know he's OK with the simd changes.


>     else if constexpr (_Bytes == sizeof(char))
>       return char();
>   #else
>@@ -615,7 +615,7 @@ template <size_t _Bytes>
>   #endif
>     else if constexpr (_Bytes == sizeof(short))
>       return short();
>-  #ifndef __clang__
>+  #ifndef _GLIBCXX_CLANG
>     else if constexpr (_Bytes == sizeof(long))
>       return long();
>   #endif
>@@ -1720,7 +1720,7 @@ template <typename _To, typename _From>
> 	  __builtin_memcpy(&__r, &__v, sizeof(_To));
> 	  return __r;
> 	}
>-#if _GLIBCXX_SIMD_X86INTRIN && !defined __clang__
>+#if _GLIBCXX_SIMD_X86INTRIN && !defined _GLIBCXX_CLANG
>     else if constexpr (__have_avx && sizeof(_From) == 16 && sizeof(_To) == 32)
>       return reinterpret_cast<_To>(__builtin_ia32_ps256_ps(
> 	reinterpret_cast<__vector_type_t<float, 4>>(__v)));
>@@ -1975,7 +1975,7 @@ template <typename _TW>
>
> // }}}
> // __andnot{{{
>-#if _GLIBCXX_SIMD_X86INTRIN && !defined __clang__
>+#if _GLIBCXX_SIMD_X86INTRIN && !defined _GLIBCXX_CLANG
> static constexpr struct
> {
>   _GLIBCXX_SIMD_INTRINSIC __v4sf
>@@ -2035,7 +2035,7 @@ static constexpr struct
>   operator()(__v8di __a, __v8di __b) const noexcept
>   { return _mm512_andnot_si512(__a, __b); }
> } _S_x86_andnot;
>-#endif // _GLIBCXX_SIMD_X86INTRIN && !__clang__
>+#endif // _GLIBCXX_SIMD_X86INTRIN && !_GLIBCXX_CLANG
>
> template <typename _TW>
>   _GLIBCXX_SIMD_INTRINSIC constexpr _TW
>@@ -2046,7 +2046,7 @@ template <typename _TW>
> 	using _TVT = conditional_t<__is_simd_wrapper_v<_TW>, _TW,
> 				   _VectorTraitsImpl<_TW>>;
> 	using _Tp = typename _TVT::value_type;
>-#if _GLIBCXX_SIMD_X86INTRIN && !defined __clang__
>+#if _GLIBCXX_SIMD_X86INTRIN && !defined _GLIBCXX_CLANG
> 	if constexpr (sizeof(_TW) >= 16)
> 	  {
> 	    const auto __ai = __to_intrin(__a);
>@@ -2095,7 +2095,7 @@ template <typename _T0, typename _T1, typename _Fun, size_t... _Is>
>     using _Tp = remove_reference_t<decltype(declval<_T0>()[0])>;
>     using _RV [[maybe_unused]] = __vector_type_t<_Tp, sizeof...(_Is)>;
> #if __has_builtin(__builtin_shufflevector)
>-#ifdef __clang__
>+#ifdef _GLIBCXX_CLANG
>     // Clang requires _T0 == _T1
>     if constexpr (sizeof(__x) > sizeof(__y) and _N1 == 1)
>       return __vec_shuffle(__x, _T0{__y[0]}, __seq, __idx_perm);
>diff --git a/libstdc++-v3/include/experimental/bits/simd_builtin.h b/libstdc++-v3/include/experimental/bits/simd_builtin.h
>index 505f8083794e7..4abc750cfa1c2 100644
>--- a/libstdc++-v3/include/experimental/bits/simd_builtin.h
>+++ b/libstdc++-v3/include/experimental/bits/simd_builtin.h
>@@ -1177,7 +1177,7 @@ struct _CommonImplBuiltin
>       constexpr size_t _Bytes = _ReqBytes == 0 ? sizeof(__x) : _ReqBytes;
>       static_assert(sizeof(__x) >= _Bytes);
>
>-#if !defined __clang__ && _GLIBCXX_SIMD_WORKAROUND_PR90424
>+#if !defined _GLIBCXX_CLANG && _GLIBCXX_SIMD_WORKAROUND_PR90424
>       if constexpr (__is_vector_type_v<_TV>)
> 	_S_memcpy<_Bytes>(reinterpret_cast<char*>(__addr), reinterpret_cast<const char*>(&__x));
>       else
>@@ -2022,7 +2022,7 @@ template <typename _Abi, typename>
> 	      return __vector_bitcast<float, 2>(_S_plus_minus(__x4, __y));
> 	  }
> #endif
>-#if !defined __clang__ && __GCC_IEC_559 == 0
>+#if !defined _GLIBCXX_CLANG && __GCC_IEC_559 == 0
> 	if (__builtin_is_constant_evaluated()
> 	      || (__builtin_constant_p(__x) && __builtin_constant_p(__y)))
> 	  return (__x + __y) - __y;
>diff --git a/libstdc++-v3/include/experimental/bits/simd_detail.h b/libstdc++-v3/include/experimental/bits/simd_detail.h
>index 51e130bd36a5e..9ddf912a62b03 100644
>--- a/libstdc++-v3/include/experimental/bits/simd_detail.h
>+++ b/libstdc++-v3/include/experimental/bits/simd_detail.h
>@@ -262,7 +262,7 @@
> #endif
> //}}}
>
>-#ifdef __clang__
>+#ifdef _GLIBCXX_CLANG
> #define _GLIBCXX_SIMD_NORMAL_MATH
> #define _GLIBCXX_SIMD_ALWAYS_INLINE_LAMBDA
> #else
>@@ -277,7 +277,7 @@
> #define _GLIBCXX_SIMD_IS_UNLIKELY(__x) __builtin_expect(__x, 0)
> #define _GLIBCXX_SIMD_IS_LIKELY(__x) __builtin_expect(__x, 1)
>
>-#if _GLIBCXX_SIMD_HAVE_SVE || __STRICT_ANSI__ || defined __clang__
>+#if _GLIBCXX_SIMD_HAVE_SVE || __STRICT_ANSI__ || defined _GLIBCXX_CLANG
> #define _GLIBCXX_SIMD_CONSTEXPR
> #define _GLIBCXX_SIMD_USE_CONSTEXPR_API const
> #else
>@@ -285,7 +285,7 @@
> #define _GLIBCXX_SIMD_USE_CONSTEXPR_API constexpr
> #endif
>
>-#if defined __clang__
>+#if defined _GLIBCXX_CLANG
> #define _GLIBCXX_SIMD_USE_CONSTEXPR const
> #else
> #define _GLIBCXX_SIMD_USE_CONSTEXPR constexpr
>@@ -330,7 +330,7 @@
> #endif
>
> // integer division not optimized
>-#ifndef __clang__
>+#ifndef _GLIBCXX_CLANG
> #define _GLIBCXX_SIMD_WORKAROUND_PR90993 1
> #endif
>
>diff --git a/libstdc++-v3/include/experimental/bits/simd_x86.h b/libstdc++-v3/include/experimental/bits/simd_x86.h
>index 517c4b4a5bec7..4ab933b573c61 100644
>--- a/libstdc++-v3/include/experimental/bits/simd_x86.h
>+++ b/libstdc++-v3/include/experimental/bits/simd_x86.h
>@@ -363,7 +363,7 @@ template <typename _Tp>
>
> // }}}
>
>-#ifdef __clang__
>+#ifdef _GLIBCXX_CLANG
> template <size_t _Np, typename _Tp, typename _Kp>
>   _GLIBCXX_SIMD_INTRINSIC constexpr auto
>   __movm(_Kp __k) noexcept
>@@ -408,7 +408,7 @@ template <size_t _Np, typename _Tp, typename _Kp>
>     else
>       __assert_unreachable<_Tp>();
>   }
>-#endif // __clang__
>+#endif // _GLIBCXX_CLANG
>
> #ifdef _GLIBCXX_SIMD_WORKAROUND_PR85048
> #include "simd_x86_conversions.h"
>@@ -674,7 +674,7 @@ struct _CommonImplX86 : _CommonImplBuiltin
>       using _Tp = typename _VectorTraits<_TV>::value_type;
>       static_assert(sizeof(_TV) >= 16);
>       static_assert(sizeof(_Tp) <= 8);
>-#ifdef __clang__
>+#ifdef _GLIBCXX_CLANG
>       return __movm<_VectorTraits<_TV>::_S_full_size, _Tp>(__k) ? __b : __a;
> #else
>       using _IntT
>@@ -3505,9 +3505,9 @@ template <typename _Abi, typename>
> 	    // optimize masked unary increment and decrement as masked sub +/-1
> 	    constexpr int __pm_one
> 	      = is_same_v<_Op<void>, __increment<void>> ? -1 : 1;
>-#ifdef __clang__
>+#ifdef _GLIBCXX_CLANG
> 	    return __movm<_Np, _Tp>(__k._M_data) ? __v._M_data - __pm_one : __v._M_data;
>-#else // __clang__
>+#else // _GLIBCXX_CLANG
> 	    using _TV = __vector_type_t<_Tp, _Np>;
> 	    constexpr size_t __bytes = sizeof(__v) < 16 ? 16 : sizeof(__v);
> 	    constexpr size_t __width = __bytes / sizeof(_Tp);
>@@ -3561,7 +3561,7 @@ template <typename _Abi, typename>
> #undef _GLIBCXX_SIMD_MASK_SUB_512
> #undef _GLIBCXX_SIMD_MASK_SUB
> 	      }
>-#endif // __clang__
>+#endif // _GLIBCXX_CLANG
> 	  }
> 	else
> 	  return _Base::template _S_masked_unary<_Op>(__k, __v);
>diff --git a/libstdc++-v3/include/experimental/simd b/libstdc++-v3/include/experimental/simd
>index f45ad4ed2e6cc..d2d081e0d1a2a 100644
>--- a/libstdc++-v3/include/experimental/simd
>+++ b/libstdc++-v3/include/experimental/simd
>@@ -59,7 +59,7 @@
> #pragma GCC diagnostic push
> // Many [[gnu::vector_size(N)]] types might lead to a -Wpsabi warning which is
> // irrelevant as those functions never appear on ABI borders
>-#ifndef __clang__
>+#ifndef _GLIBCXX_CLANG
> #pragma GCC diagnostic ignored "-Wpsabi"
> #endif
>
>diff --git a/libstdc++-v3/include/pstl/pstl_config.h b/libstdc++-v3/include/pstl/pstl_config.h
>index ccb9dd32838d3..fcac557077bb6 100644
>--- a/libstdc++-v3/include/pstl/pstl_config.h
>+++ b/libstdc++-v3/include/pstl/pstl_config.h
>@@ -53,7 +53,7 @@
> // the actual GCC version on the system.
> #define _PSTL_GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)
>
>-#if defined(__clang__)
>+#if defined(__GLIBCXX__) ? defined(_GLIBCXX_CLANG) : defined(__clang__)

This file is also imported from upstream, like Ryu and fast_float.

I don't think having a "spurious" definition of _PSTL_CLANG_VERSION
here actually matters. It's only used in a header in the testsuite,
and only seems to matter for Clang 9 and older. Maybe we don't need to
care about that?

So don't change anything here at all. If we do need to change it, then
testing __GLIBCXX__ is redundant, because this copy of the file is
always used as part of libstdc++, which defines __GLIBCXX__.

So either don't change this line at all, or just do a simple
s/__clang__/_GLIBCXX_CLANG/

> // according to clang documentation, version can be vendor specific
> #    define _PSTL_CLANG_VERSION (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__)
> #endif
>@@ -62,7 +62,7 @@
> #if (defined(_OPENMP) && _OPENMP >= 201307) || \

This condition will be true when using g++ with -fopenmp (but not
without -fopenmp which I think means we don't want the pragmas to be
enabled unconditionally when gaslighting with -D__clang__).

>     (defined(__INTEL_COMPILER) && __INTEL_COMPILER >= 1600) || \
>     (!defined(__INTEL_COMPILER) && _PSTL_GCC_VERSION >= 40900) || \
>-    defined(__clang__)
>+    defined(_PSTL_CLANG_VERSION)

If think this could just use defined(_GLIBCXX_CLANG), no?
That would mean there's only one change in this file.

Does the vxworks toolchain need to support the PSTL headers?

If not, we could just ignore this file, so the local changes don't
need to be re-applied when we import a new version of the header from
upstream.


> #    define _PSTL_PRAGMA_SIMD _PSTL_PRAGMA(omp simd)
> #    define _PSTL_PRAGMA_DECLARE_SIMD _PSTL_PRAGMA(omp declare simd)
> #    define _PSTL_PRAGMA_SIMD_REDUCTION(PRM) _PSTL_PRAGMA(omp simd reduction(PRM))
>diff --git a/libstdc++-v3/include/std/complex b/libstdc++-v3/include/std/complex
>index 415c735665c3e..be810b6d05d25 100644
>--- a/libstdc++-v3/include/std/complex
>+++ b/libstdc++-v3/include/std/complex
>@@ -47,7 +47,7 @@
> // Get rid of a macro possibly defined in <complex.h>
> #undef complex
>
>-#ifdef __clang__
>+#ifdef _GLIBCXX_CLANG
> #pragma clang diagnostic push
> #pragma clang diagnostic ignored "-Wc99-extensions"
> #endif
>@@ -2646,7 +2646,7 @@ _GLIBCXX_END_NAMESPACE_VERSION
>
> #endif  // C++11
>
>-#ifdef __clang__
>+#ifdef _GLIBCXX_CLANG
> #pragma clang diagnostic pop
> #endif
>
>diff --git a/libstdc++-v3/include/std/ranges b/libstdc++-v3/include/std/ranges
>index b1e827c9a7241..3f335b95a0864 100644
>--- a/libstdc++-v3/include/std/ranges
>+++ b/libstdc++-v3/include/std/ranges
>@@ -4687,7 +4687,7 @@ namespace views::__adaptor
>   class zip_view<_Vs...>::_Iterator
>     : public __detail::__zip_view_iter_cat<_Const, _Vs...>
>   {
>-#ifdef __clang__ // LLVM-61763 workaround
>+#ifdef _GLIBCXX_CLANG // LLVM-61763 workaround

This one doesn't matter, since making these members public for a "fake
clang" doesn't really hurt anything. For consistency maybe it makes
sense to use _GLIBCXX_CLANG anyway.

Ditto for the rest of this file.

>   public:
> #endif
>     tuple<iterator_t<__detail::__maybe_const_t<_Const, _Vs>>...> _M_current;
>@@ -4710,7 +4710,7 @@ namespace views::__adaptor
> 	return input_iterator_tag{};
>     }
>
>-#ifndef __clang__ // LLVM-61763 workaround
>+#ifndef _GLIBCXX_CLANG // LLVM-61763 workaround
>     template<move_constructible _Fp, input_range... _Ws>
>       requires (view<_Ws> && ...) && (sizeof...(_Ws) > 0) && is_object_v<_Fp>
> 	&& regular_invocable<_Fp&, range_reference_t<_Ws>...>
>@@ -5387,7 +5387,7 @@ namespace views::__adaptor
>   template<bool _Const>
>   class adjacent_view<_Vp, _Nm>::_Iterator
>   {
>-#ifdef __clang__ // LLVM-61763 workaround
>+#ifdef _GLIBCXX_CLANG // LLVM-61763 workaround
>   public:
> #endif
>     using _Base = __detail::__maybe_const_t<_Const, _Vp>;
>@@ -5430,7 +5430,7 @@ namespace views::__adaptor
>
>     friend class adjacent_view;
>
>-#ifndef __clang__ // LLVM-61763 workaround
>+#ifndef _GLIBCXX_CLANG // LLVM-61763 workaround
>     template<forward_range _Wp, move_constructible _Fp, size_t _Mm>
>       requires view<_Wp> && (_Mm > 0) && is_object_v<_Fp>
>         && regular_invocable<__detail::__unarize<_Fp&, _Mm>, range_reference_t<_Wp>>
>diff --git a/libstdc++-v3/include/std/variant b/libstdc++-v3/include/std/variant
>index 371cbb90f54a6..51aaa62085170 100644
>--- a/libstdc++-v3/include/std/variant
>+++ b/libstdc++-v3/include/std/variant
>@@ -1758,7 +1758,7 @@ namespace __detail::__variant
> 	  }, __rhs);
>       }
>
>-#if defined(__clang__) && __clang_major__ <= 7
>+#if defined(_GLIBCXX_CLANG) && __clang_major__ <= 7

I think we could drop this kluge entirely, clang 7 is old now, we
generally only support the most recent 3 or 4 clang versions.

>     public:
>       using _Base::_M_u; // See https://bugs.llvm.org/show_bug.cgi?id=31852
> #endif
>
>-- 
>Alexandre Oliva, happy hacker            https://FSFLA.org/blogs/lxo/
>   Free Software Activist                   GNU Toolchain Engineer
>More tolerance and less prejudice are key for inclusion and diversity
>Excluding neuro-others for not behaving ""normal"" is *not* inclusive
Alexandre Oliva May 31, 2024, 3:52 p.m. UTC | #2
On May 31, 2024, Jonathan Wakely <jwakely@redhat.com> wrote:

> On 31/05/24 11:07 -0300, Alexandre Oliva wrote:
>> --- a/libstdc++-v3/include/pstl/pstl_config.h
[...]
>> -#if defined(__clang__)
>> +#if defined(__GLIBCXX__) ? defined(_GLIBCXX_CLANG) : defined(__clang__)

> This file is also imported from upstream, like Ryu and fast_float.

Oh, yeah, I should have mentioned this one in the proposed commit
message.

The problem here was that it wasn't clear c++config would always be
included, so I figured I'd better be conservative.

> I don't think having a "spurious" definition of _PSTL_CLANG_VERSION
> here actually matters.

Yeah, no, it's the other macros guarded by __clang__ that I'm concerned
about, and since the version macro could replace it, I went for it.

> So either don't change this line at all, or just do a simple
> s/__clang__/_GLIBCXX_CLANG/

If c++config can be counted on, I'd be happy to do that, but I couldn't
tell that it could.

> Does the vxworks toolchain need to support the PSTL headers?

Maybe we can do without them.  I really don't know.  Olivier?

> If not, we could just ignore this file, so the local changes don't
> need to be re-applied when we import a new version of the header from
> upstream.

That sounds desirable indeed.  This change is supposed to spare us
(AdaCore) from precisely this sort of trouble, so it wouldn't be fair if
it made this very kind of trouble for our upstream.

>> --- a/libstdc++-v3/include/std/ranges

>> -#ifdef __clang__ // LLVM-61763 workaround
>> +#ifdef _GLIBCXX_CLANG // LLVM-61763 workaround

> This one doesn't matter, since making these members public for a "fake
> clang" doesn't really hurt anything. For consistency maybe it makes
> sense to use _GLIBCXX_CLANG anyway.

Yeah, uniformity would be good to simplify checking for no new
appearances of __clang__, and to set the example to avoid accidental
additions thereof.

>> --- a/libstdc++-v3/include/std/variant

>> -#if defined(__clang__) && __clang_major__ <= 7
>> +#if defined(_GLIBCXX_CLANG) && __clang_major__ <= 7

> I think we could drop this kluge entirely, clang 7 is old now, we
> generally only support the most recent 3 or 4 clang versions.

Fine with me, but I'd do that in a separate later patch, so that this
goes in, and if it gets backported, it will cover this change, rather
than miss it.  Though, as you say, it doesn't matter much either way.
Matthias Kretz May 31, 2024, 3:55 p.m. UTC | #3
So __clang__ is turning into the next __GNUC__ ;)

In essence, inside libstdc++ code, __clang__ is going to mean Clang-compatible 
compiler and _GLIBCXX_CLANG then means it's the actual Clang compiler (or a 
vendor variant like Apple's). Would it make sense to adjust the Apple clang 
major version then so that it matches the LLVM major versions? (e.g. https://
stackoverflow.com/a/78014367)

More inline.

On Friday, 31 May 2024 16:50:26 GMT+2 Jonathan Wakely wrote:
> >diff --git a/libstdc++-v3/include/bits/c++config
> >b/libstdc++-v3/include/bits/c++config index b57e3f338e92a..6dca2d9467aa5
> >100644
> >--- a/libstdc++-v3/include/bits/c++config
> >+++ b/libstdc++-v3/include/bits/c++config
> >@@ -481,9 +481,20 @@ _GLIBCXX_END_NAMESPACE_VERSION
> >
> > // Define if compatibility should be provided for -mlong-double-64.
> > #undef _GLIBCXX_LONG_DOUBLE_COMPAT
> >
> >+// Use an alternate macro to test for clang, so as to provide an easy
> >+// workaround for systems (such as vxworks) whose headers require
> >+// __clang__ to be defined, even when compiling with GCC.
> >+#if !defined _GLIBCXX_CLANG && defined __clang__
> >+# define _GLIBCXX_CLANG __clang__
> >+// Turn -D_GLIBCXX_CLANG=0 into -U_GLIBCXX_CLANG, so that
> >+// _GLIBCXX_CLANG can be tested as defined, just like __clang__.
> >+#elif !_GLIBCXX_CLANG
> >+# undef _GLIBCXX_CLANG
> >+#endif
> >+

So passing -D__clang__=17 -D_GLIBCXX_CLANG=1 is possible? Should it be?

> >diff --git a/libstdc++-v3/include/experimental/bits/simd.h
> >b/libstdc++-v3/include/experimental/bits/simd.h index
> >7c52462571902..ea034138fd720 100644
> >--- a/libstdc++-v3/include/experimental/bits/simd.h
> >+++ b/libstdc++-v3/include/experimental/bits/simd.h
> >@@ -606,7 +606,7 @@ template <size_t _Bytes>
> >
> >     static_assert(_Bytes > 0);
> >     if constexpr (_Bytes == sizeof(int))
> >     
> >       return int();
> >
> >-  #ifdef __clang__
> >+  #ifdef _GLIBCXX_CLANG
> 
> I'd like to hear from Matthias to know he's OK with the simd changes.

Yes, LGTM. There's no maintained upstream copy of simd anymore. And all 
occurrences in the simd code are asking for the actual Clang compiler.

-Matthias
Alexandre Oliva May 31, 2024, 5:40 p.m. UTC | #4
On May 31, 2024, Matthias Kretz <m.kretz@gsi.de> wrote:

> So __clang__ is turning into the next __GNUC__ ;)

Yeah :-(

> So passing -D__clang__=17 -D_GLIBCXX_CLANG=1 is possible? Should it be?

I thought setting them independently could give us some testing
flexibility, thought it's not for the faint of heart ;-)
Olivier Hainque June 1, 2024, 7:35 a.m. UTC | #5
> On 31 May 2024, at 17:52, Alexandre Oliva <oliva@adacore.com> wrote:

>> Does the vxworks toolchain need to support the PSTL headers?
> 
> Maybe we can do without them.  I really don't know.  Olivier?

I have no indication that we can not-support these.

We are seeing many cases of C++/Ada combined codebases in a variety
of VxWorks contexts so actual uses seem likely.

>> If not, we could just ignore this file, so the local changes don't
>> need to be re-applied when we import a new version of the header from
>> upstream.
> 
> That sounds desirable indeed.  This change is supposed to spare us
> (AdaCore) from precisely this sort of trouble, so it wouldn't be fair if
> it made this very kind of trouble for our upstream.

Of course, 100% agreed!

Thanks a lot for help in looking into this!

Olivier
Jonathan Wakely June 1, 2024, 8:18 a.m. UTC | #6
On Sat, 1 Jun 2024 at 08:35, Olivier Hainque <hainque@adacore.com> wrote:
>
>
>
> > On 31 May 2024, at 17:52, Alexandre Oliva <oliva@adacore.com> wrote:
>
> >> Does the vxworks toolchain need to support the PSTL headers?
> >
> > Maybe we can do without them.  I really don't know.  Olivier?
>
> I have no indication that we can not-support these.
>
> We are seeing many cases of C++/Ada combined codebases in a variety
> of VxWorks contexts so actual uses seem likely.

If Intel TBB isn't supported on vxworks then the PSTL algos are not
very useful. You can use them, but you won't get any benefits. I'm
unsure of the status of the openmp and simd backends in PSTL, I think
only the TBB backend really works.

>
> >> If not, we could just ignore this file, so the local changes don't
> >> need to be re-applied when we import a new version of the header from
> >> upstream.
> >
> > That sounds desirable indeed.  This change is supposed to spare us
> > (AdaCore) from precisely this sort of trouble, so it wouldn't be fair if
> > it made this very kind of trouble for our upstream.
>
> Of course, 100% agreed!
>
> Thanks a lot for help in looking into this!
>
> Olivier
>
>
Jonathan Wakely June 1, 2024, 8:19 a.m. UTC | #7
On Fri, 31 May 2024 at 16:52, Alexandre Oliva <oliva@adacore.com> wrote:
>
> On May 31, 2024, Jonathan Wakely <jwakely@redhat.com> wrote:
>
> > On 31/05/24 11:07 -0300, Alexandre Oliva wrote:
> >> --- a/libstdc++-v3/include/pstl/pstl_config.h
> [...]
> >> -#if defined(__clang__)
> >> +#if defined(__GLIBCXX__) ? defined(_GLIBCXX_CLANG) : defined(__clang__)
>
> > This file is also imported from upstream, like Ryu and fast_float.
>
> Oh, yeah, I should have mentioned this one in the proposed commit
> message.
>
> The problem here was that it wasn't clear c++config would always be
> included, so I figured I'd better be conservative.
>
> > I don't think having a "spurious" definition of _PSTL_CLANG_VERSION
> > here actually matters.
>
> Yeah, no, it's the other macros guarded by __clang__ that I'm concerned
> about, and since the version macro could replace it, I went for it.
>
> > So either don't change this line at all, or just do a simple
> > s/__clang__/_GLIBCXX_CLANG/
>
> If c++config can be counted on, I'd be happy to do that, but I couldn't
> tell that it could.

You can't reach pstl_config.h without going through one of the
standard headers, which all include c++config.h

>
> > Does the vxworks toolchain need to support the PSTL headers?
>
> Maybe we can do without them.  I really don't know.  Olivier?
>
> > If not, we could just ignore this file, so the local changes don't
> > need to be re-applied when we import a new version of the header from
> > upstream.
>
> That sounds desirable indeed.  This change is supposed to spare us
> (AdaCore) from precisely this sort of trouble, so it wouldn't be fair if
> it made this very kind of trouble for our upstream.
>
> >> --- a/libstdc++-v3/include/std/ranges
>
> >> -#ifdef __clang__ // LLVM-61763 workaround
> >> +#ifdef _GLIBCXX_CLANG // LLVM-61763 workaround
>
> > This one doesn't matter, since making these members public for a "fake
> > clang" doesn't really hurt anything. For consistency maybe it makes
> > sense to use _GLIBCXX_CLANG anyway.
>
> Yeah, uniformity would be good to simplify checking for no new
> appearances of __clang__, and to set the example to avoid accidental
> additions thereof.
>
> >> --- a/libstdc++-v3/include/std/variant
>
> >> -#if defined(__clang__) && __clang_major__ <= 7
> >> +#if defined(_GLIBCXX_CLANG) && __clang_major__ <= 7
>
> > I think we could drop this kluge entirely, clang 7 is old now, we
> > generally only support the most recent 3 or 4 clang versions.
>
> Fine with me, but I'd do that in a separate later patch, so that this
> goes in, and if it gets backported, it will cover this change, rather
> than miss it.  Though, as you say, it doesn't matter much either way.
>
> --
> Alexandre Oliva, happy hacker            https://FSFLA.org/blogs/lxo/
>    Free Software Activist                   GNU Toolchain Engineer
> More tolerance and less prejudice are key for inclusion and diversity
> Excluding neuro-others for not behaving ""normal"" is *not* inclusive
diff mbox series

Patch

diff --git a/libstdc++-v3/include/bits/c++config b/libstdc++-v3/include/bits/c++config
index b57e3f338e92a..6dca2d9467aa5 100644
--- a/libstdc++-v3/include/bits/c++config
+++ b/libstdc++-v3/include/bits/c++config
@@ -481,9 +481,20 @@  _GLIBCXX_END_NAMESPACE_VERSION
 // Define if compatibility should be provided for -mlong-double-64.
 #undef _GLIBCXX_LONG_DOUBLE_COMPAT
 
+// Use an alternate macro to test for clang, so as to provide an easy
+// workaround for systems (such as vxworks) whose headers require
+// __clang__ to be defined, even when compiling with GCC.
+#if !defined _GLIBCXX_CLANG && defined __clang__
+# define _GLIBCXX_CLANG __clang__
+// Turn -D_GLIBCXX_CLANG=0 into -U_GLIBCXX_CLANG, so that
+// _GLIBCXX_CLANG can be tested as defined, just like __clang__.
+#elif !_GLIBCXX_CLANG
+# undef _GLIBCXX_CLANG
+#endif
+
 // Define if compatibility should be provided for alternative 128-bit long
 // double formats. Not possible for Clang until __ibm128 is supported.
-#ifndef __clang__
+#ifndef _GLIBCXX_CLANG
 #undef _GLIBCXX_LONG_DOUBLE_ALT128_COMPAT
 #endif
 
diff --git a/libstdc++-v3/include/bits/locale_facets_nonio.tcc b/libstdc++-v3/include/bits/locale_facets_nonio.tcc
index 8f67be5a6147b..72136f42f0866 100644
--- a/libstdc++-v3/include/bits/locale_facets_nonio.tcc
+++ b/libstdc++-v3/include/bits/locale_facets_nonio.tcc
@@ -1465,7 +1465,7 @@  _GLIBCXX_END_NAMESPACE_LDBL_OR_CXX11
       ctype<_CharT> const& __ctype = use_facet<ctype<_CharT> >(__loc);
       __err = ios_base::goodbit;
       bool __use_state = false;
-#if __GNUC__ >= 5 && !defined(__clang__)
+#if __GNUC__ >= 5 && !defined(_GLIBCXX_CLANG)
 #pragma GCC diagnostic push
 #pragma GCC diagnostic ignored "-Wpmf-conversions"
       // Nasty hack.  The C++ standard mandates that get invokes the do_get
diff --git a/libstdc++-v3/include/bits/stl_bvector.h b/libstdc++-v3/include/bits/stl_bvector.h
index d567e26f4e430..52153cadf8f70 100644
--- a/libstdc++-v3/include/bits/stl_bvector.h
+++ b/libstdc++-v3/include/bits/stl_bvector.h
@@ -185,7 +185,7 @@  _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
     void
     _M_assume_normalized() const
     {
-#if __has_attribute(__assume__) && !defined(__clang__)
+#if __has_attribute(__assume__) && !defined(_GLIBCXX_CLANG)
       unsigned int __ofst = _M_offset;
       __attribute__ ((__assume__ (__ofst < unsigned(_S_word_bit))));
 #endif
diff --git a/libstdc++-v3/include/c_compatibility/stdatomic.h b/libstdc++-v3/include/c_compatibility/stdatomic.h
index 52daa16c9b1ed..5403b52a036d1 100644
--- a/libstdc++-v3/include/c_compatibility/stdatomic.h
+++ b/libstdc++-v3/include/c_compatibility/stdatomic.h
@@ -125,7 +125,7 @@  using std::atomic_flag_clear_explicit;
 using std::atomic_thread_fence;
 using std::atomic_signal_fence;
 
-#elif defined __clang__
+#elif defined _GLIBCXX_CLANG
 # include_next <stdatomic.h>
 #endif // __cpp_lib_stdatomic_h
 #endif // _GLIBCXX_STDATOMIC_H
diff --git a/libstdc++-v3/include/experimental/bits/simd.h b/libstdc++-v3/include/experimental/bits/simd.h
index 7c52462571902..ea034138fd720 100644
--- a/libstdc++-v3/include/experimental/bits/simd.h
+++ b/libstdc++-v3/include/experimental/bits/simd.h
@@ -606,7 +606,7 @@  template <size_t _Bytes>
     static_assert(_Bytes > 0);
     if constexpr (_Bytes == sizeof(int))
       return int();
-  #ifdef __clang__
+  #ifdef _GLIBCXX_CLANG
     else if constexpr (_Bytes == sizeof(char))
       return char();
   #else
@@ -615,7 +615,7 @@  template <size_t _Bytes>
   #endif
     else if constexpr (_Bytes == sizeof(short))
       return short();
-  #ifndef __clang__
+  #ifndef _GLIBCXX_CLANG
     else if constexpr (_Bytes == sizeof(long))
       return long();
   #endif
@@ -1720,7 +1720,7 @@  template <typename _To, typename _From>
 	  __builtin_memcpy(&__r, &__v, sizeof(_To));
 	  return __r;
 	}
-#if _GLIBCXX_SIMD_X86INTRIN && !defined __clang__
+#if _GLIBCXX_SIMD_X86INTRIN && !defined _GLIBCXX_CLANG
     else if constexpr (__have_avx && sizeof(_From) == 16 && sizeof(_To) == 32)
       return reinterpret_cast<_To>(__builtin_ia32_ps256_ps(
 	reinterpret_cast<__vector_type_t<float, 4>>(__v)));
@@ -1975,7 +1975,7 @@  template <typename _TW>
 
 // }}}
 // __andnot{{{
-#if _GLIBCXX_SIMD_X86INTRIN && !defined __clang__
+#if _GLIBCXX_SIMD_X86INTRIN && !defined _GLIBCXX_CLANG
 static constexpr struct
 {
   _GLIBCXX_SIMD_INTRINSIC __v4sf
@@ -2035,7 +2035,7 @@  static constexpr struct
   operator()(__v8di __a, __v8di __b) const noexcept
   { return _mm512_andnot_si512(__a, __b); }
 } _S_x86_andnot;
-#endif // _GLIBCXX_SIMD_X86INTRIN && !__clang__
+#endif // _GLIBCXX_SIMD_X86INTRIN && !_GLIBCXX_CLANG
 
 template <typename _TW>
   _GLIBCXX_SIMD_INTRINSIC constexpr _TW
@@ -2046,7 +2046,7 @@  template <typename _TW>
 	using _TVT = conditional_t<__is_simd_wrapper_v<_TW>, _TW,
 				   _VectorTraitsImpl<_TW>>;
 	using _Tp = typename _TVT::value_type;
-#if _GLIBCXX_SIMD_X86INTRIN && !defined __clang__
+#if _GLIBCXX_SIMD_X86INTRIN && !defined _GLIBCXX_CLANG
 	if constexpr (sizeof(_TW) >= 16)
 	  {
 	    const auto __ai = __to_intrin(__a);
@@ -2095,7 +2095,7 @@  template <typename _T0, typename _T1, typename _Fun, size_t... _Is>
     using _Tp = remove_reference_t<decltype(declval<_T0>()[0])>;
     using _RV [[maybe_unused]] = __vector_type_t<_Tp, sizeof...(_Is)>;
 #if __has_builtin(__builtin_shufflevector)
-#ifdef __clang__
+#ifdef _GLIBCXX_CLANG
     // Clang requires _T0 == _T1
     if constexpr (sizeof(__x) > sizeof(__y) and _N1 == 1)
       return __vec_shuffle(__x, _T0{__y[0]}, __seq, __idx_perm);
diff --git a/libstdc++-v3/include/experimental/bits/simd_builtin.h b/libstdc++-v3/include/experimental/bits/simd_builtin.h
index 505f8083794e7..4abc750cfa1c2 100644
--- a/libstdc++-v3/include/experimental/bits/simd_builtin.h
+++ b/libstdc++-v3/include/experimental/bits/simd_builtin.h
@@ -1177,7 +1177,7 @@  struct _CommonImplBuiltin
       constexpr size_t _Bytes = _ReqBytes == 0 ? sizeof(__x) : _ReqBytes;
       static_assert(sizeof(__x) >= _Bytes);
 
-#if !defined __clang__ && _GLIBCXX_SIMD_WORKAROUND_PR90424
+#if !defined _GLIBCXX_CLANG && _GLIBCXX_SIMD_WORKAROUND_PR90424
       if constexpr (__is_vector_type_v<_TV>)
 	_S_memcpy<_Bytes>(reinterpret_cast<char*>(__addr), reinterpret_cast<const char*>(&__x));
       else
@@ -2022,7 +2022,7 @@  template <typename _Abi, typename>
 	      return __vector_bitcast<float, 2>(_S_plus_minus(__x4, __y));
 	  }
 #endif
-#if !defined __clang__ && __GCC_IEC_559 == 0
+#if !defined _GLIBCXX_CLANG && __GCC_IEC_559 == 0
 	if (__builtin_is_constant_evaluated()
 	      || (__builtin_constant_p(__x) && __builtin_constant_p(__y)))
 	  return (__x + __y) - __y;
diff --git a/libstdc++-v3/include/experimental/bits/simd_detail.h b/libstdc++-v3/include/experimental/bits/simd_detail.h
index 51e130bd36a5e..9ddf912a62b03 100644
--- a/libstdc++-v3/include/experimental/bits/simd_detail.h
+++ b/libstdc++-v3/include/experimental/bits/simd_detail.h
@@ -262,7 +262,7 @@ 
 #endif
 //}}}
 
-#ifdef __clang__
+#ifdef _GLIBCXX_CLANG
 #define _GLIBCXX_SIMD_NORMAL_MATH
 #define _GLIBCXX_SIMD_ALWAYS_INLINE_LAMBDA
 #else
@@ -277,7 +277,7 @@ 
 #define _GLIBCXX_SIMD_IS_UNLIKELY(__x) __builtin_expect(__x, 0)
 #define _GLIBCXX_SIMD_IS_LIKELY(__x) __builtin_expect(__x, 1)
 
-#if _GLIBCXX_SIMD_HAVE_SVE || __STRICT_ANSI__ || defined __clang__
+#if _GLIBCXX_SIMD_HAVE_SVE || __STRICT_ANSI__ || defined _GLIBCXX_CLANG
 #define _GLIBCXX_SIMD_CONSTEXPR
 #define _GLIBCXX_SIMD_USE_CONSTEXPR_API const
 #else
@@ -285,7 +285,7 @@ 
 #define _GLIBCXX_SIMD_USE_CONSTEXPR_API constexpr
 #endif
 
-#if defined __clang__
+#if defined _GLIBCXX_CLANG
 #define _GLIBCXX_SIMD_USE_CONSTEXPR const
 #else
 #define _GLIBCXX_SIMD_USE_CONSTEXPR constexpr
@@ -330,7 +330,7 @@ 
 #endif
 
 // integer division not optimized
-#ifndef __clang__
+#ifndef _GLIBCXX_CLANG
 #define _GLIBCXX_SIMD_WORKAROUND_PR90993 1
 #endif
 
diff --git a/libstdc++-v3/include/experimental/bits/simd_x86.h b/libstdc++-v3/include/experimental/bits/simd_x86.h
index 517c4b4a5bec7..4ab933b573c61 100644
--- a/libstdc++-v3/include/experimental/bits/simd_x86.h
+++ b/libstdc++-v3/include/experimental/bits/simd_x86.h
@@ -363,7 +363,7 @@  template <typename _Tp>
 
 // }}}
 
-#ifdef __clang__
+#ifdef _GLIBCXX_CLANG
 template <size_t _Np, typename _Tp, typename _Kp>
   _GLIBCXX_SIMD_INTRINSIC constexpr auto
   __movm(_Kp __k) noexcept
@@ -408,7 +408,7 @@  template <size_t _Np, typename _Tp, typename _Kp>
     else
       __assert_unreachable<_Tp>();
   }
-#endif // __clang__
+#endif // _GLIBCXX_CLANG
 
 #ifdef _GLIBCXX_SIMD_WORKAROUND_PR85048
 #include "simd_x86_conversions.h"
@@ -674,7 +674,7 @@  struct _CommonImplX86 : _CommonImplBuiltin
       using _Tp = typename _VectorTraits<_TV>::value_type;
       static_assert(sizeof(_TV) >= 16);
       static_assert(sizeof(_Tp) <= 8);
-#ifdef __clang__
+#ifdef _GLIBCXX_CLANG
       return __movm<_VectorTraits<_TV>::_S_full_size, _Tp>(__k) ? __b : __a;
 #else
       using _IntT
@@ -3505,9 +3505,9 @@  template <typename _Abi, typename>
 	    // optimize masked unary increment and decrement as masked sub +/-1
 	    constexpr int __pm_one
 	      = is_same_v<_Op<void>, __increment<void>> ? -1 : 1;
-#ifdef __clang__
+#ifdef _GLIBCXX_CLANG
 	    return __movm<_Np, _Tp>(__k._M_data) ? __v._M_data - __pm_one : __v._M_data;
-#else // __clang__
+#else // _GLIBCXX_CLANG
 	    using _TV = __vector_type_t<_Tp, _Np>;
 	    constexpr size_t __bytes = sizeof(__v) < 16 ? 16 : sizeof(__v);
 	    constexpr size_t __width = __bytes / sizeof(_Tp);
@@ -3561,7 +3561,7 @@  template <typename _Abi, typename>
 #undef _GLIBCXX_SIMD_MASK_SUB_512
 #undef _GLIBCXX_SIMD_MASK_SUB
 	      }
-#endif // __clang__
+#endif // _GLIBCXX_CLANG
 	  }
 	else
 	  return _Base::template _S_masked_unary<_Op>(__k, __v);
diff --git a/libstdc++-v3/include/experimental/simd b/libstdc++-v3/include/experimental/simd
index f45ad4ed2e6cc..d2d081e0d1a2a 100644
--- a/libstdc++-v3/include/experimental/simd
+++ b/libstdc++-v3/include/experimental/simd
@@ -59,7 +59,7 @@ 
 #pragma GCC diagnostic push
 // Many [[gnu::vector_size(N)]] types might lead to a -Wpsabi warning which is
 // irrelevant as those functions never appear on ABI borders
-#ifndef __clang__
+#ifndef _GLIBCXX_CLANG
 #pragma GCC diagnostic ignored "-Wpsabi"
 #endif
 
diff --git a/libstdc++-v3/include/pstl/pstl_config.h b/libstdc++-v3/include/pstl/pstl_config.h
index ccb9dd32838d3..fcac557077bb6 100644
--- a/libstdc++-v3/include/pstl/pstl_config.h
+++ b/libstdc++-v3/include/pstl/pstl_config.h
@@ -53,7 +53,7 @@ 
 // the actual GCC version on the system.
 #define _PSTL_GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)
 
-#if defined(__clang__)
+#if defined(__GLIBCXX__) ? defined(_GLIBCXX_CLANG) : defined(__clang__)
 // according to clang documentation, version can be vendor specific
 #    define _PSTL_CLANG_VERSION (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__)
 #endif
@@ -62,7 +62,7 @@ 
 #if (defined(_OPENMP) && _OPENMP >= 201307) || \
     (defined(__INTEL_COMPILER) && __INTEL_COMPILER >= 1600) || \
     (!defined(__INTEL_COMPILER) && _PSTL_GCC_VERSION >= 40900) || \
-    defined(__clang__)
+    defined(_PSTL_CLANG_VERSION)
 #    define _PSTL_PRAGMA_SIMD _PSTL_PRAGMA(omp simd)
 #    define _PSTL_PRAGMA_DECLARE_SIMD _PSTL_PRAGMA(omp declare simd)
 #    define _PSTL_PRAGMA_SIMD_REDUCTION(PRM) _PSTL_PRAGMA(omp simd reduction(PRM))
diff --git a/libstdc++-v3/include/std/complex b/libstdc++-v3/include/std/complex
index 415c735665c3e..be810b6d05d25 100644
--- a/libstdc++-v3/include/std/complex
+++ b/libstdc++-v3/include/std/complex
@@ -47,7 +47,7 @@ 
 // Get rid of a macro possibly defined in <complex.h>
 #undef complex
 
-#ifdef __clang__
+#ifdef _GLIBCXX_CLANG
 #pragma clang diagnostic push
 #pragma clang diagnostic ignored "-Wc99-extensions"
 #endif
@@ -2646,7 +2646,7 @@  _GLIBCXX_END_NAMESPACE_VERSION
 
 #endif  // C++11
 
-#ifdef __clang__
+#ifdef _GLIBCXX_CLANG
 #pragma clang diagnostic pop
 #endif
 
diff --git a/libstdc++-v3/include/std/ranges b/libstdc++-v3/include/std/ranges
index b1e827c9a7241..3f335b95a0864 100644
--- a/libstdc++-v3/include/std/ranges
+++ b/libstdc++-v3/include/std/ranges
@@ -4687,7 +4687,7 @@  namespace views::__adaptor
   class zip_view<_Vs...>::_Iterator
     : public __detail::__zip_view_iter_cat<_Const, _Vs...>
   {
-#ifdef __clang__ // LLVM-61763 workaround
+#ifdef _GLIBCXX_CLANG // LLVM-61763 workaround
   public:
 #endif
     tuple<iterator_t<__detail::__maybe_const_t<_Const, _Vs>>...> _M_current;
@@ -4710,7 +4710,7 @@  namespace views::__adaptor
 	return input_iterator_tag{};
     }
 
-#ifndef __clang__ // LLVM-61763 workaround
+#ifndef _GLIBCXX_CLANG // LLVM-61763 workaround
     template<move_constructible _Fp, input_range... _Ws>
       requires (view<_Ws> && ...) && (sizeof...(_Ws) > 0) && is_object_v<_Fp>
 	&& regular_invocable<_Fp&, range_reference_t<_Ws>...>
@@ -5387,7 +5387,7 @@  namespace views::__adaptor
   template<bool _Const>
   class adjacent_view<_Vp, _Nm>::_Iterator
   {
-#ifdef __clang__ // LLVM-61763 workaround
+#ifdef _GLIBCXX_CLANG // LLVM-61763 workaround
   public:
 #endif
     using _Base = __detail::__maybe_const_t<_Const, _Vp>;
@@ -5430,7 +5430,7 @@  namespace views::__adaptor
 
     friend class adjacent_view;
 
-#ifndef __clang__ // LLVM-61763 workaround
+#ifndef _GLIBCXX_CLANG // LLVM-61763 workaround
     template<forward_range _Wp, move_constructible _Fp, size_t _Mm>
       requires view<_Wp> && (_Mm > 0) && is_object_v<_Fp>
         && regular_invocable<__detail::__unarize<_Fp&, _Mm>, range_reference_t<_Wp>>
diff --git a/libstdc++-v3/include/std/variant b/libstdc++-v3/include/std/variant
index 371cbb90f54a6..51aaa62085170 100644
--- a/libstdc++-v3/include/std/variant
+++ b/libstdc++-v3/include/std/variant
@@ -1758,7 +1758,7 @@  namespace __detail::__variant
 	  }, __rhs);
       }
 
-#if defined(__clang__) && __clang_major__ <= 7
+#if defined(_GLIBCXX_CLANG) && __clang_major__ <= 7
     public:
       using _Base::_M_u; // See https://bugs.llvm.org/show_bug.cgi?id=31852
 #endif