]> git.ipfire.org Git - thirdparty/gcc.git/commit
libstdc++: Fix ODR issues with different -m flags
authorMatthias Kretz <m.kretz@gsi.de>
Mon, 1 Feb 2021 09:58:03 +0000 (10:58 +0100)
committerMatthias Kretz <m.kretz@gsi.de>
Sat, 15 Jan 2022 20:05:17 +0000 (21:05 +0100)
commit52d28210389ff3d4af8f20db4db1f0d58b0f8eff
treea9f2b6d5f6a6ba4a73a04fc61c0321053e26d79e
parentf4a2cecd689c5dd805c86731f712ff20ca41a71d
libstdc++: Fix ODR issues with different -m flags

Explicitly support use of the stdx::simd implementation in situations
where the user links TUs that were compiled with different -m flags. In
general, this is always a (quasi) ODR violation for inline functions
because at least codegen may differ in important ways. However, in the
resulting executable only one (unspecified which one) of them might be
used. For simd we want to support users to compile code multiple times,
with different -m flags and have a runtime dispatch to the TU matching
the target CPU. But if internal functions are not inlined this may lead
to unexpected performance loss or execution of illegal instructions.
Therefore, inline functions that are not marked as always_inline must
use an additional template parameter somewhere in their name, to
disambiguate between the different -m translations.

Signed-off-by: Matthias Kretz <m.kretz@gsi.de>
libstdc++-v3/ChangeLog:

* include/experimental/bits/simd.h: Move feature detection bools
and add __have_avx512bitalg, __have_avx512vbmi2,
__have_avx512vbmi, __have_avx512ifma, __have_avx512cd,
__have_avx512vnni, __have_avx512vpopcntdq.
(__detail::__machine_flags): New function which returns a unique
uint64 depending on relevant -m and -f flags.
(__detail::__odr_helper): New type alias for either an anonymous
type or a type specialized with the __machine_flags number.
(_SimdIntOperators): Change template parameters from _Impl to
_Tp, _Abi because _Impl now has an __odr_helper parameter which
may be _OdrEnforcer from the anonymous namespace, which makes
for a bad base class.
(many): Either add __odr_helper template parameter or mark as
always_inline.
* include/experimental/bits/simd_detail.h: Add defines for
AVX512BITALG, AVX512VBMI2, AVX512VBMI, AVX512IFMA, AVX512CD,
AVX512VNNI, AVX512VPOPCNTDQ, and AVX512VP2INTERSECT.
* include/experimental/bits/simd_builtin.h: Add __odr_helper
template parameter or mark as always_inline.
* include/experimental/bits/simd_fixed_size.h: Ditto.
* include/experimental/bits/simd_math.h: Ditto.
* include/experimental/bits/simd_scalar.h: Ditto.
* include/experimental/bits/simd_neon.h: Add __odr_helper
template parameter.
* include/experimental/bits/simd_ppc.h: Ditto.
* include/experimental/bits/simd_x86.h: Ditto.
libstdc++-v3/include/experimental/bits/simd.h
libstdc++-v3/include/experimental/bits/simd_builtin.h
libstdc++-v3/include/experimental/bits/simd_detail.h
libstdc++-v3/include/experimental/bits/simd_fixed_size.h
libstdc++-v3/include/experimental/bits/simd_math.h
libstdc++-v3/include/experimental/bits/simd_neon.h
libstdc++-v3/include/experimental/bits/simd_ppc.h
libstdc++-v3/include/experimental/bits/simd_scalar.h
libstdc++-v3/include/experimental/bits/simd_x86.h