remote: get rid of all the T packets when syncing the thread list
[deliverable/binutils-gdb.git] / gdb / addrmap.c
index fd800cfddba1b81050e3f391c3ba43c990d97ff0..a5db199a5569143c4e0880ece1e1e793351fd24a 100644 (file)
@@ -1,12 +1,12 @@
 /* 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"
-
-#include <stdlib.h>
-
 #include "splay-tree.h"
 #include "gdb_obstack.h"
 #include "addrmap.h"
-#include "gdb_assert.h"
-
 
 \f
 /* The "abstract class".  */
@@ -43,12 +36,13 @@ 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);
 };
 
 
 struct addrmap
 {
-  struct addrmap_funcs *funcs;
+  const struct addrmap_funcs *funcs;
 };
 
 
@@ -84,6 +78,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);
+}
 \f
 /* Fixed address maps.  */
 
@@ -160,7 +159,9 @@ addrmap_fixed_find (struct addrmap *this, CORE_ADDR addr)
 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"));
 }
 
 
@@ -175,12 +176,32 @@ addrmap_fixed_relocate (struct addrmap *this, CORE_ADDR offset)
 }
 
 
-static struct addrmap_funcs addrmap_fixed_funcs =
+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 =
 {
-  .set_empty    = addrmap_fixed_set_empty,
-  .find         = addrmap_fixed_find,
-  .create_fixed = addrmap_fixed_create_fixed,
-  .relocate     = addrmap_fixed_relocate
+  addrmap_fixed_set_empty,
+  addrmap_fixed_find,
+  addrmap_fixed_create_fixed,
+  addrmap_fixed_relocate,
+  addrmap_fixed_foreach
 };
 
 
@@ -224,8 +245,8 @@ static splay_tree_key
 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;
 }
 
@@ -252,6 +273,13 @@ addrmap_splay_tree_successor (struct addrmap_mutable *map, CORE_ADDR addr)
 }
 
 
+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)
 {
@@ -274,7 +302,8 @@ addrmap_node_set_value (splay_tree_node node, void *value)
 
 
 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),
@@ -347,7 +376,7 @@ addrmap_mutable_set_empty (struct addrmap *this,
     {
       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);
     }
@@ -358,7 +387,9 @@ static void *
 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"));
 }
 
 
@@ -429,16 +460,54 @@ static void
 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 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 struct addrmap_funcs addrmap_mutable_funcs =
+static const struct addrmap_funcs addrmap_mutable_funcs =
 {
-  .set_empty    = addrmap_mutable_set_empty,
-  .find         = addrmap_mutable_find,
-  .create_fixed = addrmap_mutable_create_fixed,
-  .relocate     = addrmap_mutable_relocate
+  addrmap_mutable_set_empty,
+  addrmap_mutable_find,
+  addrmap_mutable_create_fixed,
+  addrmap_mutable_relocate,
+  addrmap_mutable_foreach
 };
 
 
@@ -522,6 +591,9 @@ addrmap_create_mutable (struct obstack *obstack)
 \f
 /* Initialization.  */
 
+/* Provide a prototype to silence -Wmissing-prototypes.  */
+extern initialize_file_ftype _initialize_addrmap;
+
 void
 _initialize_addrmap (void)
 {
This page took 0.031888 seconds and 4 git commands to generate.