rs6000: Remove GCC 8.1 U10__float128 mangling compatibility [PR104172]

Message ID 20220124192259.GU2646553@tucnak
State New
Headers
Series rs6000: Remove GCC 8.1 U10__float128 mangling compatibility [PR104172] |

Commit Message

Jakub Jelinek Jan. 24, 2022, 7:22 p.m. UTC
  Hi!

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.

Bootstrap/regtest pedning on powerpc64le-linux (both defaulting to
ibmlongdouble and ieeelongdouble), ok for trunk if it passes?

2022-01-24  Jakub Jelinek  <jakub@redhat.com>

	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.


	Jakub
  

Comments

Segher Boessenkool Jan. 24, 2022, 8:08 p.m. UTC | #1
Hi!

On Mon, Jan 24, 2022 at 08:22:59PM +0100, Jakub Jelinek wrote:
> 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.

u<source-name> is correct mangling (extended type).  U<source-name>
means extended qualifier, which is non-sensical in most contexts where
it is used (it cannot demangle for example), and wrong everywhere.

> So, the following patch just drops those aliases.

Okay for trunk.  Thanks!

Do you want to backport this to any release branch?

> 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.

I love deleting code :-)


Segher
  

Patch

--- gcc/config/rs6000/rs6000-internal.h.jj	2022-01-18 11:58:59.218987257 +0100
+++ gcc/config/rs6000/rs6000-internal.h	2022-01-24 12:05:56.428125199 +0100
@@ -183,9 +183,6 @@  extern tree rs6000_fold_builtin (tree fn
 			         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;
--- gcc/config/rs6000/rs6000.cc.jj	2022-01-22 12:02:24.583563625 +0100
+++ gcc/config/rs6000/rs6000.cc	2022-01-24 12:07:05.783152147 +0100
@@ -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 rs600
 #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 <foo>l to <foo>f128 if the default long double type is
    IEEE 128-bit.  Typically, with the C and C++ languages, the standard math.h
--- gcc/config/rs6000/rs6000-call.cc.jj	2022-01-19 00:01:41.356806639 +0100
+++ gcc/config/rs6000/rs6000-call.cc	2022-01-24 12:06:22.519759135 +0100
@@ -755,12 +755,6 @@  init_cumulative_args (CUMULATIVE_ARGS *c
 			  && (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 (CUMULATIV
 		  || (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;