+2019-12-12  Tom Tromey  <tom@tromey.com>
+
+       * symfile.c (syms_from_objfile_1): Use objfile_up.
+       (syms_from_objfile_1, remove_symbol_file_command): Call unlink
+       method.
+       (reread_symbols): Use objfile_up.
+       * solib.c (update_solib_list, reload_shared_libraries_1): Call
+       unlink method.
+       * objfiles.h (struct objfile) <~objfile>: Now private.
+       <unlink>: New method.
+       (struct objfile_deleter): New.
+       (objfile_up): New typedef.
+       * objfiles.c (objfile::unlink): New method.
+       (free_objfile_separate_debug, free_all_objfiles)
+       (objfile_purge_solibs): Use it.
+       * jit.c (jit_unregister_code): Remove.
+       (jit_inferior_exit_hook, jit_event_handler): Call unlink on
+       objfile.
+       * compile/compile-object-run.c (do_module_cleanup): Call unlink on
+       objfile.
+       * compile/compile-object-load.c (compile_object_load): Use
+       objfile_up.
+
 2019-12-12  Tom Tromey  <tom@tromey.com>
 
        * symfile.c (symbol_file_add_with_addrs): Pass "parent" to
 
 
   /* SYMFILE_VERBOSE is not passed even if FROM_TTY, user is not interested in
      "Reading symbols from ..." message for automatically generated file.  */
-  std::unique_ptr<struct objfile> objfile_holder
-    (symbol_file_add_from_bfd (abfd.get (), filename.get (),
-                              0, NULL, 0, NULL));
+  objfile_up objfile_holder (symbol_file_add_from_bfd (abfd.get (),
+                                                      filename.get (),
+                                                      0, NULL, 0, NULL));
   objfile = objfile_holder.get ();
 
   func_sym = lookup_global_symbol_from_objfile (objfile,
 
     if ((objfile->flags & OBJF_USERLOADED) == 0
         && (strcmp (objfile_name (objfile), data->objfile_name_string) == 0))
       {
-       delete objfile;
+       objfile->unlink ();
 
        /* It may be a bit too pervasive in this dummy_frame dtor callback.  */
        clear_symtab_users (0);
 
     jit_bfd_try_read_symtab (code_entry, entry_addr, gdbarch);
 }
 
-/* This function unregisters JITed code and frees the corresponding
-   objfile.  */
-
-static void
-jit_unregister_code (struct objfile *objfile)
-{
-  if (jit_debug)
-    fprintf_unfiltered (gdb_stdlog, "jit_unregister_code (%s)\n",
-                       host_address_to_string (objfile));
-  delete objfile;
-}
-
 /* Look up the objfile with this code entry address.  */
 
 static struct objfile *
        = (struct jit_objfile_data *) objfile_data (objf, jit_objfile_data);
 
       if (objf_data != NULL && objf_data->addr != 0)
-       jit_unregister_code (objf);
+       objf->unlink ();
     }
 }
 
                             "entry at address: %s\n"),
                           paddress (gdbarch, entry_addr));
       else
-        jit_unregister_code (objf);
+        objf->unlink ();
 
       break;
     default:
 
   return result;
 }
 
+/* See objfiles.h.  */
+
+void
+objfile::unlink ()
+{
+  delete this;
+}
+
 /* Free all separate debug objfile of OBJFILE, but don't free OBJFILE
    itself.  */
 
   for (child = objfile->separate_debug_objfile; child;)
     {
       struct objfile *next_child = child->separate_debug_objfile_link;
-      delete child;
+      child->unlink ();
       child = next_child;
     }
 }
     gdb_assert (so->objfile == NULL);
 
   for (objfile *objfile : current_program_space->objfiles_safe ())
-    delete objfile;
+    objfile->unlink ();
   clear_symtab_users (0);
 }
 \f
         be soon.  */
 
       if (!(objf->flags & OBJF_USERLOADED) && (objf->flags & OBJF_SHARED))
-       delete objf;
+       objf->unlink ();
     }
 }
 
 
   /* The only way to create an objfile is to call objfile::make.  */
   objfile (bfd *, const char *, objfile_flags);
 
+  /* The only way to free an objfile is via 'unlink'.  */
+  ~objfile ();
+
 public:
 
   /* Create an objfile.  */
   static objfile *make (bfd *bfd_, const char *name_, objfile_flags flags_,
                        objfile *parent = nullptr);
 
-  ~objfile ();
+  /* Remove an objfile from the current program space, and free
+     it.  */
+  void unlink ();
 
   DISABLE_COPY_AND_ASSIGN (objfile);
 
   htab_up static_links;
 };
 
+/* A deleter for objfile.  */
+
+struct objfile_deleter
+{
+  void operator() (objfile *ptr) const
+  {
+    ptr->unlink ();
+  }
+};
+
+/* A unique pointer that holds an objfile.  */
+
+typedef std::unique_ptr<objfile, objfile_deleter> objfile_up;
+
 /* Declarations for functions defined in objfiles.c */
 
 extern struct gdbarch *get_objfile_arch (const struct objfile *);
 
          /* Unless the user loaded it explicitly, free SO's objfile.  */
          if (gdb->objfile && ! (gdb->objfile->flags & OBJF_USERLOADED)
              && !solib_used (gdb))
-           delete gdb->objfile;
+           gdb->objfile->unlink ();
 
          /* Some targets' section tables might be referring to
             sections from so->abfd; remove them.  */
        {
          if (so->objfile && ! (so->objfile->flags & OBJF_USERLOADED)
              && !solib_used (so))
-           delete so->objfile;
+           so->objfile->unlink ();
          remove_target_sections (so);
          clear_so (so);
        }
 
      if an error occurs during symbol reading.  */
   gdb::optional<clear_symtab_users_cleanup> defer_clear_users;
 
-  std::unique_ptr<struct objfile> objfile_holder (objfile);
+  objfile_up objfile_holder (objfile);
 
   /* If ADDRS is NULL, put together a dummy address list.
      We now establish the convention that an addr of zero means
 
       if (symfile_objfile != NULL)
        {
-         delete symfile_objfile;
+         symfile_objfile->unlink ();
          gdb_assert (symfile_objfile == NULL);
        }
 
                 objfile_name (objf)))
     error (_("Not confirmed."));
 
-  delete objf;
+  objf->unlink ();
   clear_symtab_users (0);
 }
 
          /* If we get an error, blow away this objfile (not sure if
             that is the correct response for things like shared
             libraries).  */
-         std::unique_ptr<struct objfile> objfile_holder (objfile);
+         objfile_up objfile_holder (objfile);
 
          /* We need to do this whenever any symbols go away.  */
          clear_symtab_users_cleanup defer_clear_users (0);