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:
Tom Tromey 2020-05-08 14:21:22 -06:00 committed by Tom Tromey
parent 38eae08459
commit a1fd1ac9de
9 changed files with 63 additions and 72 deletions

View File

@ -1,3 +1,23 @@
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.
2020-05-08 Tom Tromey <tom@tromey.com> 2020-05-08 Tom Tromey <tom@tromey.com>
* extension.c (extension_languages): Now a std::array. * extension.c (extension_languages): Now a std::array.

View File

@ -121,7 +121,6 @@ mi_cmd_file_list_shared_libraries (const char *command, char **argv, int argc)
{ {
struct ui_out *uiout = current_uiout; struct ui_out *uiout = current_uiout;
const char *pattern; const char *pattern;
struct so_list *so = NULL;
switch (argc) switch (argc)
{ {
@ -148,7 +147,7 @@ mi_cmd_file_list_shared_libraries (const char *command, char **argv, int argc)
/* Print the table header. */ /* Print the table header. */
ui_out_emit_list list_emitter (uiout, "shared-libraries"); ui_out_emit_list list_emitter (uiout, "shared-libraries");
ALL_SO_LIBS (so) for (struct so_list *so : current_program_space->solibs ())
{ {
if (so->so_name[0] == '\0') if (so->so_name[0] == '\0')
continue; continue;

View File

@ -192,10 +192,8 @@ program_space::~program_space ()
void void
program_space::free_all_objfiles () program_space::free_all_objfiles ()
{ {
struct so_list *so;
/* Any objfile reference would become stale. */ /* Any objfile reference would become stale. */
for (so = master_so_list (); so; so = so->next) for (struct so_list *so : current_program_space->solibs ())
gdb_assert (so->objfile == NULL); gdb_assert (so->objfile == NULL);
while (!objfiles_list.empty ()) while (!objfiles_list.empty ())
@ -239,6 +237,14 @@ program_space::remove_objfile (struct objfile *objfile)
symfile_object_file = NULL; symfile_object_file = NULL;
} }
/* See progspace.h. */
next_adapter<struct so_list>
program_space::solibs () const
{
return next_adapter<struct so_list> (this->so_list);
}
/* Copies program space SRC to DEST. Copies the main executable file, /* Copies program space SRC to DEST. Copies the main executable file,
and the main symbol file. Returns DEST. */ and the main symbol file. Returns DEST. */

View File

@ -37,6 +37,7 @@ struct exec;
struct address_space; struct address_space;
struct program_space_data; struct program_space_data;
struct address_space_data; struct address_space_data;
struct so_list;
typedef std::list<std::shared_ptr<objfile>> objfile_list; typedef std::list<std::shared_ptr<objfile>> objfile_list;
@ -264,6 +265,12 @@ struct program_space
/* Free all the objfiles associated with this program space. */ /* Free all the objfiles associated with this program space. */
void free_all_objfiles (); void free_all_objfiles ();
/* Return a range adapter for iterating over all the solibs in this
program space. Use it like:
for (so_list *so : pspace->solibs ()) { ... } */
next_adapter<struct so_list> solibs () const;
/* Pointer to next in linked list. */ /* Pointer to next in linked list. */
struct program_space *next = NULL; struct program_space *next = NULL;

View File

@ -908,10 +908,7 @@ main_got (void)
CORE_ADDR CORE_ADDR
frv_fdpic_find_global_pointer (CORE_ADDR addr) frv_fdpic_find_global_pointer (CORE_ADDR addr)
{ {
struct so_list *so; for (struct so_list *so : current_program_space->solibs ())
so = master_so_list ();
while (so)
{ {
int seg; int seg;
lm_info_frv *li = (lm_info_frv *) so->lm_info; lm_info_frv *li = (lm_info_frv *) so->lm_info;
@ -923,8 +920,6 @@ frv_fdpic_find_global_pointer (CORE_ADDR addr)
&& addr < map->segs[seg].addr + map->segs[seg].p_memsz) && addr < map->segs[seg].addr + map->segs[seg].p_memsz)
return li->got_value; return li->got_value;
} }
so = so->next;
} }
/* Didn't find it in any of the shared objects. So assume it's in the /* Didn't find it in any of the shared objects. So assume it's in the
@ -969,10 +964,7 @@ frv_fdpic_find_canonical_descriptor (CORE_ADDR entry_point)
in list of shared objects. */ in list of shared objects. */
if (addr == 0) if (addr == 0)
{ {
struct so_list *so; for (struct so_list *so : current_program_space->solibs ())
so = master_so_list ();
while (so)
{ {
lm_info_frv *li = (lm_info_frv *) so->lm_info; lm_info_frv *li = (lm_info_frv *) so->lm_info;
@ -981,8 +973,6 @@ frv_fdpic_find_canonical_descriptor (CORE_ADDR entry_point)
if (addr != 0) if (addr != 0)
break; break;
so = so->next;
} }
} }
@ -1116,8 +1106,6 @@ find_canonical_descriptor_in_load_object
CORE_ADDR CORE_ADDR
frv_fetch_objfile_link_map (struct objfile *objfile) frv_fetch_objfile_link_map (struct objfile *objfile)
{ {
struct so_list *so;
/* Cause frv_current_sos() to be run if it hasn't been already. */ /* Cause frv_current_sos() to be run if it hasn't been already. */
if (main_lm_addr == 0) if (main_lm_addr == 0)
solib_add (0, 0, 1); solib_add (0, 0, 1);
@ -1128,7 +1116,7 @@ frv_fetch_objfile_link_map (struct objfile *objfile)
/* The other link map addresses may be found by examining the list /* The other link map addresses may be found by examining the list
of shared libraries. */ of shared libraries. */
for (so = master_so_list (); so; so = so->next) for (struct so_list *so : current_program_space->solibs ())
{ {
lm_info_frv *li = (lm_info_frv *) so->lm_info; lm_info_frv *li = (lm_info_frv *) so->lm_info;

View File

@ -1537,7 +1537,6 @@ svr4_current_sos (void)
CORE_ADDR CORE_ADDR
svr4_fetch_objfile_link_map (struct objfile *objfile) svr4_fetch_objfile_link_map (struct objfile *objfile)
{ {
struct so_list *so;
struct svr4_info *info = get_svr4_info (objfile->pspace); struct svr4_info *info = get_svr4_info (objfile->pspace);
/* Cause svr4_current_sos() to be run if it hasn't been already. */ /* Cause svr4_current_sos() to be run if it hasn't been already. */
@ -1555,7 +1554,7 @@ svr4_fetch_objfile_link_map (struct objfile *objfile)
/* The other link map addresses may be found by examining the list /* The other link map addresses may be found by examining the list
of shared libraries. */ of shared libraries. */
for (so = master_so_list (); so; so = so->next) for (struct so_list *so : current_program_space->solibs ())
if (so->objfile == objfile) if (so->objfile == objfile)
{ {
lm_info_svr4 *li = (lm_info_svr4 *) so->lm_info; lm_info_svr4 *li = (lm_info_svr4 *) so->lm_info;
@ -2307,7 +2306,6 @@ enable_break (struct svr4_info *info, int from_tty)
CORE_ADDR load_addr = 0; CORE_ADDR load_addr = 0;
int load_addr_found = 0; int load_addr_found = 0;
int loader_found_in_list = 0; int loader_found_in_list = 0;
struct so_list *so;
struct target_ops *tmp_bfd_target; struct target_ops *tmp_bfd_target;
sym_addr = 0; sym_addr = 0;
@ -2340,8 +2338,7 @@ enable_break (struct svr4_info *info, int from_tty)
/* On a running target, we can get the dynamic linker's base /* On a running target, we can get the dynamic linker's base
address from the shared library table. */ address from the shared library table. */
so = master_so_list (); for (struct so_list *so : current_program_space->solibs ())
while (so)
{ {
if (svr4_same_1 (interp_name, so->so_original_name)) if (svr4_same_1 (interp_name, so->so_original_name))
{ {
@ -2350,7 +2347,6 @@ enable_break (struct svr4_info *info, int from_tty)
load_addr = lm_addr_check (so, tmp_bfd.get ()); load_addr = lm_addr_check (so, tmp_bfd.get ());
break; break;
} }
so = so->next;
} }
/* If we were not able to find the base address of the loader /* If we were not able to find the base address of the loader

View File

@ -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, /* 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. */ 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 false;
} }
/* Return true if KNOWN->objfile is used by any other so_list object in the /* Return true if KNOWN->objfile is used by any other so_list object
SO_LIST_HEAD list. Return false otherwise. */ in the list of shared libraries. Return false otherwise. */
static bool static bool
solib_used (const struct so_list *const known) solib_used (const struct so_list *const known)
{ {
const struct so_list *pivot; for (const struct so_list *pivot : current_program_space->solibs ())
for (pivot = so_list_head; pivot != NULL; pivot = pivot->next)
if (pivot != known && pivot->objfile == known->objfile) if (pivot != known && pivot->objfile == known->objfile)
return true; return true;
return false; 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 the time we're done walking GDB's list, the inferior's list
contains only the new shared objects, which we then add. */ contains only the new shared objects, which we then add. */
gdb = so_list_head; gdb = current_program_space->so_list;
gdb_link = &so_list_head; gdb_link = &current_program_space->so_list;
while (gdb) while (gdb)
{ {
struct so_list *i = inferior; struct so_list *i = inferior;
@ -943,8 +934,6 @@ libpthread_solib_p (struct so_list *so)
void void
solib_add (const char *pattern, int from_tty, int readsyms) solib_add (const char *pattern, int from_tty, int readsyms)
{ {
struct so_list *gdb;
if (print_symbol_loading_p (from_tty, 0, 0)) if (print_symbol_loading_p (from_tty, 0, 0))
{ {
if (pattern != NULL) if (pattern != NULL)
@ -979,7 +968,7 @@ solib_add (const char *pattern, int from_tty, int readsyms)
if (from_tty) if (from_tty)
add_flags |= SYMFILE_VERBOSE; 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)) if (! pattern || re_exec (gdb->so_name))
{ {
/* Normally, we would read the symbols from that library /* 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 static void
info_sharedlibrary_command (const char *pattern, int from_tty) info_sharedlibrary_command (const char *pattern, int from_tty)
{ {
struct so_list *so = NULL; /* link map state variable */
bool so_missing_debug_info = false; bool so_missing_debug_info = false;
int addr_width; int addr_width;
int nr_libs; 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, /* ui_out_emit_table table_emitter needs to know the number of rows,
so we need to make two passes over the libs. */ 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]) if (so->so_name[0])
{ {
@ -1074,7 +1063,7 @@ info_sharedlibrary_command (const char *pattern, int from_tty)
uiout->table_body (); uiout->table_body ();
ALL_SO_LIBS (so) for (struct so_list *so : current_program_space->solibs ())
{ {
if (! so->so_name[0]) if (! so->so_name[0])
continue; continue;
@ -1185,11 +1174,11 @@ clear_solib (void)
disable_breakpoints_in_shlibs (); 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); gdb::observers::solib_unloaded.notify (so);
remove_target_sections (so); remove_target_sections (so);
free_so (so); free_so (so);
@ -1284,12 +1273,10 @@ handle_solib_event (void)
static void static void
reload_shared_libraries_1 (int from_tty) reload_shared_libraries_1 (int from_tty)
{ {
struct so_list *so;
if (print_symbol_loading_p (from_tty, 0, 0)) if (print_symbol_loading_p (from_tty, 0, 0))
printf_unfiltered (_("Loading symbols for shared libraries.\n")); 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; const char *found_pathname = NULL;
bool was_loaded = so->symbols_loaded != 0; bool was_loaded = so->symbols_loaded != 0;
@ -1552,18 +1539,17 @@ gdb_bfd_lookup_symbol (bfd *abfd,
return symaddr; return symaddr;
} }
/* SO_LIST_HEAD may contain user-loaded object files that can be removed /* The shared library list may contain user-loaded object files that
out-of-band by the user. So upon notification of free_objfile remove can be removed out-of-band by the user. So upon notification of
all references to any user-loaded file that is about to be freed. */ free_objfile remove all references to any user-loaded file that is
about to be freed. */
static void static void
remove_user_added_objfile (struct objfile *objfile) remove_user_added_objfile (struct objfile *objfile)
{ {
struct so_list *so;
if (objfile != 0 && objfile->flags & OBJF_USERLOADED) 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) if (so->objfile == objfile)
so->objfile = NULL; so->objfile = NULL;
} }

View File

@ -28,9 +28,6 @@ struct program_space;
#include "symfile-add-flags.h" #include "symfile-add-flags.h"
/* List of known shared objects */
#define so_list_head current_program_space->so_list
/* Called when we free all symtabs, to free the shared library information /* Called when we free all symtabs, to free the shared library information
as well. */ as well. */
@ -81,9 +78,9 @@ extern void set_solib_ops (struct gdbarch *gdbarch,
/* Synchronize GDB's shared object list with inferior's. /* Synchronize GDB's shared object list with inferior's.
Extract the list of currently loaded shared objects from the Extract the list of currently loaded shared objects from the
inferior, and compare it with the list of shared objects currently inferior, and compare it with the list of shared objects in the
in GDB's so_list_head list. Edit so_list_head to bring it in sync current program space's list of shared libraries. Edit
with the inferior's new list. so_list_head to bring it in sync with the inferior's new list.
If we notice that the inferior has unloaded some shared objects, If we notice that the inferior has unloaded some shared objects,
free any symbolic info GDB had read about those shared objects. free any symbolic info GDB had read about those shared objects.

View File

@ -24,11 +24,6 @@
#include "symtab.h" #include "symtab.h"
#include "gdb_bfd.h" #include "gdb_bfd.h"
#define ALL_SO_LIBS(so) \
for (so = so_list_head; \
so != NULL; \
so = so->next)
/* Base class for target-specific link map information. */ /* Base class for target-specific link map information. */
struct lm_info_base struct lm_info_base
@ -183,9 +178,6 @@ struct so_deleter
/* A unique pointer to a so_list. */ /* A unique pointer to a so_list. */
typedef std::unique_ptr<so_list, so_deleter> so_list_up; typedef std::unique_ptr<so_list, so_deleter> so_list_up;
/* Return address of first so_list entry in master shared object list. */
struct so_list *master_so_list (void);
/* Find main executable binary file. */ /* Find main executable binary file. */
extern gdb::unique_xmalloc_ptr<char> exec_file_find (const char *in_pathname, extern gdb::unique_xmalloc_ptr<char> exec_file_find (const char *in_pathname,
int *fd); int *fd);