summaryrefslogtreecommitdiff
path: root/compiler/cbits/genSym.c
blob: 8a47d77f2700ab4b22836740ef0c9717b45fb343 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <Rts.h>
#include <assert.h>
#include "Unique.h"

HsInt ghc_unique_counter = 0;
HsInt ghc_unique_inc     = 1;

#define UNIQUE_BITS (sizeof (HsInt) * 8 - UNIQUE_TAG_BITS)
#define UNIQUE_MASK ((1ULL << UNIQUE_BITS) - 1)

HsInt genSym(void) {
    HsInt u = atomic_inc((StgWord *)&ghc_unique_counter, ghc_unique_inc) & UNIQUE_MASK;
#if DEBUG
    // Uh oh! We will overflow next time a unique is requested.
    assert(u != UNIQUE_MASK);
#endif
    return u;
}