Hi Mike,
On Fri, Jun 01, 2018 at 07:28:40PM -0400, Michael Meissner wrote:
> This patch also makes __ibm128 or __float128 use the long double mode if long
> double uses the IBM extended double or IEEE 128-bit representations.
Does that need to be the same patch? Please split such things out when
you can.
> This
> allows templates to work again with those types (the template code aborts if
> you have two distinct types use the same mangling). However, overloaded types
> won't work, but I suspect these days people use templates over overloaded
> functions. I fixed up the test case for this (pr85657.C) so that it only
> tests
> for templates.
If tests fail, do not delete the test. If we have a problem, we have
a problem, and it needs to be fixed (not necessarily today of course,
and there is xfail for long-standing problems).
> +/* Generate old manged name, not new name. */
> +static bool old_mangling;
As Andreas said, this is not a good name. Please at least mention for
what type this old mangling is.
> @@ -16355,14 +16394,21 @@ rs6000_init_builtins (void)
> __ieee128. */
> if (TARGET_FLOAT128_TYPE)
> {
> - ibm128_float_type_node = make_node (REAL_TYPE);
> - TYPE_PRECISION (ibm128_float_type_node) = 128;
> - SET_TYPE_MODE (ibm128_float_type_node, IFmode);
> - layout_type (ibm128_float_type_node);
> + if (TARGET_IEEEQUAD || !TARGET_LONG_DOUBLE_128)
> + {
> + ibm128_float_type_node = make_node (REAL_TYPE);
> + TYPE_PRECISION (ibm128_float_type_node) = 128;
> + SET_TYPE_MODE (ibm128_float_type_node, IFmode);
> + layout_type (ibm128_float_type_node);
> + }
> + else
> + ibm128_float_type_node = long_double_type_node;
I wonder how hard it would be to alias the long double type to either
__ibm128 or __ieee128, instead of the other way around? This would
simplify code a lot. Esp. if we can do the same thing for the modes,
too.
> @@ -32117,7 +32163,7 @@ rs6000_mangle_type (const_tree type)
> if (SCALAR_FLOAT_TYPE_P (type) && FLOAT128_IBM_P (TYPE_MODE (type)))
> return "g";
> if (SCALAR_FLOAT_TYPE_P (type) && FLOAT128_IEEE_P (TYPE_MODE (type)))
> - return "u9__ieee128";
> + return old_mangling ? "U10__float128" : "u9__ieee128";
> +#if TARGET_ELF && RS6000_WEAK
> +static void
> +rs6000_globalize_decl_name (FILE * stream, tree decl)
> +{
> + const char *name = XSTR (XEXP (DECL_RTL (decl), 0), 0);
> +
> + targetm.asm_out.globalize_label (stream, name);
> +
> + if (TARGET_OLD_NAME_MANGLING && rs6000_passes_ieee128
> + && name[0] == '_' && name[1] == 'Z')
> + {
> + tree save_asm_name = DECL_ASSEMBLER_NAME (decl);
> + const char *old_name;
> +
> + old_mangling = true;
> + lang_hooks.set_decl_assembler_name (decl);
> + old_name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
> + SET_DECL_ASSEMBLER_NAME (decl, save_asm_name);
> + old_mangling = false;
Eww. Can't we just create old_name directly? Maybe there already is
some nice helper for this?
> +;; -malias-old-name-mangling: implement an alias to map old C++ mangled names
> +;; to the new version of the name
> +malias-old-name-mangling
> +Target Undocumented Var(TARGET_OLD_NAME_MANGLING) Init(-1) Save
As said, better name please. Or, just drop the option (always enable it).
Segher