// Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. #include #include "cc.h" enum { WORDSIZE = sizeof(uint32), WORDBITS = 32, }; uintptr bvsize(uintptr n) { return ((n + WORDBITS - 1) / WORDBITS) * WORDSIZE; } Bvec* bvalloc(int32 n) { Bvec *bv; uintptr nbytes; if(n < 0) fatal(Z, "bvalloc: initial size is negative\n"); nbytes = sizeof(Bvec) + bvsize(n); bv = malloc(nbytes); if(bv == nil) fatal(Z, "bvalloc: malloc failed\n"); memset(bv, 0, nbytes); bv->n = n; return bv; } void bvset(Bvec *bv, int32 i) { uint32 mask; if(i < 0 || i >= bv->n) fatal(Z, "bvset: index %d is out of bounds with length %d\n", i, bv->n); mask = 1 << (i % WORDBITS); bv->b[i / WORDBITS] |= mask; }