aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2022-07-07 08:49:09 +0930
committerAlan Modra <amodra@gmail.com>2022-07-09 21:47:24 +0930
commit0edfd2985b3ce036bcee5e5d3518eab317018b4d (patch)
tree5c5c2515e77b7670a6dc7d65ad063f52a5a1b7a3
parent7bfc4db2893c5de00197e40ab52394979f83a75d (diff)
downloadbinutils-0edfd2985b3ce036bcee5e5d3518eab317018b4d.zip
binutils-0edfd2985b3ce036bcee5e5d3518eab317018b4d.tar.gz
binutils-0edfd2985b3ce036bcee5e5d3518eab317018b4d.tar.bz2
gas: use notes_calloc in string hash
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.
-rw-r--r--gas/as.h4
-rw-r--r--gas/config/obj-elf.c2
-rw-r--r--gas/config/tc-ia64.c4
-rw-r--r--gas/config/tc-nds32.c3
-rw-r--r--gas/hash.h2
-rw-r--r--gas/symbols.c2
6 files changed, 9 insertions, 8 deletions
diff --git a/gas/as.h b/gas/as.h
index d179537..ff665c7 100644
--- 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"
diff --git a/gas/config/obj-elf.c b/gas/config/obj-elf.c
index e5ab851..82cde27 100644
--- a/gas/config/obj-elf.c
+++ b/gas/config/obj-elf.c
@@ -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
diff --git a/gas/config/tc-ia64.c b/gas/config/tc-ia64.c
index 7fa7e57..3011302 100644
--- a/gas/config/tc-ia64.c
+++ b/gas/config/tc-ia64.c
@@ -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
diff --git a/gas/config/tc-nds32.c b/gas/config/tc-nds32.c
index 48893a5..6b082a3 100644
--- a/gas/config/tc-nds32.c
+++ b/gas/config/tc-nds32.c
@@ -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
diff --git a/gas/hash.h b/gas/hash.h
index 29e8825..30404d8 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,
- free, xcalloc, free);
+ NULL, notes_calloc, NULL);
}
#endif /* HASH_H */
diff --git a/gas/symbols.c b/gas/symbols.c
index 744f6e1..6904a31 100644
--- a/gas/symbols.c
+++ b/gas/symbols.c
@@ -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