c++: Emit DFP typeinfos even when DFP is disabled [PR92906]

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.
This commit is contained in:
Jakub Jelinek 2020-02-14 00:11:24 +01:00
parent 9a0c4f5b37
commit 994e0ad415
4 changed files with 39 additions and 3 deletions

View 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

View 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]
#include "name-lookup.h"

View 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 ();

View 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;
}