Use unique_ptr for objfiles

A while back, I changed objfiles to be held via a shared_ptr.  The
idea at the time was that this was a step toward writing to the index
cache in the background, and this would let gdb keep a reference alive
to do so.  However, since then we've rewritten the DWARF reader, and
the new index can do this without requiring a shared pointer -- in
fact there are patches pending to implement this.

This patch switches objfile management to unique_ptr, which makes more
sense now.

Regression tested on x86-64 Fedora 34.
This commit is contained in:
Tom Tromey 2022-05-21 09:50:13 -06:00
parent ebad7c6613
commit e2904e1ff0
4 changed files with 9 additions and 11 deletions

View file

@ -468,9 +468,7 @@ objfile::make (bfd *bfd_, const char *name_, objfile_flags flags_,
if (parent != nullptr) if (parent != nullptr)
add_separate_debug_objfile (result, parent); add_separate_debug_objfile (result, parent);
/* Using std::make_shared might be a bit nicer here, but that would current_program_space->add_objfile (std::unique_ptr<objfile> (result),
require making the constructor public. */
current_program_space->add_objfile (std::shared_ptr<objfile> (result),
parent); parent);
/* Rebuild section map next time we need it. */ /* Rebuild section map next time we need it. */

View file

@ -409,7 +409,7 @@ public:
remove it from the program space's list. In some cases, you may remove it from the program space's list. In some cases, you may
need to hold a reference to an objfile that is independent of its need to hold a reference to an objfile that is independent of its
existence on the program space's list; for this case, the existence on the program space's list; for this case, the
destructor must be public so that shared_ptr can reference destructor must be public so that unique_ptr can reference
it. */ it. */
~objfile (); ~objfile ();

View file

@ -174,7 +174,7 @@ program_space::free_all_objfiles ()
/* See progspace.h. */ /* See progspace.h. */
void void
program_space::add_objfile (std::shared_ptr<objfile> &&objfile, program_space::add_objfile (std::unique_ptr<objfile> &&objfile,
struct objfile *before) struct objfile *before)
{ {
if (before == nullptr) if (before == nullptr)
@ -182,7 +182,7 @@ program_space::add_objfile (std::shared_ptr<objfile> &&objfile,
else else
{ {
auto iter = std::find_if (objfiles_list.begin (), objfiles_list.end (), auto iter = std::find_if (objfiles_list.begin (), objfiles_list.end (),
[=] (const std::shared_ptr<::objfile> &objf) [=] (const std::unique_ptr<::objfile> &objf)
{ {
return objf.get () == before; return objf.get () == before;
}); });
@ -203,7 +203,7 @@ program_space::remove_objfile (struct objfile *objfile)
reinit_frame_cache (); reinit_frame_cache ();
auto iter = std::find_if (objfiles_list.begin (), objfiles_list.end (), auto iter = std::find_if (objfiles_list.begin (), objfiles_list.end (),
[=] (const std::shared_ptr<::objfile> &objf) [=] (const std::unique_ptr<::objfile> &objf)
{ {
return objf.get () == objfile; return objf.get () == objfile;
}); });

View file

@ -41,9 +41,9 @@ struct program_space_data;
struct address_space_data; struct address_space_data;
struct so_list; struct so_list;
typedef std::list<std::shared_ptr<objfile>> objfile_list; typedef std::list<std::unique_ptr<objfile>> objfile_list;
/* An iterator that wraps an iterator over std::shared_ptr<objfile>, /* An iterator that wraps an iterator over std::unique_ptr<objfile>,
and dereferences the returned object. This is useful for iterating and dereferences the returned object. This is useful for iterating
over a list of shared pointers and returning raw pointers -- which over a list of shared pointers and returning raw pointers -- which
helped avoid touching a lot of code when changing how objfiles are helped avoid touching a lot of code when changing how objfiles are
@ -234,7 +234,7 @@ struct program_space
/* Add OBJFILE to the list of objfiles, putting it just before /* Add OBJFILE to the list of objfiles, putting it just before
BEFORE. If BEFORE is nullptr, it will go at the end of the BEFORE. If BEFORE is nullptr, it will go at the end of the
list. */ list. */
void add_objfile (std::shared_ptr<objfile> &&objfile, void add_objfile (std::unique_ptr<objfile> &&objfile,
struct objfile *before); struct objfile *before);
/* Remove OBJFILE from the list of objfiles. */ /* Remove OBJFILE from the list of objfiles. */
@ -354,7 +354,7 @@ struct program_space
struct objfile *symfile_object_file = NULL; struct objfile *symfile_object_file = NULL;
/* All known objfiles are kept in a linked list. */ /* All known objfiles are kept in a linked list. */
std::list<std::shared_ptr<objfile>> objfiles_list; std::list<std::unique_ptr<objfile>> objfiles_list;
/* List of shared objects mapped into this space. Managed by /* List of shared objects mapped into this space. Managed by
solib.c. */ solib.c. */