From a51628a9d49bf7abb89b71032aa38d7f596be674 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Thu, 7 Jul 2022 22:09:28 +0930 Subject: arc gas: don't leak arc_opcode_hash memory The arc opcode hash table has entries that have a realloc'd field. This doesn't lend itself to obstack allocation, so freeing must be done with a purpose built hashtab del_f. * config/tc-arc.c (arc_opcode_free): New function. (md_begin): Pass the above as del_f to htab_create_alloc. (arc_md_end): New function. * config/tc-arc.h (arc_md_end): Declare. (md_end): Define. --- gas/config/tc-arc.c | 21 ++++++++++++++++++++- gas/config/tc-arc.h | 3 +++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/gas/config/tc-arc.c b/gas/config/tc-arc.c index 6c5b1d6..fd648b7 100644 --- a/gas/config/tc-arc.c +++ b/gas/config/tc-arc.c @@ -774,6 +774,15 @@ arc_insert_opcode (const struct arc_opcode *opcode) entry->count++; } +static void +arc_opcode_free (void *elt) +{ + string_tuple_t *tuple = (string_tuple_t *) elt; + struct arc_opcode_hash_entry *entry = (void *) tuple->value; + free (entry->opcode); + free (entry); + free (tuple); +} /* Like md_number_to_chars but for middle-endian values. The 4-byte limm value, is encoded as 'middle-endian' for a little-endian target. This @@ -2605,7 +2614,8 @@ md_begin (void) bfd_set_private_flags (stdoutput, selected_cpu.eflags); /* Set up a hash table for the instructions. */ - arc_opcode_hash = str_htab_create (); + arc_opcode_hash = htab_create_alloc (16, hash_string_tuple, eq_string_tuple, + arc_opcode_free, xcalloc, free); /* Initialize the hash table with the insns. */ do @@ -2710,6 +2720,15 @@ md_begin (void) declare_addrtype ("cxd", ARC_NPS400_ADDRTYPE_CXD); } +void +arc_md_end (void) +{ + htab_delete (arc_opcode_hash); + htab_delete (arc_reg_hash); + htab_delete (arc_aux_hash); + htab_delete (arc_addrtype_hash); +} + /* Write a value out to the object file, using the appropriate endianness. */ diff --git a/gas/config/tc-arc.h b/gas/config/tc-arc.h index 29b4582..d7b989e 100644 --- a/gas/config/tc-arc.h +++ b/gas/config/tc-arc.h @@ -268,4 +268,7 @@ struct arc_relax_type int nflg; }; +extern void arc_md_end (void); +#define md_end arc_md_end + #endif -- cgit v1.1