* 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.
This commit is contained in:
Doug Evans 2010-10-07 17:02:14 +00:00
parent 94e482001f
commit 855c153ff2
3 changed files with 88 additions and 2 deletions

View File

@ -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

View File

@ -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
};

View File

@ -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 */