[v2,25/31] Convert elfread.c to type-safe registry API

Message ID 20190503231231.8954-26-tom@tromey.com
State New
Headers show
Series
  • Add a type-safe API to registries
Related show

Commit Message

Tom Tromey May 3, 2019, 11:12 p.m.
This changes elfread.c to use the type-safe registry API.  This also
fixes a potential memory leak, by changing the hash table so that it
is no longer allocated on an obstack.

2019-05-01  Tom Tromey  <tom@tromey.com>

	* elfread.c (elf_objfile_gnu_ifunc_cache_data): Change type.
	(elf_gnu_ifunc_record_cache): Update.  Don't allocate hash table
	on obstack.
	(elf_gnu_ifunc_resolve_by_cache, _initialize_elfread): Update.
---
 gdb/ChangeLog |  7 +++++++
 gdb/elfread.c | 18 ++++++++----------
 2 files changed, 15 insertions(+), 10 deletions(-)

-- 
2.17.2

Patch

diff --git a/gdb/elfread.c b/gdb/elfread.c
index deee6f0baab..cb98b83f74b 100644
--- a/gdb/elfread.c
+++ b/gdb/elfread.c
@@ -639,7 +639,8 @@  elf_rel_plt_read (minimal_symbol_reader &reader,
 
 /* The data pointer is htab_t for gnu_ifunc_record_cache_unchecked.  */
 
-static const struct objfile_data *elf_objfile_gnu_ifunc_cache_data;
+static const struct objfile_key<htab, htab_deleter>
+  elf_objfile_gnu_ifunc_cache_data;
 
 /* Map function names to CORE_ADDR in elf_objfile_gnu_ifunc_cache_data.  */
 
@@ -710,15 +711,13 @@  elf_gnu_ifunc_record_cache (const char *name, CORE_ADDR addr)
   if (len > 4 && strcmp (target_name + len - 4, "@plt") == 0)
     return 0;
 
-  htab = (htab_t) objfile_data (objfile, elf_objfile_gnu_ifunc_cache_data);
+  htab = elf_objfile_gnu_ifunc_cache_data.get (objfile);
   if (htab == NULL)
     {
-      htab = htab_create_alloc_ex (1, elf_gnu_ifunc_cache_hash,
-				   elf_gnu_ifunc_cache_eq,
-				   NULL, &objfile->objfile_obstack,
-				   hashtab_obstack_allocate,
-				   dummy_obstack_deallocate);
-      set_objfile_data (objfile, elf_objfile_gnu_ifunc_cache_data, htab);
+      htab = htab_create_alloc (1, elf_gnu_ifunc_cache_hash,
+				elf_gnu_ifunc_cache_eq,
+				NULL, xcalloc, xfree);
+      elf_objfile_gnu_ifunc_cache_data.set (objfile, htab);
     }
 
   entry_local.addr = addr;
@@ -769,7 +768,7 @@  elf_gnu_ifunc_resolve_by_cache (const char *name, CORE_ADDR *addr_p)
       struct elf_gnu_ifunc_cache *entry_p;
       void **slot;
 
-      htab = (htab_t) objfile_data (objfile, elf_objfile_gnu_ifunc_cache_data);
+      htab = elf_objfile_gnu_ifunc_cache_data.get (objfile);
       if (htab == NULL)
 	continue;
 
@@ -1462,6 +1461,5 @@  _initialize_elfread (void)
 {
   add_symtab_fns (bfd_target_elf_flavour, &elf_sym_fns);
 
-  elf_objfile_gnu_ifunc_cache_data = register_objfile_data ();
   gnu_ifunc_fns_p = &elf_gnu_ifunc_fns;
 }