Hi!

_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.

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

2023-02-23  Jakub Jelinek  <ja...@redhat.com>

        PR target/108883
        * hooks.h (hook_void_bool): Declare.
        * hooks.cc (hook_void_bool): 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.

        * rtti.cc (emit_support_tinfos): Call targetm.emit_support_tinfos
        before and after emit_support_tinfo_1 calls.

--- gcc/hooks.h.jj      2023-01-02 09:32:29.418183667 +0100
+++ gcc/hooks.h 2023-02-22 12:34:32.144973558 +0100
@@ -77,6 +77,7 @@ extern bool hook_bool_wint_wint_uint_boo
                                                unsigned int, bool);
 
 extern void hook_void_void (void);
+extern void hook_void_bool (bool);
 extern void hook_void_constcharptr (const char *);
 extern void hook_void_rtx_insn_int (rtx_insn *, int);
 extern void hook_void_FILEptr_constcharptr (FILE *, const char *);
--- gcc/hooks.cc.jj     2023-01-02 09:32:49.675890970 +0100
+++ gcc/hooks.cc        2023-02-22 12:36:46.241035355 +0100
@@ -271,6 +271,11 @@ hook_hwi_void_0 (void)
 }
 
 void
+hook_void_bool (bool)
+{
+}
+
+void
 hook_void_tree (tree)
 {
 }
--- gcc/target.def.jj   2023-01-04 10:45:50.117881714 +0100
+++ gcc/target.def      2023-02-22 12:33:39.715731356 +0100
@@ -2606,6 +2606,20 @@ types.",
  const char *, (const_tree type),
  hook_constcharptr_const_tree_null)
 
+/* Temporarily add conditional target specific types for the purpose of
+   emitting C++ fundamental type tinfos.  */
+DEFHOOK
+(emit_support_tinfos,
+ "If your target defines any fundamental types which depend on ISA flags,\n\
+they might need C++ tinfo symbols in libsupc++/libstdc++ regardless of\n\
+ISA flags the library is compiled with.\n\
+The hook is called with @var{add} @code{true} at the start of C++ FE\n\
+@code{emit_support_tinfos} and with @var{add} @code{false} at the end of it\n\
+and can temporarily create fundamental types that are not supposed to be\n\
+otherwise created due to the ISA options.",
+ void, (bool add),
+ hook_void_bool)
+
 /* Make any adjustments to libfunc names needed for this target.  */
 DEFHOOK
 (init_libfuncs,
--- gcc/doc/tm.texi.in.jj       2023-01-16 11:52:16.124733460 +0100
+++ gcc/doc/tm.texi.in  2023-02-22 12:46:37.951482849 +0100
@@ -1286,6 +1286,8 @@ pattern needs to support both a 32- and
 
 @hook TARGET_MANGLE_TYPE
 
+@hook TARGET_EMIT_SUPPORT_TINFOS
+
 @node Type Layout
 @section Layout of Source Language Data Types
 
--- gcc/doc/tm.texi.jj  2023-01-16 11:52:16.123733475 +0100
+++ gcc/doc/tm.texi     2023-02-22 12:46:41.741428081 +0100
@@ -1525,6 +1525,16 @@ appropriate for a target that does not d
 types.
 @end deftypefn
 
+@deftypefn {Target Hook} void TARGET_EMIT_SUPPORT_TINFOS (bool @var{add})
+If your target defines any fundamental types which depend on ISA flags,
+they might need C++ tinfo symbols in libsupc++/libstdc++ regardless of
+ISA flags the library is compiled with.
+The hook is called with @var{add} @code{true} at the start of C++ FE
+@code{emit_support_tinfos} and with @var{add} @code{false} at the end of it
+and can temporarily create fundamental types that are not supposed to be
+otherwise created due to the ISA options.
+@end deftypefn
+
 @node Type Layout
 @section Layout of Source Language Data Types
 
--- gcc/config/i386/i386.cc.jj  2023-02-16 10:13:23.701210667 +0100
+++ gcc/config/i386/i386.cc     2023-02-22 12:59:55.110960505 +0100
@@ -22775,6 +22775,30 @@ ix86_mangle_type (const_tree type)
     }
 }
 
+/* Temporarily tweak the set of fundamental types for C++
+   emit_support_tinfos purposes.  */
+
+static void
+ix86_emit_support_tinfos (bool add)
+{
+  extern tree ix86_float16_type_node;
+  extern tree ix86_bf16_type_node;
+
+  if (TARGET_SSE2)
+    return;
+  if (add)
+    {
+      gcc_checking_assert (!float16_type_node && !bfloat16_type_node);
+      float16_type_node = ix86_float16_type_node;
+      bfloat16_type_node = ix86_bf16_type_node;
+    }
+  else
+    {
+      float16_type_node = NULL_TREE;
+      bfloat16_type_node = NULL_TREE;
+    }
+}
+
 static GTY(()) tree ix86_tls_stack_chk_guard_decl;
 
 static tree
@@ -24954,6 +24978,9 @@ ix86_libgcc_floating_mode_supported_p
 #undef TARGET_MANGLE_TYPE
 #define TARGET_MANGLE_TYPE ix86_mangle_type
 
+#undef TARGET_EMIT_SUPPORT_TINFOS
+#define TARGET_EMIT_SUPPORT_TINFOS ix86_emit_support_tinfos
+
 #undef TARGET_STACK_PROTECT_GUARD
 #define TARGET_STACK_PROTECT_GUARD ix86_stack_protect_guard
 
--- gcc/cp/rtti.cc.jj   2023-01-16 11:52:16.090733961 +0100
+++ gcc/cp/rtti.cc      2023-02-22 12:40:10.078089124 +0100
@@ -1623,6 +1623,9 @@ emit_support_tinfos (void)
   if (!dtor || DECL_EXTERNAL (dtor))
     return;
 
+  /* Tell target code that support tinfos are about to be emitted.  */
+  targetm.emit_support_tinfos (true);
+
   /* All these are really builtins.  So set the location.  */
   location_t saved_loc = input_location;
   input_location = BUILTINS_LOCATION;
@@ -1652,6 +1655,9 @@ emit_support_tinfos (void)
       emit_support_tinfo_1 (fallback_dfloat128_type);
     }
   input_location = saved_loc;
+
+  /* Tell target code that support tinfos have been emitted.  */
+  targetm.emit_support_tinfos (false);
 }
 
 /* Finish a type info decl. DECL_PTR is a pointer to an unemitted

        Jakub

Reply via email to