Remove ALL_SO_LIBS and so_list_head
This patch started as an attempt to replace ALL_SO_LIBS with an ordinary C++ iterator. However, then I tripped over the so_list_head define again, and decided to remove it as well. gdb/ChangeLog 2020-05-08 Tom Tromey <tom@tromey.com> * mi/mi-cmd-file.c (mi_cmd_file_list_shared_libraries): Update. * solib-svr4.c (svr4_fetch_objfile_link_map): Update. (enable_break): Update. * solib-frv.c (frv_fdpic_find_global_pointer): Update. (frv_fdpic_find_canonical_descriptor): Update. (frv_fetch_objfile_link_map): Update. * progspace.c (program_space::free_all_objfiles): Update. (program_space::solibs): New method. * progspace.h (struct program_space) <solibs>: New method. * solist.h (master_so_list): Don't declare. (ALL_SO_LIBS): Remove. * solib.h (so_list_head): Remove. (update_solib_list): Update comment. * solib.c (master_so_list): Remove. (solib_used, update_solib_list, solib_add) (info_sharedlibrary_command, clear_solib) (reload_shared_libraries_1, remove_user_added_objfile): Update.
This commit is contained in:
parent
38eae08459
commit
a1fd1ac9de
9 changed files with 63 additions and 72 deletions
50
gdb/solib.c
50
gdb/solib.c
|
@ -647,13 +647,6 @@ free_so (struct so_list *so)
|
|||
}
|
||||
|
||||
|
||||
/* Return address of first so_list entry in master shared object list. */
|
||||
struct so_list *
|
||||
master_so_list (void)
|
||||
{
|
||||
return so_list_head;
|
||||
}
|
||||
|
||||
/* Read in symbols for shared object SO. If SYMFILE_VERBOSE is set in FLAGS,
|
||||
be chatty about it. Return true if any symbols were actually loaded. */
|
||||
|
||||
|
@ -713,15 +706,13 @@ solib_read_symbols (struct so_list *so, symfile_add_flags flags)
|
|||
return false;
|
||||
}
|
||||
|
||||
/* Return true if KNOWN->objfile is used by any other so_list object in the
|
||||
SO_LIST_HEAD list. Return false otherwise. */
|
||||
/* Return true if KNOWN->objfile is used by any other so_list object
|
||||
in the list of shared libraries. Return false otherwise. */
|
||||
|
||||
static bool
|
||||
solib_used (const struct so_list *const known)
|
||||
{
|
||||
const struct so_list *pivot;
|
||||
|
||||
for (pivot = so_list_head; pivot != NULL; pivot = pivot->next)
|
||||
for (const struct so_list *pivot : current_program_space->solibs ())
|
||||
if (pivot != known && pivot->objfile == known->objfile)
|
||||
return true;
|
||||
return false;
|
||||
|
@ -784,8 +775,8 @@ update_solib_list (int from_tty)
|
|||
the time we're done walking GDB's list, the inferior's list
|
||||
contains only the new shared objects, which we then add. */
|
||||
|
||||
gdb = so_list_head;
|
||||
gdb_link = &so_list_head;
|
||||
gdb = current_program_space->so_list;
|
||||
gdb_link = ¤t_program_space->so_list;
|
||||
while (gdb)
|
||||
{
|
||||
struct so_list *i = inferior;
|
||||
|
@ -943,8 +934,6 @@ libpthread_solib_p (struct so_list *so)
|
|||
void
|
||||
solib_add (const char *pattern, int from_tty, int readsyms)
|
||||
{
|
||||
struct so_list *gdb;
|
||||
|
||||
if (print_symbol_loading_p (from_tty, 0, 0))
|
||||
{
|
||||
if (pattern != NULL)
|
||||
|
@ -979,7 +968,7 @@ solib_add (const char *pattern, int from_tty, int readsyms)
|
|||
if (from_tty)
|
||||
add_flags |= SYMFILE_VERBOSE;
|
||||
|
||||
for (gdb = so_list_head; gdb; gdb = gdb->next)
|
||||
for (struct so_list *gdb : current_program_space->solibs ())
|
||||
if (! pattern || re_exec (gdb->so_name))
|
||||
{
|
||||
/* Normally, we would read the symbols from that library
|
||||
|
@ -1030,7 +1019,6 @@ solib_add (const char *pattern, int from_tty, int readsyms)
|
|||
static void
|
||||
info_sharedlibrary_command (const char *pattern, int from_tty)
|
||||
{
|
||||
struct so_list *so = NULL; /* link map state variable */
|
||||
bool so_missing_debug_info = false;
|
||||
int addr_width;
|
||||
int nr_libs;
|
||||
|
@ -1053,7 +1041,8 @@ info_sharedlibrary_command (const char *pattern, int from_tty)
|
|||
/* ui_out_emit_table table_emitter needs to know the number of rows,
|
||||
so we need to make two passes over the libs. */
|
||||
|
||||
for (nr_libs = 0, so = so_list_head; so; so = so->next)
|
||||
nr_libs = 0;
|
||||
for (struct so_list *so : current_program_space->solibs ())
|
||||
{
|
||||
if (so->so_name[0])
|
||||
{
|
||||
|
@ -1074,7 +1063,7 @@ info_sharedlibrary_command (const char *pattern, int from_tty)
|
|||
|
||||
uiout->table_body ();
|
||||
|
||||
ALL_SO_LIBS (so)
|
||||
for (struct so_list *so : current_program_space->solibs ())
|
||||
{
|
||||
if (! so->so_name[0])
|
||||
continue;
|
||||
|
@ -1185,11 +1174,11 @@ clear_solib (void)
|
|||
|
||||
disable_breakpoints_in_shlibs ();
|
||||
|
||||
while (so_list_head)
|
||||
while (current_program_space->so_list)
|
||||
{
|
||||
struct so_list *so = so_list_head;
|
||||
struct so_list *so = current_program_space->so_list;
|
||||
|
||||
so_list_head = so->next;
|
||||
current_program_space->so_list = so->next;
|
||||
gdb::observers::solib_unloaded.notify (so);
|
||||
remove_target_sections (so);
|
||||
free_so (so);
|
||||
|
@ -1284,12 +1273,10 @@ handle_solib_event (void)
|
|||
static void
|
||||
reload_shared_libraries_1 (int from_tty)
|
||||
{
|
||||
struct so_list *so;
|
||||
|
||||
if (print_symbol_loading_p (from_tty, 0, 0))
|
||||
printf_unfiltered (_("Loading symbols for shared libraries.\n"));
|
||||
|
||||
for (so = so_list_head; so != NULL; so = so->next)
|
||||
for (struct so_list *so : current_program_space->solibs ())
|
||||
{
|
||||
const char *found_pathname = NULL;
|
||||
bool was_loaded = so->symbols_loaded != 0;
|
||||
|
@ -1552,18 +1539,17 @@ gdb_bfd_lookup_symbol (bfd *abfd,
|
|||
return symaddr;
|
||||
}
|
||||
|
||||
/* SO_LIST_HEAD may contain user-loaded object files that can be removed
|
||||
out-of-band by the user. So upon notification of free_objfile remove
|
||||
all references to any user-loaded file that is about to be freed. */
|
||||
/* The shared library list may contain user-loaded object files that
|
||||
can be removed out-of-band by the user. So upon notification of
|
||||
free_objfile remove all references to any user-loaded file that is
|
||||
about to be freed. */
|
||||
|
||||
static void
|
||||
remove_user_added_objfile (struct objfile *objfile)
|
||||
{
|
||||
struct so_list *so;
|
||||
|
||||
if (objfile != 0 && objfile->flags & OBJF_USERLOADED)
|
||||
{
|
||||
for (so = so_list_head; so != NULL; so = so->next)
|
||||
for (struct so_list *so : current_program_space->solibs ())
|
||||
if (so->objfile == objfile)
|
||||
so->objfile = NULL;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue