36 static void *ptr[
NPtr];
    37 static void **pool = ptr;
    53 die_(
char *file, 
char *s, ...)
    57     fprintf(stderr, 
"%s: dying: ", file);
    59     vfprintf(stderr, s, ap);
    72         die(
"emalloc, out of memory");
    89     return pool[nptr++] = 
emalloc(n);
    98         for (pp = &pool[1]; pp < &pool[nptr]; pp++)
   117     for (cap=
VMin; cap<
len; cap*=2)
   120     v = f(cap * esz + 
sizeof(
Vec));
   152     memcpy(v1, v+1, v->
cap * v->
esz);
   169         if (strcmp(s, b->
str[i]) == 0)
   170             return h + (i<<
IBits);
   172     if (n == 1<<(32-
IBits))
   173         die(
"interning table overflow");
   176     else if ((n & (n-1)) == 0)
   181     strcpy(b->
str[n], s);
   182     return h + (n<<
IBits);
   232         die(
"emit, too many instructions");
   235         .to = to, .arg = {arg0, arg1}
   249     memcpy(*pd, s, n * 
sizeof(
Ins));
   255     memcpy(d, s, n * 
sizeof(
Ins));
   259 static int cmptab[][2] ={
   284     assert(0 <= c && c < 
NCmp);
   291     assert(0 <= c && c < 
NCmp);
   305     if ((k1 == 
Kw && k == 
Kl) || (k1 == 
Kl && k == 
Kw)) {
   333     memset(&fn->
tmp[t], 0, 
sizeof(
Tmp));
   335         sprintf(fn->
tmp[t].
name, 
"%s.%d", prfx, ++n);
   346     if (rtype(r) == 
RTmp)
   355     for (c=0; c<fn->
ncon; c++)
   366     if (c0->
type == CUndef)
   369         if (c1->
type == CAddr) {
   370             assert(c0->
type != CAddr && 
"adding two addresses");
   381     struct { 
int st, ld, 
cls, size; } *p, tbl[] = {
   390     for (boff=0, p=tbl; sz; p++)
   391         for (s=p->size; sz>=s; sz-=s, doff+=s, boff+=s) {
   394             emit(p->st, 0, 
R, r, r1);
   397             emit(p->ld, p->cls, r, r1, 
R);
   407     bs->
t = 
alloc(n * 
sizeof bs->
t[0]);
   414     b = (b & 0x5555555555555555) + ((b>>1) & 0x5555555555555555);
   415     b = (b & 0x3333333333333333) + ((b>>2) & 0x3333333333333333);
   416     b = (b & 0x0f0f0f0f0f0f0f0f) + ((b>>4) & 0x0f0f0f0f0f0f0f0f);
   429     if (!(b & 0xffffffff)) {
   445     n += (
char[16]){4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0}[b & 0xf];
   455     for (i=0; i<bs->
nt; i++)
   456         n += popcnt(bs->
t[i]);
   469     assert(elt < bsmax(bs));
   476     assert(elt < bsmax(bs));
   480 #define BSOP(f, op)                           \   482     f(BSet *a, BSet *b)                   \   486         assert(a->nt == b->nt);       \   487         for (i=0; i<a->nt; i++)       \   488             a->t[i] op b->t[i];   \   501     assert(a->nt == b->nt);
   502     for (i=0; i<a->nt; i++)
   503         if (a->t[i] != b->t[i])
   511     memset(bs->
t, 0, bs->
nt * 
sizeof bs->
t[0]);
   538     *elt = 
NBit*t + firstbit(b);
   549         fprintf(f, 
" %s", tmp[t].name);
 
Ins * icpy(Ins *d, Ins *s, ulong n)
void die_(char *file, char *s,...)
int bsequal(BSet *a, BSet *b)
int ncon
Размер массива con. 
int bsiter(BSet *bs, int *elt)
Структура, хранящая информацию об инструкциях. 
Op optab[NOp]
Массив всех операций. 
void bsclr(BSet *bs, uint elt)
int clsmerge(short *pk, short k)
void bsinit(BSet *bs, uint n)
void * vnew(ulong len, size_t esz, Pool pool)
uint ndef
Количество блоков, в которых есть объявление переменной 
Con * con
Массив используемых функцией констант 
int phicls(int t, Tmp *tmp)
Структура, хранящая описание переменных (более подробное описание переменной ищите в Tmp)...
void vgrow(void *vp, ulong len)
Содержит информацию о переменной 
Tmp * tmp
Массив используемых функцией переменных 
void addcon(Con *c0, Con *c1)
int ntmp
Размер массива tmp. 
int iscmp(int op, int *pk, int *pc)
char name[NString]
Имя переменной 
int argcls(Ins *i, int n)
void bsinter(BSet *a, BSet *b)
void bsset(BSet *bs, uint elt)
void bscopy(BSet *a, BSet *b)
void bsunion(BSet *a, BSet *b)
Номер (в массиве Fn->tmp) первой не регистровой переменной 
void emit(int op, int k, Ref to, Ref arg0, Ref arg1)
void idup(Ins **pd, Ins *s, ulong n)
Ref getcon(int64_t val, Fn *fn)
void dumpts(BSet *bs, Tmp *tmp, FILE *f)
Ref newtmp(char *prfx, int k, Fn *fn)
void blit(Ref rdst, uint doff, Ref rsrc, uint sz, Fn *fn)
Структура, хранящая в себе информацию о функции 
uint nuse
Количество блоков, в которых переменная используется 
#define MAKESURE(what, x)
void bsdiff(BSet *a, BSet *b)
void chuse(Ref r, int du, Fn *fn)