diff options
author | Alan Modra <amodra@gmail.com> | 2022-07-07 22:06:55 +0930 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2022-07-09 21:35:02 +0930 |
commit | 654d6f31a644d1381c76d3d70ce3ca9f45a08597 (patch) | |
tree | c4271dfc64112bdac82ffa0d0cf8cc3eca09e402 | |
parent | a887be69963c40ced36e319e5fb14b3de4b6658b (diff) | |
download | gdb-654d6f31a644d1381c76d3d70ce3ca9f45a08597.zip gdb-654d6f31a644d1381c76d3d70ce3ca9f45a08597.tar.gz gdb-654d6f31a644d1381c76d3d70ce3ca9f45a08597.tar.bz2 |
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.
-rw-r--r-- | gas/config/tc-i386.c | 11 | ||||
-rw-r--r-- | gas/config/tc-i386.h | 3 | ||||
-rw-r--r-- | 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 9cd33a9..d40a71a 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 5d6fc75..a6e096e 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 @@ -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 */ |