Convert elfread.c to type-safe registry API
authorTom Tromey <tom@tromey.com>
Wed, 1 May 2019 21:41:13 +0000 (15:41 -0600)
committerTom Tromey <tom@tromey.com>
Wed, 8 May 2019 22:01:54 +0000 (16:01 -0600)
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.

gdb/ChangeLog
2019-05-08  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
gdb/elfread.c

index 4f1859c981db353e756f5f24ba5bbf123fd7e338..be3e5db38c49c1bbdf20464268a7a1badf589b53 100644 (file)
@@ -1,3 +1,10 @@
+2019-05-08  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.
+
 2019-05-08  Tom Tromey  <tom@tromey.com>
 
        * mdebugread.c (basic_type_data): Change type.
index deee6f0baab5b59727700080793d51e9a5484e1e..cb98b83f74b772cf0ffae2bb89af04b2f5c03627 100644 (file)
@@ -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;
 }