Remove ALL_OBJFILES_SAFE

This removes the ALL_OBJFILES_SAFE macro, replacing the uses with
ranged for loops.

gdb/ChangeLog
2019-01-09  Tom Tromey  <tom@tromey.com>

	* common/next-iterator.h (next_adapter): Add Iterator template
	parameter.
	* objfiles.h (ALL_OBJFILES_SAFE): Remove.
	(class all_objfiles_safe): New.
	* jit.c (jit_inferior_exit_hook): Use all_objfiles_safe.
	* objfiles.c (put_objfile_before): Update comment.
	(add_separate_debug_objfile): Likewise.
	(free_all_objfiles): Use all_objfiles_safe.
	(objfile_purge_solibs): Likewise.
This commit is contained in:
Tom Tromey 2018-11-23 17:09:34 -07:00
parent aed57c5371
commit cac85af246
5 changed files with 49 additions and 30 deletions

View file

@ -1,3 +1,15 @@
2019-01-09 Tom Tromey <tom@tromey.com>
* common/next-iterator.h (next_adapter): Add Iterator template
parameter.
* objfiles.h (ALL_OBJFILES_SAFE): Remove.
(class all_objfiles_safe): New.
* jit.c (jit_inferior_exit_hook): Use all_objfiles_safe.
* objfiles.c (put_objfile_before): Update comment.
(add_separate_debug_objfile): Likewise.
(free_all_objfiles): Use all_objfiles_safe.
(objfile_purge_solibs): Likewise.
2019-01-09 Tom Tromey <tom@tromey.com> 2019-01-09 Tom Tromey <tom@tromey.com>
* symtab.c (iterate_over_symtabs, matching_obj_sections) * symtab.c (iterate_over_symtabs, matching_obj_sections)

View file

@ -72,7 +72,7 @@ private:
/* A range adapter that allows iterating over a linked list. */ /* A range adapter that allows iterating over a linked list. */
template<typename T> template<typename T, typename Iterator = next_iterator<T>>
class next_adapter class next_adapter
{ {
public: public:
@ -82,7 +82,7 @@ public:
{ {
} }
using iterator = next_iterator<T>; using iterator = Iterator;
iterator begin () const iterator begin () const
{ {

View file

@ -1393,10 +1393,7 @@ jit_breakpoint_re_set (void)
static void static void
jit_inferior_exit_hook (struct inferior *inf) jit_inferior_exit_hook (struct inferior *inf)
{ {
struct objfile *objf; for (objfile *objf : all_objfiles_safe (current_program_space))
struct objfile *temp;
ALL_OBJFILES_SAFE (objf, temp)
{ {
struct jit_objfile_data *objf_data struct jit_objfile_data *objf_data
= (struct jit_objfile_data *) objfile_data (objf, jit_objfile_data); = (struct jit_objfile_data *) objfile_data (objf, jit_objfile_data);

View file

@ -514,7 +514,7 @@ objfile_separate_debug_iterate (const struct objfile *parent,
/* Put one object file before a specified on in the global list. /* Put one object file before a specified on in the global list.
This can be used to make sure an object file is destroyed before This can be used to make sure an object file is destroyed before
another when using ALL_OBJFILES_SAFE to free all objfiles. */ another when using all_objfiles_safe to free all objfiles. */
void void
put_objfile_before (struct objfile *objfile, struct objfile *before_this) put_objfile_before (struct objfile *objfile, struct objfile *before_this)
{ {
@ -587,7 +587,7 @@ add_separate_debug_objfile (struct objfile *objfile, struct objfile *parent)
parent->separate_debug_objfile = objfile; parent->separate_debug_objfile = objfile;
/* Put the separate debug object before the normal one, this is so that /* Put the separate debug object before the normal one, this is so that
usage of the ALL_OBJFILES_SAFE macro will stay safe. */ usage of all_objfiles_safe will stay safe. */
put_objfile_before (objfile, parent); put_objfile_before (objfile, parent);
} }
@ -730,17 +730,14 @@ objfile::~objfile ()
void void
free_all_objfiles (void) free_all_objfiles (void)
{ {
struct objfile *objfile, *temp;
struct so_list *so; struct so_list *so;
/* Any objfile referencewould become stale. */ /* Any objfile referencewould become stale. */
for (so = master_so_list (); so; so = so->next) for (so = master_so_list (); so; so = so->next)
gdb_assert (so->objfile == NULL); gdb_assert (so->objfile == NULL);
ALL_OBJFILES_SAFE (objfile, temp) for (objfile *objfile : all_objfiles_safe (current_program_space))
{
delete objfile; delete objfile;
}
clear_symtab_users (0); clear_symtab_users (0);
} }
@ -1047,17 +1044,14 @@ have_full_symbols (void)
void void
objfile_purge_solibs (void) objfile_purge_solibs (void)
{ {
struct objfile *objf; for (objfile *objf : all_objfiles_safe (current_program_space))
struct objfile *temp; {
/* We assume that the solib package has been purged already, or will
be soon. */
ALL_OBJFILES_SAFE (objf, temp) if (!(objf->flags & OBJF_USERLOADED) && (objf->flags & OBJF_SHARED))
{ delete objf;
/* We assume that the solib package has been purged already, or will }
be soon. */
if (!(objf->flags & OBJF_USERLOADED) && (objf->flags & OBJF_SHARED))
delete objf;
}
} }

View file

@ -29,6 +29,7 @@
#include "gdb_bfd.h" #include "gdb_bfd.h"
#include <vector> #include <vector>
#include "common/next-iterator.h" #include "common/next-iterator.h"
#include "common/safe-iterator.h"
struct bcache; struct bcache;
struct htab; struct htab;
@ -581,21 +582,36 @@ public:
} }
}; };
/* An iterarable object that can be used to iterate over all
objfiles. The basic use is in a foreach, like:
/* Traverse all object files in the current program space. for (objfile *objf : all_objfiles_safe (pspace)) { ... }
ALL_OBJFILES_SAFE works even if you delete the objfile during the
traversal. */ This variant uses a basic_safe_iterator so that objfiles can be
deleted during iteration. */
class all_objfiles_safe
: public next_adapter<struct objfile,
basic_safe_iterator<next_iterator<objfile>>>
{
public:
explicit all_objfiles_safe (struct program_space *pspace)
: next_adapter<struct objfile,
basic_safe_iterator<next_iterator<objfile>>>
(pspace->objfiles)
{
}
};
/* Traverse all object files in the current program space. */
#define ALL_OBJFILES(obj) \ #define ALL_OBJFILES(obj) \
for ((obj) = current_program_space->objfiles; \ for ((obj) = current_program_space->objfiles; \
(obj) != NULL; \ (obj) != NULL; \
(obj) = (obj)->next) (obj) = (obj)->next)
#define ALL_OBJFILES_SAFE(obj,nxt) \
for ((obj) = current_program_space->objfiles; \
(obj) != NULL? ((nxt)=(obj)->next,1) :0; \
(obj) = (nxt))
/* Traverse all symtabs in one objfile. */ /* Traverse all symtabs in one objfile. */
#define ALL_OBJFILE_FILETABS(objfile, cu, s) \ #define ALL_OBJFILE_FILETABS(objfile, cu, s) \