+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>
* extension.c (extension_languages): Now a std::array.
{
struct ui_out *uiout = current_uiout;
const char *pattern;
- struct so_list *so = NULL;
switch (argc)
{
/* Print the table header. */
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')
continue;
void
program_space::free_all_objfiles ()
{
- struct so_list *so;
-
/* 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);
while (!objfiles_list.empty ())
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,
and the main symbol file. Returns DEST. */
struct address_space;
struct program_space_data;
struct address_space_data;
+struct so_list;
typedef std::list<std::shared_ptr<objfile>> objfile_list;
/* Free all the objfiles associated with this program space. */
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. */
struct program_space *next = NULL;
CORE_ADDR
frv_fdpic_find_global_pointer (CORE_ADDR addr)
{
- struct so_list *so;
-
- so = master_so_list ();
- while (so)
+ for (struct so_list *so : current_program_space->solibs ())
{
int seg;
lm_info_frv *li = (lm_info_frv *) so->lm_info;
&& addr < map->segs[seg].addr + map->segs[seg].p_memsz)
return li->got_value;
}
-
- so = so->next;
}
/* Didn't find it in any of the shared objects. So assume it's in the
in list of shared objects. */
if (addr == 0)
{
- struct so_list *so;
-
- so = master_so_list ();
- while (so)
+ for (struct so_list *so : current_program_space->solibs ())
{
lm_info_frv *li = (lm_info_frv *) so->lm_info;
if (addr != 0)
break;
-
- so = so->next;
}
}
CORE_ADDR
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. */
if (main_lm_addr == 0)
solib_add (0, 0, 1);
/* The other link map addresses may be found by examining the list
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;
CORE_ADDR
svr4_fetch_objfile_link_map (struct objfile *objfile)
{
- struct so_list *so;
struct svr4_info *info = get_svr4_info (objfile->pspace);
/* Cause svr4_current_sos() to be run if it hasn't been already. */
/* The other link map addresses may be found by examining the list
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)
{
lm_info_svr4 *li = (lm_info_svr4 *) so->lm_info;
CORE_ADDR load_addr = 0;
int load_addr_found = 0;
int loader_found_in_list = 0;
- struct so_list *so;
struct target_ops *tmp_bfd_target;
sym_addr = 0;
/* On a running target, we can get the dynamic linker's base
address from the shared library table. */
- so = master_so_list ();
- while (so)
+ for (struct so_list *so : current_program_space->solibs ())
{
if (svr4_same_1 (interp_name, so->so_original_name))
{
load_addr = lm_addr_check (so, tmp_bfd.get ());
break;
}
- so = so->next;
}
/* If we were not able to find the base address of the loader
}
-/* 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. */
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;
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;
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)
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
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;
/* 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])
{
uiout->table_body ();
- ALL_SO_LIBS (so)
+ for (struct so_list *so : current_program_space->solibs ())
{
if (! so->so_name[0])
continue;
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);
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;
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;
}
#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
as well. */
/* Synchronize GDB's shared object list with inferior's.
Extract the list of currently loaded shared objects from the
- inferior, and compare it with the list of shared objects currently
- in GDB's so_list_head list. Edit so_list_head to bring it in sync
- with the inferior's new list.
+ inferior, and compare it with the list of shared objects in the
+ current program space's list of shared libraries. Edit
+ 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,
free any symbolic info GDB had read about those shared objects.
#include "symtab.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. */
struct lm_info_base
/* A unique pointer to a so_list. */
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. */
extern gdb::unique_xmalloc_ptr<char> exec_file_find (const char *in_pathname,
int *fd);