146 lines
3.7 KiB
Diff
146 lines
3.7 KiB
Diff
|
http://sourceware.org/ml/gdb-cvs/2010-10/msg00048.html
|
|||
|
|
|||
|
### src/gdb/ChangeLog 2010/10/07 08:32:36 1.12241
|
|||
|
### src/gdb/ChangeLog 2010/10/07 17:02:06 1.12242
|
|||
|
## -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
|
|||
|
--- src/gdb/addrmap.c 2010/05/18 19:23:37 1.8
|
|||
|
+++ src/gdb/addrmap.c 2010/10/07 17:02:14 1.9
|
|||
|
@@ -41,6 +41,7 @@
|
|||
|
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 @@
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
+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 @@
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
+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 @@
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
+/* 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
|
|||
|
};
|
|||
|
|
|||
|
|
|||
|
--- src/gdb/addrmap.h 2010/01/01 07:31:29 1.5
|
|||
|
+++ src/gdb/addrmap.h 2010/10/07 17:02:14 1.6
|
|||
|
@@ -91,4 +91,15 @@
|
|||
|
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 */
|