1*783e9e51SPaolo Bonzini /* 2*783e9e51SPaolo Bonzini * Sparse bit array 3*783e9e51SPaolo Bonzini * 4*783e9e51SPaolo Bonzini * Copyright (C) 2018, Google LLC. 5*783e9e51SPaolo Bonzini * Copyright (C) 2018, Red Hat, Inc. (code style cleanup and fuzzing driver) 6*783e9e51SPaolo Bonzini * 7*783e9e51SPaolo Bonzini * This work is licensed under the terms of the GNU GPL, version 2. 8*783e9e51SPaolo Bonzini * 9*783e9e51SPaolo Bonzini * This library provides functions to support a memory efficient bit array, 10*783e9e51SPaolo Bonzini * with an index size of 2^64. A sparsebit array is allocated through 11*783e9e51SPaolo Bonzini * the use sparsebit_alloc() and free'd via sparsebit_free(), 12*783e9e51SPaolo Bonzini * such as in the following: 13*783e9e51SPaolo Bonzini * 14*783e9e51SPaolo Bonzini * struct sparsebit *s; 15*783e9e51SPaolo Bonzini * s = sparsebit_alloc(); 16*783e9e51SPaolo Bonzini * sparsebit_free(&s); 17*783e9e51SPaolo Bonzini * 18*783e9e51SPaolo Bonzini * The struct sparsebit type resolves down to a struct sparsebit. 19*783e9e51SPaolo Bonzini * Note that, sparsebit_free() takes a pointer to the sparsebit 20*783e9e51SPaolo Bonzini * structure. This is so that sparsebit_free() is able to poison 21*783e9e51SPaolo Bonzini * the pointer (e.g. set it to NULL) to the struct sparsebit before 22*783e9e51SPaolo Bonzini * returning to the caller. 23*783e9e51SPaolo Bonzini * 24*783e9e51SPaolo Bonzini * Between the return of sparsebit_alloc() and the call of 25*783e9e51SPaolo Bonzini * sparsebit_free(), there are multiple query and modifying operations 26*783e9e51SPaolo Bonzini * that can be performed on the allocated sparsebit array. All of 27*783e9e51SPaolo Bonzini * these operations take as a parameter the value returned from 28*783e9e51SPaolo Bonzini * sparsebit_alloc() and most also take a bit index. Frequently 29*783e9e51SPaolo Bonzini * used routines include: 30*783e9e51SPaolo Bonzini * 31*783e9e51SPaolo Bonzini * ---- Query Operations 32*783e9e51SPaolo Bonzini * sparsebit_is_set(s, idx) 33*783e9e51SPaolo Bonzini * sparsebit_is_clear(s, idx) 34*783e9e51SPaolo Bonzini * sparsebit_any_set(s) 35*783e9e51SPaolo Bonzini * sparsebit_first_set(s) 36*783e9e51SPaolo Bonzini * sparsebit_next_set(s, prev_idx) 37*783e9e51SPaolo Bonzini * 38*783e9e51SPaolo Bonzini * ---- Modifying Operations 39*783e9e51SPaolo Bonzini * sparsebit_set(s, idx) 40*783e9e51SPaolo Bonzini * sparsebit_clear(s, idx) 41*783e9e51SPaolo Bonzini * sparsebit_set_num(s, idx, num); 42*783e9e51SPaolo Bonzini * sparsebit_clear_num(s, idx, num); 43*783e9e51SPaolo Bonzini * 44*783e9e51SPaolo Bonzini * A common operation, is to itterate over all the bits set in a test 45*783e9e51SPaolo Bonzini * sparsebit array. This can be done via code with the following structure: 46*783e9e51SPaolo Bonzini * 47*783e9e51SPaolo Bonzini * sparsebit_idx_t idx; 48*783e9e51SPaolo Bonzini * if (sparsebit_any_set(s)) { 49*783e9e51SPaolo Bonzini * idx = sparsebit_first_set(s); 50*783e9e51SPaolo Bonzini * do { 51*783e9e51SPaolo Bonzini * ... 52*783e9e51SPaolo Bonzini * idx = sparsebit_next_set(s, idx); 53*783e9e51SPaolo Bonzini * } while (idx != 0); 54*783e9e51SPaolo Bonzini * } 55*783e9e51SPaolo Bonzini * 56*783e9e51SPaolo Bonzini * The index of the first bit set needs to be obtained via 57*783e9e51SPaolo Bonzini * sparsebit_first_set(), because sparsebit_next_set(), needs 58*783e9e51SPaolo Bonzini * the index of the previously set. The sparsebit_idx_t type is 59*783e9e51SPaolo Bonzini * unsigned, so there is no previous index before 0 that is available. 60*783e9e51SPaolo Bonzini * Also, the call to sparsebit_first_set() is not made unless there 61*783e9e51SPaolo Bonzini * is at least 1 bit in the array set. This is because sparsebit_first_set() 62*783e9e51SPaolo Bonzini * aborts if sparsebit_first_set() is called with no bits set. 63*783e9e51SPaolo Bonzini * It is the callers responsibility to assure that the 64*783e9e51SPaolo Bonzini * sparsebit array has at least a single bit set before calling 65*783e9e51SPaolo Bonzini * sparsebit_first_set(). 66*783e9e51SPaolo Bonzini * 67*783e9e51SPaolo Bonzini * ==== Implementation Overview ==== 68*783e9e51SPaolo Bonzini * For the most part the internal implementation of sparsebit is 69*783e9e51SPaolo Bonzini * opaque to the caller. One important implementation detail that the 70*783e9e51SPaolo Bonzini * caller may need to be aware of is the spatial complexity of the 71*783e9e51SPaolo Bonzini * implementation. This implementation of a sparsebit array is not 72*783e9e51SPaolo Bonzini * only sparse, in that it uses memory proportional to the number of bits 73*783e9e51SPaolo Bonzini * set. It is also efficient in memory usage when most of the bits are 74*783e9e51SPaolo Bonzini * set. 75*783e9e51SPaolo Bonzini * 76*783e9e51SPaolo Bonzini * At a high-level the state of the bit settings are maintained through 77*783e9e51SPaolo Bonzini * the use of a binary-search tree, where each node contains at least 78*783e9e51SPaolo Bonzini * the following members: 79*783e9e51SPaolo Bonzini * 80*783e9e51SPaolo Bonzini * typedef uint64_t sparsebit_idx_t; 81*783e9e51SPaolo Bonzini * typedef uint64_t sparsebit_num_t; 82*783e9e51SPaolo Bonzini * 83*783e9e51SPaolo Bonzini * sparsebit_idx_t idx; 84*783e9e51SPaolo Bonzini * uint32_t mask; 85*783e9e51SPaolo Bonzini * sparsebit_num_t num_after; 86*783e9e51SPaolo Bonzini * 87*783e9e51SPaolo Bonzini * The idx member contains the bit index of the first bit described by this 88*783e9e51SPaolo Bonzini * node, while the mask member stores the setting of the first 32-bits. 89*783e9e51SPaolo Bonzini * The setting of the bit at idx + n, where 0 <= n < 32, is located in the 90*783e9e51SPaolo Bonzini * mask member at 1 << n. 91*783e9e51SPaolo Bonzini * 92*783e9e51SPaolo Bonzini * Nodes are sorted by idx and the bits described by two nodes will never 93*783e9e51SPaolo Bonzini * overlap. The idx member is always aligned to the mask size, i.e. a 94*783e9e51SPaolo Bonzini * multiple of 32. 95*783e9e51SPaolo Bonzini * 96*783e9e51SPaolo Bonzini * Beyond a typical implementation, the nodes in this implementation also 97*783e9e51SPaolo Bonzini * contains a member named num_after. The num_after member holds the 98*783e9e51SPaolo Bonzini * number of bits immediately after the mask bits that are contiguously set. 99*783e9e51SPaolo Bonzini * The use of the num_after member allows this implementation to efficiently 100*783e9e51SPaolo Bonzini * represent cases where most bits are set. For example, the case of all 101*783e9e51SPaolo Bonzini * but the last two bits set, is represented by the following two nodes: 102*783e9e51SPaolo Bonzini * 103*783e9e51SPaolo Bonzini * node 0 - idx: 0x0 mask: 0xffffffff num_after: 0xffffffffffffffc0 104*783e9e51SPaolo Bonzini * node 1 - idx: 0xffffffffffffffe0 mask: 0x3fffffff num_after: 0 105*783e9e51SPaolo Bonzini * 106*783e9e51SPaolo Bonzini * ==== Invariants ==== 107*783e9e51SPaolo Bonzini * This implementation usses the following invariants: 108*783e9e51SPaolo Bonzini * 109*783e9e51SPaolo Bonzini * + Node are only used to represent bits that are set. 110*783e9e51SPaolo Bonzini * Nodes with a mask of 0 and num_after of 0 are not allowed. 111*783e9e51SPaolo Bonzini * 112*783e9e51SPaolo Bonzini * + Sum of bits set in all the nodes is equal to the value of 113*783e9e51SPaolo Bonzini * the struct sparsebit_pvt num_set member. 114*783e9e51SPaolo Bonzini * 115*783e9e51SPaolo Bonzini * + The setting of at least one bit is always described in a nodes 116*783e9e51SPaolo Bonzini * mask (mask >= 1). 117*783e9e51SPaolo Bonzini * 118*783e9e51SPaolo Bonzini * + A node with all mask bits set only occurs when the last bit 119*783e9e51SPaolo Bonzini * described by the previous node is not equal to this nodes 120*783e9e51SPaolo Bonzini * starting index - 1. All such occurences of this condition are 121*783e9e51SPaolo Bonzini * avoided by moving the setting of the nodes mask bits into 122*783e9e51SPaolo Bonzini * the previous nodes num_after setting. 123*783e9e51SPaolo Bonzini * 124*783e9e51SPaolo Bonzini * + Node starting index is evenly divisable by the number of bits 125*783e9e51SPaolo Bonzini * within a nodes mask member. 126*783e9e51SPaolo Bonzini * 127*783e9e51SPaolo Bonzini * + Nodes never represent a range of bits that wrap around the 128*783e9e51SPaolo Bonzini * highest supported index. 129*783e9e51SPaolo Bonzini * 130*783e9e51SPaolo Bonzini * (idx + MASK_BITS + num_after - 1) <= ((sparsebit_idx_t) 0) - 1) 131*783e9e51SPaolo Bonzini * 132*783e9e51SPaolo Bonzini * As a consequence of the above, the num_after member of a node 133*783e9e51SPaolo Bonzini * will always be <=: 134*783e9e51SPaolo Bonzini * 135*783e9e51SPaolo Bonzini * maximum_index - nodes_starting_index - number_of_mask_bits 136*783e9e51SPaolo Bonzini * 137*783e9e51SPaolo Bonzini * + Nodes within the binary search tree are sorted based on each 138*783e9e51SPaolo Bonzini * nodes starting index. 139*783e9e51SPaolo Bonzini * 140*783e9e51SPaolo Bonzini * + The range of bits described by any two nodes do not overlap. The 141*783e9e51SPaolo Bonzini * range of bits described by a single node is: 142*783e9e51SPaolo Bonzini * 143*783e9e51SPaolo Bonzini * start: node->idx 144*783e9e51SPaolo Bonzini * end (inclusive): node->idx + MASK_BITS + node->num_after - 1; 145*783e9e51SPaolo Bonzini * 146*783e9e51SPaolo Bonzini * Note, at times these invariants are temporarily violated for a 147*783e9e51SPaolo Bonzini * specific portion of the code. For example, when setting a mask 148*783e9e51SPaolo Bonzini * bit, there is a small delay between when the mask bit is set and the 149*783e9e51SPaolo Bonzini * value in the struct sparsebit_pvt num_set member is updated. Other 150*783e9e51SPaolo Bonzini * temporary violations occur when node_split() is called with a specified 151*783e9e51SPaolo Bonzini * index and assures that a node where its mask represents the bit 152*783e9e51SPaolo Bonzini * at the specified index exists. At times to do this node_split() 153*783e9e51SPaolo Bonzini * must split an existing node into two nodes or create a node that 154*783e9e51SPaolo Bonzini * has no bits set. Such temporary violations must be corrected before 155*783e9e51SPaolo Bonzini * returning to the caller. These corrections are typically performed 156*783e9e51SPaolo Bonzini * by the local function node_reduce(). 157*783e9e51SPaolo Bonzini */ 158*783e9e51SPaolo Bonzini 159*783e9e51SPaolo Bonzini #include "test_util.h" 160*783e9e51SPaolo Bonzini #include "sparsebit.h" 161*783e9e51SPaolo Bonzini #include <limits.h> 162*783e9e51SPaolo Bonzini #include <assert.h> 163*783e9e51SPaolo Bonzini 164*783e9e51SPaolo Bonzini #define DUMP_LINE_MAX 100 /* Does not include indent amount */ 165*783e9e51SPaolo Bonzini 166*783e9e51SPaolo Bonzini typedef uint32_t mask_t; 167*783e9e51SPaolo Bonzini #define MASK_BITS (sizeof(mask_t) * CHAR_BIT) 168*783e9e51SPaolo Bonzini 169*783e9e51SPaolo Bonzini struct node { 170*783e9e51SPaolo Bonzini struct node *parent; 171*783e9e51SPaolo Bonzini struct node *left; 172*783e9e51SPaolo Bonzini struct node *right; 173*783e9e51SPaolo Bonzini sparsebit_idx_t idx; /* index of least-significant bit in mask */ 174*783e9e51SPaolo Bonzini sparsebit_num_t num_after; /* num contiguously set after mask */ 175*783e9e51SPaolo Bonzini mask_t mask; 176*783e9e51SPaolo Bonzini }; 177*783e9e51SPaolo Bonzini 178*783e9e51SPaolo Bonzini struct sparsebit { 179*783e9e51SPaolo Bonzini /* 180*783e9e51SPaolo Bonzini * Points to root node of the binary search 181*783e9e51SPaolo Bonzini * tree. Equal to NULL when no bits are set in 182*783e9e51SPaolo Bonzini * the entire sparsebit array. 183*783e9e51SPaolo Bonzini */ 184*783e9e51SPaolo Bonzini struct node *root; 185*783e9e51SPaolo Bonzini 186*783e9e51SPaolo Bonzini /* 187*783e9e51SPaolo Bonzini * A redundant count of the total number of bits set. Used for 188*783e9e51SPaolo Bonzini * diagnostic purposes and to change the time complexity of 189*783e9e51SPaolo Bonzini * sparsebit_num_set() from O(n) to O(1). 190*783e9e51SPaolo Bonzini * Note: Due to overflow, a value of 0 means none or all set. 191*783e9e51SPaolo Bonzini */ 192*783e9e51SPaolo Bonzini sparsebit_num_t num_set; 193*783e9e51SPaolo Bonzini }; 194*783e9e51SPaolo Bonzini 195*783e9e51SPaolo Bonzini /* Returns the number of set bits described by the settings 196*783e9e51SPaolo Bonzini * of the node pointed to by nodep. 197*783e9e51SPaolo Bonzini */ 198*783e9e51SPaolo Bonzini static sparsebit_num_t node_num_set(struct node *nodep) 199*783e9e51SPaolo Bonzini { 200*783e9e51SPaolo Bonzini return nodep->num_after + __builtin_popcount(nodep->mask); 201*783e9e51SPaolo Bonzini } 202*783e9e51SPaolo Bonzini 203*783e9e51SPaolo Bonzini /* Returns a pointer to the node that describes the 204*783e9e51SPaolo Bonzini * lowest bit index. 205*783e9e51SPaolo Bonzini */ 206*783e9e51SPaolo Bonzini static struct node *node_first(struct sparsebit *s) 207*783e9e51SPaolo Bonzini { 208*783e9e51SPaolo Bonzini struct node *nodep; 209*783e9e51SPaolo Bonzini 210*783e9e51SPaolo Bonzini for (nodep = s->root; nodep && nodep->left; nodep = nodep->left) 211*783e9e51SPaolo Bonzini ; 212*783e9e51SPaolo Bonzini 213*783e9e51SPaolo Bonzini return nodep; 214*783e9e51SPaolo Bonzini } 215*783e9e51SPaolo Bonzini 216*783e9e51SPaolo Bonzini /* Returns a pointer to the node that describes the 217*783e9e51SPaolo Bonzini * lowest bit index > the index of the node pointed to by np. 218*783e9e51SPaolo Bonzini * Returns NULL if no node with a higher index exists. 219*783e9e51SPaolo Bonzini */ 220*783e9e51SPaolo Bonzini static struct node *node_next(struct sparsebit *s, struct node *np) 221*783e9e51SPaolo Bonzini { 222*783e9e51SPaolo Bonzini struct node *nodep = np; 223*783e9e51SPaolo Bonzini 224*783e9e51SPaolo Bonzini /* 225*783e9e51SPaolo Bonzini * If current node has a right child, next node is the left-most 226*783e9e51SPaolo Bonzini * of the right child. 227*783e9e51SPaolo Bonzini */ 228*783e9e51SPaolo Bonzini if (nodep->right) { 229*783e9e51SPaolo Bonzini for (nodep = nodep->right; nodep->left; nodep = nodep->left) 230*783e9e51SPaolo Bonzini ; 231*783e9e51SPaolo Bonzini return nodep; 232*783e9e51SPaolo Bonzini } 233*783e9e51SPaolo Bonzini 234*783e9e51SPaolo Bonzini /* 235*783e9e51SPaolo Bonzini * No right child. Go up until node is left child of a parent. 236*783e9e51SPaolo Bonzini * That parent is then the next node. 237*783e9e51SPaolo Bonzini */ 238*783e9e51SPaolo Bonzini while (nodep->parent && nodep == nodep->parent->right) 239*783e9e51SPaolo Bonzini nodep = nodep->parent; 240*783e9e51SPaolo Bonzini 241*783e9e51SPaolo Bonzini return nodep->parent; 242*783e9e51SPaolo Bonzini } 243*783e9e51SPaolo Bonzini 244*783e9e51SPaolo Bonzini /* Searches for and returns a pointer to the node that describes the 245*783e9e51SPaolo Bonzini * highest index < the index of the node pointed to by np. 246*783e9e51SPaolo Bonzini * Returns NULL if no node with a lower index exists. 247*783e9e51SPaolo Bonzini */ 248*783e9e51SPaolo Bonzini static struct node *node_prev(struct sparsebit *s, struct node *np) 249*783e9e51SPaolo Bonzini { 250*783e9e51SPaolo Bonzini struct node *nodep = np; 251*783e9e51SPaolo Bonzini 252*783e9e51SPaolo Bonzini /* 253*783e9e51SPaolo Bonzini * If current node has a left child, next node is the right-most 254*783e9e51SPaolo Bonzini * of the left child. 255*783e9e51SPaolo Bonzini */ 256*783e9e51SPaolo Bonzini if (nodep->left) { 257*783e9e51SPaolo Bonzini for (nodep = nodep->left; nodep->right; nodep = nodep->right) 258*783e9e51SPaolo Bonzini ; 259*783e9e51SPaolo Bonzini return (struct node *) nodep; 260*783e9e51SPaolo Bonzini } 261*783e9e51SPaolo Bonzini 262*783e9e51SPaolo Bonzini /* 263*783e9e51SPaolo Bonzini * No left child. Go up until node is right child of a parent. 264*783e9e51SPaolo Bonzini * That parent is then the next node. 265*783e9e51SPaolo Bonzini */ 266*783e9e51SPaolo Bonzini while (nodep->parent && nodep == nodep->parent->left) 267*783e9e51SPaolo Bonzini nodep = nodep->parent; 268*783e9e51SPaolo Bonzini 269*783e9e51SPaolo Bonzini return (struct node *) nodep->parent; 270*783e9e51SPaolo Bonzini } 271*783e9e51SPaolo Bonzini 272*783e9e51SPaolo Bonzini 273*783e9e51SPaolo Bonzini /* Allocates space to hold a copy of the node sub-tree pointed to by 274*783e9e51SPaolo Bonzini * subtree and duplicates the bit settings to the newly allocated nodes. 275*783e9e51SPaolo Bonzini * Returns the newly allocated copy of subtree. 276*783e9e51SPaolo Bonzini */ 277*783e9e51SPaolo Bonzini static struct node *node_copy_subtree(struct node *subtree) 278*783e9e51SPaolo Bonzini { 279*783e9e51SPaolo Bonzini struct node *root; 280*783e9e51SPaolo Bonzini 281*783e9e51SPaolo Bonzini /* Duplicate the node at the root of the subtree */ 282*783e9e51SPaolo Bonzini root = calloc(1, sizeof(*root)); 283*783e9e51SPaolo Bonzini if (!root) { 284*783e9e51SPaolo Bonzini perror("calloc"); 285*783e9e51SPaolo Bonzini abort(); 286*783e9e51SPaolo Bonzini } 287*783e9e51SPaolo Bonzini 288*783e9e51SPaolo Bonzini root->idx = subtree->idx; 289*783e9e51SPaolo Bonzini root->mask = subtree->mask; 290*783e9e51SPaolo Bonzini root->num_after = subtree->num_after; 291*783e9e51SPaolo Bonzini 292*783e9e51SPaolo Bonzini /* As needed, recursively duplicate the left and right subtrees */ 293*783e9e51SPaolo Bonzini if (subtree->left) { 294*783e9e51SPaolo Bonzini root->left = node_copy_subtree(subtree->left); 295*783e9e51SPaolo Bonzini root->left->parent = root; 296*783e9e51SPaolo Bonzini } 297*783e9e51SPaolo Bonzini 298*783e9e51SPaolo Bonzini if (subtree->right) { 299*783e9e51SPaolo Bonzini root->right = node_copy_subtree(subtree->right); 300*783e9e51SPaolo Bonzini root->right->parent = root; 301*783e9e51SPaolo Bonzini } 302*783e9e51SPaolo Bonzini 303*783e9e51SPaolo Bonzini return root; 304*783e9e51SPaolo Bonzini } 305*783e9e51SPaolo Bonzini 306*783e9e51SPaolo Bonzini /* Searches for and returns a pointer to the node that describes the setting 307*783e9e51SPaolo Bonzini * of the bit given by idx. A node describes the setting of a bit if its 308*783e9e51SPaolo Bonzini * index is within the bits described by the mask bits or the number of 309*783e9e51SPaolo Bonzini * contiguous bits set after the mask. Returns NULL if there is no such node. 310*783e9e51SPaolo Bonzini */ 311*783e9e51SPaolo Bonzini static struct node *node_find(struct sparsebit *s, sparsebit_idx_t idx) 312*783e9e51SPaolo Bonzini { 313*783e9e51SPaolo Bonzini struct node *nodep; 314*783e9e51SPaolo Bonzini 315*783e9e51SPaolo Bonzini /* Find the node that describes the setting of the bit at idx */ 316*783e9e51SPaolo Bonzini for (nodep = s->root; nodep; 317*783e9e51SPaolo Bonzini nodep = nodep->idx > idx ? nodep->left : nodep->right) { 318*783e9e51SPaolo Bonzini if (idx >= nodep->idx && 319*783e9e51SPaolo Bonzini idx <= nodep->idx + MASK_BITS + nodep->num_after - 1) 320*783e9e51SPaolo Bonzini break; 321*783e9e51SPaolo Bonzini } 322*783e9e51SPaolo Bonzini 323*783e9e51SPaolo Bonzini return nodep; 324*783e9e51SPaolo Bonzini } 325*783e9e51SPaolo Bonzini 326*783e9e51SPaolo Bonzini /* Entry Requirements: 327*783e9e51SPaolo Bonzini * + A node that describes the setting of idx is not already present. 328*783e9e51SPaolo Bonzini * 329*783e9e51SPaolo Bonzini * Adds a new node to describe the setting of the bit at the index given 330*783e9e51SPaolo Bonzini * by idx. Returns a pointer to the newly added node. 331*783e9e51SPaolo Bonzini * 332*783e9e51SPaolo Bonzini * TODO(lhuemill): Degenerate cases causes the tree to get unbalanced. 333*783e9e51SPaolo Bonzini */ 334*783e9e51SPaolo Bonzini static struct node *node_add(struct sparsebit *s, sparsebit_idx_t idx) 335*783e9e51SPaolo Bonzini { 336*783e9e51SPaolo Bonzini struct node *nodep, *parentp, *prev; 337*783e9e51SPaolo Bonzini 338*783e9e51SPaolo Bonzini /* Allocate and initialize the new node. */ 339*783e9e51SPaolo Bonzini nodep = calloc(1, sizeof(*nodep)); 340*783e9e51SPaolo Bonzini if (!nodep) { 341*783e9e51SPaolo Bonzini perror("calloc"); 342*783e9e51SPaolo Bonzini abort(); 343*783e9e51SPaolo Bonzini } 344*783e9e51SPaolo Bonzini 345*783e9e51SPaolo Bonzini nodep->idx = idx & -MASK_BITS; 346*783e9e51SPaolo Bonzini 347*783e9e51SPaolo Bonzini /* If no nodes, set it up as the root node. */ 348*783e9e51SPaolo Bonzini if (!s->root) { 349*783e9e51SPaolo Bonzini s->root = nodep; 350*783e9e51SPaolo Bonzini return nodep; 351*783e9e51SPaolo Bonzini } 352*783e9e51SPaolo Bonzini 353*783e9e51SPaolo Bonzini /* 354*783e9e51SPaolo Bonzini * Find the parent where the new node should be attached 355*783e9e51SPaolo Bonzini * and add the node there. 356*783e9e51SPaolo Bonzini */ 357*783e9e51SPaolo Bonzini parentp = s->root; 358*783e9e51SPaolo Bonzini while (true) { 359*783e9e51SPaolo Bonzini if (idx < parentp->idx) { 360*783e9e51SPaolo Bonzini if (!parentp->left) { 361*783e9e51SPaolo Bonzini parentp->left = nodep; 362*783e9e51SPaolo Bonzini nodep->parent = parentp; 363*783e9e51SPaolo Bonzini break; 364*783e9e51SPaolo Bonzini } 365*783e9e51SPaolo Bonzini parentp = parentp->left; 366*783e9e51SPaolo Bonzini } else { 367*783e9e51SPaolo Bonzini assert(idx > parentp->idx + MASK_BITS + parentp->num_after - 1); 368*783e9e51SPaolo Bonzini if (!parentp->right) { 369*783e9e51SPaolo Bonzini parentp->right = nodep; 370*783e9e51SPaolo Bonzini nodep->parent = parentp; 371*783e9e51SPaolo Bonzini break; 372*783e9e51SPaolo Bonzini } 373*783e9e51SPaolo Bonzini parentp = parentp->right; 374*783e9e51SPaolo Bonzini } 375*783e9e51SPaolo Bonzini } 376*783e9e51SPaolo Bonzini 377*783e9e51SPaolo Bonzini /* 378*783e9e51SPaolo Bonzini * Does num_after bits of previous node overlap with the mask 379*783e9e51SPaolo Bonzini * of the new node? If so set the bits in the new nodes mask 380*783e9e51SPaolo Bonzini * and reduce the previous nodes num_after. 381*783e9e51SPaolo Bonzini */ 382*783e9e51SPaolo Bonzini prev = node_prev(s, nodep); 383*783e9e51SPaolo Bonzini while (prev && prev->idx + MASK_BITS + prev->num_after - 1 >= nodep->idx) { 384*783e9e51SPaolo Bonzini unsigned int n1 = (prev->idx + MASK_BITS + prev->num_after - 1) 385*783e9e51SPaolo Bonzini - nodep->idx; 386*783e9e51SPaolo Bonzini assert(prev->num_after > 0); 387*783e9e51SPaolo Bonzini assert(n1 < MASK_BITS); 388*783e9e51SPaolo Bonzini assert(!(nodep->mask & (1 << n1))); 389*783e9e51SPaolo Bonzini nodep->mask |= (1 << n1); 390*783e9e51SPaolo Bonzini prev->num_after--; 391*783e9e51SPaolo Bonzini } 392*783e9e51SPaolo Bonzini 393*783e9e51SPaolo Bonzini return nodep; 394*783e9e51SPaolo Bonzini } 395*783e9e51SPaolo Bonzini 396*783e9e51SPaolo Bonzini /* Returns whether all the bits in the sparsebit array are set. */ 397*783e9e51SPaolo Bonzini bool sparsebit_all_set(struct sparsebit *s) 398*783e9e51SPaolo Bonzini { 399*783e9e51SPaolo Bonzini /* 400*783e9e51SPaolo Bonzini * If any nodes there must be at least one bit set. Only case 401*783e9e51SPaolo Bonzini * where a bit is set and total num set is 0, is when all bits 402*783e9e51SPaolo Bonzini * are set. 403*783e9e51SPaolo Bonzini */ 404*783e9e51SPaolo Bonzini return s->root && s->num_set == 0; 405*783e9e51SPaolo Bonzini } 406*783e9e51SPaolo Bonzini 407*783e9e51SPaolo Bonzini /* Clears all bits described by the node pointed to by nodep, then 408*783e9e51SPaolo Bonzini * removes the node. 409*783e9e51SPaolo Bonzini */ 410*783e9e51SPaolo Bonzini static void node_rm(struct sparsebit *s, struct node *nodep) 411*783e9e51SPaolo Bonzini { 412*783e9e51SPaolo Bonzini struct node *tmp; 413*783e9e51SPaolo Bonzini sparsebit_num_t num_set; 414*783e9e51SPaolo Bonzini 415*783e9e51SPaolo Bonzini num_set = node_num_set(nodep); 416*783e9e51SPaolo Bonzini assert(s->num_set >= num_set || sparsebit_all_set(s)); 417*783e9e51SPaolo Bonzini s->num_set -= node_num_set(nodep); 418*783e9e51SPaolo Bonzini 419*783e9e51SPaolo Bonzini /* Have both left and right child */ 420*783e9e51SPaolo Bonzini if (nodep->left && nodep->right) { 421*783e9e51SPaolo Bonzini /* 422*783e9e51SPaolo Bonzini * Move left children to the leftmost leaf node 423*783e9e51SPaolo Bonzini * of the right child. 424*783e9e51SPaolo Bonzini */ 425*783e9e51SPaolo Bonzini for (tmp = nodep->right; tmp->left; tmp = tmp->left) 426*783e9e51SPaolo Bonzini ; 427*783e9e51SPaolo Bonzini tmp->left = nodep->left; 428*783e9e51SPaolo Bonzini nodep->left = NULL; 429*783e9e51SPaolo Bonzini tmp->left->parent = tmp; 430*783e9e51SPaolo Bonzini } 431*783e9e51SPaolo Bonzini 432*783e9e51SPaolo Bonzini /* Left only child */ 433*783e9e51SPaolo Bonzini if (nodep->left) { 434*783e9e51SPaolo Bonzini if (!nodep->parent) { 435*783e9e51SPaolo Bonzini s->root = nodep->left; 436*783e9e51SPaolo Bonzini nodep->left->parent = NULL; 437*783e9e51SPaolo Bonzini } else { 438*783e9e51SPaolo Bonzini nodep->left->parent = nodep->parent; 439*783e9e51SPaolo Bonzini if (nodep == nodep->parent->left) 440*783e9e51SPaolo Bonzini nodep->parent->left = nodep->left; 441*783e9e51SPaolo Bonzini else { 442*783e9e51SPaolo Bonzini assert(nodep == nodep->parent->right); 443*783e9e51SPaolo Bonzini nodep->parent->right = nodep->left; 444*783e9e51SPaolo Bonzini } 445*783e9e51SPaolo Bonzini } 446*783e9e51SPaolo Bonzini 447*783e9e51SPaolo Bonzini nodep->parent = nodep->left = nodep->right = NULL; 448*783e9e51SPaolo Bonzini free(nodep); 449*783e9e51SPaolo Bonzini 450*783e9e51SPaolo Bonzini return; 451*783e9e51SPaolo Bonzini } 452*783e9e51SPaolo Bonzini 453*783e9e51SPaolo Bonzini 454*783e9e51SPaolo Bonzini /* Right only child */ 455*783e9e51SPaolo Bonzini if (nodep->right) { 456*783e9e51SPaolo Bonzini if (!nodep->parent) { 457*783e9e51SPaolo Bonzini s->root = nodep->right; 458*783e9e51SPaolo Bonzini nodep->right->parent = NULL; 459*783e9e51SPaolo Bonzini } else { 460*783e9e51SPaolo Bonzini nodep->right->parent = nodep->parent; 461*783e9e51SPaolo Bonzini if (nodep == nodep->parent->left) 462*783e9e51SPaolo Bonzini nodep->parent->left = nodep->right; 463*783e9e51SPaolo Bonzini else { 464*783e9e51SPaolo Bonzini assert(nodep == nodep->parent->right); 465*783e9e51SPaolo Bonzini nodep->parent->right = nodep->right; 466*783e9e51SPaolo Bonzini } 467*783e9e51SPaolo Bonzini } 468*783e9e51SPaolo Bonzini 469*783e9e51SPaolo Bonzini nodep->parent = nodep->left = nodep->right = NULL; 470*783e9e51SPaolo Bonzini free(nodep); 471*783e9e51SPaolo Bonzini 472*783e9e51SPaolo Bonzini return; 473*783e9e51SPaolo Bonzini } 474*783e9e51SPaolo Bonzini 475*783e9e51SPaolo Bonzini /* Leaf Node */ 476*783e9e51SPaolo Bonzini if (!nodep->parent) { 477*783e9e51SPaolo Bonzini s->root = NULL; 478*783e9e51SPaolo Bonzini } else { 479*783e9e51SPaolo Bonzini if (nodep->parent->left == nodep) 480*783e9e51SPaolo Bonzini nodep->parent->left = NULL; 481*783e9e51SPaolo Bonzini else { 482*783e9e51SPaolo Bonzini assert(nodep == nodep->parent->right); 483*783e9e51SPaolo Bonzini nodep->parent->right = NULL; 484*783e9e51SPaolo Bonzini } 485*783e9e51SPaolo Bonzini } 486*783e9e51SPaolo Bonzini 487*783e9e51SPaolo Bonzini nodep->parent = nodep->left = nodep->right = NULL; 488*783e9e51SPaolo Bonzini free(nodep); 489*783e9e51SPaolo Bonzini 490*783e9e51SPaolo Bonzini return; 491*783e9e51SPaolo Bonzini } 492*783e9e51SPaolo Bonzini 493*783e9e51SPaolo Bonzini /* Splits the node containing the bit at idx so that there is a node 494*783e9e51SPaolo Bonzini * that starts at the specified index. If no such node exists, a new 495*783e9e51SPaolo Bonzini * node at the specified index is created. Returns the new node. 496*783e9e51SPaolo Bonzini * 497*783e9e51SPaolo Bonzini * idx must start of a mask boundary. 498*783e9e51SPaolo Bonzini */ 499*783e9e51SPaolo Bonzini static struct node *node_split(struct sparsebit *s, sparsebit_idx_t idx) 500*783e9e51SPaolo Bonzini { 501*783e9e51SPaolo Bonzini struct node *nodep1, *nodep2; 502*783e9e51SPaolo Bonzini sparsebit_idx_t offset; 503*783e9e51SPaolo Bonzini sparsebit_num_t orig_num_after; 504*783e9e51SPaolo Bonzini 505*783e9e51SPaolo Bonzini assert(!(idx % MASK_BITS)); 506*783e9e51SPaolo Bonzini 507*783e9e51SPaolo Bonzini /* 508*783e9e51SPaolo Bonzini * Is there a node that describes the setting of idx? 509*783e9e51SPaolo Bonzini * If not, add it. 510*783e9e51SPaolo Bonzini */ 511*783e9e51SPaolo Bonzini nodep1 = node_find(s, idx); 512*783e9e51SPaolo Bonzini if (!nodep1) 513*783e9e51SPaolo Bonzini return node_add(s, idx); 514*783e9e51SPaolo Bonzini 515*783e9e51SPaolo Bonzini /* 516*783e9e51SPaolo Bonzini * All done if the starting index of the node is where the 517*783e9e51SPaolo Bonzini * split should occur. 518*783e9e51SPaolo Bonzini */ 519*783e9e51SPaolo Bonzini if (nodep1->idx == idx) 520*783e9e51SPaolo Bonzini return nodep1; 521*783e9e51SPaolo Bonzini 522*783e9e51SPaolo Bonzini /* 523*783e9e51SPaolo Bonzini * Split point not at start of mask, so it must be part of 524*783e9e51SPaolo Bonzini * bits described by num_after. 525*783e9e51SPaolo Bonzini */ 526*783e9e51SPaolo Bonzini 527*783e9e51SPaolo Bonzini /* 528*783e9e51SPaolo Bonzini * Calculate offset within num_after for where the split is 529*783e9e51SPaolo Bonzini * to occur. 530*783e9e51SPaolo Bonzini */ 531*783e9e51SPaolo Bonzini offset = idx - (nodep1->idx + MASK_BITS); 532*783e9e51SPaolo Bonzini orig_num_after = nodep1->num_after; 533*783e9e51SPaolo Bonzini 534*783e9e51SPaolo Bonzini /* 535*783e9e51SPaolo Bonzini * Add a new node to describe the bits starting at 536*783e9e51SPaolo Bonzini * the split point. 537*783e9e51SPaolo Bonzini */ 538*783e9e51SPaolo Bonzini nodep1->num_after = offset; 539*783e9e51SPaolo Bonzini nodep2 = node_add(s, idx); 540*783e9e51SPaolo Bonzini 541*783e9e51SPaolo Bonzini /* Move bits after the split point into the new node */ 542*783e9e51SPaolo Bonzini nodep2->num_after = orig_num_after - offset; 543*783e9e51SPaolo Bonzini if (nodep2->num_after >= MASK_BITS) { 544*783e9e51SPaolo Bonzini nodep2->mask = ~(mask_t) 0; 545*783e9e51SPaolo Bonzini nodep2->num_after -= MASK_BITS; 546*783e9e51SPaolo Bonzini } else { 547*783e9e51SPaolo Bonzini nodep2->mask = (1 << nodep2->num_after) - 1; 548*783e9e51SPaolo Bonzini nodep2->num_after = 0; 549*783e9e51SPaolo Bonzini } 550*783e9e51SPaolo Bonzini 551*783e9e51SPaolo Bonzini return nodep2; 552*783e9e51SPaolo Bonzini } 553*783e9e51SPaolo Bonzini 554*783e9e51SPaolo Bonzini /* Iteratively reduces the node pointed to by nodep and its adjacent 555*783e9e51SPaolo Bonzini * nodes into a more compact form. For example, a node with a mask with 556*783e9e51SPaolo Bonzini * all bits set adjacent to a previous node, will get combined into a 557*783e9e51SPaolo Bonzini * single node with an increased num_after setting. 558*783e9e51SPaolo Bonzini * 559*783e9e51SPaolo Bonzini * After each reduction, a further check is made to see if additional 560*783e9e51SPaolo Bonzini * reductions are possible with the new previous and next nodes. Note, 561*783e9e51SPaolo Bonzini * a search for a reduction is only done across the nodes nearest nodep 562*783e9e51SPaolo Bonzini * and those that became part of a reduction. Reductions beyond nodep 563*783e9e51SPaolo Bonzini * and the adjacent nodes that are reduced are not discovered. It is the 564*783e9e51SPaolo Bonzini * responsibility of the caller to pass a nodep that is within one node 565*783e9e51SPaolo Bonzini * of each possible reduction. 566*783e9e51SPaolo Bonzini * 567*783e9e51SPaolo Bonzini * This function does not fix the temporary violation of all invariants. 568*783e9e51SPaolo Bonzini * For example it does not fix the case where the bit settings described 569*783e9e51SPaolo Bonzini * by two or more nodes overlap. Such a violation introduces the potential 570*783e9e51SPaolo Bonzini * complication of a bit setting for a specific index having different settings 571*783e9e51SPaolo Bonzini * in different nodes. This would then introduce the further complication 572*783e9e51SPaolo Bonzini * of which node has the correct setting of the bit and thus such conditions 573*783e9e51SPaolo Bonzini * are not allowed. 574*783e9e51SPaolo Bonzini * 575*783e9e51SPaolo Bonzini * This function is designed to fix invariant violations that are introduced 576*783e9e51SPaolo Bonzini * by node_split() and by changes to the nodes mask or num_after members. 577*783e9e51SPaolo Bonzini * For example, when setting a bit within a nodes mask, the function that 578*783e9e51SPaolo Bonzini * sets the bit doesn't have to worry about whether the setting of that 579*783e9e51SPaolo Bonzini * bit caused the mask to have leading only or trailing only bits set. 580*783e9e51SPaolo Bonzini * Instead, the function can call node_reduce(), with nodep equal to the 581*783e9e51SPaolo Bonzini * node address that it set a mask bit in, and node_reduce() will notice 582*783e9e51SPaolo Bonzini * the cases of leading or trailing only bits and that there is an 583*783e9e51SPaolo Bonzini * adjacent node that the bit settings could be merged into. 584*783e9e51SPaolo Bonzini * 585*783e9e51SPaolo Bonzini * This implementation specifically detects and corrects violation of the 586*783e9e51SPaolo Bonzini * following invariants: 587*783e9e51SPaolo Bonzini * 588*783e9e51SPaolo Bonzini * + Node are only used to represent bits that are set. 589*783e9e51SPaolo Bonzini * Nodes with a mask of 0 and num_after of 0 are not allowed. 590*783e9e51SPaolo Bonzini * 591*783e9e51SPaolo Bonzini * + The setting of at least one bit is always described in a nodes 592*783e9e51SPaolo Bonzini * mask (mask >= 1). 593*783e9e51SPaolo Bonzini * 594*783e9e51SPaolo Bonzini * + A node with all mask bits set only occurs when the last bit 595*783e9e51SPaolo Bonzini * described by the previous node is not equal to this nodes 596*783e9e51SPaolo Bonzini * starting index - 1. All such occurences of this condition are 597*783e9e51SPaolo Bonzini * avoided by moving the setting of the nodes mask bits into 598*783e9e51SPaolo Bonzini * the previous nodes num_after setting. 599*783e9e51SPaolo Bonzini */ 600*783e9e51SPaolo Bonzini static void node_reduce(struct sparsebit *s, struct node *nodep) 601*783e9e51SPaolo Bonzini { 602*783e9e51SPaolo Bonzini bool reduction_performed; 603*783e9e51SPaolo Bonzini 604*783e9e51SPaolo Bonzini do { 605*783e9e51SPaolo Bonzini reduction_performed = false; 606*783e9e51SPaolo Bonzini struct node *prev, *next, *tmp; 607*783e9e51SPaolo Bonzini 608*783e9e51SPaolo Bonzini /* 1) Potential reductions within the current node. */ 609*783e9e51SPaolo Bonzini 610*783e9e51SPaolo Bonzini /* Nodes with all bits cleared may be removed. */ 611*783e9e51SPaolo Bonzini if (nodep->mask == 0 && nodep->num_after == 0) { 612*783e9e51SPaolo Bonzini /* 613*783e9e51SPaolo Bonzini * About to remove the node pointed to by 614*783e9e51SPaolo Bonzini * nodep, which normally would cause a problem 615*783e9e51SPaolo Bonzini * for the next pass through the reduction loop, 616*783e9e51SPaolo Bonzini * because the node at the starting point no longer 617*783e9e51SPaolo Bonzini * exists. This potential problem is handled 618*783e9e51SPaolo Bonzini * by first remembering the location of the next 619*783e9e51SPaolo Bonzini * or previous nodes. Doesn't matter which, because 620*783e9e51SPaolo Bonzini * once the node at nodep is removed, there will be 621*783e9e51SPaolo Bonzini * no other nodes between prev and next. 622*783e9e51SPaolo Bonzini * 623*783e9e51SPaolo Bonzini * Note, the checks performed on nodep against both 624*783e9e51SPaolo Bonzini * both prev and next both check for an adjacent 625*783e9e51SPaolo Bonzini * node that can be reduced into a single node. As 626*783e9e51SPaolo Bonzini * such, after removing the node at nodep, doesn't 627*783e9e51SPaolo Bonzini * matter whether the nodep for the next pass 628*783e9e51SPaolo Bonzini * through the loop is equal to the previous pass 629*783e9e51SPaolo Bonzini * prev or next node. Either way, on the next pass 630*783e9e51SPaolo Bonzini * the one not selected will become either the 631*783e9e51SPaolo Bonzini * prev or next node. 632*783e9e51SPaolo Bonzini */ 633*783e9e51SPaolo Bonzini tmp = node_next(s, nodep); 634*783e9e51SPaolo Bonzini if (!tmp) 635*783e9e51SPaolo Bonzini tmp = node_prev(s, nodep); 636*783e9e51SPaolo Bonzini 637*783e9e51SPaolo Bonzini node_rm(s, nodep); 638*783e9e51SPaolo Bonzini nodep = NULL; 639*783e9e51SPaolo Bonzini 640*783e9e51SPaolo Bonzini nodep = tmp; 641*783e9e51SPaolo Bonzini reduction_performed = true; 642*783e9e51SPaolo Bonzini continue; 643*783e9e51SPaolo Bonzini } 644*783e9e51SPaolo Bonzini 645*783e9e51SPaolo Bonzini /* 646*783e9e51SPaolo Bonzini * When the mask is 0, can reduce the amount of num_after 647*783e9e51SPaolo Bonzini * bits by moving the initial num_after bits into the mask. 648*783e9e51SPaolo Bonzini */ 649*783e9e51SPaolo Bonzini if (nodep->mask == 0) { 650*783e9e51SPaolo Bonzini assert(nodep->num_after != 0); 651*783e9e51SPaolo Bonzini assert(nodep->idx + MASK_BITS > nodep->idx); 652*783e9e51SPaolo Bonzini 653*783e9e51SPaolo Bonzini nodep->idx += MASK_BITS; 654*783e9e51SPaolo Bonzini 655*783e9e51SPaolo Bonzini if (nodep->num_after >= MASK_BITS) { 656*783e9e51SPaolo Bonzini nodep->mask = ~0; 657*783e9e51SPaolo Bonzini nodep->num_after -= MASK_BITS; 658*783e9e51SPaolo Bonzini } else { 659*783e9e51SPaolo Bonzini nodep->mask = (1u << nodep->num_after) - 1; 660*783e9e51SPaolo Bonzini nodep->num_after = 0; 661*783e9e51SPaolo Bonzini } 662*783e9e51SPaolo Bonzini 663*783e9e51SPaolo Bonzini reduction_performed = true; 664*783e9e51SPaolo Bonzini continue; 665*783e9e51SPaolo Bonzini } 666*783e9e51SPaolo Bonzini 667*783e9e51SPaolo Bonzini /* 668*783e9e51SPaolo Bonzini * 2) Potential reductions between the current and 669*783e9e51SPaolo Bonzini * previous nodes. 670*783e9e51SPaolo Bonzini */ 671*783e9e51SPaolo Bonzini prev = node_prev(s, nodep); 672*783e9e51SPaolo Bonzini if (prev) { 673*783e9e51SPaolo Bonzini sparsebit_idx_t prev_highest_bit; 674*783e9e51SPaolo Bonzini 675*783e9e51SPaolo Bonzini /* Nodes with no bits set can be removed. */ 676*783e9e51SPaolo Bonzini if (prev->mask == 0 && prev->num_after == 0) { 677*783e9e51SPaolo Bonzini node_rm(s, prev); 678*783e9e51SPaolo Bonzini 679*783e9e51SPaolo Bonzini reduction_performed = true; 680*783e9e51SPaolo Bonzini continue; 681*783e9e51SPaolo Bonzini } 682*783e9e51SPaolo Bonzini 683*783e9e51SPaolo Bonzini /* 684*783e9e51SPaolo Bonzini * All mask bits set and previous node has 685*783e9e51SPaolo Bonzini * adjacent index. 686*783e9e51SPaolo Bonzini */ 687*783e9e51SPaolo Bonzini if (nodep->mask + 1 == 0 && 688*783e9e51SPaolo Bonzini prev->idx + MASK_BITS == nodep->idx) { 689*783e9e51SPaolo Bonzini prev->num_after += MASK_BITS + nodep->num_after; 690*783e9e51SPaolo Bonzini nodep->mask = 0; 691*783e9e51SPaolo Bonzini nodep->num_after = 0; 692*783e9e51SPaolo Bonzini 693*783e9e51SPaolo Bonzini reduction_performed = true; 694*783e9e51SPaolo Bonzini continue; 695*783e9e51SPaolo Bonzini } 696*783e9e51SPaolo Bonzini 697*783e9e51SPaolo Bonzini /* 698*783e9e51SPaolo Bonzini * Is node adjacent to previous node and the node 699*783e9e51SPaolo Bonzini * contains a single contiguous range of bits 700*783e9e51SPaolo Bonzini * starting from the beginning of the mask? 701*783e9e51SPaolo Bonzini */ 702*783e9e51SPaolo Bonzini prev_highest_bit = prev->idx + MASK_BITS - 1 + prev->num_after; 703*783e9e51SPaolo Bonzini if (prev_highest_bit + 1 == nodep->idx && 704*783e9e51SPaolo Bonzini (nodep->mask | (nodep->mask >> 1)) == nodep->mask) { 705*783e9e51SPaolo Bonzini /* 706*783e9e51SPaolo Bonzini * How many contiguous bits are there? 707*783e9e51SPaolo Bonzini * Is equal to the total number of set 708*783e9e51SPaolo Bonzini * bits, due to an earlier check that 709*783e9e51SPaolo Bonzini * there is a single contiguous range of 710*783e9e51SPaolo Bonzini * set bits. 711*783e9e51SPaolo Bonzini */ 712*783e9e51SPaolo Bonzini unsigned int num_contiguous 713*783e9e51SPaolo Bonzini = __builtin_popcount(nodep->mask); 714*783e9e51SPaolo Bonzini assert((num_contiguous > 0) && 715*783e9e51SPaolo Bonzini ((1ULL << num_contiguous) - 1) == nodep->mask); 716*783e9e51SPaolo Bonzini 717*783e9e51SPaolo Bonzini prev->num_after += num_contiguous; 718*783e9e51SPaolo Bonzini nodep->mask = 0; 719*783e9e51SPaolo Bonzini 720*783e9e51SPaolo Bonzini /* 721*783e9e51SPaolo Bonzini * For predictable performance, handle special 722*783e9e51SPaolo Bonzini * case where all mask bits are set and there 723*783e9e51SPaolo Bonzini * is a non-zero num_after setting. This code 724*783e9e51SPaolo Bonzini * is functionally correct without the following 725*783e9e51SPaolo Bonzini * conditionalized statements, but without them 726*783e9e51SPaolo Bonzini * the value of num_after is only reduced by 727*783e9e51SPaolo Bonzini * the number of mask bits per pass. There are 728*783e9e51SPaolo Bonzini * cases where num_after can be close to 2^64. 729*783e9e51SPaolo Bonzini * Without this code it could take nearly 730*783e9e51SPaolo Bonzini * (2^64) / 32 passes to perform the full 731*783e9e51SPaolo Bonzini * reduction. 732*783e9e51SPaolo Bonzini */ 733*783e9e51SPaolo Bonzini if (num_contiguous == MASK_BITS) { 734*783e9e51SPaolo Bonzini prev->num_after += nodep->num_after; 735*783e9e51SPaolo Bonzini nodep->num_after = 0; 736*783e9e51SPaolo Bonzini } 737*783e9e51SPaolo Bonzini 738*783e9e51SPaolo Bonzini reduction_performed = true; 739*783e9e51SPaolo Bonzini continue; 740*783e9e51SPaolo Bonzini } 741*783e9e51SPaolo Bonzini } 742*783e9e51SPaolo Bonzini 743*783e9e51SPaolo Bonzini /* 744*783e9e51SPaolo Bonzini * 3) Potential reductions between the current and 745*783e9e51SPaolo Bonzini * next nodes. 746*783e9e51SPaolo Bonzini */ 747*783e9e51SPaolo Bonzini next = node_next(s, nodep); 748*783e9e51SPaolo Bonzini if (next) { 749*783e9e51SPaolo Bonzini /* Nodes with no bits set can be removed. */ 750*783e9e51SPaolo Bonzini if (next->mask == 0 && next->num_after == 0) { 751*783e9e51SPaolo Bonzini node_rm(s, next); 752*783e9e51SPaolo Bonzini reduction_performed = true; 753*783e9e51SPaolo Bonzini continue; 754*783e9e51SPaolo Bonzini } 755*783e9e51SPaolo Bonzini 756*783e9e51SPaolo Bonzini /* 757*783e9e51SPaolo Bonzini * Is next node index adjacent to current node 758*783e9e51SPaolo Bonzini * and has a mask with all bits set? 759*783e9e51SPaolo Bonzini */ 760*783e9e51SPaolo Bonzini if (next->idx == nodep->idx + MASK_BITS + nodep->num_after && 761*783e9e51SPaolo Bonzini next->mask == ~(mask_t) 0) { 762*783e9e51SPaolo Bonzini nodep->num_after += MASK_BITS; 763*783e9e51SPaolo Bonzini next->mask = 0; 764*783e9e51SPaolo Bonzini nodep->num_after += next->num_after; 765*783e9e51SPaolo Bonzini next->num_after = 0; 766*783e9e51SPaolo Bonzini 767*783e9e51SPaolo Bonzini node_rm(s, next); 768*783e9e51SPaolo Bonzini next = NULL; 769*783e9e51SPaolo Bonzini 770*783e9e51SPaolo Bonzini reduction_performed = true; 771*783e9e51SPaolo Bonzini continue; 772*783e9e51SPaolo Bonzini } 773*783e9e51SPaolo Bonzini } 774*783e9e51SPaolo Bonzini } while (nodep && reduction_performed); 775*783e9e51SPaolo Bonzini } 776*783e9e51SPaolo Bonzini 777*783e9e51SPaolo Bonzini /* Returns whether the bit at the index given by idx, within the 778*783e9e51SPaolo Bonzini * sparsebit array is set or not. 779*783e9e51SPaolo Bonzini */ 780*783e9e51SPaolo Bonzini bool sparsebit_is_set(struct sparsebit *s, sparsebit_idx_t idx) 781*783e9e51SPaolo Bonzini { 782*783e9e51SPaolo Bonzini struct node *nodep; 783*783e9e51SPaolo Bonzini 784*783e9e51SPaolo Bonzini /* Find the node that describes the setting of the bit at idx */ 785*783e9e51SPaolo Bonzini for (nodep = s->root; nodep; 786*783e9e51SPaolo Bonzini nodep = nodep->idx > idx ? nodep->left : nodep->right) 787*783e9e51SPaolo Bonzini if (idx >= nodep->idx && 788*783e9e51SPaolo Bonzini idx <= nodep->idx + MASK_BITS + nodep->num_after - 1) 789*783e9e51SPaolo Bonzini goto have_node; 790*783e9e51SPaolo Bonzini 791*783e9e51SPaolo Bonzini return false; 792*783e9e51SPaolo Bonzini 793*783e9e51SPaolo Bonzini have_node: 794*783e9e51SPaolo Bonzini /* Bit is set if it is any of the bits described by num_after */ 795*783e9e51SPaolo Bonzini if (nodep->num_after && idx >= nodep->idx + MASK_BITS) 796*783e9e51SPaolo Bonzini return true; 797*783e9e51SPaolo Bonzini 798*783e9e51SPaolo Bonzini /* Is the corresponding mask bit set */ 799*783e9e51SPaolo Bonzini assert(idx >= nodep->idx && idx - nodep->idx < MASK_BITS); 800*783e9e51SPaolo Bonzini return !!(nodep->mask & (1 << (idx - nodep->idx))); 801*783e9e51SPaolo Bonzini } 802*783e9e51SPaolo Bonzini 803*783e9e51SPaolo Bonzini /* Within the sparsebit array pointed to by s, sets the bit 804*783e9e51SPaolo Bonzini * at the index given by idx. 805*783e9e51SPaolo Bonzini */ 806*783e9e51SPaolo Bonzini static void bit_set(struct sparsebit *s, sparsebit_idx_t idx) 807*783e9e51SPaolo Bonzini { 808*783e9e51SPaolo Bonzini struct node *nodep; 809*783e9e51SPaolo Bonzini 810*783e9e51SPaolo Bonzini /* Skip bits that are already set */ 811*783e9e51SPaolo Bonzini if (sparsebit_is_set(s, idx)) 812*783e9e51SPaolo Bonzini return; 813*783e9e51SPaolo Bonzini 814*783e9e51SPaolo Bonzini /* 815*783e9e51SPaolo Bonzini * Get a node where the bit at idx is described by the mask. 816*783e9e51SPaolo Bonzini * The node_split will also create a node, if there isn't 817*783e9e51SPaolo Bonzini * already a node that describes the setting of bit. 818*783e9e51SPaolo Bonzini */ 819*783e9e51SPaolo Bonzini nodep = node_split(s, idx & -MASK_BITS); 820*783e9e51SPaolo Bonzini 821*783e9e51SPaolo Bonzini /* Set the bit within the nodes mask */ 822*783e9e51SPaolo Bonzini assert(idx >= nodep->idx && idx <= nodep->idx + MASK_BITS - 1); 823*783e9e51SPaolo Bonzini assert(!(nodep->mask & (1 << (idx - nodep->idx)))); 824*783e9e51SPaolo Bonzini nodep->mask |= 1 << (idx - nodep->idx); 825*783e9e51SPaolo Bonzini s->num_set++; 826*783e9e51SPaolo Bonzini 827*783e9e51SPaolo Bonzini node_reduce(s, nodep); 828*783e9e51SPaolo Bonzini } 829*783e9e51SPaolo Bonzini 830*783e9e51SPaolo Bonzini /* Within the sparsebit array pointed to by s, clears the bit 831*783e9e51SPaolo Bonzini * at the index given by idx. 832*783e9e51SPaolo Bonzini */ 833*783e9e51SPaolo Bonzini static void bit_clear(struct sparsebit *s, sparsebit_idx_t idx) 834*783e9e51SPaolo Bonzini { 835*783e9e51SPaolo Bonzini struct node *nodep; 836*783e9e51SPaolo Bonzini 837*783e9e51SPaolo Bonzini /* Skip bits that are already cleared */ 838*783e9e51SPaolo Bonzini if (!sparsebit_is_set(s, idx)) 839*783e9e51SPaolo Bonzini return; 840*783e9e51SPaolo Bonzini 841*783e9e51SPaolo Bonzini /* Is there a node that describes the setting of this bit? */ 842*783e9e51SPaolo Bonzini nodep = node_find(s, idx); 843*783e9e51SPaolo Bonzini if (!nodep) 844*783e9e51SPaolo Bonzini return; 845*783e9e51SPaolo Bonzini 846*783e9e51SPaolo Bonzini /* 847*783e9e51SPaolo Bonzini * If a num_after bit, split the node, so that the bit is 848*783e9e51SPaolo Bonzini * part of a node mask. 849*783e9e51SPaolo Bonzini */ 850*783e9e51SPaolo Bonzini if (idx >= nodep->idx + MASK_BITS) 851*783e9e51SPaolo Bonzini nodep = node_split(s, idx & -MASK_BITS); 852*783e9e51SPaolo Bonzini 853*783e9e51SPaolo Bonzini /* 854*783e9e51SPaolo Bonzini * After node_split above, bit at idx should be within the mask. 855*783e9e51SPaolo Bonzini * Clear that bit. 856*783e9e51SPaolo Bonzini */ 857*783e9e51SPaolo Bonzini assert(idx >= nodep->idx && idx <= nodep->idx + MASK_BITS - 1); 858*783e9e51SPaolo Bonzini assert(nodep->mask & (1 << (idx - nodep->idx))); 859*783e9e51SPaolo Bonzini nodep->mask &= ~(1 << (idx - nodep->idx)); 860*783e9e51SPaolo Bonzini assert(s->num_set > 0 || sparsebit_all_set(s)); 861*783e9e51SPaolo Bonzini s->num_set--; 862*783e9e51SPaolo Bonzini 863*783e9e51SPaolo Bonzini node_reduce(s, nodep); 864*783e9e51SPaolo Bonzini } 865*783e9e51SPaolo Bonzini 866*783e9e51SPaolo Bonzini /* Recursively dumps to the FILE stream given by stream the contents 867*783e9e51SPaolo Bonzini * of the sub-tree of nodes pointed to by nodep. Each line of output 868*783e9e51SPaolo Bonzini * is prefixed by the number of spaces given by indent. On each 869*783e9e51SPaolo Bonzini * recursion, the indent amount is increased by 2. This causes nodes 870*783e9e51SPaolo Bonzini * at each level deeper into the binary search tree to be displayed 871*783e9e51SPaolo Bonzini * with a greater indent. 872*783e9e51SPaolo Bonzini */ 873*783e9e51SPaolo Bonzini static void dump_nodes(FILE *stream, struct node *nodep, 874*783e9e51SPaolo Bonzini unsigned int indent) 875*783e9e51SPaolo Bonzini { 876*783e9e51SPaolo Bonzini char *node_type; 877*783e9e51SPaolo Bonzini 878*783e9e51SPaolo Bonzini /* Dump contents of node */ 879*783e9e51SPaolo Bonzini if (!nodep->parent) 880*783e9e51SPaolo Bonzini node_type = "root"; 881*783e9e51SPaolo Bonzini else if (nodep == nodep->parent->left) 882*783e9e51SPaolo Bonzini node_type = "left"; 883*783e9e51SPaolo Bonzini else { 884*783e9e51SPaolo Bonzini assert(nodep == nodep->parent->right); 885*783e9e51SPaolo Bonzini node_type = "right"; 886*783e9e51SPaolo Bonzini } 887*783e9e51SPaolo Bonzini fprintf(stream, "%*s---- %s nodep: %p\n", indent, "", node_type, nodep); 888*783e9e51SPaolo Bonzini fprintf(stream, "%*s parent: %p left: %p right: %p\n", indent, "", 889*783e9e51SPaolo Bonzini nodep->parent, nodep->left, nodep->right); 890*783e9e51SPaolo Bonzini fprintf(stream, "%*s idx: 0x%lx mask: 0x%x num_after: 0x%lx\n", 891*783e9e51SPaolo Bonzini indent, "", nodep->idx, nodep->mask, nodep->num_after); 892*783e9e51SPaolo Bonzini 893*783e9e51SPaolo Bonzini /* If present, dump contents of left child nodes */ 894*783e9e51SPaolo Bonzini if (nodep->left) 895*783e9e51SPaolo Bonzini dump_nodes(stream, nodep->left, indent + 2); 896*783e9e51SPaolo Bonzini 897*783e9e51SPaolo Bonzini /* If present, dump contents of right child nodes */ 898*783e9e51SPaolo Bonzini if (nodep->right) 899*783e9e51SPaolo Bonzini dump_nodes(stream, nodep->right, indent + 2); 900*783e9e51SPaolo Bonzini } 901*783e9e51SPaolo Bonzini 902*783e9e51SPaolo Bonzini static inline sparsebit_idx_t node_first_set(struct node *nodep, int start) 903*783e9e51SPaolo Bonzini { 904*783e9e51SPaolo Bonzini mask_t leading = (mask_t)1 << start; 905*783e9e51SPaolo Bonzini int n1 = __builtin_ctz(nodep->mask & -leading); 906*783e9e51SPaolo Bonzini 907*783e9e51SPaolo Bonzini return nodep->idx + n1; 908*783e9e51SPaolo Bonzini } 909*783e9e51SPaolo Bonzini 910*783e9e51SPaolo Bonzini static inline sparsebit_idx_t node_first_clear(struct node *nodep, int start) 911*783e9e51SPaolo Bonzini { 912*783e9e51SPaolo Bonzini mask_t leading = (mask_t)1 << start; 913*783e9e51SPaolo Bonzini int n1 = __builtin_ctz(~nodep->mask & -leading); 914*783e9e51SPaolo Bonzini 915*783e9e51SPaolo Bonzini return nodep->idx + n1; 916*783e9e51SPaolo Bonzini } 917*783e9e51SPaolo Bonzini 918*783e9e51SPaolo Bonzini /* Dumps to the FILE stream specified by stream, the implementation dependent 919*783e9e51SPaolo Bonzini * internal state of s. Each line of output is prefixed with the number 920*783e9e51SPaolo Bonzini * of spaces given by indent. The output is completely implementation 921*783e9e51SPaolo Bonzini * dependent and subject to change. Output from this function should only 922*783e9e51SPaolo Bonzini * be used for diagnostic purposes. For example, this function can be 923*783e9e51SPaolo Bonzini * used by test cases after they detect an unexpected condition, as a means 924*783e9e51SPaolo Bonzini * to capture diagnostic information. 925*783e9e51SPaolo Bonzini */ 926*783e9e51SPaolo Bonzini static void sparsebit_dump_internal(FILE *stream, struct sparsebit *s, 927*783e9e51SPaolo Bonzini unsigned int indent) 928*783e9e51SPaolo Bonzini { 929*783e9e51SPaolo Bonzini /* Dump the contents of s */ 930*783e9e51SPaolo Bonzini fprintf(stream, "%*sroot: %p\n", indent, "", s->root); 931*783e9e51SPaolo Bonzini fprintf(stream, "%*snum_set: 0x%lx\n", indent, "", s->num_set); 932*783e9e51SPaolo Bonzini 933*783e9e51SPaolo Bonzini if (s->root) 934*783e9e51SPaolo Bonzini dump_nodes(stream, s->root, indent); 935*783e9e51SPaolo Bonzini } 936*783e9e51SPaolo Bonzini 937*783e9e51SPaolo Bonzini /* Allocates and returns a new sparsebit array. The initial state 938*783e9e51SPaolo Bonzini * of the newly allocated sparsebit array has all bits cleared. 939*783e9e51SPaolo Bonzini */ 940*783e9e51SPaolo Bonzini struct sparsebit *sparsebit_alloc(void) 941*783e9e51SPaolo Bonzini { 942*783e9e51SPaolo Bonzini struct sparsebit *s; 943*783e9e51SPaolo Bonzini 944*783e9e51SPaolo Bonzini /* Allocate top level structure. */ 945*783e9e51SPaolo Bonzini s = calloc(1, sizeof(*s)); 946*783e9e51SPaolo Bonzini if (!s) { 947*783e9e51SPaolo Bonzini perror("calloc"); 948*783e9e51SPaolo Bonzini abort(); 949*783e9e51SPaolo Bonzini } 950*783e9e51SPaolo Bonzini 951*783e9e51SPaolo Bonzini return s; 952*783e9e51SPaolo Bonzini } 953*783e9e51SPaolo Bonzini 954*783e9e51SPaolo Bonzini /* Frees the implementation dependent data for the sparsebit array 955*783e9e51SPaolo Bonzini * pointed to by s and poisons the pointer to that data. 956*783e9e51SPaolo Bonzini */ 957*783e9e51SPaolo Bonzini void sparsebit_free(struct sparsebit **sbitp) 958*783e9e51SPaolo Bonzini { 959*783e9e51SPaolo Bonzini struct sparsebit *s = *sbitp; 960*783e9e51SPaolo Bonzini 961*783e9e51SPaolo Bonzini if (!s) 962*783e9e51SPaolo Bonzini return; 963*783e9e51SPaolo Bonzini 964*783e9e51SPaolo Bonzini sparsebit_clear_all(s); 965*783e9e51SPaolo Bonzini free(s); 966*783e9e51SPaolo Bonzini *sbitp = NULL; 967*783e9e51SPaolo Bonzini } 968*783e9e51SPaolo Bonzini 969*783e9e51SPaolo Bonzini /* Makes a copy of the sparsebit array given by s, to the sparsebit 970*783e9e51SPaolo Bonzini * array given by d. Note, d must have already been allocated via 971*783e9e51SPaolo Bonzini * sparsebit_alloc(). It can though already have bits set, which 972*783e9e51SPaolo Bonzini * if different from src will be cleared. 973*783e9e51SPaolo Bonzini */ 974*783e9e51SPaolo Bonzini void sparsebit_copy(struct sparsebit *d, struct sparsebit *s) 975*783e9e51SPaolo Bonzini { 976*783e9e51SPaolo Bonzini /* First clear any bits already set in the destination */ 977*783e9e51SPaolo Bonzini sparsebit_clear_all(d); 978*783e9e51SPaolo Bonzini 979*783e9e51SPaolo Bonzini if (s->root) { 980*783e9e51SPaolo Bonzini d->root = node_copy_subtree(s->root); 981*783e9e51SPaolo Bonzini d->num_set = s->num_set; 982*783e9e51SPaolo Bonzini } 983*783e9e51SPaolo Bonzini } 984*783e9e51SPaolo Bonzini 985*783e9e51SPaolo Bonzini /* Returns whether num consecutive bits starting at idx are all set. */ 986*783e9e51SPaolo Bonzini bool sparsebit_is_set_num(struct sparsebit *s, 987*783e9e51SPaolo Bonzini sparsebit_idx_t idx, sparsebit_num_t num) 988*783e9e51SPaolo Bonzini { 989*783e9e51SPaolo Bonzini sparsebit_idx_t next_cleared; 990*783e9e51SPaolo Bonzini 991*783e9e51SPaolo Bonzini assert(num > 0); 992*783e9e51SPaolo Bonzini assert(idx + num - 1 >= idx); 993*783e9e51SPaolo Bonzini 994*783e9e51SPaolo Bonzini /* With num > 0, the first bit must be set. */ 995*783e9e51SPaolo Bonzini if (!sparsebit_is_set(s, idx)) 996*783e9e51SPaolo Bonzini return false; 997*783e9e51SPaolo Bonzini 998*783e9e51SPaolo Bonzini /* Find the next cleared bit */ 999*783e9e51SPaolo Bonzini next_cleared = sparsebit_next_clear(s, idx); 1000*783e9e51SPaolo Bonzini 1001*783e9e51SPaolo Bonzini /* 1002*783e9e51SPaolo Bonzini * If no cleared bits beyond idx, then there are at least num 1003*783e9e51SPaolo Bonzini * set bits. idx + num doesn't wrap. Otherwise check if 1004*783e9e51SPaolo Bonzini * there are enough set bits between idx and the next cleared bit. 1005*783e9e51SPaolo Bonzini */ 1006*783e9e51SPaolo Bonzini return next_cleared == 0 || next_cleared - idx >= num; 1007*783e9e51SPaolo Bonzini } 1008*783e9e51SPaolo Bonzini 1009*783e9e51SPaolo Bonzini /* Returns whether the bit at the index given by idx. */ 1010*783e9e51SPaolo Bonzini bool sparsebit_is_clear(struct sparsebit *s, 1011*783e9e51SPaolo Bonzini sparsebit_idx_t idx) 1012*783e9e51SPaolo Bonzini { 1013*783e9e51SPaolo Bonzini return !sparsebit_is_set(s, idx); 1014*783e9e51SPaolo Bonzini } 1015*783e9e51SPaolo Bonzini 1016*783e9e51SPaolo Bonzini /* Returns whether num consecutive bits starting at idx are all cleared. */ 1017*783e9e51SPaolo Bonzini bool sparsebit_is_clear_num(struct sparsebit *s, 1018*783e9e51SPaolo Bonzini sparsebit_idx_t idx, sparsebit_num_t num) 1019*783e9e51SPaolo Bonzini { 1020*783e9e51SPaolo Bonzini sparsebit_idx_t next_set; 1021*783e9e51SPaolo Bonzini 1022*783e9e51SPaolo Bonzini assert(num > 0); 1023*783e9e51SPaolo Bonzini assert(idx + num - 1 >= idx); 1024*783e9e51SPaolo Bonzini 1025*783e9e51SPaolo Bonzini /* With num > 0, the first bit must be cleared. */ 1026*783e9e51SPaolo Bonzini if (!sparsebit_is_clear(s, idx)) 1027*783e9e51SPaolo Bonzini return false; 1028*783e9e51SPaolo Bonzini 1029*783e9e51SPaolo Bonzini /* Find the next set bit */ 1030*783e9e51SPaolo Bonzini next_set = sparsebit_next_set(s, idx); 1031*783e9e51SPaolo Bonzini 1032*783e9e51SPaolo Bonzini /* 1033*783e9e51SPaolo Bonzini * If no set bits beyond idx, then there are at least num 1034*783e9e51SPaolo Bonzini * cleared bits. idx + num doesn't wrap. Otherwise check if 1035*783e9e51SPaolo Bonzini * there are enough cleared bits between idx and the next set bit. 1036*783e9e51SPaolo Bonzini */ 1037*783e9e51SPaolo Bonzini return next_set == 0 || next_set - idx >= num; 1038*783e9e51SPaolo Bonzini } 1039*783e9e51SPaolo Bonzini 1040*783e9e51SPaolo Bonzini /* Returns the total number of bits set. Note: 0 is also returned for 1041*783e9e51SPaolo Bonzini * the case of all bits set. This is because with all bits set, there 1042*783e9e51SPaolo Bonzini * is 1 additional bit set beyond what can be represented in the return 1043*783e9e51SPaolo Bonzini * value. Use sparsebit_any_set(), instead of sparsebit_num_set() > 0, 1044*783e9e51SPaolo Bonzini * to determine if the sparsebit array has any bits set. 1045*783e9e51SPaolo Bonzini */ 1046*783e9e51SPaolo Bonzini sparsebit_num_t sparsebit_num_set(struct sparsebit *s) 1047*783e9e51SPaolo Bonzini { 1048*783e9e51SPaolo Bonzini return s->num_set; 1049*783e9e51SPaolo Bonzini } 1050*783e9e51SPaolo Bonzini 1051*783e9e51SPaolo Bonzini /* Returns whether any bit is set in the sparsebit array. */ 1052*783e9e51SPaolo Bonzini bool sparsebit_any_set(struct sparsebit *s) 1053*783e9e51SPaolo Bonzini { 1054*783e9e51SPaolo Bonzini /* 1055*783e9e51SPaolo Bonzini * Nodes only describe set bits. If any nodes then there 1056*783e9e51SPaolo Bonzini * is at least 1 bit set. 1057*783e9e51SPaolo Bonzini */ 1058*783e9e51SPaolo Bonzini if (!s->root) 1059*783e9e51SPaolo Bonzini return false; 1060*783e9e51SPaolo Bonzini 1061*783e9e51SPaolo Bonzini /* 1062*783e9e51SPaolo Bonzini * Every node should have a non-zero mask. For now will 1063*783e9e51SPaolo Bonzini * just assure that the root node has a non-zero mask, 1064*783e9e51SPaolo Bonzini * which is a quick check that at least 1 bit is set. 1065*783e9e51SPaolo Bonzini */ 1066*783e9e51SPaolo Bonzini assert(s->root->mask != 0); 1067*783e9e51SPaolo Bonzini assert(s->num_set > 0 || 1068*783e9e51SPaolo Bonzini (s->root->num_after == ((sparsebit_num_t) 0) - MASK_BITS && 1069*783e9e51SPaolo Bonzini s->root->mask == ~(mask_t) 0)); 1070*783e9e51SPaolo Bonzini 1071*783e9e51SPaolo Bonzini return true; 1072*783e9e51SPaolo Bonzini } 1073*783e9e51SPaolo Bonzini 1074*783e9e51SPaolo Bonzini /* Returns whether all the bits in the sparsebit array are cleared. */ 1075*783e9e51SPaolo Bonzini bool sparsebit_all_clear(struct sparsebit *s) 1076*783e9e51SPaolo Bonzini { 1077*783e9e51SPaolo Bonzini return !sparsebit_any_set(s); 1078*783e9e51SPaolo Bonzini } 1079*783e9e51SPaolo Bonzini 1080*783e9e51SPaolo Bonzini /* Returns whether all the bits in the sparsebit array are set. */ 1081*783e9e51SPaolo Bonzini bool sparsebit_any_clear(struct sparsebit *s) 1082*783e9e51SPaolo Bonzini { 1083*783e9e51SPaolo Bonzini return !sparsebit_all_set(s); 1084*783e9e51SPaolo Bonzini } 1085*783e9e51SPaolo Bonzini 1086*783e9e51SPaolo Bonzini /* Returns the index of the first set bit. Abort if no bits are set. 1087*783e9e51SPaolo Bonzini */ 1088*783e9e51SPaolo Bonzini sparsebit_idx_t sparsebit_first_set(struct sparsebit *s) 1089*783e9e51SPaolo Bonzini { 1090*783e9e51SPaolo Bonzini struct node *nodep; 1091*783e9e51SPaolo Bonzini 1092*783e9e51SPaolo Bonzini /* Validate at least 1 bit is set */ 1093*783e9e51SPaolo Bonzini assert(sparsebit_any_set(s)); 1094*783e9e51SPaolo Bonzini 1095*783e9e51SPaolo Bonzini nodep = node_first(s); 1096*783e9e51SPaolo Bonzini return node_first_set(nodep, 0); 1097*783e9e51SPaolo Bonzini } 1098*783e9e51SPaolo Bonzini 1099*783e9e51SPaolo Bonzini /* Returns the index of the first cleared bit. Abort if 1100*783e9e51SPaolo Bonzini * no bits are cleared. 1101*783e9e51SPaolo Bonzini */ 1102*783e9e51SPaolo Bonzini sparsebit_idx_t sparsebit_first_clear(struct sparsebit *s) 1103*783e9e51SPaolo Bonzini { 1104*783e9e51SPaolo Bonzini struct node *nodep1, *nodep2; 1105*783e9e51SPaolo Bonzini 1106*783e9e51SPaolo Bonzini /* Validate at least 1 bit is cleared. */ 1107*783e9e51SPaolo Bonzini assert(sparsebit_any_clear(s)); 1108*783e9e51SPaolo Bonzini 1109*783e9e51SPaolo Bonzini /* If no nodes or first node index > 0 then lowest cleared is 0 */ 1110*783e9e51SPaolo Bonzini nodep1 = node_first(s); 1111*783e9e51SPaolo Bonzini if (!nodep1 || nodep1->idx > 0) 1112*783e9e51SPaolo Bonzini return 0; 1113*783e9e51SPaolo Bonzini 1114*783e9e51SPaolo Bonzini /* Does the mask in the first node contain any cleared bits. */ 1115*783e9e51SPaolo Bonzini if (nodep1->mask != ~(mask_t) 0) 1116*783e9e51SPaolo Bonzini return node_first_clear(nodep1, 0); 1117*783e9e51SPaolo Bonzini 1118*783e9e51SPaolo Bonzini /* 1119*783e9e51SPaolo Bonzini * All mask bits set in first node. If there isn't a second node 1120*783e9e51SPaolo Bonzini * then the first cleared bit is the first bit after the bits 1121*783e9e51SPaolo Bonzini * described by the first node. 1122*783e9e51SPaolo Bonzini */ 1123*783e9e51SPaolo Bonzini nodep2 = node_next(s, nodep1); 1124*783e9e51SPaolo Bonzini if (!nodep2) { 1125*783e9e51SPaolo Bonzini /* 1126*783e9e51SPaolo Bonzini * No second node. First cleared bit is first bit beyond 1127*783e9e51SPaolo Bonzini * bits described by first node. 1128*783e9e51SPaolo Bonzini */ 1129*783e9e51SPaolo Bonzini assert(nodep1->mask == ~(mask_t) 0); 1130*783e9e51SPaolo Bonzini assert(nodep1->idx + MASK_BITS + nodep1->num_after != (sparsebit_idx_t) 0); 1131*783e9e51SPaolo Bonzini return nodep1->idx + MASK_BITS + nodep1->num_after; 1132*783e9e51SPaolo Bonzini } 1133*783e9e51SPaolo Bonzini 1134*783e9e51SPaolo Bonzini /* 1135*783e9e51SPaolo Bonzini * There is a second node. 1136*783e9e51SPaolo Bonzini * If it is not adjacent to the first node, then there is a gap 1137*783e9e51SPaolo Bonzini * of cleared bits between the nodes, and the first cleared bit 1138*783e9e51SPaolo Bonzini * is the first bit within the gap. 1139*783e9e51SPaolo Bonzini */ 1140*783e9e51SPaolo Bonzini if (nodep1->idx + MASK_BITS + nodep1->num_after != nodep2->idx) 1141*783e9e51SPaolo Bonzini return nodep1->idx + MASK_BITS + nodep1->num_after; 1142*783e9e51SPaolo Bonzini 1143*783e9e51SPaolo Bonzini /* 1144*783e9e51SPaolo Bonzini * Second node is adjacent to the first node. 1145*783e9e51SPaolo Bonzini * Because it is adjacent, its mask should be non-zero. If all 1146*783e9e51SPaolo Bonzini * its mask bits are set, then with it being adjacent, it should 1147*783e9e51SPaolo Bonzini * have had the mask bits moved into the num_after setting of the 1148*783e9e51SPaolo Bonzini * previous node. 1149*783e9e51SPaolo Bonzini */ 1150*783e9e51SPaolo Bonzini return node_first_clear(nodep2, 0); 1151*783e9e51SPaolo Bonzini } 1152*783e9e51SPaolo Bonzini 1153*783e9e51SPaolo Bonzini /* Returns index of next bit set within s after the index given by prev. 1154*783e9e51SPaolo Bonzini * Returns 0 if there are no bits after prev that are set. 1155*783e9e51SPaolo Bonzini */ 1156*783e9e51SPaolo Bonzini sparsebit_idx_t sparsebit_next_set(struct sparsebit *s, 1157*783e9e51SPaolo Bonzini sparsebit_idx_t prev) 1158*783e9e51SPaolo Bonzini { 1159*783e9e51SPaolo Bonzini sparsebit_idx_t lowest_possible = prev + 1; 1160*783e9e51SPaolo Bonzini sparsebit_idx_t start; 1161*783e9e51SPaolo Bonzini struct node *nodep; 1162*783e9e51SPaolo Bonzini 1163*783e9e51SPaolo Bonzini /* A bit after the highest index can't be set. */ 1164*783e9e51SPaolo Bonzini if (lowest_possible == 0) 1165*783e9e51SPaolo Bonzini return 0; 1166*783e9e51SPaolo Bonzini 1167*783e9e51SPaolo Bonzini /* 1168*783e9e51SPaolo Bonzini * Find the leftmost 'candidate' overlapping or to the right 1169*783e9e51SPaolo Bonzini * of lowest_possible. 1170*783e9e51SPaolo Bonzini */ 1171*783e9e51SPaolo Bonzini struct node *candidate = NULL; 1172*783e9e51SPaolo Bonzini 1173*783e9e51SPaolo Bonzini /* True iff lowest_possible is within candidate */ 1174*783e9e51SPaolo Bonzini bool contains = false; 1175*783e9e51SPaolo Bonzini 1176*783e9e51SPaolo Bonzini /* 1177*783e9e51SPaolo Bonzini * Find node that describes setting of bit at lowest_possible. 1178*783e9e51SPaolo Bonzini * If such a node doesn't exist, find the node with the lowest 1179*783e9e51SPaolo Bonzini * starting index that is > lowest_possible. 1180*783e9e51SPaolo Bonzini */ 1181*783e9e51SPaolo Bonzini for (nodep = s->root; nodep;) { 1182*783e9e51SPaolo Bonzini if ((nodep->idx + MASK_BITS + nodep->num_after - 1) 1183*783e9e51SPaolo Bonzini >= lowest_possible) { 1184*783e9e51SPaolo Bonzini candidate = nodep; 1185*783e9e51SPaolo Bonzini if (candidate->idx <= lowest_possible) { 1186*783e9e51SPaolo Bonzini contains = true; 1187*783e9e51SPaolo Bonzini break; 1188*783e9e51SPaolo Bonzini } 1189*783e9e51SPaolo Bonzini nodep = nodep->left; 1190*783e9e51SPaolo Bonzini } else { 1191*783e9e51SPaolo Bonzini nodep = nodep->right; 1192*783e9e51SPaolo Bonzini } 1193*783e9e51SPaolo Bonzini } 1194*783e9e51SPaolo Bonzini if (!candidate) 1195*783e9e51SPaolo Bonzini return 0; 1196*783e9e51SPaolo Bonzini 1197*783e9e51SPaolo Bonzini assert(candidate->mask != 0); 1198*783e9e51SPaolo Bonzini 1199*783e9e51SPaolo Bonzini /* Does the candidate node describe the setting of lowest_possible? */ 1200*783e9e51SPaolo Bonzini if (!contains) { 1201*783e9e51SPaolo Bonzini /* 1202*783e9e51SPaolo Bonzini * Candidate doesn't describe setting of bit at lowest_possible. 1203*783e9e51SPaolo Bonzini * Candidate points to the first node with a starting index 1204*783e9e51SPaolo Bonzini * > lowest_possible. 1205*783e9e51SPaolo Bonzini */ 1206*783e9e51SPaolo Bonzini assert(candidate->idx > lowest_possible); 1207*783e9e51SPaolo Bonzini 1208*783e9e51SPaolo Bonzini return node_first_set(candidate, 0); 1209*783e9e51SPaolo Bonzini } 1210*783e9e51SPaolo Bonzini 1211*783e9e51SPaolo Bonzini /* 1212*783e9e51SPaolo Bonzini * Candidate describes setting of bit at lowest_possible. 1213*783e9e51SPaolo Bonzini * Note: although the node describes the setting of the bit 1214*783e9e51SPaolo Bonzini * at lowest_possible, its possible that its setting and the 1215*783e9e51SPaolo Bonzini * setting of all latter bits described by this node are 0. 1216*783e9e51SPaolo Bonzini * For now, just handle the cases where this node describes 1217*783e9e51SPaolo Bonzini * a bit at or after an index of lowest_possible that is set. 1218*783e9e51SPaolo Bonzini */ 1219*783e9e51SPaolo Bonzini start = lowest_possible - candidate->idx; 1220*783e9e51SPaolo Bonzini 1221*783e9e51SPaolo Bonzini if (start < MASK_BITS && candidate->mask >= (1 << start)) 1222*783e9e51SPaolo Bonzini return node_first_set(candidate, start); 1223*783e9e51SPaolo Bonzini 1224*783e9e51SPaolo Bonzini if (candidate->num_after) { 1225*783e9e51SPaolo Bonzini sparsebit_idx_t first_num_after_idx = candidate->idx + MASK_BITS; 1226*783e9e51SPaolo Bonzini 1227*783e9e51SPaolo Bonzini return lowest_possible < first_num_after_idx 1228*783e9e51SPaolo Bonzini ? first_num_after_idx : lowest_possible; 1229*783e9e51SPaolo Bonzini } 1230*783e9e51SPaolo Bonzini 1231*783e9e51SPaolo Bonzini /* 1232*783e9e51SPaolo Bonzini * Although candidate node describes setting of bit at 1233*783e9e51SPaolo Bonzini * the index of lowest_possible, all bits at that index and 1234*783e9e51SPaolo Bonzini * latter that are described by candidate are cleared. With 1235*783e9e51SPaolo Bonzini * this, the next bit is the first bit in the next node, if 1236*783e9e51SPaolo Bonzini * such a node exists. If a next node doesn't exist, then 1237*783e9e51SPaolo Bonzini * there is no next set bit. 1238*783e9e51SPaolo Bonzini */ 1239*783e9e51SPaolo Bonzini candidate = node_next(s, candidate); 1240*783e9e51SPaolo Bonzini if (!candidate) 1241*783e9e51SPaolo Bonzini return 0; 1242*783e9e51SPaolo Bonzini 1243*783e9e51SPaolo Bonzini return node_first_set(candidate, 0); 1244*783e9e51SPaolo Bonzini } 1245*783e9e51SPaolo Bonzini 1246*783e9e51SPaolo Bonzini /* Returns index of next bit cleared within s after the index given by prev. 1247*783e9e51SPaolo Bonzini * Returns 0 if there are no bits after prev that are cleared. 1248*783e9e51SPaolo Bonzini */ 1249*783e9e51SPaolo Bonzini sparsebit_idx_t sparsebit_next_clear(struct sparsebit *s, 1250*783e9e51SPaolo Bonzini sparsebit_idx_t prev) 1251*783e9e51SPaolo Bonzini { 1252*783e9e51SPaolo Bonzini sparsebit_idx_t lowest_possible = prev + 1; 1253*783e9e51SPaolo Bonzini sparsebit_idx_t idx; 1254*783e9e51SPaolo Bonzini struct node *nodep1, *nodep2; 1255*783e9e51SPaolo Bonzini 1256*783e9e51SPaolo Bonzini /* A bit after the highest index can't be set. */ 1257*783e9e51SPaolo Bonzini if (lowest_possible == 0) 1258*783e9e51SPaolo Bonzini return 0; 1259*783e9e51SPaolo Bonzini 1260*783e9e51SPaolo Bonzini /* 1261*783e9e51SPaolo Bonzini * Does a node describing the setting of lowest_possible exist? 1262*783e9e51SPaolo Bonzini * If not, the bit at lowest_possible is cleared. 1263*783e9e51SPaolo Bonzini */ 1264*783e9e51SPaolo Bonzini nodep1 = node_find(s, lowest_possible); 1265*783e9e51SPaolo Bonzini if (!nodep1) 1266*783e9e51SPaolo Bonzini return lowest_possible; 1267*783e9e51SPaolo Bonzini 1268*783e9e51SPaolo Bonzini /* Does a mask bit in node 1 describe the next cleared bit. */ 1269*783e9e51SPaolo Bonzini for (idx = lowest_possible - nodep1->idx; idx < MASK_BITS; idx++) 1270*783e9e51SPaolo Bonzini if (!(nodep1->mask & (1 << idx))) 1271*783e9e51SPaolo Bonzini return nodep1->idx + idx; 1272*783e9e51SPaolo Bonzini 1273*783e9e51SPaolo Bonzini /* 1274*783e9e51SPaolo Bonzini * Next cleared bit is not described by node 1. If there 1275*783e9e51SPaolo Bonzini * isn't a next node, then next cleared bit is described 1276*783e9e51SPaolo Bonzini * by bit after the bits described by the first node. 1277*783e9e51SPaolo Bonzini */ 1278*783e9e51SPaolo Bonzini nodep2 = node_next(s, nodep1); 1279*783e9e51SPaolo Bonzini if (!nodep2) 1280*783e9e51SPaolo Bonzini return nodep1->idx + MASK_BITS + nodep1->num_after; 1281*783e9e51SPaolo Bonzini 1282*783e9e51SPaolo Bonzini /* 1283*783e9e51SPaolo Bonzini * There is a second node. 1284*783e9e51SPaolo Bonzini * If it is not adjacent to the first node, then there is a gap 1285*783e9e51SPaolo Bonzini * of cleared bits between the nodes, and the next cleared bit 1286*783e9e51SPaolo Bonzini * is the first bit within the gap. 1287*783e9e51SPaolo Bonzini */ 1288*783e9e51SPaolo Bonzini if (nodep1->idx + MASK_BITS + nodep1->num_after != nodep2->idx) 1289*783e9e51SPaolo Bonzini return nodep1->idx + MASK_BITS + nodep1->num_after; 1290*783e9e51SPaolo Bonzini 1291*783e9e51SPaolo Bonzini /* 1292*783e9e51SPaolo Bonzini * Second node is adjacent to the first node. 1293*783e9e51SPaolo Bonzini * Because it is adjacent, its mask should be non-zero. If all 1294*783e9e51SPaolo Bonzini * its mask bits are set, then with it being adjacent, it should 1295*783e9e51SPaolo Bonzini * have had the mask bits moved into the num_after setting of the 1296*783e9e51SPaolo Bonzini * previous node. 1297*783e9e51SPaolo Bonzini */ 1298*783e9e51SPaolo Bonzini return node_first_clear(nodep2, 0); 1299*783e9e51SPaolo Bonzini } 1300*783e9e51SPaolo Bonzini 1301*783e9e51SPaolo Bonzini /* Starting with the index 1 greater than the index given by start, finds 1302*783e9e51SPaolo Bonzini * and returns the index of the first sequence of num consecutively set 1303*783e9e51SPaolo Bonzini * bits. Returns a value of 0 of no such sequence exists. 1304*783e9e51SPaolo Bonzini */ 1305*783e9e51SPaolo Bonzini sparsebit_idx_t sparsebit_next_set_num(struct sparsebit *s, 1306*783e9e51SPaolo Bonzini sparsebit_idx_t start, sparsebit_num_t num) 1307*783e9e51SPaolo Bonzini { 1308*783e9e51SPaolo Bonzini sparsebit_idx_t idx; 1309*783e9e51SPaolo Bonzini 1310*783e9e51SPaolo Bonzini assert(num >= 1); 1311*783e9e51SPaolo Bonzini 1312*783e9e51SPaolo Bonzini for (idx = sparsebit_next_set(s, start); 1313*783e9e51SPaolo Bonzini idx != 0 && idx + num - 1 >= idx; 1314*783e9e51SPaolo Bonzini idx = sparsebit_next_set(s, idx)) { 1315*783e9e51SPaolo Bonzini assert(sparsebit_is_set(s, idx)); 1316*783e9e51SPaolo Bonzini 1317*783e9e51SPaolo Bonzini /* 1318*783e9e51SPaolo Bonzini * Does the sequence of bits starting at idx consist of 1319*783e9e51SPaolo Bonzini * num set bits? 1320*783e9e51SPaolo Bonzini */ 1321*783e9e51SPaolo Bonzini if (sparsebit_is_set_num(s, idx, num)) 1322*783e9e51SPaolo Bonzini return idx; 1323*783e9e51SPaolo Bonzini 1324*783e9e51SPaolo Bonzini /* 1325*783e9e51SPaolo Bonzini * Sequence of set bits at idx isn't large enough. 1326*783e9e51SPaolo Bonzini * Skip this entire sequence of set bits. 1327*783e9e51SPaolo Bonzini */ 1328*783e9e51SPaolo Bonzini idx = sparsebit_next_clear(s, idx); 1329*783e9e51SPaolo Bonzini if (idx == 0) 1330*783e9e51SPaolo Bonzini return 0; 1331*783e9e51SPaolo Bonzini } 1332*783e9e51SPaolo Bonzini 1333*783e9e51SPaolo Bonzini return 0; 1334*783e9e51SPaolo Bonzini } 1335*783e9e51SPaolo Bonzini 1336*783e9e51SPaolo Bonzini /* Starting with the index 1 greater than the index given by start, finds 1337*783e9e51SPaolo Bonzini * and returns the index of the first sequence of num consecutively cleared 1338*783e9e51SPaolo Bonzini * bits. Returns a value of 0 of no such sequence exists. 1339*783e9e51SPaolo Bonzini */ 1340*783e9e51SPaolo Bonzini sparsebit_idx_t sparsebit_next_clear_num(struct sparsebit *s, 1341*783e9e51SPaolo Bonzini sparsebit_idx_t start, sparsebit_num_t num) 1342*783e9e51SPaolo Bonzini { 1343*783e9e51SPaolo Bonzini sparsebit_idx_t idx; 1344*783e9e51SPaolo Bonzini 1345*783e9e51SPaolo Bonzini assert(num >= 1); 1346*783e9e51SPaolo Bonzini 1347*783e9e51SPaolo Bonzini for (idx = sparsebit_next_clear(s, start); 1348*783e9e51SPaolo Bonzini idx != 0 && idx + num - 1 >= idx; 1349*783e9e51SPaolo Bonzini idx = sparsebit_next_clear(s, idx)) { 1350*783e9e51SPaolo Bonzini assert(sparsebit_is_clear(s, idx)); 1351*783e9e51SPaolo Bonzini 1352*783e9e51SPaolo Bonzini /* 1353*783e9e51SPaolo Bonzini * Does the sequence of bits starting at idx consist of 1354*783e9e51SPaolo Bonzini * num cleared bits? 1355*783e9e51SPaolo Bonzini */ 1356*783e9e51SPaolo Bonzini if (sparsebit_is_clear_num(s, idx, num)) 1357*783e9e51SPaolo Bonzini return idx; 1358*783e9e51SPaolo Bonzini 1359*783e9e51SPaolo Bonzini /* 1360*783e9e51SPaolo Bonzini * Sequence of cleared bits at idx isn't large enough. 1361*783e9e51SPaolo Bonzini * Skip this entire sequence of cleared bits. 1362*783e9e51SPaolo Bonzini */ 1363*783e9e51SPaolo Bonzini idx = sparsebit_next_set(s, idx); 1364*783e9e51SPaolo Bonzini if (idx == 0) 1365*783e9e51SPaolo Bonzini return 0; 1366*783e9e51SPaolo Bonzini } 1367*783e9e51SPaolo Bonzini 1368*783e9e51SPaolo Bonzini return 0; 1369*783e9e51SPaolo Bonzini } 1370*783e9e51SPaolo Bonzini 1371*783e9e51SPaolo Bonzini /* Sets the bits * in the inclusive range idx through idx + num - 1. */ 1372*783e9e51SPaolo Bonzini void sparsebit_set_num(struct sparsebit *s, 1373*783e9e51SPaolo Bonzini sparsebit_idx_t start, sparsebit_num_t num) 1374*783e9e51SPaolo Bonzini { 1375*783e9e51SPaolo Bonzini struct node *nodep, *next; 1376*783e9e51SPaolo Bonzini unsigned int n1; 1377*783e9e51SPaolo Bonzini sparsebit_idx_t idx; 1378*783e9e51SPaolo Bonzini sparsebit_num_t n; 1379*783e9e51SPaolo Bonzini sparsebit_idx_t middle_start, middle_end; 1380*783e9e51SPaolo Bonzini 1381*783e9e51SPaolo Bonzini assert(num > 0); 1382*783e9e51SPaolo Bonzini assert(start + num - 1 >= start); 1383*783e9e51SPaolo Bonzini 1384*783e9e51SPaolo Bonzini /* 1385*783e9e51SPaolo Bonzini * Leading - bits before first mask boundary. 1386*783e9e51SPaolo Bonzini * 1387*783e9e51SPaolo Bonzini * TODO(lhuemill): With some effort it may be possible to 1388*783e9e51SPaolo Bonzini * replace the following loop with a sequential sequence 1389*783e9e51SPaolo Bonzini * of statements. High level sequence would be: 1390*783e9e51SPaolo Bonzini * 1391*783e9e51SPaolo Bonzini * 1. Use node_split() to force node that describes setting 1392*783e9e51SPaolo Bonzini * of idx to be within the mask portion of a node. 1393*783e9e51SPaolo Bonzini * 2. Form mask of bits to be set. 1394*783e9e51SPaolo Bonzini * 3. Determine number of mask bits already set in the node 1395*783e9e51SPaolo Bonzini * and store in a local variable named num_already_set. 1396*783e9e51SPaolo Bonzini * 4. Set the appropriate mask bits within the node. 1397*783e9e51SPaolo Bonzini * 5. Increment struct sparsebit_pvt num_set member 1398*783e9e51SPaolo Bonzini * by the number of bits that were actually set. 1399*783e9e51SPaolo Bonzini * Exclude from the counts bits that were already set. 1400*783e9e51SPaolo Bonzini * 6. Before returning to the caller, use node_reduce() to 1401*783e9e51SPaolo Bonzini * handle the multiple corner cases that this method 1402*783e9e51SPaolo Bonzini * introduces. 1403*783e9e51SPaolo Bonzini */ 1404*783e9e51SPaolo Bonzini for (idx = start, n = num; n > 0 && idx % MASK_BITS != 0; idx++, n--) 1405*783e9e51SPaolo Bonzini bit_set(s, idx); 1406*783e9e51SPaolo Bonzini 1407*783e9e51SPaolo Bonzini /* Middle - bits spanning one or more entire mask */ 1408*783e9e51SPaolo Bonzini middle_start = idx; 1409*783e9e51SPaolo Bonzini middle_end = middle_start + (n & -MASK_BITS) - 1; 1410*783e9e51SPaolo Bonzini if (n >= MASK_BITS) { 1411*783e9e51SPaolo Bonzini nodep = node_split(s, middle_start); 1412*783e9e51SPaolo Bonzini 1413*783e9e51SPaolo Bonzini /* 1414*783e9e51SPaolo Bonzini * As needed, split just after end of middle bits. 1415*783e9e51SPaolo Bonzini * No split needed if end of middle bits is at highest 1416*783e9e51SPaolo Bonzini * supported bit index. 1417*783e9e51SPaolo Bonzini */ 1418*783e9e51SPaolo Bonzini if (middle_end + 1 > middle_end) 1419*783e9e51SPaolo Bonzini (void) node_split(s, middle_end + 1); 1420*783e9e51SPaolo Bonzini 1421*783e9e51SPaolo Bonzini /* Delete nodes that only describe bits within the middle. */ 1422*783e9e51SPaolo Bonzini for (next = node_next(s, nodep); 1423*783e9e51SPaolo Bonzini next && (next->idx < middle_end); 1424*783e9e51SPaolo Bonzini next = node_next(s, nodep)) { 1425*783e9e51SPaolo Bonzini assert(next->idx + MASK_BITS + next->num_after - 1 <= middle_end); 1426*783e9e51SPaolo Bonzini node_rm(s, next); 1427*783e9e51SPaolo Bonzini next = NULL; 1428*783e9e51SPaolo Bonzini } 1429*783e9e51SPaolo Bonzini 1430*783e9e51SPaolo Bonzini /* As needed set each of the mask bits */ 1431*783e9e51SPaolo Bonzini for (n1 = 0; n1 < MASK_BITS; n1++) { 1432*783e9e51SPaolo Bonzini if (!(nodep->mask & (1 << n1))) { 1433*783e9e51SPaolo Bonzini nodep->mask |= 1 << n1; 1434*783e9e51SPaolo Bonzini s->num_set++; 1435*783e9e51SPaolo Bonzini } 1436*783e9e51SPaolo Bonzini } 1437*783e9e51SPaolo Bonzini 1438*783e9e51SPaolo Bonzini s->num_set -= nodep->num_after; 1439*783e9e51SPaolo Bonzini nodep->num_after = middle_end - middle_start + 1 - MASK_BITS; 1440*783e9e51SPaolo Bonzini s->num_set += nodep->num_after; 1441*783e9e51SPaolo Bonzini 1442*783e9e51SPaolo Bonzini node_reduce(s, nodep); 1443*783e9e51SPaolo Bonzini } 1444*783e9e51SPaolo Bonzini idx = middle_end + 1; 1445*783e9e51SPaolo Bonzini n -= middle_end - middle_start + 1; 1446*783e9e51SPaolo Bonzini 1447*783e9e51SPaolo Bonzini /* Trailing - bits at and beyond last mask boundary */ 1448*783e9e51SPaolo Bonzini assert(n < MASK_BITS); 1449*783e9e51SPaolo Bonzini for (; n > 0; idx++, n--) 1450*783e9e51SPaolo Bonzini bit_set(s, idx); 1451*783e9e51SPaolo Bonzini } 1452*783e9e51SPaolo Bonzini 1453*783e9e51SPaolo Bonzini /* Clears the bits * in the inclusive range idx through idx + num - 1. */ 1454*783e9e51SPaolo Bonzini void sparsebit_clear_num(struct sparsebit *s, 1455*783e9e51SPaolo Bonzini sparsebit_idx_t start, sparsebit_num_t num) 1456*783e9e51SPaolo Bonzini { 1457*783e9e51SPaolo Bonzini struct node *nodep, *next; 1458*783e9e51SPaolo Bonzini unsigned int n1; 1459*783e9e51SPaolo Bonzini sparsebit_idx_t idx; 1460*783e9e51SPaolo Bonzini sparsebit_num_t n; 1461*783e9e51SPaolo Bonzini sparsebit_idx_t middle_start, middle_end; 1462*783e9e51SPaolo Bonzini 1463*783e9e51SPaolo Bonzini assert(num > 0); 1464*783e9e51SPaolo Bonzini assert(start + num - 1 >= start); 1465*783e9e51SPaolo Bonzini 1466*783e9e51SPaolo Bonzini /* Leading - bits before first mask boundary */ 1467*783e9e51SPaolo Bonzini for (idx = start, n = num; n > 0 && idx % MASK_BITS != 0; idx++, n--) 1468*783e9e51SPaolo Bonzini bit_clear(s, idx); 1469*783e9e51SPaolo Bonzini 1470*783e9e51SPaolo Bonzini /* Middle - bits spanning one or more entire mask */ 1471*783e9e51SPaolo Bonzini middle_start = idx; 1472*783e9e51SPaolo Bonzini middle_end = middle_start + (n & -MASK_BITS) - 1; 1473*783e9e51SPaolo Bonzini if (n >= MASK_BITS) { 1474*783e9e51SPaolo Bonzini nodep = node_split(s, middle_start); 1475*783e9e51SPaolo Bonzini 1476*783e9e51SPaolo Bonzini /* 1477*783e9e51SPaolo Bonzini * As needed, split just after end of middle bits. 1478*783e9e51SPaolo Bonzini * No split needed if end of middle bits is at highest 1479*783e9e51SPaolo Bonzini * supported bit index. 1480*783e9e51SPaolo Bonzini */ 1481*783e9e51SPaolo Bonzini if (middle_end + 1 > middle_end) 1482*783e9e51SPaolo Bonzini (void) node_split(s, middle_end + 1); 1483*783e9e51SPaolo Bonzini 1484*783e9e51SPaolo Bonzini /* Delete nodes that only describe bits within the middle. */ 1485*783e9e51SPaolo Bonzini for (next = node_next(s, nodep); 1486*783e9e51SPaolo Bonzini next && (next->idx < middle_end); 1487*783e9e51SPaolo Bonzini next = node_next(s, nodep)) { 1488*783e9e51SPaolo Bonzini assert(next->idx + MASK_BITS + next->num_after - 1 <= middle_end); 1489*783e9e51SPaolo Bonzini node_rm(s, next); 1490*783e9e51SPaolo Bonzini next = NULL; 1491*783e9e51SPaolo Bonzini } 1492*783e9e51SPaolo Bonzini 1493*783e9e51SPaolo Bonzini /* As needed clear each of the mask bits */ 1494*783e9e51SPaolo Bonzini for (n1 = 0; n1 < MASK_BITS; n1++) { 1495*783e9e51SPaolo Bonzini if (nodep->mask & (1 << n1)) { 1496*783e9e51SPaolo Bonzini nodep->mask &= ~(1 << n1); 1497*783e9e51SPaolo Bonzini s->num_set--; 1498*783e9e51SPaolo Bonzini } 1499*783e9e51SPaolo Bonzini } 1500*783e9e51SPaolo Bonzini 1501*783e9e51SPaolo Bonzini /* Clear any bits described by num_after */ 1502*783e9e51SPaolo Bonzini s->num_set -= nodep->num_after; 1503*783e9e51SPaolo Bonzini nodep->num_after = 0; 1504*783e9e51SPaolo Bonzini 1505*783e9e51SPaolo Bonzini /* 1506*783e9e51SPaolo Bonzini * Delete the node that describes the beginning of 1507*783e9e51SPaolo Bonzini * the middle bits and perform any allowed reductions 1508*783e9e51SPaolo Bonzini * with the nodes prev or next of nodep. 1509*783e9e51SPaolo Bonzini */ 1510*783e9e51SPaolo Bonzini node_reduce(s, nodep); 1511*783e9e51SPaolo Bonzini nodep = NULL; 1512*783e9e51SPaolo Bonzini } 1513*783e9e51SPaolo Bonzini idx = middle_end + 1; 1514*783e9e51SPaolo Bonzini n -= middle_end - middle_start + 1; 1515*783e9e51SPaolo Bonzini 1516*783e9e51SPaolo Bonzini /* Trailing - bits at and beyond last mask boundary */ 1517*783e9e51SPaolo Bonzini assert(n < MASK_BITS); 1518*783e9e51SPaolo Bonzini for (; n > 0; idx++, n--) 1519*783e9e51SPaolo Bonzini bit_clear(s, idx); 1520*783e9e51SPaolo Bonzini } 1521*783e9e51SPaolo Bonzini 1522*783e9e51SPaolo Bonzini /* Sets the bit at the index given by idx. */ 1523*783e9e51SPaolo Bonzini void sparsebit_set(struct sparsebit *s, sparsebit_idx_t idx) 1524*783e9e51SPaolo Bonzini { 1525*783e9e51SPaolo Bonzini sparsebit_set_num(s, idx, 1); 1526*783e9e51SPaolo Bonzini } 1527*783e9e51SPaolo Bonzini 1528*783e9e51SPaolo Bonzini /* Clears the bit at the index given by idx. */ 1529*783e9e51SPaolo Bonzini void sparsebit_clear(struct sparsebit *s, sparsebit_idx_t idx) 1530*783e9e51SPaolo Bonzini { 1531*783e9e51SPaolo Bonzini sparsebit_clear_num(s, idx, 1); 1532*783e9e51SPaolo Bonzini } 1533*783e9e51SPaolo Bonzini 1534*783e9e51SPaolo Bonzini /* Sets the bits in the entire addressable range of the sparsebit array. */ 1535*783e9e51SPaolo Bonzini void sparsebit_set_all(struct sparsebit *s) 1536*783e9e51SPaolo Bonzini { 1537*783e9e51SPaolo Bonzini sparsebit_set(s, 0); 1538*783e9e51SPaolo Bonzini sparsebit_set_num(s, 1, ~(sparsebit_idx_t) 0); 1539*783e9e51SPaolo Bonzini assert(sparsebit_all_set(s)); 1540*783e9e51SPaolo Bonzini } 1541*783e9e51SPaolo Bonzini 1542*783e9e51SPaolo Bonzini /* Clears the bits in the entire addressable range of the sparsebit array. */ 1543*783e9e51SPaolo Bonzini void sparsebit_clear_all(struct sparsebit *s) 1544*783e9e51SPaolo Bonzini { 1545*783e9e51SPaolo Bonzini sparsebit_clear(s, 0); 1546*783e9e51SPaolo Bonzini sparsebit_clear_num(s, 1, ~(sparsebit_idx_t) 0); 1547*783e9e51SPaolo Bonzini assert(!sparsebit_any_set(s)); 1548*783e9e51SPaolo Bonzini } 1549*783e9e51SPaolo Bonzini 1550*783e9e51SPaolo Bonzini static size_t display_range(FILE *stream, sparsebit_idx_t low, 1551*783e9e51SPaolo Bonzini sparsebit_idx_t high, bool prepend_comma_space) 1552*783e9e51SPaolo Bonzini { 1553*783e9e51SPaolo Bonzini char *fmt_str; 1554*783e9e51SPaolo Bonzini size_t sz; 1555*783e9e51SPaolo Bonzini 1556*783e9e51SPaolo Bonzini /* Determine the printf format string */ 1557*783e9e51SPaolo Bonzini if (low == high) 1558*783e9e51SPaolo Bonzini fmt_str = prepend_comma_space ? ", 0x%lx" : "0x%lx"; 1559*783e9e51SPaolo Bonzini else 1560*783e9e51SPaolo Bonzini fmt_str = prepend_comma_space ? ", 0x%lx:0x%lx" : "0x%lx:0x%lx"; 1561*783e9e51SPaolo Bonzini 1562*783e9e51SPaolo Bonzini /* 1563*783e9e51SPaolo Bonzini * When stream is NULL, just determine the size of what would 1564*783e9e51SPaolo Bonzini * have been printed, else print the range. 1565*783e9e51SPaolo Bonzini */ 1566*783e9e51SPaolo Bonzini if (!stream) 1567*783e9e51SPaolo Bonzini sz = snprintf(NULL, 0, fmt_str, low, high); 1568*783e9e51SPaolo Bonzini else 1569*783e9e51SPaolo Bonzini sz = fprintf(stream, fmt_str, low, high); 1570*783e9e51SPaolo Bonzini 1571*783e9e51SPaolo Bonzini return sz; 1572*783e9e51SPaolo Bonzini } 1573*783e9e51SPaolo Bonzini 1574*783e9e51SPaolo Bonzini 1575*783e9e51SPaolo Bonzini /* Dumps to the FILE stream given by stream, the bit settings 1576*783e9e51SPaolo Bonzini * of s. Each line of output is prefixed with the number of 1577*783e9e51SPaolo Bonzini * spaces given by indent. The length of each line is implementation 1578*783e9e51SPaolo Bonzini * dependent and does not depend on the indent amount. The following 1579*783e9e51SPaolo Bonzini * is an example output of a sparsebit array that has bits: 1580*783e9e51SPaolo Bonzini * 1581*783e9e51SPaolo Bonzini * 0x5, 0x8, 0xa:0xe, 0x12 1582*783e9e51SPaolo Bonzini * 1583*783e9e51SPaolo Bonzini * This corresponds to a sparsebit whose bits 5, 8, 10, 11, 12, 13, 14, 18 1584*783e9e51SPaolo Bonzini * are set. Note that a ':', instead of a '-' is used to specify a range of 1585*783e9e51SPaolo Bonzini * contiguous bits. This is done because '-' is used to specify command-line 1586*783e9e51SPaolo Bonzini * options, and sometimes ranges are specified as command-line arguments. 1587*783e9e51SPaolo Bonzini */ 1588*783e9e51SPaolo Bonzini void sparsebit_dump(FILE *stream, struct sparsebit *s, 1589*783e9e51SPaolo Bonzini unsigned int indent) 1590*783e9e51SPaolo Bonzini { 1591*783e9e51SPaolo Bonzini size_t current_line_len = 0; 1592*783e9e51SPaolo Bonzini size_t sz; 1593*783e9e51SPaolo Bonzini struct node *nodep; 1594*783e9e51SPaolo Bonzini 1595*783e9e51SPaolo Bonzini if (!sparsebit_any_set(s)) 1596*783e9e51SPaolo Bonzini return; 1597*783e9e51SPaolo Bonzini 1598*783e9e51SPaolo Bonzini /* Display initial indent */ 1599*783e9e51SPaolo Bonzini fprintf(stream, "%*s", indent, ""); 1600*783e9e51SPaolo Bonzini 1601*783e9e51SPaolo Bonzini /* For each node */ 1602*783e9e51SPaolo Bonzini for (nodep = node_first(s); nodep; nodep = node_next(s, nodep)) { 1603*783e9e51SPaolo Bonzini unsigned int n1; 1604*783e9e51SPaolo Bonzini sparsebit_idx_t low, high; 1605*783e9e51SPaolo Bonzini 1606*783e9e51SPaolo Bonzini /* For each group of bits in the mask */ 1607*783e9e51SPaolo Bonzini for (n1 = 0; n1 < MASK_BITS; n1++) { 1608*783e9e51SPaolo Bonzini if (nodep->mask & (1 << n1)) { 1609*783e9e51SPaolo Bonzini low = high = nodep->idx + n1; 1610*783e9e51SPaolo Bonzini 1611*783e9e51SPaolo Bonzini for (; n1 < MASK_BITS; n1++) { 1612*783e9e51SPaolo Bonzini if (nodep->mask & (1 << n1)) 1613*783e9e51SPaolo Bonzini high = nodep->idx + n1; 1614*783e9e51SPaolo Bonzini else 1615*783e9e51SPaolo Bonzini break; 1616*783e9e51SPaolo Bonzini } 1617*783e9e51SPaolo Bonzini 1618*783e9e51SPaolo Bonzini if ((n1 == MASK_BITS) && nodep->num_after) 1619*783e9e51SPaolo Bonzini high += nodep->num_after; 1620*783e9e51SPaolo Bonzini 1621*783e9e51SPaolo Bonzini /* 1622*783e9e51SPaolo Bonzini * How much room will it take to display 1623*783e9e51SPaolo Bonzini * this range. 1624*783e9e51SPaolo Bonzini */ 1625*783e9e51SPaolo Bonzini sz = display_range(NULL, low, high, 1626*783e9e51SPaolo Bonzini current_line_len != 0); 1627*783e9e51SPaolo Bonzini 1628*783e9e51SPaolo Bonzini /* 1629*783e9e51SPaolo Bonzini * If there is not enough room, display 1630*783e9e51SPaolo Bonzini * a newline plus the indent of the next 1631*783e9e51SPaolo Bonzini * line. 1632*783e9e51SPaolo Bonzini */ 1633*783e9e51SPaolo Bonzini if (current_line_len + sz > DUMP_LINE_MAX) { 1634*783e9e51SPaolo Bonzini fputs("\n", stream); 1635*783e9e51SPaolo Bonzini fprintf(stream, "%*s", indent, ""); 1636*783e9e51SPaolo Bonzini current_line_len = 0; 1637*783e9e51SPaolo Bonzini } 1638*783e9e51SPaolo Bonzini 1639*783e9e51SPaolo Bonzini /* Display the range */ 1640*783e9e51SPaolo Bonzini sz = display_range(stream, low, high, 1641*783e9e51SPaolo Bonzini current_line_len != 0); 1642*783e9e51SPaolo Bonzini current_line_len += sz; 1643*783e9e51SPaolo Bonzini } 1644*783e9e51SPaolo Bonzini } 1645*783e9e51SPaolo Bonzini 1646*783e9e51SPaolo Bonzini /* 1647*783e9e51SPaolo Bonzini * If num_after and most significant-bit of mask is not 1648*783e9e51SPaolo Bonzini * set, then still need to display a range for the bits 1649*783e9e51SPaolo Bonzini * described by num_after. 1650*783e9e51SPaolo Bonzini */ 1651*783e9e51SPaolo Bonzini if (!(nodep->mask & (1 << (MASK_BITS - 1))) && nodep->num_after) { 1652*783e9e51SPaolo Bonzini low = nodep->idx + MASK_BITS; 1653*783e9e51SPaolo Bonzini high = nodep->idx + MASK_BITS + nodep->num_after - 1; 1654*783e9e51SPaolo Bonzini 1655*783e9e51SPaolo Bonzini /* 1656*783e9e51SPaolo Bonzini * How much room will it take to display 1657*783e9e51SPaolo Bonzini * this range. 1658*783e9e51SPaolo Bonzini */ 1659*783e9e51SPaolo Bonzini sz = display_range(NULL, low, high, 1660*783e9e51SPaolo Bonzini current_line_len != 0); 1661*783e9e51SPaolo Bonzini 1662*783e9e51SPaolo Bonzini /* 1663*783e9e51SPaolo Bonzini * If there is not enough room, display 1664*783e9e51SPaolo Bonzini * a newline plus the indent of the next 1665*783e9e51SPaolo Bonzini * line. 1666*783e9e51SPaolo Bonzini */ 1667*783e9e51SPaolo Bonzini if (current_line_len + sz > DUMP_LINE_MAX) { 1668*783e9e51SPaolo Bonzini fputs("\n", stream); 1669*783e9e51SPaolo Bonzini fprintf(stream, "%*s", indent, ""); 1670*783e9e51SPaolo Bonzini current_line_len = 0; 1671*783e9e51SPaolo Bonzini } 1672*783e9e51SPaolo Bonzini 1673*783e9e51SPaolo Bonzini /* Display the range */ 1674*783e9e51SPaolo Bonzini sz = display_range(stream, low, high, 1675*783e9e51SPaolo Bonzini current_line_len != 0); 1676*783e9e51SPaolo Bonzini current_line_len += sz; 1677*783e9e51SPaolo Bonzini } 1678*783e9e51SPaolo Bonzini } 1679*783e9e51SPaolo Bonzini fputs("\n", stream); 1680*783e9e51SPaolo Bonzini } 1681*783e9e51SPaolo Bonzini 1682*783e9e51SPaolo Bonzini /* Validates the internal state of the sparsebit array given by 1683*783e9e51SPaolo Bonzini * s. On error, diagnostic information is printed to stderr and 1684*783e9e51SPaolo Bonzini * abort is called. 1685*783e9e51SPaolo Bonzini */ 1686*783e9e51SPaolo Bonzini void sparsebit_validate_internal(struct sparsebit *s) 1687*783e9e51SPaolo Bonzini { 1688*783e9e51SPaolo Bonzini bool error_detected = false; 1689*783e9e51SPaolo Bonzini struct node *nodep, *prev = NULL; 1690*783e9e51SPaolo Bonzini sparsebit_num_t total_bits_set = 0; 1691*783e9e51SPaolo Bonzini unsigned int n1; 1692*783e9e51SPaolo Bonzini 1693*783e9e51SPaolo Bonzini /* For each node */ 1694*783e9e51SPaolo Bonzini for (nodep = node_first(s); nodep; 1695*783e9e51SPaolo Bonzini prev = nodep, nodep = node_next(s, nodep)) { 1696*783e9e51SPaolo Bonzini 1697*783e9e51SPaolo Bonzini /* 1698*783e9e51SPaolo Bonzini * Increase total bits set by the number of bits set 1699*783e9e51SPaolo Bonzini * in this node. 1700*783e9e51SPaolo Bonzini */ 1701*783e9e51SPaolo Bonzini for (n1 = 0; n1 < MASK_BITS; n1++) 1702*783e9e51SPaolo Bonzini if (nodep->mask & (1 << n1)) 1703*783e9e51SPaolo Bonzini total_bits_set++; 1704*783e9e51SPaolo Bonzini 1705*783e9e51SPaolo Bonzini total_bits_set += nodep->num_after; 1706*783e9e51SPaolo Bonzini 1707*783e9e51SPaolo Bonzini /* 1708*783e9e51SPaolo Bonzini * Arbitrary choice as to whether a mask of 0 is allowed 1709*783e9e51SPaolo Bonzini * or not. For diagnostic purposes it is beneficial to 1710*783e9e51SPaolo Bonzini * have only one valid means to represent a set of bits. 1711*783e9e51SPaolo Bonzini * To support this an arbitrary choice has been made 1712*783e9e51SPaolo Bonzini * to not allow a mask of zero. 1713*783e9e51SPaolo Bonzini */ 1714*783e9e51SPaolo Bonzini if (nodep->mask == 0) { 1715*783e9e51SPaolo Bonzini fprintf(stderr, "Node mask of zero, " 1716*783e9e51SPaolo Bonzini "nodep: %p nodep->mask: 0x%x", 1717*783e9e51SPaolo Bonzini nodep, nodep->mask); 1718*783e9e51SPaolo Bonzini error_detected = true; 1719*783e9e51SPaolo Bonzini break; 1720*783e9e51SPaolo Bonzini } 1721*783e9e51SPaolo Bonzini 1722*783e9e51SPaolo Bonzini /* 1723*783e9e51SPaolo Bonzini * Validate num_after is not greater than the max index 1724*783e9e51SPaolo Bonzini * - the number of mask bits. The num_after member 1725*783e9e51SPaolo Bonzini * uses 0-based indexing and thus has no value that 1726*783e9e51SPaolo Bonzini * represents all bits set. This limitation is handled 1727*783e9e51SPaolo Bonzini * by requiring a non-zero mask. With a non-zero mask, 1728*783e9e51SPaolo Bonzini * MASK_BITS worth of bits are described by the mask, 1729*783e9e51SPaolo Bonzini * which makes the largest needed num_after equal to: 1730*783e9e51SPaolo Bonzini * 1731*783e9e51SPaolo Bonzini * (~(sparsebit_num_t) 0) - MASK_BITS + 1 1732*783e9e51SPaolo Bonzini */ 1733*783e9e51SPaolo Bonzini if (nodep->num_after 1734*783e9e51SPaolo Bonzini > (~(sparsebit_num_t) 0) - MASK_BITS + 1) { 1735*783e9e51SPaolo Bonzini fprintf(stderr, "num_after too large, " 1736*783e9e51SPaolo Bonzini "nodep: %p nodep->num_after: 0x%lx", 1737*783e9e51SPaolo Bonzini nodep, nodep->num_after); 1738*783e9e51SPaolo Bonzini error_detected = true; 1739*783e9e51SPaolo Bonzini break; 1740*783e9e51SPaolo Bonzini } 1741*783e9e51SPaolo Bonzini 1742*783e9e51SPaolo Bonzini /* Validate node index is divisible by the mask size */ 1743*783e9e51SPaolo Bonzini if (nodep->idx % MASK_BITS) { 1744*783e9e51SPaolo Bonzini fprintf(stderr, "Node index not divisable by " 1745*783e9e51SPaolo Bonzini "mask size,\n" 1746*783e9e51SPaolo Bonzini " nodep: %p nodep->idx: 0x%lx " 1747*783e9e51SPaolo Bonzini "MASK_BITS: %lu\n", 1748*783e9e51SPaolo Bonzini nodep, nodep->idx, MASK_BITS); 1749*783e9e51SPaolo Bonzini error_detected = true; 1750*783e9e51SPaolo Bonzini break; 1751*783e9e51SPaolo Bonzini } 1752*783e9e51SPaolo Bonzini 1753*783e9e51SPaolo Bonzini /* 1754*783e9e51SPaolo Bonzini * Validate bits described by node don't wrap beyond the 1755*783e9e51SPaolo Bonzini * highest supported index. 1756*783e9e51SPaolo Bonzini */ 1757*783e9e51SPaolo Bonzini if ((nodep->idx + MASK_BITS + nodep->num_after - 1) < nodep->idx) { 1758*783e9e51SPaolo Bonzini fprintf(stderr, "Bits described by node wrap " 1759*783e9e51SPaolo Bonzini "beyond highest supported index,\n" 1760*783e9e51SPaolo Bonzini " nodep: %p nodep->idx: 0x%lx\n" 1761*783e9e51SPaolo Bonzini " MASK_BITS: %lu nodep->num_after: 0x%lx", 1762*783e9e51SPaolo Bonzini nodep, nodep->idx, MASK_BITS, nodep->num_after); 1763*783e9e51SPaolo Bonzini error_detected = true; 1764*783e9e51SPaolo Bonzini break; 1765*783e9e51SPaolo Bonzini } 1766*783e9e51SPaolo Bonzini 1767*783e9e51SPaolo Bonzini /* Check parent pointers. */ 1768*783e9e51SPaolo Bonzini if (nodep->left) { 1769*783e9e51SPaolo Bonzini if (nodep->left->parent != nodep) { 1770*783e9e51SPaolo Bonzini fprintf(stderr, "Left child parent pointer " 1771*783e9e51SPaolo Bonzini "doesn't point to this node,\n" 1772*783e9e51SPaolo Bonzini " nodep: %p nodep->left: %p " 1773*783e9e51SPaolo Bonzini "nodep->left->parent: %p", 1774*783e9e51SPaolo Bonzini nodep, nodep->left, 1775*783e9e51SPaolo Bonzini nodep->left->parent); 1776*783e9e51SPaolo Bonzini error_detected = true; 1777*783e9e51SPaolo Bonzini break; 1778*783e9e51SPaolo Bonzini } 1779*783e9e51SPaolo Bonzini } 1780*783e9e51SPaolo Bonzini 1781*783e9e51SPaolo Bonzini if (nodep->right) { 1782*783e9e51SPaolo Bonzini if (nodep->right->parent != nodep) { 1783*783e9e51SPaolo Bonzini fprintf(stderr, "Right child parent pointer " 1784*783e9e51SPaolo Bonzini "doesn't point to this node,\n" 1785*783e9e51SPaolo Bonzini " nodep: %p nodep->right: %p " 1786*783e9e51SPaolo Bonzini "nodep->right->parent: %p", 1787*783e9e51SPaolo Bonzini nodep, nodep->right, 1788*783e9e51SPaolo Bonzini nodep->right->parent); 1789*783e9e51SPaolo Bonzini error_detected = true; 1790*783e9e51SPaolo Bonzini break; 1791*783e9e51SPaolo Bonzini } 1792*783e9e51SPaolo Bonzini } 1793*783e9e51SPaolo Bonzini 1794*783e9e51SPaolo Bonzini if (!nodep->parent) { 1795*783e9e51SPaolo Bonzini if (s->root != nodep) { 1796*783e9e51SPaolo Bonzini fprintf(stderr, "Unexpected root node, " 1797*783e9e51SPaolo Bonzini "s->root: %p nodep: %p", 1798*783e9e51SPaolo Bonzini s->root, nodep); 1799*783e9e51SPaolo Bonzini error_detected = true; 1800*783e9e51SPaolo Bonzini break; 1801*783e9e51SPaolo Bonzini } 1802*783e9e51SPaolo Bonzini } 1803*783e9e51SPaolo Bonzini 1804*783e9e51SPaolo Bonzini if (prev) { 1805*783e9e51SPaolo Bonzini /* 1806*783e9e51SPaolo Bonzini * Is index of previous node before index of 1807*783e9e51SPaolo Bonzini * current node? 1808*783e9e51SPaolo Bonzini */ 1809*783e9e51SPaolo Bonzini if (prev->idx >= nodep->idx) { 1810*783e9e51SPaolo Bonzini fprintf(stderr, "Previous node index " 1811*783e9e51SPaolo Bonzini ">= current node index,\n" 1812*783e9e51SPaolo Bonzini " prev: %p prev->idx: 0x%lx\n" 1813*783e9e51SPaolo Bonzini " nodep: %p nodep->idx: 0x%lx", 1814*783e9e51SPaolo Bonzini prev, prev->idx, nodep, nodep->idx); 1815*783e9e51SPaolo Bonzini error_detected = true; 1816*783e9e51SPaolo Bonzini break; 1817*783e9e51SPaolo Bonzini } 1818*783e9e51SPaolo Bonzini 1819*783e9e51SPaolo Bonzini /* 1820*783e9e51SPaolo Bonzini * Nodes occur in asscending order, based on each 1821*783e9e51SPaolo Bonzini * nodes starting index. 1822*783e9e51SPaolo Bonzini */ 1823*783e9e51SPaolo Bonzini if ((prev->idx + MASK_BITS + prev->num_after - 1) 1824*783e9e51SPaolo Bonzini >= nodep->idx) { 1825*783e9e51SPaolo Bonzini fprintf(stderr, "Previous node bit range " 1826*783e9e51SPaolo Bonzini "overlap with current node bit range,\n" 1827*783e9e51SPaolo Bonzini " prev: %p prev->idx: 0x%lx " 1828*783e9e51SPaolo Bonzini "prev->num_after: 0x%lx\n" 1829*783e9e51SPaolo Bonzini " nodep: %p nodep->idx: 0x%lx " 1830*783e9e51SPaolo Bonzini "nodep->num_after: 0x%lx\n" 1831*783e9e51SPaolo Bonzini " MASK_BITS: %lu", 1832*783e9e51SPaolo Bonzini prev, prev->idx, prev->num_after, 1833*783e9e51SPaolo Bonzini nodep, nodep->idx, nodep->num_after, 1834*783e9e51SPaolo Bonzini MASK_BITS); 1835*783e9e51SPaolo Bonzini error_detected = true; 1836*783e9e51SPaolo Bonzini break; 1837*783e9e51SPaolo Bonzini } 1838*783e9e51SPaolo Bonzini 1839*783e9e51SPaolo Bonzini /* 1840*783e9e51SPaolo Bonzini * When the node has all mask bits set, it shouldn't 1841*783e9e51SPaolo Bonzini * be adjacent to the last bit described by the 1842*783e9e51SPaolo Bonzini * previous node. 1843*783e9e51SPaolo Bonzini */ 1844*783e9e51SPaolo Bonzini if (nodep->mask == ~(mask_t) 0 && 1845*783e9e51SPaolo Bonzini prev->idx + MASK_BITS + prev->num_after == nodep->idx) { 1846*783e9e51SPaolo Bonzini fprintf(stderr, "Current node has mask with " 1847*783e9e51SPaolo Bonzini "all bits set and is adjacent to the " 1848*783e9e51SPaolo Bonzini "previous node,\n" 1849*783e9e51SPaolo Bonzini " prev: %p prev->idx: 0x%lx " 1850*783e9e51SPaolo Bonzini "prev->num_after: 0x%lx\n" 1851*783e9e51SPaolo Bonzini " nodep: %p nodep->idx: 0x%lx " 1852*783e9e51SPaolo Bonzini "nodep->num_after: 0x%lx\n" 1853*783e9e51SPaolo Bonzini " MASK_BITS: %lu", 1854*783e9e51SPaolo Bonzini prev, prev->idx, prev->num_after, 1855*783e9e51SPaolo Bonzini nodep, nodep->idx, nodep->num_after, 1856*783e9e51SPaolo Bonzini MASK_BITS); 1857*783e9e51SPaolo Bonzini 1858*783e9e51SPaolo Bonzini error_detected = true; 1859*783e9e51SPaolo Bonzini break; 1860*783e9e51SPaolo Bonzini } 1861*783e9e51SPaolo Bonzini } 1862*783e9e51SPaolo Bonzini } 1863*783e9e51SPaolo Bonzini 1864*783e9e51SPaolo Bonzini if (!error_detected) { 1865*783e9e51SPaolo Bonzini /* 1866*783e9e51SPaolo Bonzini * Is sum of bits set in each node equal to the count 1867*783e9e51SPaolo Bonzini * of total bits set. 1868*783e9e51SPaolo Bonzini */ 1869*783e9e51SPaolo Bonzini if (s->num_set != total_bits_set) { 1870*783e9e51SPaolo Bonzini fprintf(stderr, "Number of bits set missmatch,\n" 1871*783e9e51SPaolo Bonzini " s->num_set: 0x%lx total_bits_set: 0x%lx", 1872*783e9e51SPaolo Bonzini s->num_set, total_bits_set); 1873*783e9e51SPaolo Bonzini 1874*783e9e51SPaolo Bonzini error_detected = true; 1875*783e9e51SPaolo Bonzini } 1876*783e9e51SPaolo Bonzini } 1877*783e9e51SPaolo Bonzini 1878*783e9e51SPaolo Bonzini if (error_detected) { 1879*783e9e51SPaolo Bonzini fputs(" dump_internal:\n", stderr); 1880*783e9e51SPaolo Bonzini sparsebit_dump_internal(stderr, s, 4); 1881*783e9e51SPaolo Bonzini abort(); 1882*783e9e51SPaolo Bonzini } 1883*783e9e51SPaolo Bonzini } 1884*783e9e51SPaolo Bonzini 1885*783e9e51SPaolo Bonzini 1886*783e9e51SPaolo Bonzini #ifdef FUZZ 1887*783e9e51SPaolo Bonzini /* A simple but effective fuzzing driver. Look for bugs with the help 1888*783e9e51SPaolo Bonzini * of some invariants and of a trivial representation of sparsebit. 1889*783e9e51SPaolo Bonzini * Just use 512 bytes of /dev/zero and /dev/urandom as inputs, and let 1890*783e9e51SPaolo Bonzini * afl-fuzz do the magic. :) 1891*783e9e51SPaolo Bonzini */ 1892*783e9e51SPaolo Bonzini 1893*783e9e51SPaolo Bonzini #include <stdlib.h> 1894*783e9e51SPaolo Bonzini #include <assert.h> 1895*783e9e51SPaolo Bonzini 1896*783e9e51SPaolo Bonzini struct range { 1897*783e9e51SPaolo Bonzini sparsebit_idx_t first, last; 1898*783e9e51SPaolo Bonzini bool set; 1899*783e9e51SPaolo Bonzini }; 1900*783e9e51SPaolo Bonzini 1901*783e9e51SPaolo Bonzini struct sparsebit *s; 1902*783e9e51SPaolo Bonzini struct range ranges[1000]; 1903*783e9e51SPaolo Bonzini int num_ranges; 1904*783e9e51SPaolo Bonzini 1905*783e9e51SPaolo Bonzini static bool get_value(sparsebit_idx_t idx) 1906*783e9e51SPaolo Bonzini { 1907*783e9e51SPaolo Bonzini int i; 1908*783e9e51SPaolo Bonzini 1909*783e9e51SPaolo Bonzini for (i = num_ranges; --i >= 0; ) 1910*783e9e51SPaolo Bonzini if (ranges[i].first <= idx && idx <= ranges[i].last) 1911*783e9e51SPaolo Bonzini return ranges[i].set; 1912*783e9e51SPaolo Bonzini 1913*783e9e51SPaolo Bonzini return false; 1914*783e9e51SPaolo Bonzini } 1915*783e9e51SPaolo Bonzini 1916*783e9e51SPaolo Bonzini static void operate(int code, sparsebit_idx_t first, sparsebit_idx_t last) 1917*783e9e51SPaolo Bonzini { 1918*783e9e51SPaolo Bonzini sparsebit_num_t num; 1919*783e9e51SPaolo Bonzini sparsebit_idx_t next; 1920*783e9e51SPaolo Bonzini 1921*783e9e51SPaolo Bonzini if (first < last) { 1922*783e9e51SPaolo Bonzini num = last - first + 1; 1923*783e9e51SPaolo Bonzini } else { 1924*783e9e51SPaolo Bonzini num = first - last + 1; 1925*783e9e51SPaolo Bonzini first = last; 1926*783e9e51SPaolo Bonzini last = first + num - 1; 1927*783e9e51SPaolo Bonzini } 1928*783e9e51SPaolo Bonzini 1929*783e9e51SPaolo Bonzini switch (code) { 1930*783e9e51SPaolo Bonzini case 0: 1931*783e9e51SPaolo Bonzini sparsebit_set(s, first); 1932*783e9e51SPaolo Bonzini assert(sparsebit_is_set(s, first)); 1933*783e9e51SPaolo Bonzini assert(!sparsebit_is_clear(s, first)); 1934*783e9e51SPaolo Bonzini assert(sparsebit_any_set(s)); 1935*783e9e51SPaolo Bonzini assert(!sparsebit_all_clear(s)); 1936*783e9e51SPaolo Bonzini if (get_value(first)) 1937*783e9e51SPaolo Bonzini return; 1938*783e9e51SPaolo Bonzini if (num_ranges == 1000) 1939*783e9e51SPaolo Bonzini exit(0); 1940*783e9e51SPaolo Bonzini ranges[num_ranges++] = (struct range) 1941*783e9e51SPaolo Bonzini { .first = first, .last = first, .set = true }; 1942*783e9e51SPaolo Bonzini break; 1943*783e9e51SPaolo Bonzini case 1: 1944*783e9e51SPaolo Bonzini sparsebit_clear(s, first); 1945*783e9e51SPaolo Bonzini assert(!sparsebit_is_set(s, first)); 1946*783e9e51SPaolo Bonzini assert(sparsebit_is_clear(s, first)); 1947*783e9e51SPaolo Bonzini assert(sparsebit_any_clear(s)); 1948*783e9e51SPaolo Bonzini assert(!sparsebit_all_set(s)); 1949*783e9e51SPaolo Bonzini if (!get_value(first)) 1950*783e9e51SPaolo Bonzini return; 1951*783e9e51SPaolo Bonzini if (num_ranges == 1000) 1952*783e9e51SPaolo Bonzini exit(0); 1953*783e9e51SPaolo Bonzini ranges[num_ranges++] = (struct range) 1954*783e9e51SPaolo Bonzini { .first = first, .last = first, .set = false }; 1955*783e9e51SPaolo Bonzini break; 1956*783e9e51SPaolo Bonzini case 2: 1957*783e9e51SPaolo Bonzini assert(sparsebit_is_set(s, first) == get_value(first)); 1958*783e9e51SPaolo Bonzini assert(sparsebit_is_clear(s, first) == !get_value(first)); 1959*783e9e51SPaolo Bonzini break; 1960*783e9e51SPaolo Bonzini case 3: 1961*783e9e51SPaolo Bonzini if (sparsebit_any_set(s)) 1962*783e9e51SPaolo Bonzini assert(get_value(sparsebit_first_set(s))); 1963*783e9e51SPaolo Bonzini if (sparsebit_any_clear(s)) 1964*783e9e51SPaolo Bonzini assert(!get_value(sparsebit_first_clear(s))); 1965*783e9e51SPaolo Bonzini sparsebit_set_all(s); 1966*783e9e51SPaolo Bonzini assert(!sparsebit_any_clear(s)); 1967*783e9e51SPaolo Bonzini assert(sparsebit_all_set(s)); 1968*783e9e51SPaolo Bonzini num_ranges = 0; 1969*783e9e51SPaolo Bonzini ranges[num_ranges++] = (struct range) 1970*783e9e51SPaolo Bonzini { .first = 0, .last = ~(sparsebit_idx_t)0, .set = true }; 1971*783e9e51SPaolo Bonzini break; 1972*783e9e51SPaolo Bonzini case 4: 1973*783e9e51SPaolo Bonzini if (sparsebit_any_set(s)) 1974*783e9e51SPaolo Bonzini assert(get_value(sparsebit_first_set(s))); 1975*783e9e51SPaolo Bonzini if (sparsebit_any_clear(s)) 1976*783e9e51SPaolo Bonzini assert(!get_value(sparsebit_first_clear(s))); 1977*783e9e51SPaolo Bonzini sparsebit_clear_all(s); 1978*783e9e51SPaolo Bonzini assert(!sparsebit_any_set(s)); 1979*783e9e51SPaolo Bonzini assert(sparsebit_all_clear(s)); 1980*783e9e51SPaolo Bonzini num_ranges = 0; 1981*783e9e51SPaolo Bonzini break; 1982*783e9e51SPaolo Bonzini case 5: 1983*783e9e51SPaolo Bonzini next = sparsebit_next_set(s, first); 1984*783e9e51SPaolo Bonzini assert(next == 0 || next > first); 1985*783e9e51SPaolo Bonzini assert(next == 0 || get_value(next)); 1986*783e9e51SPaolo Bonzini break; 1987*783e9e51SPaolo Bonzini case 6: 1988*783e9e51SPaolo Bonzini next = sparsebit_next_clear(s, first); 1989*783e9e51SPaolo Bonzini assert(next == 0 || next > first); 1990*783e9e51SPaolo Bonzini assert(next == 0 || !get_value(next)); 1991*783e9e51SPaolo Bonzini break; 1992*783e9e51SPaolo Bonzini case 7: 1993*783e9e51SPaolo Bonzini next = sparsebit_next_clear(s, first); 1994*783e9e51SPaolo Bonzini if (sparsebit_is_set_num(s, first, num)) { 1995*783e9e51SPaolo Bonzini assert(next == 0 || next > last); 1996*783e9e51SPaolo Bonzini if (first) 1997*783e9e51SPaolo Bonzini next = sparsebit_next_set(s, first - 1); 1998*783e9e51SPaolo Bonzini else if (sparsebit_any_set(s)) 1999*783e9e51SPaolo Bonzini next = sparsebit_first_set(s); 2000*783e9e51SPaolo Bonzini else 2001*783e9e51SPaolo Bonzini return; 2002*783e9e51SPaolo Bonzini assert(next == first); 2003*783e9e51SPaolo Bonzini } else { 2004*783e9e51SPaolo Bonzini assert(sparsebit_is_clear(s, first) || next <= last); 2005*783e9e51SPaolo Bonzini } 2006*783e9e51SPaolo Bonzini break; 2007*783e9e51SPaolo Bonzini case 8: 2008*783e9e51SPaolo Bonzini next = sparsebit_next_set(s, first); 2009*783e9e51SPaolo Bonzini if (sparsebit_is_clear_num(s, first, num)) { 2010*783e9e51SPaolo Bonzini assert(next == 0 || next > last); 2011*783e9e51SPaolo Bonzini if (first) 2012*783e9e51SPaolo Bonzini next = sparsebit_next_clear(s, first - 1); 2013*783e9e51SPaolo Bonzini else if (sparsebit_any_clear(s)) 2014*783e9e51SPaolo Bonzini next = sparsebit_first_clear(s); 2015*783e9e51SPaolo Bonzini else 2016*783e9e51SPaolo Bonzini return; 2017*783e9e51SPaolo Bonzini assert(next == first); 2018*783e9e51SPaolo Bonzini } else { 2019*783e9e51SPaolo Bonzini assert(sparsebit_is_set(s, first) || next <= last); 2020*783e9e51SPaolo Bonzini } 2021*783e9e51SPaolo Bonzini break; 2022*783e9e51SPaolo Bonzini case 9: 2023*783e9e51SPaolo Bonzini sparsebit_set_num(s, first, num); 2024*783e9e51SPaolo Bonzini assert(sparsebit_is_set_num(s, first, num)); 2025*783e9e51SPaolo Bonzini assert(!sparsebit_is_clear_num(s, first, num)); 2026*783e9e51SPaolo Bonzini assert(sparsebit_any_set(s)); 2027*783e9e51SPaolo Bonzini assert(!sparsebit_all_clear(s)); 2028*783e9e51SPaolo Bonzini if (num_ranges == 1000) 2029*783e9e51SPaolo Bonzini exit(0); 2030*783e9e51SPaolo Bonzini ranges[num_ranges++] = (struct range) 2031*783e9e51SPaolo Bonzini { .first = first, .last = last, .set = true }; 2032*783e9e51SPaolo Bonzini break; 2033*783e9e51SPaolo Bonzini case 10: 2034*783e9e51SPaolo Bonzini sparsebit_clear_num(s, first, num); 2035*783e9e51SPaolo Bonzini assert(!sparsebit_is_set_num(s, first, num)); 2036*783e9e51SPaolo Bonzini assert(sparsebit_is_clear_num(s, first, num)); 2037*783e9e51SPaolo Bonzini assert(sparsebit_any_clear(s)); 2038*783e9e51SPaolo Bonzini assert(!sparsebit_all_set(s)); 2039*783e9e51SPaolo Bonzini if (num_ranges == 1000) 2040*783e9e51SPaolo Bonzini exit(0); 2041*783e9e51SPaolo Bonzini ranges[num_ranges++] = (struct range) 2042*783e9e51SPaolo Bonzini { .first = first, .last = last, .set = false }; 2043*783e9e51SPaolo Bonzini break; 2044*783e9e51SPaolo Bonzini case 11: 2045*783e9e51SPaolo Bonzini sparsebit_validate_internal(s); 2046*783e9e51SPaolo Bonzini break; 2047*783e9e51SPaolo Bonzini default: 2048*783e9e51SPaolo Bonzini break; 2049*783e9e51SPaolo Bonzini } 2050*783e9e51SPaolo Bonzini } 2051*783e9e51SPaolo Bonzini 2052*783e9e51SPaolo Bonzini unsigned char get8(void) 2053*783e9e51SPaolo Bonzini { 2054*783e9e51SPaolo Bonzini int ch; 2055*783e9e51SPaolo Bonzini 2056*783e9e51SPaolo Bonzini ch = getchar(); 2057*783e9e51SPaolo Bonzini if (ch == EOF) 2058*783e9e51SPaolo Bonzini exit(0); 2059*783e9e51SPaolo Bonzini return ch; 2060*783e9e51SPaolo Bonzini } 2061*783e9e51SPaolo Bonzini 2062*783e9e51SPaolo Bonzini uint64_t get64(void) 2063*783e9e51SPaolo Bonzini { 2064*783e9e51SPaolo Bonzini uint64_t x; 2065*783e9e51SPaolo Bonzini 2066*783e9e51SPaolo Bonzini x = get8(); 2067*783e9e51SPaolo Bonzini x = (x << 8) | get8(); 2068*783e9e51SPaolo Bonzini x = (x << 8) | get8(); 2069*783e9e51SPaolo Bonzini x = (x << 8) | get8(); 2070*783e9e51SPaolo Bonzini x = (x << 8) | get8(); 2071*783e9e51SPaolo Bonzini x = (x << 8) | get8(); 2072*783e9e51SPaolo Bonzini x = (x << 8) | get8(); 2073*783e9e51SPaolo Bonzini return (x << 8) | get8(); 2074*783e9e51SPaolo Bonzini } 2075*783e9e51SPaolo Bonzini 2076*783e9e51SPaolo Bonzini int main(void) 2077*783e9e51SPaolo Bonzini { 2078*783e9e51SPaolo Bonzini s = sparsebit_alloc(); 2079*783e9e51SPaolo Bonzini for (;;) { 2080*783e9e51SPaolo Bonzini uint8_t op = get8() & 0xf; 2081*783e9e51SPaolo Bonzini uint64_t first = get64(); 2082*783e9e51SPaolo Bonzini uint64_t last = get64(); 2083*783e9e51SPaolo Bonzini 2084*783e9e51SPaolo Bonzini operate(op, first, last); 2085*783e9e51SPaolo Bonzini } 2086*783e9e51SPaolo Bonzini } 2087*783e9e51SPaolo Bonzini #endif 2088