/* addrmap.c --- implementation of address map data structure.
- Copyright (C) 2007 Free Software Foundation, Inc.
+ Copyright (C) 2007-2014 Free Software Foundation, Inc.
This file is part of GDB.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
+ the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA. */
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
#include "defs.h"
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);
};
struct addrmap
{
- struct addrmap_funcs *funcs;
+ const struct addrmap_funcs *funcs;
};
}
+int
+addrmap_foreach (struct addrmap *map, addrmap_foreach_fn fn, void *data)
+{
+ return map->funcs->foreach (map, fn, data);
+}
\f
/* Fixed address maps. */
static struct addrmap *
addrmap_fixed_create_fixed (struct addrmap *this, struct obstack *obstack)
{
- abort ();
+ internal_error (__FILE__, __LINE__,
+ _("addrmap_create_fixed is not implemented yet "
+ "for fixed addrmaps"));
}
}
-static struct addrmap_funcs addrmap_fixed_funcs =
+static int
+addrmap_fixed_foreach (struct addrmap *this, addrmap_foreach_fn fn,
+ void *data)
{
- .set_empty = addrmap_fixed_set_empty,
- .find = addrmap_fixed_find,
- .create_fixed = addrmap_fixed_create_fixed,
- .relocate = addrmap_fixed_relocate
+ 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_foreach
};
allocate_key (struct addrmap_mutable *map, CORE_ADDR addr)
{
CORE_ADDR *key = obstack_alloc (map->obstack, sizeof (*key));
- *key = addr;
+ *key = addr;
return (splay_tree_key) key;
}
}
+static void
+addrmap_splay_tree_remove (struct addrmap_mutable *map, CORE_ADDR addr)
+{
+ splay_tree_remove (map->tree, (splay_tree_key) &addr);
+}
+
+
static CORE_ADDR
addrmap_node_key (splay_tree_node node)
{
static void
-addrmap_splay_tree_insert (struct addrmap_mutable *map, CORE_ADDR key, void *value)
+addrmap_splay_tree_insert (struct addrmap_mutable *map,
+ CORE_ADDR key, void *value)
{
splay_tree_insert (map->tree,
allocate_key (map, key),
{
next = addrmap_splay_tree_successor (map, addrmap_node_key (n));
if (addrmap_node_value (n) == prior_value)
- splay_tree_remove (map->tree, addrmap_node_key (n));
+ addrmap_splay_tree_remove (map, addrmap_node_key (n));
else
prior_value = addrmap_node_value (n);
}
addrmap_mutable_find (struct addrmap *this, CORE_ADDR addr)
{
/* Not needed yet. */
- abort ();
+ internal_error (__FILE__, __LINE__,
+ _("addrmap_find is not implemented yet "
+ "for mutable addrmaps"));
}
addrmap_mutable_relocate (struct addrmap *this, CORE_ADDR offset)
{
/* Not needed yet. */
- abort ();
+ internal_error (__FILE__, __LINE__,
+ _("addrmap_relocate is not implemented yet "
+ "for mutable addrmaps"));
+}
+
+
+/* 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 struct addrmap_funcs addrmap_mutable_funcs =
+static int
+addrmap_mutable_foreach (struct addrmap *this, addrmap_foreach_fn fn,
+ void *data)
{
- .set_empty = addrmap_mutable_set_empty,
- .find = addrmap_mutable_find,
- .create_fixed = addrmap_mutable_create_fixed,
- .relocate = addrmap_mutable_relocate
+ 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_foreach
};
\f
/* Initialization. */
+/* Provide a prototype to silence -Wmissing-prototypes. */
+extern initialize_file_ftype _initialize_addrmap;
+
void
_initialize_addrmap (void)
{