From: Jakub Jelinek Date: Tue, 25 Jan 2022 04:49:05 +0000 (+0100) Subject: rs6000: Remove GCC 8.1 U10__float128 mangling compatibility [PR104172] X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=f4ee27d3262fc4fc3e5d3535f195fdcf87d7ec77;p=test_jj.git rs6000: Remove GCC 8.1 U10__float128 mangling compatibility [PR104172] In GCC 7.x and earlier, while it had -mabi=ieeelongdouble option, that option was undocumented and unsupported. In GCC 8.1 that option got documented and -mabi=ieeelongdouble long double started to be mangled as U10__float128. In GCC 9 and backported to before 8.2 release, that mangling changed to u9__ieee128 and a support for emitting compatibility mangling aliases have been added. Unfortunately, as mentioned in the PR, those don't really work well in many cases, the free_lang_data pass throws away important trees, so e.g. with -flto -ffat-lto-objects the compiler often ICEs on templates that involve IEEE quad long double arguments etc. because the mangling was done too late (at final time). Furthermore, lto1's mangler is not the C++ mangler, so with -flto it would often emit as "mangled identifiers" something that wasn't a valid assembler identifier, e.g. operator+ etc. While it is possible to do such mangling earlier, e.g. at the same time when the C++ FE emits its mangling aliases and untested proof of concept is in the PR, there seems to be agreement that we shouldn't bother with this ABI compatibility with something that probably nobody really used. GCC 8.2 already uses the new mangling, it was just a few months, but more importantly, libstdc++ support for IEEE quad long double on powerpc64le-linux was only added in GCC 11, and glibc support for that some weeks after 8.2 got released. So, the following patch just drops those aliases. 2022-01-25 Jakub Jelinek PR target/104172 gcc/ * config/rs6000/rs6000-internal.h (rs6000_passes_ieee128): Don't declare. * config/rs6000/rs6000.cc (rs6000_passes_ieee128, ieee128_mangling_gcc_8_1): Remove. (TARGET_ASM_GLOBALIZE_DECL_NAME): Don't redefine. (rs6000_mangle_type): Return "u9__ieee128" instead of ieee128_mangling_gcc_8_1 ? "U10__float128" : "u9__ieee128". (rs6000_globalize_decl_name): Remove. * config/rs6000/rs6000-call.cc (init_cumulative_args, rs6000_function_arg_advance_1): Don't set rs6000_passes_ieee128. --- diff --git a/gcc/config/rs6000/rs6000-call.cc b/gcc/config/rs6000/rs6000-call.cc index e002e1f..5c870d4 100644 --- a/gcc/config/rs6000/rs6000-call.cc +++ b/gcc/config/rs6000/rs6000-call.cc @@ -755,12 +755,6 @@ init_cumulative_args (CUMULATIVE_ARGS *cum, tree fntype, && (TYPE_MAIN_VARIANT (return_type) == long_double_type_node)))) rs6000_passes_long_double = true; - - /* Note if we passed or return a IEEE 128-bit type. We changed - the mangling for these types, and we may need to make an alias - with the old mangling. */ - if (FLOAT128_IEEE_P (return_mode)) - rs6000_passes_ieee128 = true; } if (ALTIVEC_OR_VSX_VECTOR_MODE (return_mode)) rs6000_passes_vector = true; @@ -1179,12 +1173,6 @@ rs6000_function_arg_advance_1 (CUMULATIVE_ARGS *cum, machine_mode mode, || (type != NULL && TYPE_MAIN_VARIANT (type) == long_double_type_node))) rs6000_passes_long_double = true; - - /* Note if we passed or return a IEEE 128-bit type. We changed the - mangling for these types, and we may need to make an alias with - the old mangling. */ - if (FLOAT128_IEEE_P (mode)) - rs6000_passes_ieee128 = true; } if (named && ALTIVEC_OR_VSX_VECTOR_MODE (mode)) rs6000_passes_vector = true; diff --git a/gcc/config/rs6000/rs6000-internal.h b/gcc/config/rs6000/rs6000-internal.h index 2d1090e..8ee8c98 100644 --- a/gcc/config/rs6000/rs6000-internal.h +++ b/gcc/config/rs6000/rs6000-internal.h @@ -183,9 +183,6 @@ extern tree rs6000_fold_builtin (tree fndecl ATTRIBUTE_UNUSED, tree *args ATTRIBUTE_UNUSED, bool ignore ATTRIBUTE_UNUSED); -#if TARGET_ELF -extern bool rs6000_passes_ieee128; -#endif extern bool rs6000_passes_float; extern bool rs6000_passes_long_double; extern bool rs6000_passes_vector; diff --git a/gcc/config/rs6000/rs6000.cc b/gcc/config/rs6000/rs6000.cc index 943f53e..e5471da 100644 --- a/gcc/config/rs6000/rs6000.cc +++ b/gcc/config/rs6000/rs6000.cc @@ -121,22 +121,9 @@ int dot_symbols; of this machine mode. */ scalar_int_mode rs6000_pmode; -#if TARGET_ELF -/* Note whether IEEE 128-bit floating point was passed or returned, either as - the __float128/_Float128 explicit type, or when long double is IEEE 128-bit - floating point. We changed the default C++ mangling for these types and we - may want to generate a weak alias of the old mangling (U10__float128) to the - new mangling (u9__ieee128). */ -bool rs6000_passes_ieee128 = false; -#endif - /* Track use of r13 in 64bit AIX TLS. */ static bool xcoff_tls_exec_model_detected = false; -/* Generate the manged name (i.e. U10__float128) used in GCC 8.1, and not the - name used in current releases (i.e. u9__ieee128). */ -static bool ieee128_mangling_gcc_8_1; - /* Width in bits of a pointer. */ unsigned rs6000_pointer_size; @@ -1765,11 +1752,6 @@ static const struct attribute_spec rs6000_attribute_table[] = #undef TARGET_STARTING_FRAME_OFFSET #define TARGET_STARTING_FRAME_OFFSET rs6000_starting_frame_offset -#if TARGET_ELF && RS6000_WEAK -#undef TARGET_ASM_GLOBALIZE_DECL_NAME -#define TARGET_ASM_GLOBALIZE_DECL_NAME rs6000_globalize_decl_name -#endif - #undef TARGET_SETJMP_PRESERVES_NONVOLATILE_REGS_P #define TARGET_SETJMP_PRESERVES_NONVOLATILE_REGS_P hook_bool_void_true @@ -20262,7 +20244,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 ieee128_mangling_gcc_8_1 ? "U10__float128" : "u9__ieee128"; + return "u9__ieee128"; if (type == vector_pair_type_node) return "u13__vector_pair"; @@ -28159,39 +28141,6 @@ rs6000_starting_frame_offset (void) } -/* Create an alias for a mangled name where we have changed the mangling (in - GCC 8.1, we used U10__float128, and now we use u9__ieee128). This is called - via the target hook TARGET_ASM_GLOBALIZE_DECL_NAME. */ - -#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 (rs6000_passes_ieee128 && name[0] == '_' && name[1] == 'Z') - { - tree save_asm_name = DECL_ASSEMBLER_NAME (decl); - const char *old_name; - - ieee128_mangling_gcc_8_1 = true; - lang_hooks.set_decl_assembler_name (decl); - old_name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)); - SET_DECL_ASSEMBLER_NAME (decl, save_asm_name); - ieee128_mangling_gcc_8_1 = false; - - if (strcmp (name, old_name) != 0) - { - fprintf (stream, "\t.weak %s\n", old_name); - fprintf (stream, "\t.set %s,%s\n", old_name, name); - } - } -} -#endif - - /* On 64-bit Linux and Freebsd systems, possibly switch the long double library function names from l to f128 if the default long double type is IEEE 128-bit. Typically, with the C and C++ languages, the standard math.h