/* Bitset vectors.
- Copyright (C) 2001 Free Software Foundation, Inc.
+ Copyright (C) 2001, 2002 Free Software Foundation, Inc.
This file is part of GCC.
type TYPE. */
bitset *
bitsetv_alloc (n_vecs, n_bits, type)
- unsigned int n_vecs;
- unsigned int n_bits;
- enum bitset_type type;
+ bitset_bindex n_vecs;
+ bitset_bindex n_bits;
+ enum_bitset_type type;
{
- unsigned int vector_bytes;
- unsigned int bytes;
+ size_t vector_bytes;
+ size_t bytes;
bitset *bsetv;
- unsigned int i;
+ bitset_bindex i;
/* Determine number of bytes for each set. */
bytes = bitset_bytes (type, n_bits);
+
+ /* If size calculation overflows, memory is exhausted. */
+ if (BITSET_SIZE_MAX / (sizeof (bitset) + bytes) <= n_vecs)
+ xalloc_die ();
/* Allocate vector table at head of bitset array. */
- vector_bytes = (n_vecs + 1) * sizeof (bitset);
+ vector_bytes = (n_vecs + 1) * sizeof (bitset) + bytes - 1;
+ vector_bytes -= vector_bytes % bytes;
bsetv = (bitset *) xcalloc (1, vector_bytes + bytes * n_vecs);
for (i = 0; i < n_vecs; i++)
{
- bsetv[i] = (bitset) ((char *) bsetv + vector_bytes + i * bytes);
-
+ bsetv[i] = (bitset) (void *) ((char *) bsetv + vector_bytes + i * bytes);
+
bitset_init (bsetv[i], n_bits, type);
}
attribute hints specified by ATTR. */
bitset *
bitsetv_create (n_vecs, n_bits, attr)
- unsigned int n_vecs;
- unsigned int n_bits;
+ bitset_bindex n_vecs;
+ bitset_bindex n_bits;
unsigned int attr;
{
enum bitset_type type;
bitsetv_free (bsetv)
bitset *bsetv;
{
- unsigned int i;
+ bitset_bindex i;
for (i = 0; bsetv[i]; i++)
BITSET_FREE_ (bsetv[i]);
/* Zero a vector of bitsets. */
void
bitsetv_zero (bsetv)
- struct bitset_struct **bsetv;
+ bitsetv bsetv;
{
- unsigned int i;
+ bitset_bindex i;
for (i = 0; bsetv[i]; i++)
bitset_zero (bsetv[i]);
bitsetv_ones (bsetv)
bitset *bsetv;
{
- unsigned int i;
+ bitset_bindex i;
for (i = 0; bsetv[i]; i++)
bitset_ones (bsetv[i]);
}
+/* Given a vector BSETV of N bitsets of size N, modify its contents to
+ be the transitive closure of what was given. */
+void
+bitsetv_transitive_closure (bsetv)
+ bitset *bsetv;
+{
+ bitset_bindex i;
+ bitset_bindex j;
+
+ for (i = 0; bsetv[i]; i++)
+ for (j = 0; bsetv[j]; j++)
+ if (bitset_test (bsetv[j], i))
+ bitset_or (bsetv[j], bsetv[j], bsetv[i]);
+}
+
+
+/* Given a vector BSETV of N bitsets of size N, modify its contents to
+ be the reflexive transitive closure of what was given. This is
+ the same as transitive closure but with all bits on the diagonal
+ of the bit matrix set. */
+void
+bitsetv_reflexive_transitive_closure (bitsetv bsetv)
+{
+ bitset_bindex i;
+
+ bitsetv_transitive_closure (bsetv);
+ for (i = 0; bsetv[i]; i++)
+ bitset_set (bsetv[i], i);
+}
+
+
/* Dump the contents of a bitset vector BSETV with N_VECS elements to
FILE. */
void
const char *title, *subtitle;
bitset *bsetv;
{
- unsigned int i;
+ bitset_windex i;
fprintf (file, "%s\n", title);
for (i = 0; bsetv[i]; i++)
{
- fprintf (file, "%s %d\n", subtitle, i);
+ fprintf (file, "%s %lu\n", subtitle, (unsigned long) i);
bitset_dump (file, bsetv[i]);
}
debug_bitsetv (bsetv)
bitset *bsetv;
{
- unsigned int i;
+ bitset_windex i;
for (i = 0; bsetv[i]; i++)
{
- fprintf (stderr, "%d: ", i);
+ fprintf (stderr, "%lu: ", (unsigned long) i);
debug_bitset (bsetv[i]);
}