summaryrefslogtreecommitdiff
path: root/gdb
diff options
context:
space:
mode:
authorDoug Evans <dje@google.com>2010-10-07 17:02:06 +0000
committerDoug Evans <dje@google.com>2010-10-07 17:02:06 +0000
commit6f62fad7e30dbb269e40bd71957e88e35e4c1d90 (patch)
treec07674aedb731c89c8e1e51a0d60a388c0c41261 /gdb
parent0e7a75f6f7e3894d9574bb5e3b0fe9ca5e2ea0e6 (diff)
downloadgdb-6f62fad7e30dbb269e40bd71957e88e35e4c1d90.tar.gz
* addrmap.h (addrmap_foreach_fn): New typedef.
(addrmap_foreach): Declare. * addrmap.c (struct addrmap_funcs): New member foreach. (addrmap_foreach): New function. (addrmap_fixed_foreach): New function. (addrmap_fixed_funcs): Update. (struct mutable_foreach_data): New struct. (addrmap_mutable_foreach_worker): New function. (addrmap_mutable_foreach): New function. (addrmap_mutable_funcs): Update.
Diffstat (limited to 'gdb')
-rw-r--r--gdb/ChangeLog13
-rw-r--r--gdb/addrmap.c66
-rw-r--r--gdb/addrmap.h11
3 files changed, 88 insertions, 2 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index cb316143a53..67f13f0b0e1 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,16 @@
+2010-10-07 Doug Evans <dje@google.com>
+
+ * addrmap.h (addrmap_foreach_fn): New typedef.
+ (addrmap_foreach): Declare.
+ * addrmap.c (struct addrmap_funcs): New member foreach.
+ (addrmap_foreach): New function.
+ (addrmap_fixed_foreach): New function.
+ (addrmap_fixed_funcs): Update.
+ (struct mutable_foreach_data): New struct.
+ (addrmap_mutable_foreach_worker): New function.
+ (addrmap_mutable_foreach): New function.
+ (addrmap_mutable_funcs): Update.
+
2010-10-07 Paul Hilfinger <hilfinger@adacore.com>
* dictionary.c (dict_hash): Revert to msymbol_hash_iw in
diff --git a/gdb/addrmap.c b/gdb/addrmap.c
index 30ec1ef57b2..2d4750bd3ed 100644
--- a/gdb/addrmap.c
+++ b/gdb/addrmap.c
@@ -41,6 +41,7 @@ struct addrmap_funcs
struct addrmap *(*create_fixed) (struct addrmap *this,
struct obstack *obstack);
void (*relocate) (struct addrmap *this, CORE_ADDR offset);
+ int (*foreach) (struct addrmap *this, addrmap_foreach_fn fn, void *data);
};
@@ -82,6 +83,11 @@ addrmap_relocate (struct addrmap *map, CORE_ADDR offset)
}
+int
+addrmap_foreach (struct addrmap *map, addrmap_foreach_fn fn, void *data)
+{
+ return map->funcs->foreach (map, fn, data);
+}
/* Fixed address maps. */
@@ -175,12 +181,32 @@ addrmap_fixed_relocate (struct addrmap *this, CORE_ADDR offset)
}
+static int
+addrmap_fixed_foreach (struct addrmap *this, addrmap_foreach_fn fn,
+ void *data)
+{
+ struct addrmap_fixed *map = (struct addrmap_fixed *) this;
+ size_t i;
+
+ for (i = 0; i < map->num_transitions; i++)
+ {
+ int res = fn (data, map->transitions[i].addr, map->transitions[i].value);
+
+ if (res != 0)
+ return res;
+ }
+
+ return 0;
+}
+
+
static const struct addrmap_funcs addrmap_fixed_funcs =
{
addrmap_fixed_set_empty,
addrmap_fixed_find,
addrmap_fixed_create_fixed,
- addrmap_fixed_relocate
+ addrmap_fixed_relocate,
+ addrmap_fixed_foreach
};
@@ -444,12 +470,48 @@ addrmap_mutable_relocate (struct addrmap *this, CORE_ADDR offset)
}
+/* Struct to map addrmap's foreach function to splay_tree's version. */
+struct mutable_foreach_data
+{
+ addrmap_foreach_fn fn;
+ void *data;
+};
+
+
+/* This is a splay_tree_foreach_fn. */
+
+static int
+addrmap_mutable_foreach_worker (splay_tree_node node, void *data)
+{
+ struct mutable_foreach_data *foreach_data = data;
+
+ return foreach_data->fn (foreach_data->data,
+ addrmap_node_key (node),
+ addrmap_node_value (node));
+}
+
+
+static int
+addrmap_mutable_foreach (struct addrmap *this, addrmap_foreach_fn fn,
+ void *data)
+{
+ struct addrmap_mutable *mutable = (struct addrmap_mutable *) this;
+ struct mutable_foreach_data foreach_data;
+
+ foreach_data.fn = fn;
+ foreach_data.data = data;
+ return splay_tree_foreach (mutable->tree, addrmap_mutable_foreach_worker,
+ &foreach_data);
+}
+
+
static const struct addrmap_funcs addrmap_mutable_funcs =
{
addrmap_mutable_set_empty,
addrmap_mutable_find,
addrmap_mutable_create_fixed,
- addrmap_mutable_relocate
+ addrmap_mutable_relocate,
+ addrmap_mutable_foreach
};
diff --git a/gdb/addrmap.h b/gdb/addrmap.h
index 96d4e08a807..7ec5447ce5e 100644
--- a/gdb/addrmap.h
+++ b/gdb/addrmap.h
@@ -91,4 +91,15 @@ struct addrmap *addrmap_create_fixed (struct addrmap *original,
to either mutable or immutable maps.) */
void addrmap_relocate (struct addrmap *map, CORE_ADDR offset);
+/* The type of a function used to iterate over the map.
+ OBJ is NULL for unmapped regions. */
+typedef int (*addrmap_foreach_fn) (void *data, CORE_ADDR start_addr,
+ void *obj);
+
+/* Call FN, passing it DATA, for every address in MAP, following an
+ in-order traversal. If FN ever returns a non-zero value, the
+ iteration ceases immediately, and the value is returned.
+ Otherwise, this function returns 0. */
+int addrmap_foreach (struct addrmap *map, addrmap_foreach_fn fn, void *data);
+
#endif /* ADDRMAP_H */