[binutils-gdb] aarch64: Fix .unreq of predefined aliases

Alice Carlotti via Binutils-cvs <[email protected]> Fri, 10 Jul 2026 15:18:04 +0000 (GMT)
Newsgroups gmane.comp.gnu.binutils.cvs
Message-ID <[email protected]>
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=535fe82b83426e98599f37f3be889223768b38a9

commit 535fe82b83426e98599f37f3be889223768b38a9
Author: Alice Carlotti <[email protected]>
Date:   Wed Feb 18 15:03:41 2026 +0000

    aarch64: Fix .unreq of predefined aliases
    
    Attempting to free a static reg_entry is invalid, so use
    insert_reg_alias to create a dynamic copy of the content.

Diff:
---
 gas/config/tc-aarch64.c                      | 15 ++++++++++++---
 gas/testsuite/gas/aarch64/register_aliases.s | 10 ++++++++++
 2 files changed, 22 insertions(+), 3 deletions(-)

diff --git a/gas/config/tc-aarch64.c b/gas/config/tc-aarch64.c
index 373b97b1534..dddaa615ab8 100644
--- a/gas/config/tc-aarch64.c
+++ b/gas/config/tc-aarch64.c
@@ -1595,7 +1595,7 @@ parse_simd_vector_with_bit_index (char **ccp, struct vector_type_el *typeinfo)
 /* Directives: register aliases.  */
 
 static reg_entry *
-insert_reg_alias (char *str, int number, aarch64_reg_type type)
+insert_reg_alias (const char *str, int number, aarch64_reg_type type)
 {
   reg_entry *new;
   const char *name;
@@ -10699,8 +10699,17 @@ md_begin (void)
 			aarch64_sys_regs_sr + i);
 
   for (i = 0; i < ARRAY_SIZE (reg_names); i++)
-    checked_hash_insert (aarch64_reg_hsh, reg_names[i].name,
-			 reg_names + i);
+    {
+      if (reg_names[i].builtin)
+	checked_hash_insert (aarch64_reg_hsh, reg_names[i].name,
+			     reg_names + i);
+      else
+	/* Aliases need to be safely removable, so create a copy of
+	   the reg_entry data.  */
+	insert_reg_alias (reg_names[i].name, reg_names[i].number,
+			  reg_names[i].type);
+    }
+
 
   for (i = 0; i < ARRAY_SIZE (nzcv_names); i++)
     checked_hash_insert (aarch64_nzcv_hsh, nzcv_names[i].template,
diff --git a/gas/testsuite/gas/aarch64/register_aliases.s b/gas/testsuite/gas/aarch64/register_aliases.s
index 856be5699ce..c9aaea79f1b 100644
--- a/gas/testsuite/gas/aarch64/register_aliases.s
+++ b/gas/testsuite/gas/aarch64/register_aliases.s
@@ -10,3 +10,13 @@
 	str 	IP0, [fp]
 	ldr	IP1, [fp]
 	str	zero, [x0]
+
+	# Removal of user-defined aliases.
+	foo	.req	x13
+	.unreq foo
+
+	# Removing builtin register aliases should not segfault.
+	.unreq lr
+	.unreq fp
+	.unreq ip0
+	.unreq ip1