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.
This commit is contained in:
Alan Modra
2022-07-07 22:06:55 +09:30
parent a887be6996
commit 654d6f31a6
3 changed files with 13 additions and 3 deletions

View File

@ -2947,7 +2947,7 @@ md_begin (void)
/* Setup for loop. */ /* Setup for loop. */
optab = i386_optab; optab = i386_optab;
core_optab = XNEW (templates); core_optab = notes_alloc (sizeof (*core_optab));
core_optab->start = optab; core_optab->start = optab;
while (1) while (1)
@ -2964,7 +2964,7 @@ md_begin (void)
if (optab->name == NULL) if (optab->name == NULL)
break; break;
core_optab = XNEW (templates); core_optab = notes_alloc (sizeof (*core_optab));
core_optab->start = 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 opcode", op_hash);
htab_print_statistics (file, "i386 register", reg_hash); htab_print_statistics (file, "i386 register", reg_hash);
} }
void
i386_md_end (void)
{
htab_delete (op_hash);
htab_delete (reg_hash);
}
#ifdef DEBUG386 #ifdef DEBUG386

View File

@ -216,6 +216,9 @@ extern void i386_cons_align (int);
void i386_print_statistics (FILE *); void i386_print_statistics (FILE *);
#define tc_print_statistics i386_print_statistics #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 *); extern unsigned int i386_frag_max_var (fragS *);
#define md_frag_max_var i386_frag_max_var #define md_frag_max_var i386_frag_max_var

View File

@ -99,7 +99,7 @@ static inline htab_t
str_htab_create (void) str_htab_create (void)
{ {
return htab_create_alloc (16, hash_string_tuple, eq_string_tuple, return htab_create_alloc (16, hash_string_tuple, eq_string_tuple,
NULL, xcalloc, free); free, xcalloc, free);
} }
#endif /* HASH_H */ #endif /* HASH_H */