c++: Emit DFP typeinfos even when DFP is disabled [PR92906]
authorJakub Jelinek <jakub@redhat.com>
Thu, 13 Feb 2020 23:11:24 +0000 (00:11 +0100)
committerJakub Jelinek <jakub@redhat.com>
Thu, 13 Feb 2020 23:11:24 +0000 (00:11 +0100)
Before Joseph's changes when compiling
libstdc++-v3/libsupc++/fundamental_type_info.cc
we were emitting
_ZTIPDd, _ZTIPDe, _ZTIPDf, _ZTIPKDd, _ZTIPKDe, _ZTIPKDf, _ZTIDd, _ZTIDe, _ZTIDf
symbols even when DFP wasn't usable, but now we don't and thus those 9
symbols @@CXXABI_1.3.4 are gone from libstdc++.  While nothing could
probably use it (except perhaps dlsym etc.), various tools don't really like
symbols disappearing from symbol versioned shared libraries with stable ABI.
Adding those in assembly would be possible, but would be a portability
nightmare (the PR has something Red Hat uses in libstdc++_nonshared.a, but that
can handle only a handful of linux ELF targets we care about).
So, instead this patch hacks up the FE, so that it emits those, but in a way
that won't make the DFP types available again on targets that don't support
them.

2020-02-14  Jakub Jelinek  <jakub@redhat.com>

PR libstdc++/92906
* cp-tree.h (enum cp_tree_index): Add CPTI_FALLBACK_DFLOAT32_TYPE,
CPTI_FALLBACK_DFLOAT64_TYPE and CPTI_FALLBACK_DFLOAT128_TYPE.
(fallback_dfloat32_type, fallback_dfloat64_type,
fallback_dfloat128_type): Define.
* mangle.c (write_builtin_type): Handle fallback_dfloat*_type like
dfloat*_type_node.
* rtti.c (emit_support_tinfos): Emit DFP typeinfos even when dfp
is disabled for compatibility.

gcc/cp/ChangeLog
gcc/cp/cp-tree.h
gcc/cp/mangle.c
gcc/cp/rtti.c

index 793e4afffcba070b90053c45fe8b4d36060af23e..11acab7008ee98f9cd81d4bc508a6a3f58e62f7e 100644 (file)
@@ -1,3 +1,15 @@
+2020-02-14  Jakub Jelinek  <jakub@redhat.com>
+
+       PR libstdc++/92906
+       * cp-tree.h (enum cp_tree_index): Add CPTI_FALLBACK_DFLOAT32_TYPE,
+       CPTI_FALLBACK_DFLOAT64_TYPE and CPTI_FALLBACK_DFLOAT128_TYPE.
+       (fallback_dfloat32_type, fallback_dfloat64_type,
+       fallback_dfloat128_type): Define.
+       * mangle.c (write_builtin_type): Handle fallback_dfloat*_type like
+       dfloat*_type_node.
+       * rtti.c (emit_support_tinfos): Emit DFP typeinfos even when dfp
+       is disabled for compatibility.
+
 2020-02-13  Jason Merrill  <jason@redhat.com>
 
        PR c++/93713
index 53de2b0afe7ca41174cd64792a8726ceffa1bb25..c1aafa1de3aa665e3de0127d96af4c6b47b10c9d 100644 (file)
@@ -206,6 +206,10 @@ enum cp_tree_index
 
     CPTI_SOURCE_LOCATION_IMPL,
 
+    CPTI_FALLBACK_DFLOAT32_TYPE,
+    CPTI_FALLBACK_DFLOAT64_TYPE,
+    CPTI_FALLBACK_DFLOAT128_TYPE,
+
     CPTI_MAX
 };
 
@@ -366,6 +370,12 @@ extern GTY(()) tree cp_global_trees[CPTI_MAX];
 
 #define access_default_node            null_node
 
+/* Variant of dfloat{32,64,128}_type_node only used for fundamental
+   rtti purposes if DFP is disabled.  */
+#define fallback_dfloat32_type         cp_global_trees[CPTI_FALLBACK_DFLOAT32_TYPE]
+#define fallback_dfloat64_type         cp_global_trees[CPTI_FALLBACK_DFLOAT64_TYPE]
+#define fallback_dfloat128_type                cp_global_trees[CPTI_FALLBACK_DFLOAT128_TYPE]
+
 \f
 #include "name-lookup.h"
 
index 23baa382ed9facd92e6c37a28b0f165c9f6dcee1..a0e888fde62f2c2112a249927553443689e877ca 100644 (file)
@@ -2569,11 +2569,11 @@ write_builtin_type (tree type)
        write_char ('d');
       else if (type == long_double_type_node)
        write_char ('e');
-      else if (type == dfloat32_type_node)
+      else if (type == dfloat32_type_node || type == fallback_dfloat32_type)
        write_string ("Df");
-      else if (type == dfloat64_type_node)
+      else if (type == dfloat64_type_node || type == fallback_dfloat64_type)
        write_string ("Dd");
-      else if (type == dfloat128_type_node)
+      else if (type == dfloat128_type_node || type == fallback_dfloat128_type)
        write_string ("De");
       else
        gcc_unreachable ();
index 36c1b4ed7bcfd60ac01c3c321ed517f316cbd80e..f20941c413b936ebab937e0044d6d8df0ddc7484 100644 (file)
@@ -1588,6 +1588,20 @@ emit_support_tinfos (void)
       }
   for (tree t = registered_builtin_types; t; t = TREE_CHAIN (t))
     emit_support_tinfo_1 (TREE_VALUE (t));
+  /* For compatibility, emit DFP typeinfos even when DFP isn't enabled,
+     because we've emitted that in the past.  */
+  if (!targetm.decimal_float_supported_p ())
+    {
+      gcc_assert (dfloat32_type_node == NULL_TREE
+                 && dfloat64_type_node == NULL_TREE
+                 && dfloat128_type_node == NULL_TREE);
+      fallback_dfloat32_type = make_node (REAL_TYPE);
+      fallback_dfloat64_type = make_node (REAL_TYPE);
+      fallback_dfloat128_type = make_node (REAL_TYPE);
+      emit_support_tinfo_1 (fallback_dfloat32_type);
+      emit_support_tinfo_1 (fallback_dfloat64_type);
+      emit_support_tinfo_1 (fallback_dfloat128_type);
+    }
   input_location = saved_loc;
 }