by vector of allocnos. */ bool conflict_vec_p; /* The conflict vector or conflict bit vector. */ void *vec; /* The number of the current element in the vector (of type ira_object_t or IRA_INT_TYPE). */ unsigned int word_num; /* The bit vector size. It is defined only if OBJECT_CONFLICT_VEC_P is FALSE. */ unsigned int size; /* The current bit index of bit vector. It is defined only if OBJECT_CONFLICT_VEC_P is FALSE. */ unsigned int bit_num; /* The object id corresponding to the 1st bit of the bit vector. It is defined only if OBJECT_CONFLICT_VEC_P is FALSE. */ int base_conflict_id; /* The word of bit vector currently visited. It is defined only if OBJECT_CONFLICT_VEC_P is FALSE. */ unsigned IRA_INT_TYPE word; }; /* Initialize the iterator I with ALLOCNO conflicts. */ static inline void ira_object_conflict_iter_init (ira_object_conflict_iterator *i, ira_object_t obj) { i->conflict_vec_p = OBJECT_CONFLICT_VEC_P (obj); i->vec = OBJECT_CONFLICT_ARRAY (obj); i->word_num = 0; if (i->conflict_vec_p) i->size = i->bit_num = i->base_conflict_id = i->word = 0; else { if (OBJECT_MIN (obj) > OBJECT_MAX (obj)) i->size = 0; else i->size = ((OBJECT_MAX (obj) - OBJECT_MIN (obj) + IRA_INT_BITS) / IRA_INT_BITS) * sizeof (IRA_INT_TYPE); i->bit_num = 0; i->base_conflict_id = OBJECT_MIN (obj); i->word = (i->size == 0 ? 0 : ((IRA_INT_TYPE *) i->vec)[0]); } } /* Return TRUE if we have more conflicting allocnos to visit, in which case *A is set to the allocno to be visited. Otherwise, return FALSE. */ static inline bool ira_object_conflict_iter_cond (ira_object_conflict_iterator *i, ira_object_t *pobj) { ira_object_t obj; if (i->conflict_vec_p) { obj = ((ira_object_t *) i->vec)[i->word_num++]; if (obj == NULL) return false; } else { unsigned IRA_INT_TYPE word = i->word; unsigned int bit_num = i->bit_num; /* Skip words that are zeros. */ for (; word == 0; word = ((IRA_INT_TYPE *) i->vec)[i->word_num]) { i->word_num++; /* If we have reached the end, break. */ if (i->word_num * sizeof (IRA_INT_TYPE) >= i->size) return false; bit_num = i->word_num * IRA_INT_BITS; } /* Skip bits that are zero. */ for (; (word & 1) == 0; word >>= 1) bit_num++; obj = ira_object_id_map[bit_num + i->base_conflict_id]; i->bit_num = bit_num + 1; i->word = word >> 1; } *pobj = obj; return true; } /* Loop over all objects conflicting with OBJ. In each iteration, CONF is set to the next conflicting object. ITER is an instance of ira_object_conflict_iterator used to iterate the conflicts. */ #define FOR_EACH_OBJECT_CONFLICT(OBJ, CONF, ITER) \ for (ira_object_conflict_iter_init (&(ITER), (OBJ)); \ ira_object_conflict_iter_cond (&(ITER), &(CONF));)