From a1fd1ac9def557cbb7570cf90178a00cb26e7fef Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Fri, 8 May 2020 14:21:22 -0600 Subject: [PATCH] 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 * 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) : 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. --- gdb/ChangeLog | 20 ++++++++++++++++++ gdb/mi/mi-cmd-file.c | 3 +-- gdb/progspace.c | 12 ++++++++--- gdb/progspace.h | 7 +++++++ gdb/solib-frv.c | 18 +++------------- gdb/solib-svr4.c | 8 ++----- gdb/solib.c | 50 ++++++++++++++++---------------------------- gdb/solib.h | 9 +++----- gdb/solist.h | 8 ------- 9 files changed, 63 insertions(+), 72 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index be55c41d67..3badfbd2d8 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,23 @@ +2020-05-08 Tom Tromey + + * 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) : 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 * extension.c (extension_languages): Now a std::array. diff --git a/gdb/mi/mi-cmd-file.c b/gdb/mi/mi-cmd-file.c index b5835a52bf..3b0261c6c9 100644 --- a/gdb/mi/mi-cmd-file.c +++ b/gdb/mi/mi-cmd-file.c @@ -121,7 +121,6 @@ mi_cmd_file_list_shared_libraries (const char *command, char **argv, int argc) { struct ui_out *uiout = current_uiout; const char *pattern; - struct so_list *so = NULL; switch (argc) { @@ -148,7 +147,7 @@ mi_cmd_file_list_shared_libraries (const char *command, char **argv, int 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; diff --git a/gdb/progspace.c b/gdb/progspace.c index 6419f01770..252b62e02d 100644 --- a/gdb/progspace.c +++ b/gdb/progspace.c @@ -192,10 +192,8 @@ program_space::~program_space () 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 ()) @@ -239,6 +237,14 @@ program_space::remove_objfile (struct objfile *objfile) symfile_object_file = NULL; } +/* See progspace.h. */ + +next_adapter +program_space::solibs () const +{ + return next_adapter (this->so_list); +} + /* Copies program space SRC to DEST. Copies the main executable file, and the main symbol file. Returns DEST. */ diff --git a/gdb/progspace.h b/gdb/progspace.h index 2b887847e1..0e32224f02 100644 --- a/gdb/progspace.h +++ b/gdb/progspace.h @@ -37,6 +37,7 @@ struct exec; struct address_space; struct program_space_data; struct address_space_data; +struct so_list; typedef std::list> objfile_list; @@ -264,6 +265,12 @@ struct program_space /* 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 solibs () const; + /* Pointer to next in linked list. */ struct program_space *next = NULL; diff --git a/gdb/solib-frv.c b/gdb/solib-frv.c index 582f2d5ede..62e7b05b49 100644 --- a/gdb/solib-frv.c +++ b/gdb/solib-frv.c @@ -908,10 +908,7 @@ main_got (void) 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; @@ -923,8 +920,6 @@ frv_fdpic_find_global_pointer (CORE_ADDR addr) && 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 @@ -969,10 +964,7 @@ frv_fdpic_find_canonical_descriptor (CORE_ADDR entry_point) 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; @@ -981,8 +973,6 @@ frv_fdpic_find_canonical_descriptor (CORE_ADDR entry_point) if (addr != 0) break; - - so = so->next; } } @@ -1116,8 +1106,6 @@ find_canonical_descriptor_in_load_object 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); @@ -1128,7 +1116,7 @@ frv_fetch_objfile_link_map (struct objfile *objfile) /* 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; diff --git a/gdb/solib-svr4.c b/gdb/solib-svr4.c index 38c832f8f5..19d1105ae9 100644 --- a/gdb/solib-svr4.c +++ b/gdb/solib-svr4.c @@ -1537,7 +1537,6 @@ svr4_current_sos (void) 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. */ @@ -1555,7 +1554,7 @@ svr4_fetch_objfile_link_map (struct objfile *objfile) /* 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; @@ -2307,7 +2306,6 @@ enable_break (struct svr4_info *info, int from_tty) 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; @@ -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 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)) { @@ -2350,7 +2347,6 @@ enable_break (struct svr4_info *info, int from_tty) 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 diff --git a/gdb/solib.c b/gdb/solib.c index ba388d77e8..cd410bb9e3 100644 --- a/gdb/solib.c +++ b/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; } diff --git a/gdb/solib.h b/gdb/solib.h index 2628ca0c2b..801965fcd5 100644 --- a/gdb/solib.h +++ b/gdb/solib.h @@ -28,9 +28,6 @@ struct program_space; #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. */ @@ -81,9 +78,9 @@ extern void set_solib_ops (struct gdbarch *gdbarch, /* 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. diff --git a/gdb/solist.h b/gdb/solist.h index 068aeba2f0..0360d342ae 100644 --- a/gdb/solist.h +++ b/gdb/solist.h @@ -24,11 +24,6 @@ #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 @@ -183,9 +178,6 @@ struct so_deleter /* A unique pointer to a so_list. */ typedef std::unique_ptr 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 exec_file_find (const char *in_pathname, int *fd);