Message ID | or8qzpkhcj.fsf_-_@lxoliva.fsfla.org |
---|---|
State | New |
Headers | show |
Series | [v2,libstdc++] add _GLIBCXX_CLANG to workaround predefined __clang__ | expand |
On Fri, 31 May 2024 at 18:43, Alexandre Oliva <oliva@adacore.com> wrote: > > On May 31, 2024, Alexandre Oliva <oliva@adacore.com> wrote: > > >> 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. > > Here's what I've retested on x86_64-linux-gnu and, slightly adjusted for > gcc-13, on arm-vx7r2. Ok to install? OK If there's any chance of getting the vxworks system headers fixed to work with GCC properly, that would be nice. > > > [libstdc++] add _GLIBCXX_CLANG to workaround predefined __clang__ > > 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. pstl_config.h, though also > imported, required adjustment. > > > 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. > --- > 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 > 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..7157a8a492ed9 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_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(_GLIBCXX_CLANG) > # 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 > > > -- > 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
On Sat, Jun 01, 2024 at 09:21:53AM +0100, Jonathan Wakely wrote: > On Fri, 31 May 2024 at 18:43, Alexandre Oliva <oliva@adacore.com> wrote: > > > > On May 31, 2024, Alexandre Oliva <oliva@adacore.com> wrote: > > > > >> 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. > > > > Here's what I've retested on x86_64-linux-gnu and, slightly adjusted for > > gcc-13, on arm-vx7r2. Ok to install? > > OK > > If there's any chance of getting the vxworks system headers fixed to > work with GCC properly, that would be nice. Fixincludes? That seems like the standard way to workaround bugs in system headers on proprietary targets. Jakub
>>> Here's what I've retested on x86_64-linux-gnu and, slightly adjusted for >>> gcc-13, on arm-vx7r2. Ok to install? >> >> OK Thanks Jonathan! >> If there's any chance of getting the vxworks system headers fixed to >> work with GCC properly, that would be nice. That would be nice for sure. From the vendor end, that seems very unlikely, unfortunately: VxWorks, for a variety of targets, used to come with both gcc and llvm system toolchains, with active support for the two possibilities in system headers. Also Diab to some extent. Over the years, even if there are still bits around in some headers, active support for gnu toolchains was removed and I don't see that it will be reintroduced. Jakub suggested: > Fixincludes? > That seems like the standard way to workaround bugs in system headers on > proprietary targets. Indeed, although we'd really rather avoid relying on that as much/as long as we reasonably can due to a few specifities of common VxWorks setups. Since VxWorks 7, for a given base distrib for a target environment, different users or projects configure kernels specifically to include such or such feature, and this tailors the exposed set of system headers. Relying on fixincludes would require installing an instance of gcc for each such configuration, resinstalling (or re-mkheaders) every time a kernel configuration change takes place, on hosts where users might need to go through sysadmins for compiler updates. This would be, I'm afraid, a significant regression in usability. Olivier
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..7157a8a492ed9 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_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(_GLIBCXX_CLANG) # 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