diff options
author | Alan Modra <amodra@gmail.com> | 2022-07-07 22:09:28 +0930 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2022-07-09 21:35:15 +0930 |
commit | a51628a9d49bf7abb89b71032aa38d7f596be674 (patch) | |
tree | ebd0b9d19c464fa5e51c3c37dbdae165a7d05738 | |
parent | 654d6f31a644d1381c76d3d70ce3ca9f45a08597 (diff) | |
download | fsf-binutils-gdb-a51628a9d49bf7abb89b71032aa38d7f596be674.zip fsf-binutils-gdb-a51628a9d49bf7abb89b71032aa38d7f596be674.tar.gz fsf-binutils-gdb-a51628a9d49bf7abb89b71032aa38d7f596be674.tar.bz2 |
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.
-rw-r--r-- | gas/config/tc-arc.c | 21 | ||||
-rw-r--r-- | gas/config/tc-arc.h | 3 |
2 files changed, 23 insertions, 1 deletions
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 |