From 654d6f31a644d1381c76d3d70ce3ca9f45a08597 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Thu, 7 Jul 2022 22:06:55 +0930 Subject: [PATCH] i386 gas: don't leak op_hash or reg_hash memory This tidies memory used by the two x86 gas string hash tables before exiting. I'm using a two-pronged approach, firstly the obvious call to htab_delete plus telling the libiberty/hashtab.c infrastructure to free tuples generated by str_hash_insert, and secondly putting the x86 core_optab memory on the notes obstack. It would be possible to free core_optab memory by using a custom hash table del_f on x86, as I do for arc, but a later patch will move all the string hash memory to the notes obstack. * config/tc-i386.c (md_begin): Use notes_alloc for core_optab. (386_md_end): New function. * config/tc-i386.h (386_md_end): Declare. (md_end): Define. * hash.h (str_htab_create): Pass free as del_f. --- gas/config/tc-i386.c | 11 +++++++++-- gas/config/tc-i386.h | 3 +++ gas/hash.h | 2 +- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c index 9cd33a91660..d40a71a492a 100644 --- a/gas/config/tc-i386.c +++ b/gas/config/tc-i386.c @@ -2947,7 +2947,7 @@ md_begin (void) /* Setup for loop. */ optab = i386_optab; - core_optab = XNEW (templates); + core_optab = notes_alloc (sizeof (*core_optab)); core_optab->start = optab; while (1) @@ -2964,7 +2964,7 @@ md_begin (void) if (optab->name == NULL) break; - core_optab = XNEW (templates); + core_optab = notes_alloc (sizeof (*core_optab)); core_optab->start = optab; } } @@ -3099,6 +3099,13 @@ i386_print_statistics (FILE *file) htab_print_statistics (file, "i386 opcode", op_hash); htab_print_statistics (file, "i386 register", reg_hash); } + +void +i386_md_end (void) +{ + htab_delete (op_hash); + htab_delete (reg_hash); +} #ifdef DEBUG386 diff --git a/gas/config/tc-i386.h b/gas/config/tc-i386.h index 5d6fc752474..a6e096ee110 100644 --- a/gas/config/tc-i386.h +++ b/gas/config/tc-i386.h @@ -216,6 +216,9 @@ extern void i386_cons_align (int); void i386_print_statistics (FILE *); #define tc_print_statistics i386_print_statistics +void i386_md_end (void); +#define md_end i386_md_end + extern unsigned int i386_frag_max_var (fragS *); #define md_frag_max_var i386_frag_max_var diff --git a/gas/hash.h b/gas/hash.h index 21f4a6dc42a..29e882514f4 100644 --- a/gas/hash.h +++ b/gas/hash.h @@ -99,7 +99,7 @@ static inline htab_t str_htab_create (void) { return htab_create_alloc (16, hash_string_tuple, eq_string_tuple, - NULL, xcalloc, free); + free, xcalloc, free); } #endif /* HASH_H */ -- 2.30.2