https://gcc.gnu.org/g:4a8fd4a8ee3f83c330deb0dd494b27f66a748fb5
commit r16-2559-g4a8fd4a8ee3f83c330deb0dd494b27f66a748fb5 Author: Nathaniel Shead <nathanielosh...@gmail.com> Date: Thu Jul 24 09:41:00 2025 +1000 Prevent mixups of IDENTIFIER_TRANSPARENT_ALIAS and IDENTIFIER_INTERNAL_P better [PR120855] The assertion failure on ASM_OUTPUT_WEAKREF targets since my r16-1738 was caused because the 'TREE_CHAIN (id)' check in assemble_name_resolve no longer implies that ID is a transparent alias, since internal identifiers can have a TREE_CHAIN as well. I still don't think it's possible for a transparent alias to be an internal identifier in the sense added, so this patch simply constrains the assertion better so that it doesn't fail spuriously. I also added a couple of other assertions to help validate this assumption. PR middle-end/120855 gcc/ChangeLog: * cgraphunit.cc (symbol_table::compile): Assert a transparent alias is not an internal identifier. * symtab.cc (symbol_table::change_decl_assembler_name): Likewise. * varasm.cc (assemble_name_resolve): Check for IDENTIFIER_TRANSPARENT_ALIAS instead of just TREE_CHAIN. Signed-off-by: Nathaniel Shead <nathanielosh...@gmail.com> Reviewed-by: Jason Merrill <ja...@redhat.com> Diff: --- gcc/cgraphunit.cc | 7 ++++--- gcc/symtab.cc | 1 + gcc/varasm.cc | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/gcc/cgraphunit.cc b/gcc/cgraphunit.cc index 8e8d85562b03..9f4af63b7dc0 100644 --- a/gcc/cgraphunit.cc +++ b/gcc/cgraphunit.cc @@ -2400,9 +2400,10 @@ symbol_table::compile (void) if (node->alias && lookup_attribute ("weakref", DECL_ATTRIBUTES (node->decl))) { - IDENTIFIER_TRANSPARENT_ALIAS - (DECL_ASSEMBLER_NAME (node->decl)) = 1; - TREE_CHAIN (DECL_ASSEMBLER_NAME (node->decl)) + tree id = DECL_ASSEMBLER_NAME (node->decl); + gcc_assert (!IDENTIFIER_INTERNAL_P (id)); + IDENTIFIER_TRANSPARENT_ALIAS (id) = 1; + TREE_CHAIN (id) = (node->alias_target ? node->alias_target : DECL_ASSEMBLER_NAME (node->get_alias_target ()->decl)); } diff --git a/gcc/symtab.cc b/gcc/symtab.cc index fc1155f46964..652f66a5d2f8 100644 --- a/gcc/symtab.cc +++ b/gcc/symtab.cc @@ -305,6 +305,7 @@ symbol_table::change_decl_assembler_name (tree decl, tree name) SET_DECL_ASSEMBLER_NAME (decl, name); if (alias) { + gcc_assert (!IDENTIFIER_INTERNAL_P (name)); IDENTIFIER_TRANSPARENT_ALIAS (name) = 1; TREE_CHAIN (name) = alias; } diff --git a/gcc/varasm.cc b/gcc/varasm.cc index 8384e8b635c7..82662822395a 100644 --- a/gcc/varasm.cc +++ b/gcc/varasm.cc @@ -2908,7 +2908,7 @@ assemble_name_resolve (const char *name) ultimate_transparent_alias_target (&id); if (id != id_orig) name = IDENTIFIER_POINTER (id); - gcc_assert (! TREE_CHAIN (id)); + gcc_assert (!IDENTIFIER_TRANSPARENT_ALIAS (id)); } return name;