public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
From: dje@google.com (Doug Evans)
To: gdb-patches@sourceware.org
Subject: [patch] add addrmap iterator
Date: Wed, 06 Oct 2010 04:43:00 -0000	[thread overview]
Message-ID: <20101006044257.CD7C7764B8@ruffy.mtv.corp.google.com> (raw)

Hi.

I wanted to be able to dump addrmaps so I wrote this patch.

I will check it in in two days if there are no objections.

2010-10-05  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.
	(oaddrmap_mutable_funcs): Update.

Index: addrmap.c
===================================================================
RCS file: /cvs/src/src/gdb/addrmap.c,v
retrieving revision 1.8
diff -u -p -r1.8 addrmap.c
--- addrmap.c	18 May 2010 19:23:37 -0000	1.8
+++ addrmap.c	6 Oct 2010 04:41:11 -0000
@@ -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 *map, addrmap_foreach_fn fn, void *data);
 };
 
 
@@ -82,6 +83,11 @@ addrmap_relocate (struct addrmap *map, C
 }
 
 
+int
+addrmap_foreach (struct addrmap *map, addrmap_foreach_fn fn, void *data)
+{
+  return map->funcs->foreach (map, fn, data);
+}
 \f
 /* Fixed address maps.  */
 
@@ -175,12 +181,32 @@ addrmap_fixed_relocate (struct addrmap *
 }
 
 
+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
 };
 
 
@@ -443,13 +469,48 @@ addrmap_mutable_relocate (struct addrmap
                     "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 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
 };
 
 
Index: addrmap.h
===================================================================
RCS file: /cvs/src/src/gdb/addrmap.h,v
retrieving revision 1.5
diff -u -p -r1.5 addrmap.h
--- addrmap.h	1 Jan 2010 07:31:29 -0000	1.5
+++ addrmap.h	6 Oct 2010 04:41:11 -0000
@@ -91,4 +91,15 @@ struct addrmap *addrmap_create_fixed (st
    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 */

             reply	other threads:[~2010-10-06  4:43 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-10-06  4:43 Doug Evans [this message]
2010-10-06 16:21 ` Tom Tromey

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20101006044257.CD7C7764B8@ruffy.mtv.corp.google.com \
    --to=dje@google.com \
    --cc=gdb-patches@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).