aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Tromey <tom@tromey.com>2018-11-23 17:09:34 -0700
committerTom Tromey <tom@tromey.com>2019-01-09 18:28:14 -0700
commitcac85af2467c9bac326b397b150274d95d2916a5 (patch)
tree1e9c3722cd2e1592218f8dc5c7e31a154d848a3e
parentaed57c537116ae91f553ac835b3f96d1f87b3bb0 (diff)
downloadgdb-cac85af2467c9bac326b397b150274d95d2916a5.zip
gdb-cac85af2467c9bac326b397b150274d95d2916a5.tar.gz
gdb-cac85af2467c9bac326b397b150274d95d2916a5.tar.bz2
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.
-rw-r--r--gdb/ChangeLog12
-rw-r--r--gdb/common/next-iterator.h4
-rw-r--r--gdb/jit.c5
-rw-r--r--gdb/objfiles.c26
-rw-r--r--gdb/objfiles.h32
5 files changed, 49 insertions, 30 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 00160cf..e51c19c 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,17 @@
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>
+
* symtab.c (iterate_over_symtabs, matching_obj_sections)
(expand_symtab_containing_pc, lookup_static_symbol)
(basic_lookup_transparent_type, find_pc_sect_compunit_symtab)
diff --git a/gdb/common/next-iterator.h b/gdb/common/next-iterator.h
index 588ebfd..b61b253 100644
--- a/gdb/common/next-iterator.h
+++ b/gdb/common/next-iterator.h
@@ -72,7 +72,7 @@ private:
/* A range adapter that allows iterating over a linked list. */
-template<typename T>
+template<typename T, typename Iterator = next_iterator<T>>
class next_adapter
{
public:
@@ -82,7 +82,7 @@ public:
{
}
- using iterator = next_iterator<T>;
+ using iterator = Iterator;
iterator begin () const
{
diff --git a/gdb/jit.c b/gdb/jit.c
index e77c03a..8b7f715 100644
--- a/gdb/jit.c
+++ b/gdb/jit.c
@@ -1393,10 +1393,7 @@ jit_breakpoint_re_set (void)
static void
jit_inferior_exit_hook (struct inferior *inf)
{
- struct objfile *objf;
- struct objfile *temp;
-
- ALL_OBJFILES_SAFE (objf, temp)
+ for (objfile *objf : all_objfiles_safe (current_program_space))
{
struct jit_objfile_data *objf_data
= (struct jit_objfile_data *) objfile_data (objf, jit_objfile_data);
diff --git a/gdb/objfiles.c b/gdb/objfiles.c
index c9a727a..5d46e69 100644
--- a/gdb/objfiles.c
+++ b/gdb/objfiles.c
@@ -514,7 +514,7 @@ objfile_separate_debug_iterate (const struct objfile *parent,
/* 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
- another when using ALL_OBJFILES_SAFE to free all objfiles. */
+ another when using all_objfiles_safe to free all objfiles. */
void
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;
/* 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);
}
@@ -730,17 +730,14 @@ objfile::~objfile ()
void
free_all_objfiles (void)
{
- struct objfile *objfile, *temp;
struct so_list *so;
/* Any objfile referencewould become stale. */
for (so = master_so_list (); so; so = so->next)
gdb_assert (so->objfile == NULL);
- ALL_OBJFILES_SAFE (objfile, temp)
- {
+ for (objfile *objfile : all_objfiles_safe (current_program_space))
delete objfile;
- }
clear_symtab_users (0);
}
@@ -1047,17 +1044,14 @@ have_full_symbols (void)
void
objfile_purge_solibs (void)
{
- struct objfile *objf;
- struct objfile *temp;
-
- ALL_OBJFILES_SAFE (objf, temp)
- {
- /* We assume that the solib package has been purged already, or will
- be soon. */
+ for (objfile *objf : all_objfiles_safe (current_program_space))
+ {
+ /* 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;
- }
+ if (!(objf->flags & OBJF_USERLOADED) && (objf->flags & OBJF_SHARED))
+ delete objf;
+ }
}
diff --git a/gdb/objfiles.h b/gdb/objfiles.h
index 512869f..cb3668a 100644
--- a/gdb/objfiles.h
+++ b/gdb/objfiles.h
@@ -29,6 +29,7 @@
#include "gdb_bfd.h"
#include <vector>
#include "common/next-iterator.h"
+#include "common/safe-iterator.h"
struct bcache;
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.
- ALL_OBJFILES_SAFE works even if you delete the objfile during the
- traversal. */
+ for (objfile *objf : all_objfiles_safe (pspace)) { ... }
+
+ 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) \
for ((obj) = current_program_space->objfiles; \
(obj) != NULL; \
(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. */
#define ALL_OBJFILE_FILETABS(objfile, cu, s) \