gdb: make clear_so a method of struct so_list

... just because it seems to make sense to do so.

Change-Id: Ie283c92d9b90c54e3deee96a43c6a942d8b5910b
Approved-By: Pedro Alves <pedro@palves.net>
Reviewed-By: Reviewed-By: Lancelot Six <lancelot.six@amd.com>
This commit is contained in:
Simon Marchi 2023-10-02 16:31:04 -04:00
parent 7ad0a42e88
commit 4ac91b6bb8
2 changed files with 24 additions and 21 deletions

View file

@ -623,39 +623,32 @@ solib_map_sections (so_list &so)
return 1; return 1;
} }
/* Free symbol-file related contents of SO and reset for possible reloading /* See solist.h. */
of SO. If we have opened a BFD for SO, close it. If we have placed SO's
sections in some target's section table, the caller is responsible for
removing them.
This function doesn't mess with objfiles at all. If there is an void
objfile associated with SO that needs to be removed, the caller is so_list::clear ()
responsible for taking care of that. */
static void
clear_so (so_list &so)
{ {
const target_so_ops *ops = gdbarch_so_ops (current_inferior ()->arch ()); const target_so_ops *ops = gdbarch_so_ops (current_inferior ()->arch ());
delete so.sections; delete this->sections;
so.sections = NULL; this->sections = nullptr;
gdb_bfd_unref (so.abfd); gdb_bfd_unref (this->abfd);
so.abfd = NULL; this->abfd = nullptr;
/* Our caller closed the objfile, possibly via objfile_purge_solibs. */ /* Our caller closed the objfile, possibly via objfile_purge_solibs. */
so.symbols_loaded = 0; this->symbols_loaded = 0;
so.objfile = NULL; this->objfile = nullptr;
so.addr_low = so.addr_high = 0; this->addr_low = this->addr_high = 0;
/* Restore the target-supplied file name. SO_NAME may be the path /* Restore the target-supplied file name. SO_NAME may be the path
of the symbol file. */ of the symbol file. */
strcpy (so.so_name, so.so_original_name); strcpy (this->so_name, this->so_original_name);
/* Do the same for target-specific data. */ /* Do the same for target-specific data. */
if (ops->clear_so != NULL) if (ops->clear_so != NULL)
ops->clear_so (so); ops->clear_so (*this);
} }
lm_info::~lm_info () = default; lm_info::~lm_info () = default;
@ -674,7 +667,7 @@ lm_info::~lm_info () = default;
void void
free_so (so_list &so) free_so (so_list &so)
{ {
clear_so (so); so.clear ();
delete &so; delete &so;
} }
@ -1358,7 +1351,7 @@ reload_shared_libraries_1 (int from_tty)
&& !solib_used (so)) && !solib_used (so))
so->objfile->unlink (); so->objfile->unlink ();
current_program_space->remove_target_sections (so); current_program_space->remove_target_sections (so);
clear_so (*so); so->clear ();
} }
/* If this shared library is now associated with a new symbol /* If this shared library is now associated with a new symbol

View file

@ -38,6 +38,16 @@ using lm_info_up = std::unique_ptr<lm_info>;
struct so_list struct so_list
{ {
/* Free symbol-file related contents of SO and reset for possible reloading
of SO. If we have opened a BFD for SO, close it. If we have placed SO's
sections in some target's section table, the caller is responsible for
removing them.
This function doesn't mess with objfiles at all. If there is an
objfile associated with SO that needs to be removed, the caller is
responsible for taking care of that. */
void clear () ;
/* The following fields of the structure come directly from the /* The following fields of the structure come directly from the
dynamic linker's tables in the inferior, and are initialized by dynamic linker's tables in the inferior, and are initialized by
current_sos. */ current_sos. */