aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathaniel Shead <nathanieloshead@gmail.com>2025-07-24 09:41:00 +1000
committerNathaniel Shead <nathanieloshead@gmail.com>2025-07-27 10:07:15 +1000
commit4a8fd4a8ee3f83c330deb0dd494b27f66a748fb5 (patch)
tree6cbe487029bf5106fff6eb52f603e59705e2d2c3
parent68ddec92d4066328c127fdaa28ccadf10a738446 (diff)
downloadgcc-4a8fd4a8ee3f83c330deb0dd494b27f66a748fb5.zip
gcc-4a8fd4a8ee3f83c330deb0dd494b27f66a748fb5.tar.gz
gcc-4a8fd4a8ee3f83c330deb0dd494b27f66a748fb5.tar.bz2
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 <nathanieloshead@gmail.com> Reviewed-by: Jason Merrill <jason@redhat.com>
-rw-r--r--gcc/cgraphunit.cc7
-rw-r--r--gcc/symtab.cc1
-rw-r--r--gcc/varasm.cc2
3 files changed, 6 insertions, 4 deletions
diff --git a/gcc/cgraphunit.cc b/gcc/cgraphunit.cc
index 8e8d855..9f4af63 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 fc1155f..652f66a 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 8384e8b..8266282 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;