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