1eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov
2eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov/*--------------------------------------------------------------------*/
3eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov/*--- A mapping where the keys exactly cover the address space.    ---*/
4eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov/*---                                                 m_rangemap.c ---*/
5eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov/*--------------------------------------------------------------------*/
6eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov
7eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov/*
8eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   This file is part of Valgrind, a dynamic binary instrumentation
9eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   framework.
10eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov
11eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   Copyright (C) 2014-2014 Mozilla Foundation
12eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov
13eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   This program is free software; you can redistribute it and/or
14eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   modify it under the terms of the GNU General Public License as
15eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   published by the Free Software Foundation; either version 2 of the
16eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   License, or (at your option) any later version.
17eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov
18eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   This program is distributed in the hope that it will be useful, but
19eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   WITHOUT ANY WARRANTY; without even the implied warranty of
20eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
21eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   General Public License for more details.
22eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov
23eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   You should have received a copy of the GNU General Public License
24eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   along with this program; if not, write to the Free Software
25eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
26eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   02111-1307, USA.
27eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov
28eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   The GNU General Public License is contained in the file COPYING.
29eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov*/
30eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov
31eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov/* Contributed by Julian Seward <jseward@acm.org> */
32eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov
33eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov#include "pub_core_basics.h"
34eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov#include "pub_core_libcassert.h"
35eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov#include "pub_core_libcprint.h"
36eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov#include "pub_core_xarray.h"
37eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov#include "pub_core_rangemap.h"    /* self */
38eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov
39eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov
40eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov/* See pub_tool_rangemap.h for details of what this is all about. */
41eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov
42eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov#define UWORD_MIN ((UWord)0)
43eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov#define UWORD_MAX (~(UWord)0)
44eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov
45eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanovtypedef
46eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   struct { UWord key_min; UWord key_max; UWord val; }
47eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   Range;
48eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov
49eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov
50eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanovstruct _RangeMap {
51eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   void* (*alloc) ( const HChar*, SizeT ); /* alloc fn (nofail) */
52eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   const HChar* cc;                 /* cost centre for alloc */
53eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   void  (*free) ( void* );         /* free fn */
54eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   XArray* ranges;
55eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov};
56eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov
57eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov
58eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov/* fwds */
59eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanovstatic void preen (/*MOD*/RangeMap* rm);
60eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanovstatic Word find ( RangeMap* rm, UWord key );
61eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanovstatic void split_at ( /*MOD*/RangeMap* rm, UWord key );
62eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanovstatic void show ( RangeMap* rm );
63eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov
64eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov
65eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy IvanovRangeMap* VG_(newRangeMap) ( void*(*alloc_fn)(const HChar*,SizeT),
66eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov                             const HChar* cc,
67eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov                             void(*free_fn)(void*),
68eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov                             UWord initialVal )
69eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov{
70eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   /* check user-supplied info .. */
71eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   vg_assert(alloc_fn);
72eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   vg_assert(free_fn);
73eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   RangeMap* rm = alloc_fn(cc, sizeof(RangeMap));
74eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   vg_assert(rm);
75eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   rm->alloc  = alloc_fn;
76eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   rm->cc     = cc;
77eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   rm->free   = free_fn;
78eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   rm->ranges = VG_(newXA)( alloc_fn, cc, free_fn, sizeof(Range) );
79eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   vg_assert(rm->ranges);
80eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   /* Add the initial range */
81eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   Range r;
82eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   r.key_min = UWORD_MIN;
83eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   r.key_max = UWORD_MAX;
84eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   r.val     = initialVal;
85eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   Word i = VG_(addToXA)(rm->ranges, &r);
86eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   vg_assert(i == 0);
87eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   vg_assert(VG_(sizeXA)(rm->ranges) == 1);
88eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   /* */
89eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   return rm;
90eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov}
91eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov
92eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanovvoid VG_(deleteRangeMap) ( RangeMap* rm )
93eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov{
94eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   vg_assert(rm);
95eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   vg_assert(rm->free);
96eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   vg_assert(rm->ranges);
97eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   VG_(deleteXA)(rm->ranges);
98eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   rm->free(rm);
99eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov}
100eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov
101eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanovvoid VG_(bindRangeMap) ( RangeMap* rm,
102eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov                         UWord key_min, UWord key_max, UWord val )
103eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov{
104eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   vg_assert(key_min <= key_max);
105eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   split_at(rm, key_min);
106eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   if (key_max < UWORD_MAX)
107eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      split_at(rm, key_max + 1);
108eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   Word iMin, iMax, i;
109eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   iMin = find(rm, key_min);
110eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   iMax = find(rm, key_max);
111eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   for (i = iMin; i <= iMax; i++) {
112eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      Range* rng = VG_(indexXA)(rm->ranges, i);
113eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      rng->val = val;
114eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   }
115eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   preen(rm);
116eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov}
117eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov
118eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanovvoid VG_(lookupRangeMap) ( /*OUT*/UWord* key_min, /*OUT*/UWord* key_max,
119eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov                           /*OUT*/UWord* val, RangeMap* rm, UWord key )
120eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov{
121eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   Word   i   = find(rm, key);
122eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   Range* rng = (Range*)VG_(indexXA)(rm->ranges, i);
123eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   *key_min = rng->key_min;
124eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   *key_max = rng->key_max;
125eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   *val     = rng->val;
126eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov}
127eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov
128eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy IvanovWord VG_(sizeRangeMap) ( RangeMap* rm )
129eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov{
130eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   vg_assert(rm && rm->ranges);
131eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   return VG_(sizeXA)(rm->ranges);
132eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov}
133eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov
134eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanovvoid VG_(indexRangeMap) ( /*OUT*/UWord* key_min, /*OUT*/UWord* key_max,
135eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov                          /*OUT*/UWord* val, RangeMap* rm, Word ix )
136eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov{
137eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   vg_assert(rm && rm->ranges);
138eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   Range* rng = (Range*)VG_(indexXA)(rm->ranges, ix);
139eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   *key_min = rng->key_min;
140eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   *key_max = rng->key_max;
141eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   *val     = rng->val;
142eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov}
143eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov
144eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov/* Helper functions, not externally visible. */
145eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov
146eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanovstatic void preen (/*MOD*/RangeMap* rm)
147eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov{
148eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   Word    i;
149eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   XArray* ranges = rm->ranges;
150eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   for (i = 0; i < VG_(sizeXA)(ranges) - 1; i++) {
151eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      Range* rng0 = VG_(indexXA)(ranges, i+0);
152eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      Range* rng1 = VG_(indexXA)(ranges, i+1);
153eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      if (rng0->val != rng1->val)
154eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov         continue;
155eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      rng0->key_max = rng1->key_max;
156eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      VG_(removeIndexXA)(ranges, i+1);
157eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      /* Back up one, so as not to miss an opportunity to merge with
158eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov         the entry after this one. */
159eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      i--;
160eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   }
161eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov}
162eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov
163eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanovstatic Word find ( RangeMap* rm, UWord key )
164eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov{
165eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   XArray* ranges = rm->ranges;
166eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   Word    lo     = 0;
167eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   Word    hi     = VG_(sizeXA)(ranges);
168eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   while (True) {
169eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      /* The unsearched space is lo .. hi inclusive */
170eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      if (lo > hi) {
171eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov         /* Not found.  This can't happen. */
172eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov         VG_(core_panic)("RangeMap::find: not found");
173eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov         /*NOTREACHED*/
174eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov         return -1;
175eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      }
176eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      Word   mid         = (lo + hi) / 2;
177eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      Range* mid_rng     = (Range*)VG_(indexXA)(ranges, mid);
178eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      UWord  key_mid_min = mid_rng->key_min;
179eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      UWord  key_mid_max = mid_rng->key_max;
180eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      if (key < key_mid_min) { hi = mid-1; continue; }
181eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      if (key > key_mid_max) { lo = mid+1; continue; }
182eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      return mid;
183eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   }
184eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov}
185eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov
186eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanovstatic void split_at ( /*MOD*/RangeMap* rm, UWord key )
187eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov{
188eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   XArray* ranges = rm->ranges;
189eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   Word    i      = find(rm, key);
190eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   Range   rng_i0 = *(Range*)VG_(indexXA)( ranges, i+0 );
191eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   if (rng_i0.key_min == key)
192eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      return;
193eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   VG_(insertIndexXA)( ranges, i+1, &rng_i0 );
194eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   /* The insert could have relocated the payload, hence the
195eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      re-indexing of i+0 here. */
196eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   Range* rng_i0p = (Range*)VG_(indexXA)( ranges, i+0 );
197eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   Range* rng_i1p = (Range*)VG_(indexXA)( ranges, i+1 );
198eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   rng_i0p->key_max = key-1;
199eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   rng_i1p->key_min = key;
200eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov}
201eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov
202eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov__attribute__((unused))
203eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanovstatic void show ( RangeMap* rm )
204eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov{
205eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   Word i;
206eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   VG_(printf)("<< %ld entries:\n", VG_(sizeXA)(rm->ranges) );
207eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   for (i = 0; i < VG_(sizeXA)(rm->ranges); i++) {
208eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      Range* rng = (Range*)VG_(indexXA)(rm->ranges, i);
209eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov      VG_(printf)("  %016llx  %016llx  --> 0x%llx\n",
210eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov                  (ULong)rng->key_min, (ULong)rng->key_max, (ULong)rng->val);
211eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   }
212eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov   VG_(printf)(">>\n");
213eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov}
214eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov
215eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov
216eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov/*--------------------------------------------------------------------*/
217eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov/*--- end                                             m_rangemap.c ---*/
218eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov/*--------------------------------------------------------------------*/
219