+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);