[patch] change specific int128 -> generic intN
Marc Glisse
marc.glisse@inria.fr
Sat Jun 21 17:35:00 GMT 2014
(Adding libstdc++@ in Cc: so they see the patch at
https://gcc.gnu.org/ml/gcc-patches/2014-06/msg01655.html )
On Sat, 21 Jun 2014, DJ Delorie wrote:
> New version of https://gcc.gnu.org/ml/gcc-patches/2014-04/msg00723.html
>
> This is a big patch, but it includes all the features/changes/support
> requested since the initial patch. Tested with identical results
> before/after on x86-64 EXCEPT for g++.dg/ext/int128-1.C, which assumes
> __int128 is not supported with -std= but as per previous discussion,
> it now is (because __intN might be used for size_t, which is
> required). Tested on msp430 with significant improvements but a few
> regressions (expected).
>
> This patch replaces the current int128 support with a generic intN
> support, which happens to provide int128 as well as up to three
> additional intN types per target. I will post a separate patch for
> the msp430 backend demonstrating the use of this new feature for
> __int20, as well as a third to fix some problems with PSImode in
> general.
>
> The general idea is that genmodes has a new macro INT_N() for
> <tm>-modes.def, which gives the mode and precision to use for
> target-specific intN types. These types are always created, but the
> parser will error with "unsupported" if the target does not support
> that mode for that compile (i.e. because of command line switches,
> etc). There's an INT_N(TI,128) in the common sources.
>
> If the target defines any types larger than "long long", those types
> (like int128 before) will be used for type promotion, but types
> smaller than "long long" will not, to avoid confusing the C type
> promotion rules. Otherwise, it's up to the source being compiled to
> specific __intN types as desired.
Nice. A couple quick comments on the parts I understand while
maintainers are resting for the week-end.
> Index: libstdc++-v3/src/c++11/limits.cc
> ===================================================================
[...]
> +#if !defined(__STRICT_ANSI__)
Since the test on __STRICT_ANSI__ is removed for all other uses, it would
seem consistent to me to remove this one as well. Besides, you are already
testing __GLIBCXX_USE_INT_N_0, which as far as I understand is protected
by !flag_iso (with the exception of size_t).
> -#if !defined(__STRICT_ANSI__) && defined(_GLIBCXX_USE_INT128)
> + // Conditionalizing on __STRICT_ANSI__ here will break any port that
> + // uses one of these types for size_t.
> +#if defined(__GLIBCXX_USE_INT_N_0)
> template<>
> - struct __is_integral_helper<__int128>
> + struct __is_integral_helper<__GLIBCXX_TYPE_INT_N_0>
Since the check for __STRICT_ANSI__ is removed, do we need to add
__extension__ in front of __GLIBCXX_TYPE_INT_N_0 to avoid warning with
-Wsystem-headers?
> --- gcc/cp/rtti.c (revision 211858)
> +++ gcc/cp/rtti.c (working copy)
> @@ -1506,31 +1506,44 @@ emit_support_tinfo_1 (tree bltn)
>
> void
> emit_support_tinfos (void)
> {
> /* Dummy static variable so we can put nullptr in the array; it will be
> set before we actually start to walk the array. */
> - static tree *const fundamentals[] =
> + static tree * fundamentals[] =
> {
> &void_type_node,
> &boolean_type_node,
> &wchar_type_node, &char16_type_node, &char32_type_node,
> &char_type_node, &signed_char_type_node, &unsigned_char_type_node,
> &short_integer_type_node, &short_unsigned_type_node,
> &integer_type_node, &unsigned_type_node,
> &long_integer_type_node, &long_unsigned_type_node,
> &long_long_integer_type_node, &long_long_unsigned_type_node,
> - &int128_integer_type_node, &int128_unsigned_type_node,
> &float_type_node, &double_type_node, &long_double_type_node,
> &dfloat32_type_node, &dfloat64_type_node, &dfloat128_type_node,
> +#define FUND_INT_N_IDX 22
> + // These eight are for intN_t nodes
> + &nullptr_type_node, &nullptr_type_node, &nullptr_type_node, &nullptr_type_node,
> + &nullptr_type_node, &nullptr_type_node, &nullptr_type_node, &nullptr_type_node,
> &nullptr_type_node,
> 0
> };
> - int ix;
> + int ix, i;
> tree bltn_type, dtor;
>
> + ix = FUND_INT_N_IDX;
> + for (i = 0; i < NUM_INT_N_ENTS; i ++)
> + if (int_n_enabled_p[i])
> + {
> + fundamentals [ix++] = &int_n_trees[i].signed_type;
> + fundamentals [ix++] = &int_n_trees[i].unsigned_type;
> + }
> + fundamentals [ix++] = &nullptr_type_node;
> + fundamentals [ix++] = 0;
> +
> push_abi_namespace ();
> bltn_type = xref_tag (class_type,
> get_identifier ("__fundamental_type_info"),
> /*tag_scope=*/ts_current, false);
> pop_abi_namespace ();
> if (!COMPLETE_TYPE_P (bltn_type))
That seems complicated. You just need to call emit_support_tinfo_1 on
each of the types (see how fundamentals is used at the end of the
function), no need to put everything in the array.
--
Marc Glisse
More information about the Libstdc++
mailing list