[Bug target/104172] New: [9/10/11/12 Regression] ppc64le mangling ICE with -flto -ffat-lto-objects

jakub at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Fri Jan 21 21:26:57 GMT 2022


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104172

            Bug ID: 104172
           Summary: [9/10/11/12 Regression] ppc64le mangling ICE with
                    -flto -ffat-lto-objects
           Product: gcc
           Version: 12.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: target
          Assignee: unassigned at gcc dot gnu.org
          Reporter: jakub at gcc dot gnu.org
  Target Milestone: ---

// { dg-do compile { target { powerpc*-*-* && lp64 && le } } }
// { dg-options "-O2 -flto=auto -ffat-lto-objects -mabi=ieeelongdouble" }

struct A { A(int); };
struct B { float b; };
struct C : B { C(); };
C::C() { A(b * 25.4L); }

ICEs
PagePrinter.C: In member function 'C::C()':
PagePrinter.C:7:1: internal compiler error: tree check: expected class 'type',
have 'declaration' (translation_unit_decl) in base_ctor_omit_inherited_parms,
at cp/method.c:568
    7 | C::C() { A(b * 25.4L); }
      | ^
0x101fbd8b tree_class_check_failed(tree_node const*, tree_code_class, char
const*, int, char const*)
        ../../gcc/tree.c:8752
0x104073bf tree_class_check(tree_node*, tree_code_class, char const*, int, char
const*)
        ../../gcc/tree.h:3564
0x104073bf base_ctor_omit_inherited_parms(tree_node*)
        ../../gcc/cp/method.c:568
0x104073bf base_ctor_omit_inherited_parms(tree_node*)
        ../../gcc/cp/method.c:560
0x103eda0b write_method_parms
        ../../gcc/cp/mangle.c:2798
0x103edd73 write_bare_function_type
        ../../gcc/cp/mangle.c:2758
0x103edecf write_encoding
        ../../gcc/cp/mangle.c:832
0x103eec7f mangle_decl_string
        ../../gcc/cp/mangle.c:4034
0x103ef003 get_mangled_id
        ../../gcc/cp/mangle.c:4055
0x103ef003 mangle_decl(tree_node*)
        ../../gcc/cp/mangle.c:4093
0x1142297f rs6000_globalize_decl_name
        ../../gcc/config/rs6000/rs6000.c:28190
0x113d8c43 globalize_decl
        ../../gcc/varasm.c:6146
0x113e112b assemble_start_function(tree_node*, char const*)
        ../../gcc/varasm.c:1965
0x10a01a8f rest_of_handle_final
        ../../gcc/final.c:4281
0x10a01a8f execute
        ../../gcc/final.c:4363
(for GCC configured to default to --with-long-double-format=ieee that is a
pretty serious regression breaking lots of builds).

The bug is in:
/* 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

This is just wrong, mangling is only possible before free_lang_data, not after
that, everything should be mangled by then.
So, IMHO the backend should note that during mangling that it emitted some
u9__ieee128 (when rs6000_mangle_type returns it)
and through some hook should cooperate with the C++ FE to create a mangling
alias like the FE creates mangling aliases for -fabi-version*.


More information about the Gcc-bugs mailing list