#include #include #include #pragma lib "../cc/cc.a$O" typedef struct Node Node; typedef struct Sym Sym; typedef struct Type Type; typedef struct Decl Decl; typedef struct Io Io; typedef struct Hist Hist; typedef struct Term Term; #define NHUNK 50000L #define BUFSIZ 8192 #define NSYMB 500 #define NTYPE 12 #define XTYPE (NTYPE+6) #define NHASH 1024 #define STRINGSZ 200 #define HISTSZ 20 #define YYMAXDEPTH 500 #define NTERM 10 #define SIGN(n) (((vlong)1)<<(n-1)) #define MASK(n) (SIGN(n)|(SIGN(n)-1)) #define ALLOC(lhs, type)\ while(nhunk < sizeof(type))\ gethunk();\ lhs = (type*)hunk;\ nhunk -= sizeof(type);\ hunk += sizeof(type); #define ALLOCN(lhs, len, n)\ if(lhs+len != hunk || nhunk < n) {\ while(nhunk < len+n)\ gethunk();\ memmove(hunk, lhs, len);\ lhs = hunk;\ hunk += len;\ nhunk -= len;\ }\ hunk += n;\ nhunk -= n; struct Node { union { struct { Node* nleft; Node* nright; } s0; struct { void* nlabel; long npc; } s1; struct { int nreg; long noffset; } s2; double nfconst; /* fp constant */ vlong nvconst; /* non fp const */ char* ncstring; /* character string */ ushort* nrstring; /* rune string */ } u0; Sym* sym; Type* type; long lineno; char op; char class; char etype; char complex; char addable; char scale; char garb; }; #define Z ((Node*)0) struct Sym { Sym* link; Type* type; Type* suetag; Type* tenum; char* macro; long varlineno; long offset; union { vlong svconst; double sfconst; } u0; Node* label; ushort lexical; char *name; char block; char sueblock; char class; char sym; char aused; }; #define S ((Sym*)0) struct Decl { Decl* link; Sym* sym; Type* type; long varlineno; long offset; short val; char class; char block; char aused; }; #define D ((Decl*)0) struct Type { Sym* sym; Sym* tag; Type* link; Type* down; long width; long offset; long lineno; char shift; char nbits; char etype; char garb; }; #define T ((Type*)0) #define NODECL ((void(*)(int, Type*, Sym*))0) struct { char* p; int c; } fi; struct Io { Io* link; char* p; char b[BUFSIZ]; short c; short f; }; #define I ((Io*)0) struct Hist { Hist* link; char* name; long line; long offset; }; #define H ((Hist*)0) Hist* hist; struct Term { vlong mult; Node *node; }; enum { DMARK, DAUTO, DSUE, DLABEL, }; enum { OXXX, OADD, OADDR, OAND, OANDAND,OARRAY, OAS, OASADD, OASAND, OASASHL,OASASHR,OASDIV, OASHL, OASHR, OASLDIV,OASLMOD,OASLMUL, OASLSHR,OASMOD, OASMUL, OASOR, OASSUB, OASXOR, OBIT, OBREAK, OCASE, OCAST, OCOMMA, OCOND, OCONST, OCONTINUE,ODIV, ODOT, ODOTDOT,ODWHILE,OENUM, OEQ, OFOR, OFUNC, OGE, OGOTO, OGT, OHI, OHS, OIF, OIND, OINDREG,OINIT, OLABEL, OLDIV, OLE, OLIST, OLMOD, OLMUL, OLO, OLS, OLSHR, OLT, OMOD, OMUL, ONAME, ONE, ONOT, OOR, OOROR, OPOSTDEC,OPOSTINC,OPREDEC,OPREINC,OPROTO,OREGISTER,ORETURN,OSET, OSIZE, OSTRING,OLSTRING,OSTRUCT,OSUB, OSWITCH,OUNION, OUSED, OWHILE, OXOR, ONEG, OCOM, OELEM, OEND }; enum { TXXX, TCHAR, TUCHAR, TSHORT, TUSHORT,TLONG, TULONG, TVLONG, TUVLONG,TFLOAT, TDOUBLE,TIND, /* NTYPE* */ TFUNC, TARRAY, TVOID, TSTRUCT,TUNION, TENUM, /* XTYPE */ TFILE, TOLD, TDOT, }; enum { CXXX, CAUTO, CEXTERN,CGLOBL,CSTATIC,CLOCAL,CTYPEDEF,CPARAM, CSELEM, CLABEL, CEXREG, }; enum { GXXX = 0, GCONSTNT = 1<<0, GVOLATILE = 1<<1, }; enum { BXXX = 1L<