diff options
author | Doug Evans <dje@google.com> | 2010-10-07 17:02:14 +0000 |
---|---|---|
committer | Doug Evans <dje@google.com> | 2010-10-07 17:02:14 +0000 |
commit | 855c153ff2998d1b306a15a8e01ad9ea26e47532 (patch) | |
tree | 09f618ea7194ebb38123a53d670a35a9ab60a6ec | |
parent | 94e482001fa9d7a85e52f0be277cac380243a74e (diff) | |
download | gdb-855c153ff2998d1b306a15a8e01ad9ea26e47532.zip gdb-855c153ff2998d1b306a15a8e01ad9ea26e47532.tar.gz gdb-855c153ff2998d1b306a15a8e01ad9ea26e47532.tar.bz2 |
* 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.
-rw-r--r-- | gdb/ChangeLog | 13 | ||||
-rw-r--r-- | gdb/addrmap.c | 66 | ||||
-rw-r--r-- | gdb/addrmap.h | 11 |
3 files changed, 88 insertions, 2 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index cb31614..67f13f0 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 30ec1ef..2d4750b 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 96d4e08..7ec5447 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 */ |