public inbox for binutils@sourceware.org
 help / color / mirror / Atom feed
* i386 gas: don't leak op_hash or reg_hash memory
@ 2022-07-09 12:32 Alan Modra
  0 siblings, 0 replies; only message in thread
From: Alan Modra @ 2022-07-09 12:32 UTC (permalink / raw)
  To: binutils

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.

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);
+}
 \f
 #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 */

-- 
Alan Modra
Australia Development Lab, IBM

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2022-07-09 12:32 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-07-09 12:32 i386 gas: don't leak op_hash or reg_hash memory Alan Modra

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).