gas: use notes_calloc in string hash
authorAlan Modra <amodra@gmail.com>
Wed, 6 Jul 2022 23:19:09 +0000 (08:49 +0930)
committerAlan Modra <amodra@gmail.com>
Sat, 9 Jul 2022 12:17:24 +0000 (21:47 +0930)
Using notes_calloc means all of the string hash table memory should
now be freed before gas exits, even though htab_delete isn't called.
This also means that the hash table free_f and del_f must be NULL,
because freeing notes obstack memory results in all more recently
allocated notes memory being freed too.  So hash table resizing won't
free any memory, and will be a little faster.  Also, htab_delete won't
do anything (and be quick about it).

Since htab_traverse can also resize hash tables (to make another
traversal faster if the table is largely empty), stop that happening
when only one traversal is done.

* as.h: Reorder hash.h after symbols.h for notes_calloc decl.
* hash.h (str_htab_create): Use notes_calloc.  Do not free.
* symbols.c (resolve_local_symbol_values): Don't resize
during hash table traversal.
* config/obj-elf.c (elf_frob_file_after_relocs): Likewise.
* config/tc-ia64.c (ia64_adjust_symtab, ia64_frob_file): Likewise.
* config/tc-nds32.c (nds32_elf_analysis_relax_hint): Likewise.

gas/as.h
gas/config/obj-elf.c
gas/config/tc-ia64.c
gas/config/tc-nds32.c
gas/hash.h
gas/symbols.c

index d179537f383d7a92e2c674d363a52d12a0b4e345..ff665c7581217d0a4bf0b01256c417bf60159727 100644 (file)
--- a/gas/as.h
+++ b/gas/as.h
@@ -541,10 +541,10 @@ int generic_force_reloc (struct fix *);
 
 #include "write.h"
 #include "frags.h"
-#include "hashtab.h"
-#include "hash.h"
 #include "read.h"
 #include "symbols.h"
+#include "hashtab.h"
+#include "hash.h"
 
 #include "tc.h"
 #include "obj.h"
index e5ab8514de74cf8bdadadd87e9f4e734eecf58d6..82cde271fbbf9e51c02986734d14f400884869c1 100644 (file)
@@ -3006,7 +3006,7 @@ elf_frob_file_after_relocs (void)
     }
 
   /* Cleanup hash.  */
-  htab_traverse (groups.indexes, free_section_idx, NULL);
+  htab_traverse_noresize (groups.indexes, free_section_idx, NULL);
   htab_delete (groups.indexes);
 
 #ifdef NEED_ECOFF_DEBUG
index 7fa7e572a22291b853e41b229877c8bc96f5743f..3011302ffba63fa6a55bcad2ccfd0c28997562a7 100644 (file)
@@ -11853,7 +11853,7 @@ do_alias (void **slot, void *arg ATTRIBUTE_UNUSED)
 void
 ia64_adjust_symtab (void)
 {
-  htab_traverse (alias_hash, do_alias, NULL);
+  htab_traverse_noresize (alias_hash, do_alias, NULL);
 }
 
 /* It renames the original section name to its alias.  */
@@ -11878,7 +11878,7 @@ do_secalias (void **slot, void *arg ATTRIBUTE_UNUSED)
 void
 ia64_frob_file (void)
 {
-  htab_traverse (secalias_hash, do_secalias, NULL);
+  htab_traverse_noresize (secalias_hash, do_secalias, NULL);
 }
 
 #ifdef TE_VMS
index 48893a5762e5512f78dcb40fc9364a719be76476..6b082a3a26c0045f5bb820641943ef04310ed23d 100644 (file)
@@ -7480,7 +7480,8 @@ nds32_insert_relax_entry (bfd *abfd ATTRIBUTE_UNUSED, asection *sec,
 static void
 nds32_elf_analysis_relax_hint (void)
 {
-  htab_traverse (nds32_hint_hash, nds32_elf_append_relax_relocs_traverse, NULL);
+  htab_traverse_noresize (nds32_hint_hash,
+                         nds32_elf_append_relax_relocs_traverse, NULL);
 }
 
 static void
index 29e882514f449fd3994682f28ba4e9635beaa767..30404d889282f88b2bcc2e20ea19ae8ef6dd4179 100644 (file)
@@ -99,7 +99,7 @@ static inline htab_t
 str_htab_create (void)
 {
   return htab_create_alloc (16, hash_string_tuple, eq_string_tuple,
-                           free, xcalloc, free);
+                           NULL, notes_calloc, NULL);
 }
 
 #endif /* HASH_H */
index 744f6e1260ff59d1e199221fdbfbacfa5ee5af98..6904a3102cf2f115dcd826954c5a691748ba90a3 100644 (file)
@@ -1786,7 +1786,7 @@ resolve_local_symbol (void **slot, void *arg ATTRIBUTE_UNUSED)
 void
 resolve_local_symbol_values (void)
 {
-  htab_traverse (sy_hash, resolve_local_symbol, NULL);
+  htab_traverse_noresize (sy_hash, resolve_local_symbol, NULL);
 }
 
 /* Obtain the current value of a symbol without changing any