8 #define MAKESURE(what, x) typedef char make_sure_##what[(x)?1:-1] 9 #define die(...) die_(__FILE__, __VA_ARGS__) 14 typedef unsigned long long bits;
59 #define BIT(n) ((bits)1 << (n)) 93 #define TMP(x) (Ref){RTmp, x} 94 #define CON(x) (Ref){RCon, x} 96 #define SLOT(x) (Ref){RSlot, (x)&0x1fffffff} 97 #define TYPE(x) (Ref){RType, x} 98 #define CALL(x) (Ref){RCall, x} 99 #define MEM(x) (Ref){RMem, x} 107 static inline int req(
Ref a,
Ref b)
117 static inline int rtype(
Ref r)
162 #define O(op, x, y) O##op, 173 X(ret0) X(retw) X(retl) X(rets) \ 174 X(retd) X(retc) X(jmp) X(jnz) \ 175 X(jfieq) X(jfine) X(jfisge) X(jfisgt) \ 176 X(jfisle) X(jfislt) X(jfiuge) X(jfiugt) \ 177 X(jfiule) X(jfiult) X(jffeq) X(jffge) \ 178 X(jffgt) X(jffle) X(jfflt) X(jffne) \ 204 #define isstore(o) (Ostoreb <= o && o <= Ostored) 205 #define isload(o) (Oloadsb <= o && o <= Oload) 206 #define isext(o) (Oextsb <= o && o <= Oextuw) 207 #define ispar(o) (Opar <= o && o <= Opare) 208 #define isarg(o) (Oarg <= o && o <= Oarge) 209 #define isret(j) (Jret0 <= j && j <= Jretc) 219 #define KWIDE(k) ((k)&1) 220 #define KBASE(k) ((k)>>1) 314 #define astack(t) ((t) & 1) 455 extern char debug[
'Z'+1];
465 uint32_t
hash(
char *);
466 void die_(
char *,
char *, ...) __attribute__((noreturn));
477 int iscmp(
int,
int *,
int *);
508 assert(elt < bs->nt *
NBit);
518 void parse(FILE *,
char *,
void (*)(
Dat *),
void (*)(
Fn *));
521 void err(
char *, ...) __attribute__((noreturn));
O
Перечисление всех операций QBE IL.
Blk * start
Указатель на блок функции, являющийся её входной точкой
int ncon
Размер массива con.
void gasemitdat(Dat *, FILE *)
void emit(int, int, Ref, Ref, Ref)
void bsunion(BSet *, BSet *)
Структура, хранящая информацию об инструкциях.
int clsmerge(short *, short)
int retty
index in typ[], -1 if no aggregate return
int iscmp(int, int *, int *)
void * vnew(ulong, size_t, Pool)
Op optab[NOp]
Массив всех операций.
void edgedel(Blk *, Blk **)
uint ndef
Количество блоков, в которых есть объявление переменной
Con * con
Массив используемых функцией констант
void bsinit(BSet *, uint)
void bscopy(BSet *, BSet *)
Структура, хранящая описание переменных (более подробное описание переменной ищите в Tmp)...
Содержит информацию о переменной
void err(char *,...) __attribute__((noreturn))
CmpF
Сравнения для чисел типа float.
Tmp * tmp
Массив используемых функцией переменных
Use * use
Содержит информацию об использовании переменной
enum Typ::Field::@13 type
void die_(char *, char *,...) __attribute__((noreturn))
int alias(Ref, int, Ref, int, int *, Fn *)
int ntmp
Размер массива tmp.
Непосредственно информация о базовом блоке.
int bsiter(BSet *, int *)
void idup(Ins **, Ins *, ulong)
void printfn(Fn *, FILE *)
void loopiter(Fn *, void(*)(Blk *, Blk *))
void chuse(Ref, int, Fn *)
Ref getcon(int64_t, Fn *)
int bsequal(BSet *, BSet *)
char name[NString]
Имя переменной
void addcon(Con *, Con *)
void vgrow(void *, ulong)
bits m
avoid these registers
int gasstash(void *, int)
void parse(FILE *, char *, void(*)(Dat *), void(*)(Fn *))
Парсит файл с программой на QBE IL.
uint nblk
Количество блоков в функции
bits(* retregs)(Ref, int[2])
Blk ** rpo
Ссылка на массив блоков, пронумерованных в порядке Reverse-Post Order, заполняется функцией fillrpo...
int nmem
Размер массива mem.
bits(* argregs)(Ref, int[2])
Номер (в массиве Fn->tmp) первой не регистровой переменной
void bsinter(BSet *, BSet *)
must match Oload/Oext order
char name[NString]
Имя функции
#define T(a, b, c, d, e, f, g, h)
Ins * icpy(Ins *, Ins *, ulong)
void bsdiff(BSet *, BSet *)
Ref newtmp(char *, int, Fn *)
void(* emitfn)(Fn *, FILE *)
void liveon(BSet *, Blk *, Blk *)
void blit(Ref, uint, Ref, uint, Fn *)
void dumpts(BSet *, Tmp *, FILE *)
J
Перечисление всех прыжков QBE IL.
void printref(Ref, Fn *, FILE *)
Структура, хранящая в себе информацию о функции
Структура, хранящая информацию об операции.
uint nuse
Количество блоков, в которых переменная используется
CmpI
Сравнения для 32 битных целых чисел.
#define X(NMemArgs, SetsZeroFlag, LeavesFlags)
Структура, хранящая информацию об одном "использовании" переменной.
void filluse(Fn *)
Заполняет информацию об использовании переменных в функции