[RFC 6/6] aarch64 gas: Free reg alias entries before exit
Matthieu Longo
matthieu.longo@arm.com
Tue Mar 3 17:25:39 GMT 2026
On 03/03/2026 12:41, Alice Carlotti wrote:
> Add a deletion hook to aarch64_reg_hsh, so that dynamically allocated
> data in alias entries is freed at exit. This removes the allocations
> from LeakSanitizer reports, and also allows the explicit 'free' calls to
> be removed from s_unreq ().
>
>
> diff --git a/gas/config/tc-aarch64.c b/gas/config/tc-aarch64.c
> index 3dde65e3d91e346bd271189f11d119f78355a92d..2c78f990502fb06c61b3d85142ded7036051d7db 100644
> --- a/gas/config/tc-aarch64.c
> +++ b/gas/config/tc-aarch64.c
> @@ -1711,6 +1711,21 @@ create_register_alias (char *newname, char *p)
> return true;
> }
>
> +/* Delete handler for aarch64_reg_hsh. Builtin reg entries are static values
> + added at startup, while aliases are dynamically allocated. */
> +
> +static void
> +free_register_entry (void *entry)
> +{
> + string_tuple_t *tuple = entry;
> + reg_entry *reg = (reg_entry *) tuple->value;
> + if (!reg->builtin)
> + {
> + free ((char *) reg->name);
> + free (reg);
> + }
> +}
> +
> /* Should never be called, as .req goes between the alias and the
> register name, not at the beginning of the line. */
> static void
> @@ -1753,8 +1768,6 @@ s_unreq (int a ATTRIBUTE_UNUSED)
> char *nbuf;
>
> str_hash_delete (aarch64_reg_hsh, name);
> - free ((char *) reg->name);
> - free (reg);
>
> /* Also locate the all upper case and all lower case versions.
> Do not complain if we cannot find one or the other as it
> @@ -1767,8 +1780,6 @@ s_unreq (int a ATTRIBUTE_UNUSED)
> if (reg)
> {
> str_hash_delete (aarch64_reg_hsh, nbuf);
> - free ((char *) reg->name);
> - free (reg);
> }
>
> for (p = nbuf; *p; p++)
> @@ -1777,8 +1788,6 @@ s_unreq (int a ATTRIBUTE_UNUSED)
> if (reg)
> {
> str_hash_delete (aarch64_reg_hsh, nbuf);
> - free ((char *) reg->name);
> - free (reg);
> }
>
> free (nbuf);
> @@ -10583,7 +10592,6 @@ md_begin (void)
> aarch64_sys_regs_plbi_hsh = str_htab_create ();
> aarch64_sys_regs_mlbi_hsh = str_htab_create ();
> aarch64_sys_regs_sr_hsh = str_htab_create ();
> - aarch64_reg_hsh = str_htab_create ();
> aarch64_barrier_opt_hsh = str_htab_create ();
> aarch64_nzcv_hsh = str_htab_create ();
> aarch64_pldop_hsh = str_htab_create ();
> @@ -10592,6 +10600,11 @@ md_begin (void)
> aarch64_sys_ins_gicr_hsh = str_htab_create ();
> aarch64_sys_ins_gsb_hsh = str_htab_create ();
>
> + /* This is equivalent to str_htab_create with an added deletion hook. */
> + aarch64_reg_hsh = htab_create_alloc (16, hash_string_tuple, eq_string_tuple,
> + free_register_entry, notes_calloc,
> + NULL);
> +
> fill_instruction_hash_table ();
>
> for (i = 0; aarch64_sys_regs[i].name != NULL; ++i)
Ok.
Matthieu
More information about the Binutils
mailing list