https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108883

--- Comment #4 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Jakub Jelinek <ja...@gcc.gnu.org>:

https://gcc.gnu.org/g:6978df2c04df165eaa6aac9e17b6c770bed460e3

commit r13-6426-g6978df2c04df165eaa6aac9e17b6c770bed460e3
Author: Jakub Jelinek <ja...@redhat.com>
Date:   Fri Mar 3 00:34:59 2023 +0100

    c++, v3: Emit fundamental tinfos for _Float16/decltype(0.0bf16) types on
ia32 with -mno-sse2 [PR108883]

    _Float16 and decltype(0.0bf16) types are on x86 supported only with
    -msse2.  On x86_64 that is the default, but on ia32 it is not.
    We should still emit fundamental type tinfo for those types in
    libsupc++.a/libstdc++.*, regardless of whether libsupc++/libstdc++
    is compiled with -msse2 or not, as user programs can be compiled
    with different ISA flags from libsupc++/libstdc++ and if they
    are compiled with -msse2 and use std::float16_t or std::bfloat16_t
    and need RTTI for it, it should work out of the box.  Furthermore,
    libstdc++ ABI on ia32 shouldn't depend on whether the library
    is compiled with -mno-sse or -msse2.

    Unfortunately, just hacking up libsupc++ Makefile/configure so that
    a single source is compiled with -msse2 isn't appropriate, because
    that TU emits also code and the code should be able to run on CPUs
    which libstdc++ supports.  We could add [[gnu::attribute ("no-sse2")]]
    there perhaps conditionally, but it all gets quite ugly.

    The following patch instead adds a target hook which allows the backend
    to temporarily tweak registered types such that emit_support_tinfos
    emits whatever is needed.

    Additionally, it makes emit_support_tinfos_1 call emit_tinfo_decl
    immediately, so that temporarily created dummy types for emit_support_tinfo
    purposes only can be nullified again afterwards.  And removes the
    previous fallback_* types used for dfloat*_type_node tinfos even when
    decimal types aren't supported.

    2023-03-03  Jakub Jelinek  <ja...@redhat.com>

            PR target/108883
    gcc/
            * target.h (emit_support_tinfos_callback): New typedef.
            * targhooks.h (default_emit_support_tinfos): Declare.
            * targhooks.cc (default_emit_support_tinfos): New function.
            * target.def (emit_support_tinfos): New target hook.
            * doc/tm.texi.in (emit_support_tinfos): Document it.
            * doc/tm.texi: Regenerated.
            * config/i386/i386.cc (ix86_emit_support_tinfos): New function.
            (TARGET_EMIT_SUPPORT_TINFOS): Redefine.
    gcc/cp/
            * cp-tree.h (enum cp_tree_index): Remove CPTI_FALLBACK_DFLOAT*_TYPE
            enumerators.
            (fallback_dfloat32_type, fallback_dfloat64_type,
            fallback_dfloat128_type): Remove.
            * rtti.cc (emit_support_tinfo_1): If not emitted already, call
            emit_tinfo_decl and remove from unemitted_tinfo_decls right away.
            (emit_support_tinfos): Move &dfloat*_type_node from fundamentals
array
            into new fundamentals_with_fallback array.  Call
emit_support_tinfo_1
            on elements of that array too, with the difference that if
            the type is NULL, use a fallback REAL_TYPE for it temporarily.
            Drop the !targetm.decimal_float_supported_p () handling.  Call
            targetm.emit_support_tinfos at the end.
            * mangle.cc (write_builtin_type): Remove references to
            fallback_dfloat*_type.  Handle bfloat16_type_node mangling.

Reply via email to