aijuprogress!93d470012 years agoHistory
378 lines · 4.2 KB · C
RawDownload
typedef struct ASTNode ASTNode;typedef struct Symbol Symbol;typedef struct SymTab SymTab;typedef struct Type Type;typedef struct Line Line;typedef struct Loop Loop;typedef struct IR IR;typedef struct IRBlock IRBlock;typedef struct Targ Targ;typedef struct Function Function;typedef struct Member Member;typedef struct BitSet BitSet; enum {	SYMHASH = 32,	PTRSZ = 4,}; struct Type {	char t, sign;	int size, align;	Type *next, *link;	Member *memb;	int nmemb;	char *tag;}; struct Member {	Type *type;	char *name;	int off;}; enum {	TXXX,	TUCHAR,	TCHAR,	TUSHORT,	TSHORT,	TUINT,	TINT,	TUVLONG,	TVLONG,	TFLOAT,	TDOUBLE,	TVOID,	TIND,	TFUNC,	TARRAY,	TSTRUCT,	TUNION,	NTYPE,		TBASIC = TDOUBLE,};#define regtype (&types[TUINT])extern Type types[]; enum {	BINT = 1<<0,	BCHAR = 1<<1,	BSHORT = 1<<2,	BLONG = 1<<3,	BVLONG = 1<<4,	BFLOAT = 1<<5,	BDOUBLE = 1<<6,	BVOID = 1<<7,	BUNSIGNED = 1<<8,	BSIGNED = 1<<9,	BEXTERN = 1<<10,	BSTATIC = 1<<11,	BTYPEDEF = 1<<12,	BMEM = 1<<13,		BMASK = 0xff,}; struct Line {	char *filen;	int lineno;}; struct ASTNode {	int t;	Type *type;	union {		int lval;		vlong vval;		Symbol *sym;		ASTNode *n;		struct {			int op;			ASTNode *n1, *n2;		};		struct {			ASTNode *name;			Member *memb;			int nmemb;		};		ASTNode *first;		struct {			ASTNode *cond;			ASTNode *block;			ASTNode *elsebl;		};		struct {			ASTNode *once;			ASTNode *cond;			ASTNode *iter;			ASTNode *block;		} forl;		struct {			ASTNode *n;			Type *t;		} cast;		struct {			ASTNode *n;			char *name;			Member *m;		} mb;		struct {			ASTNode *n;			ASTNode **args;			int argn;		} func;	};	ASTNode *next;	ASTNode **last;	Line;}; enum {	ASTCLONG,	ASTBIN,	ASTASS,	ASTTERN,	ASTDEREF,	ASTADDROF,	ASTUN,	ASTINC,	ASTIF,	ASTSYM,	ASTARRAY,	ASTFUNCTYPE,	ASTCAST,	ASTCOMMA,	ASTBLOCK,	ASTWHILE,	ASTDOWHILE,	ASTFOR,	ASTBREAK,	ASTCONTINUE,	ASTRETURN,	ASTLABEL,	ASTGOTO,	ASTMEMB,	ASTCALL,}; enum {	OPMOV,	OPUPLUS,	OPNEG,	OPTST,	OPCALL, 	OPADD = 0x10,	OPSUB,	OPMUL,	OPDIV,	OPMOD,	OPCMP,	OPRSB,		OPAND = 0x20,	OPOR,	OPXOR,	OPLSH,	OPRSH,	OPASR,	OPROR,	OPCOM,		OPSXTB,	OPSXTH,	OPSXTW,	OPZXTB,	OPZXTH,	OPZXTW,		OPLD = 0x30,	OPLDB,	OPLDSB,	OPLDH,	OPLDSH,	OPLDD,	OPST,	OPSTB,	OPSTH,	OPSTD,		OPFNEG = OPNEG + 0x40,	OPFADD = 0x50,	OPFSUB,	OPFMUL,	OPFDIV,	OPFCMP = 0x55, 	OPEQ = 0x100,	OPNE,	OPLT,	OPLE,	OPGT,	OPGE,	OPB,	OPBE,	OPA,	OPAE,		OPLOR = 0x110,	OPLAND,	OPISZ,		OPPHI = 0x200,}; #define OPTYPE(o) ((o) & 0xf00)#define OPGROUP(o) ((o) & 0xff0) enum {	OPNORM = 0,	OPBRANCH = 0x100,}; enum {	PREINC,	POSTINC,	PREDEC,	POSTDEC,}; struct Symbol {	int class;	char *name;	Symbol *next;	Type *t;	int level;	int off;	Line;	Targ *targ;	IRBlock *label;	int num;}; struct SymTab {	Symbol *sym[SYMHASH];	int level;	SymTab *up;}; struct Targ {	int t;	union {		struct {			Symbol *sym;			int n;			Targ *up;		};		Targ *link;		int lval;		int tn;		int off;		struct {			Targ *a;			Targ *b;			int op;		};	};	int num;	IR *def;	Type *type;	int Rn;}; enum {	TARGXXX,	TARGSYM,	TARGSSA,	TARGTEMP,	TARGCONST,	TARGRETV,	TARGFP,	TARGIND,	TARGADDR,	TARGARG,	TARGSH,}; enum {	MAXUSE = 5,}; struct IR {	short op;	char sz;	union {		struct {			Targ *r, *a, *b;		};		struct {			IRBlock *targ;			IR *gotolink;		};		struct {			Targ *r;			Targ **a;			int n;		} φ;	};	IR *prev, *next;	IR *link;	Line;}; enum {	IRMARK = 1<<7,}; struct IRBlock {	int num;	IR instr;	IRBlock *next, *prev;	IRBlock *branch;		int nfrom, nto;	IRBlock **from, *to[2];		IRBlock *idom;	IRBlock *domch, *chnext;		IRBlock **front;	int nfront, nafront;		IRBlock *link;}; struct Loop {	BitSet *bl;	IRBlock *head;	Loop *next;}; struct Function {	IRBlock bllist;	int tempcnt;	Type *type;	Symbol **arg;	Loop *loops;}; struct BitSet {	int n;	u32int p[1];}; #pragma varargck type "A" int#pragma varargck type "O" int#pragma varargck type "T" Type *#pragma varargck type "I" IR *#pragma varargck type "J" Targ *#pragma varargck type "S" BitSet * extern Line curline;extern Function *curfunc;extern IRBlock **blocks;extern int nblocks;extern Targ **targs;extern int ntargs;