00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef GCC_BITMAP_H
00023 #define GCC_BITMAP_H
00024 #include "hashtab.h"
00025
00026
00027
00028 typedef unsigned long BITMAP_WORD;
00029
00030
00031 #define BITMAP_WORD_BITS (CHAR_BIT * SIZEOF_LONG * 1u)
00032
00033
00034
00035 #ifndef BITMAP_ELEMENT_WORDS
00036 #define BITMAP_ELEMENT_WORDS ((128 + BITMAP_WORD_BITS - 1) / BITMAP_WORD_BITS)
00037 #endif
00038
00039
00040
00041 #define BITMAP_ELEMENT_ALL_BITS (BITMAP_ELEMENT_WORDS * BITMAP_WORD_BITS)
00042
00043
00044 typedef struct bitmap_obstack GTY (())
00045 {
00046 struct bitmap_element_def *elements;
00047 struct bitmap_head_def *heads;
00048 struct obstack GTY ((skip)) obstack;
00049 } bitmap_obstack;
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063 typedef struct bitmap_element_def GTY(())
00064 {
00065 struct bitmap_element_def *next;
00066 struct bitmap_element_def *prev;
00067 unsigned int indx;
00068 BITMAP_WORD bits[BITMAP_ELEMENT_WORDS];
00069 } bitmap_element;
00070
00071
00072 typedef struct bitmap_head_def GTY(()) {
00073 bitmap_element *first;
00074 bitmap_element *current;
00075 unsigned int indx;
00076 bitmap_obstack *obstack;
00077
00078 } bitmap_head;
00079
00080
00081
00082 extern bitmap_element bitmap_zero_bits;
00083 extern bitmap_obstack bitmap_default_obstack;
00084
00085
00086 extern void bitmap_clear (bitmap);
00087
00088
00089 extern void bitmap_copy (bitmap, bitmap);
00090
00091
00092 extern bool bitmap_equal_p (bitmap, bitmap);
00093
00094
00095 extern bool bitmap_intersect_p (bitmap, bitmap);
00096
00097
00098
00099 extern bool bitmap_intersect_compl_p (bitmap, bitmap);
00100
00101
00102 #define bitmap_empty_p(MAP) (!(MAP)->first)
00103
00104
00105 extern unsigned long bitmap_count_bits (bitmap);
00106
00107
00108
00109
00110
00111 extern void bitmap_and (bitmap, bitmap, bitmap);
00112 extern void bitmap_and_into (bitmap, bitmap);
00113 extern void bitmap_and_compl (bitmap, bitmap, bitmap);
00114 extern bool bitmap_and_compl_into (bitmap, bitmap);
00115 #define bitmap_compl_and(DST, A, B) bitmap_and_compl (DST, B, A)
00116 extern void bitmap_compl_and_into (bitmap, bitmap);
00117 extern void bitmap_clear_range (bitmap, unsigned int, unsigned int);
00118 extern bool bitmap_ior (bitmap, bitmap, bitmap);
00119 extern bool bitmap_ior_into (bitmap, bitmap);
00120 extern void bitmap_xor (bitmap, bitmap, bitmap);
00121 extern void bitmap_xor_into (bitmap, bitmap);
00122
00123
00124 extern bool bitmap_ior_and_compl (bitmap DST, bitmap A, bitmap B, bitmap C);
00125
00126 extern bool bitmap_ior_and_compl_into (bitmap DST, bitmap B, bitmap C);
00127
00128
00129 extern void bitmap_clear_bit (bitmap, int);
00130
00131
00132 extern void bitmap_set_bit (bitmap, int);
00133
00134
00135 extern int bitmap_bit_p (bitmap, int);
00136
00137
00138 extern void debug_bitmap (bitmap);
00139 extern void debug_bitmap_file (FILE *, bitmap);
00140
00141
00142 extern void bitmap_print (FILE *, bitmap, const char *, const char *);
00143
00144
00145 extern void bitmap_obstack_initialize (bitmap_obstack *);
00146 extern void bitmap_obstack_release (bitmap_obstack *);
00147
00148
00149
00150
00151 static inline void
00152 bitmap_initialize (bitmap head, bitmap_obstack *obstack)
00153 {
00154 head->first = head->current = NULL;
00155 head->obstack = obstack;
00156 }
00157
00158
00159 extern bitmap bitmap_obstack_alloc (bitmap_obstack *obstack);
00160 extern bitmap bitmap_gc_alloc (void);
00161 extern void bitmap_obstack_free (bitmap);
00162
00163
00164 #define dump_bitmap(file, bitmap) bitmap_print (file, bitmap, "", "\n")
00165 #define bitmap_zero(a) bitmap_clear (a)
00166 extern unsigned bitmap_first_set_bit (bitmap);
00167
00168
00169 extern hashval_t bitmap_hash(bitmap);
00170
00171
00172 #define BITMAP_ALLOC(OBSTACK) bitmap_obstack_alloc (OBSTACK)
00173
00174
00175 #define BITMAP_GGC_ALLOC() bitmap_gc_alloc ()
00176
00177
00178 #define BITMAP_FREE(BITMAP) \
00179 ((void)(bitmap_obstack_free (BITMAP), (BITMAP) = NULL))
00180
00181
00182
00183 typedef struct
00184 {
00185
00186 bitmap_element *elt1;
00187
00188
00189 bitmap_element *elt2;
00190
00191
00192 unsigned word_no;
00193
00194
00195
00196
00197 BITMAP_WORD bits;
00198 } bitmap_iterator;
00199
00200
00201
00202
00203 static inline void
00204 bmp_iter_set_init (bitmap_iterator *bi, bitmap map,
00205 unsigned start_bit, unsigned *bit_no)
00206 {
00207 bi->elt1 = map->first;
00208 bi->elt2 = NULL;
00209
00210
00211 while (1)
00212 {
00213 if (!bi->elt1)
00214 {
00215 bi->elt1 = &bitmap_zero_bits;
00216 break;
00217 }
00218
00219 if (bi->elt1->indx >= start_bit / BITMAP_ELEMENT_ALL_BITS)
00220 break;
00221 bi->elt1 = bi->elt1->next;
00222 }
00223
00224
00225 if (bi->elt1->indx != start_bit / BITMAP_ELEMENT_ALL_BITS)
00226 start_bit = bi->elt1->indx * BITMAP_ELEMENT_ALL_BITS;
00227
00228
00229 bi->word_no = start_bit / BITMAP_WORD_BITS % BITMAP_ELEMENT_WORDS;
00230 bi->bits = bi->elt1->bits[bi->word_no];
00231 bi->bits >>= start_bit % BITMAP_WORD_BITS;
00232
00233
00234
00235
00236
00237 start_bit += !bi->bits;
00238
00239 *bit_no = start_bit;
00240 }
00241
00242
00243
00244
00245 static inline void
00246 bmp_iter_and_init (bitmap_iterator *bi, bitmap map1, bitmap map2,
00247 unsigned start_bit, unsigned *bit_no)
00248 {
00249 bi->elt1 = map1->first;
00250 bi->elt2 = map2->first;
00251
00252
00253
00254 while (1)
00255 {
00256 if (!bi->elt1)
00257 {
00258 bi->elt2 = NULL;
00259 break;
00260 }
00261
00262 if (bi->elt1->indx >= start_bit / BITMAP_ELEMENT_ALL_BITS)
00263 break;
00264 bi->elt1 = bi->elt1->next;
00265 }
00266
00267
00268 while (1)
00269 {
00270 if (!bi->elt2)
00271 {
00272 bi->elt1 = bi->elt2 = &bitmap_zero_bits;
00273 break;
00274 }
00275
00276 if (bi->elt2->indx >= bi->elt1->indx)
00277 break;
00278 bi->elt2 = bi->elt2->next;
00279 }
00280
00281
00282 if (bi->elt1->indx == bi->elt2->indx)
00283 {
00284
00285
00286 if (bi->elt1->indx != start_bit / BITMAP_ELEMENT_ALL_BITS)
00287 start_bit = bi->elt1->indx * BITMAP_ELEMENT_ALL_BITS;
00288
00289 bi->word_no = start_bit / BITMAP_WORD_BITS % BITMAP_ELEMENT_WORDS;
00290 bi->bits = bi->elt1->bits[bi->word_no] & bi->elt2->bits[bi->word_no];
00291 bi->bits >>= start_bit % BITMAP_WORD_BITS;
00292 }
00293 else
00294 {
00295
00296
00297 bi->word_no = BITMAP_ELEMENT_WORDS - 1;
00298 bi->bits = 0;
00299 }
00300
00301
00302
00303
00304
00305 start_bit += !bi->bits;
00306
00307 *bit_no = start_bit;
00308 }
00309
00310
00311
00312
00313 static inline void
00314 bmp_iter_and_compl_init (bitmap_iterator *bi, bitmap map1, bitmap map2,
00315 unsigned start_bit, unsigned *bit_no)
00316 {
00317 bi->elt1 = map1->first;
00318 bi->elt2 = map2->first;
00319
00320
00321 while (1)
00322 {
00323 if (!bi->elt1)
00324 {
00325 bi->elt1 = &bitmap_zero_bits;
00326 break;
00327 }
00328
00329 if (bi->elt1->indx >= start_bit / BITMAP_ELEMENT_ALL_BITS)
00330 break;
00331 bi->elt1 = bi->elt1->next;
00332 }
00333
00334
00335 while (bi->elt2 && bi->elt2->indx < bi->elt1->indx)
00336 bi->elt2 = bi->elt2->next;
00337
00338
00339
00340 if (bi->elt1->indx != start_bit / BITMAP_ELEMENT_ALL_BITS)
00341 start_bit = bi->elt1->indx * BITMAP_ELEMENT_ALL_BITS;
00342
00343 bi->word_no = start_bit / BITMAP_WORD_BITS % BITMAP_ELEMENT_WORDS;
00344 bi->bits = bi->elt1->bits[bi->word_no];
00345 if (bi->elt2 && bi->elt1->indx == bi->elt2->indx)
00346 bi->bits &= ~bi->elt2->bits[bi->word_no];
00347 bi->bits >>= start_bit % BITMAP_WORD_BITS;
00348
00349
00350
00351
00352
00353 start_bit += !bi->bits;
00354
00355 *bit_no = start_bit;
00356 }
00357
00358
00359
00360
00361 static inline void
00362 bmp_iter_next (bitmap_iterator *bi, unsigned *bit_no)
00363 {
00364 bi->bits >>= 1;
00365 *bit_no += 1;
00366 }
00367
00368
00369
00370
00371
00372 static inline bool
00373 bmp_iter_set (bitmap_iterator *bi, unsigned *bit_no)
00374 {
00375
00376 if (bi->bits)
00377 {
00378 next_bit:
00379 while (!(bi->bits & 1))
00380 {
00381 bi->bits >>= 1;
00382 *bit_no += 1;
00383 }
00384 return true;
00385 }
00386
00387
00388
00389
00390 *bit_no = ((*bit_no + BITMAP_WORD_BITS - 1)
00391 / BITMAP_WORD_BITS * BITMAP_WORD_BITS);
00392 bi->word_no++;
00393
00394 while (1)
00395 {
00396
00397 while (bi->word_no != BITMAP_ELEMENT_WORDS)
00398 {
00399 bi->bits = bi->elt1->bits[bi->word_no];
00400 if (bi->bits)
00401 goto next_bit;
00402 *bit_no += BITMAP_WORD_BITS;
00403 bi->word_no++;
00404 }
00405
00406
00407 bi->elt1 = bi->elt1->next;
00408 if (!bi->elt1)
00409 return false;
00410 *bit_no = bi->elt1->indx * BITMAP_ELEMENT_ALL_BITS;
00411 bi->word_no = 0;
00412 }
00413 }
00414
00415
00416
00417
00418
00419 static inline bool
00420 bmp_iter_and (bitmap_iterator *bi, unsigned *bit_no)
00421 {
00422
00423 if (bi->bits)
00424 {
00425 next_bit:
00426 while (!(bi->bits & 1))
00427 {
00428 bi->bits >>= 1;
00429 *bit_no += 1;
00430 }
00431 return true;
00432 }
00433
00434
00435
00436
00437 *bit_no = ((*bit_no + BITMAP_WORD_BITS - 1)
00438 / BITMAP_WORD_BITS * BITMAP_WORD_BITS);
00439 bi->word_no++;
00440
00441 while (1)
00442 {
00443
00444 while (bi->word_no != BITMAP_ELEMENT_WORDS)
00445 {
00446 bi->bits = bi->elt1->bits[bi->word_no] & bi->elt2->bits[bi->word_no];
00447 if (bi->bits)
00448 goto next_bit;
00449 *bit_no += BITMAP_WORD_BITS;
00450 bi->word_no++;
00451 }
00452
00453
00454 do
00455 {
00456
00457
00458 do
00459 {
00460 bi->elt1 = bi->elt1->next;
00461 if (!bi->elt1)
00462 return false;
00463 }
00464 while (bi->elt1->indx < bi->elt2->indx);
00465
00466
00467
00468 while (bi->elt2->indx < bi->elt1->indx)
00469 {
00470 bi->elt2 = bi->elt2->next;
00471 if (!bi->elt2)
00472 return false;
00473 }
00474 }
00475 while (bi->elt1->indx != bi->elt2->indx);
00476
00477 *bit_no = bi->elt1->indx * BITMAP_ELEMENT_ALL_BITS;
00478 bi->word_no = 0;
00479 }
00480 }
00481
00482
00483
00484
00485
00486 static inline bool
00487 bmp_iter_and_compl (bitmap_iterator *bi, unsigned *bit_no)
00488 {
00489
00490 if (bi->bits)
00491 {
00492 next_bit:
00493 while (!(bi->bits & 1))
00494 {
00495 bi->bits >>= 1;
00496 *bit_no += 1;
00497 }
00498 return true;
00499 }
00500
00501
00502
00503
00504 *bit_no = ((*bit_no + BITMAP_WORD_BITS - 1)
00505 / BITMAP_WORD_BITS * BITMAP_WORD_BITS);
00506 bi->word_no++;
00507
00508 while (1)
00509 {
00510
00511 while (bi->word_no != BITMAP_ELEMENT_WORDS)
00512 {
00513 bi->bits = bi->elt1->bits[bi->word_no];
00514 if (bi->elt2 && bi->elt2->indx == bi->elt1->indx)
00515 bi->bits &= ~bi->elt2->bits[bi->word_no];
00516 if (bi->bits)
00517 goto next_bit;
00518 *bit_no += BITMAP_WORD_BITS;
00519 bi->word_no++;
00520 }
00521
00522
00523 bi->elt1 = bi->elt1->next;
00524 if (!bi->elt1)
00525 return false;
00526
00527
00528 while (bi->elt2 && bi->elt2->indx < bi->elt1->indx)
00529 bi->elt2 = bi->elt2->next;
00530
00531 *bit_no = bi->elt1->indx * BITMAP_ELEMENT_ALL_BITS;
00532 bi->word_no = 0;
00533 }
00534 }
00535
00536
00537
00538
00539
00540
00541 #define EXECUTE_IF_SET_IN_BITMAP(BITMAP, MIN, BITNUM, ITER) \
00542 for (bmp_iter_set_init (&(ITER), (BITMAP), (MIN), &(BITNUM)); \
00543 bmp_iter_set (&(ITER), &(BITNUM)); \
00544 bmp_iter_next (&(ITER), &(BITNUM)))
00545
00546
00547
00548
00549
00550
00551 #define EXECUTE_IF_AND_IN_BITMAP(BITMAP1, BITMAP2, MIN, BITNUM, ITER) \
00552 for (bmp_iter_and_init (&(ITER), (BITMAP1), (BITMAP2), (MIN), \
00553 &(BITNUM)); \
00554 bmp_iter_and (&(ITER), &(BITNUM)); \
00555 bmp_iter_next (&(ITER), &(BITNUM)))
00556
00557
00558
00559
00560
00561
00562 #define EXECUTE_IF_AND_COMPL_IN_BITMAP(BITMAP1, BITMAP2, MIN, BITNUM, ITER) \
00563 for (bmp_iter_and_compl_init (&(ITER), (BITMAP1), (BITMAP2), (MIN), \
00564 &(BITNUM)); \
00565 bmp_iter_and_compl (&(ITER), &(BITNUM)); \
00566 bmp_iter_next (&(ITER), &(BITNUM)))
00567
00568 #endif