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:
parent
aed57c5371
commit
cac85af246
5 changed files with 49 additions and 30 deletions
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
{
|
{
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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) \
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue