mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-26 05:47:26 +08:00
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:
@ -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
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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 */
|
||||||
|
Reference in New Issue
Block a user