From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 5138 invoked by alias); 6 Oct 2010 04:43:06 -0000 Received: (qmail 5129 invoked by uid 22791); 6 Oct 2010 04:43:04 -0000 X-SWARE-Spam-Status: No, hits=-1.9 required=5.0 tests=AWL,BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,SPF_HELO_PASS,T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from smtp-out.google.com (HELO smtp-out.google.com) (216.239.44.51) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Wed, 06 Oct 2010 04:43:00 +0000 Received: from wpaz33.hot.corp.google.com (wpaz33.hot.corp.google.com [172.24.198.97]) by smtp-out.google.com with ESMTP id o964gxTD031355 for ; Tue, 5 Oct 2010 21:42:59 -0700 Received: from ruffy.mtv.corp.google.com (ruffy.mtv.corp.google.com [172.18.118.116]) by wpaz33.hot.corp.google.com with ESMTP id o964gw2q009462 for ; Tue, 5 Oct 2010 21:42:58 -0700 Received: by ruffy.mtv.corp.google.com (Postfix, from userid 67641) id CD7C7764B8; Tue, 5 Oct 2010 21:42:57 -0700 (PDT) To: gdb-patches@sourceware.org Subject: [patch] add addrmap iterator Message-Id: <20101006044257.CD7C7764B8@ruffy.mtv.corp.google.com> Date: Wed, 06 Oct 2010 04:43:00 -0000 From: dje@google.com (Doug Evans) X-System-Of-Record: true X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2010-10/txt/msg00067.txt.bz2 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 * 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); +} /* 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 */