diff options
| author | Charles.Forsyth <devnull@localhost> | 2006-12-22 21:39:35 +0000 |
|---|---|---|
| committer | Charles.Forsyth <devnull@localhost> | 2006-12-22 21:39:35 +0000 |
| commit | 74a4d8c26dd3c1e9febcb717cfd6cb6512991a7a (patch) | |
| tree | c6e220ba61db3a6ea4052e6841296d829654e664 /utils/cc/cc.h | |
| parent | 46439007cf417cbd9ac8049bb4122c890097a0fa (diff) | |
20060303
Diffstat (limited to 'utils/cc/cc.h')
| -rw-r--r-- | utils/cc/cc.h | 768 |
1 files changed, 768 insertions, 0 deletions
diff --git a/utils/cc/cc.h b/utils/cc/cc.h new file mode 100644 index 00000000..d05b4397 --- /dev/null +++ b/utils/cc/cc.h @@ -0,0 +1,768 @@ +#include <lib9.h> +#include <bio.h> +#include <ctype.h> + +#ifndef EXTERN +#define EXTERN extern +#endif + +typedef struct Node Node; +typedef struct Sym Sym; +typedef struct Type Type; +typedef struct Funct Funct; +typedef struct Decl Decl; +typedef struct Io Io; +typedef struct Hist Hist; +typedef struct Term Term; +typedef struct Init Init; +typedef struct Bits Bits; + +#define NHUNK 50000L +#define BUFSIZ 8192 +#define NSYMB 500 +#define NHASH 1024 +#define STRINGSZ 200 +#define HISTSZ 20 +#define YYMAXDEPTH 500 +#define NTERM 10 +#define MAXALIGN 7 + +#define SIGN(n) ((vlong)1<<(n-1)) +#define MASK(n) (SIGN(n)|(SIGN(n)-1)) + +#define BITS 5 +#define NVAR (BITS*sizeof(ulong)*8) +struct Bits +{ + ulong b[BITS]; +}; + +struct Node +{ + Node* left; + Node* right; + void* label; + long pc; + int reg; + long xoffset; + double fconst; /* fp constant */ + vlong vconst; /* non fp const */ + char* cstring; /* character string */ + ushort* rstring; /* rune string */ + + Sym* sym; + Type* type; + long lineno; + char op; + + char oldop; + char xcast; + 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; + vlong vconst; + double fconst; + Node* label; + ushort lexical; + char *name; + ushort block; + ushort sueblock; + char class; + char sym; + char aused; + char sig; +}; +#define S ((Sym*)0) + +enum{ + SIGNONE = 0, + SIGDONE = 1, + SIGINTERN = 2, + + SIGNINTERN = 1729*325*1729, +}; + +struct Decl +{ + Decl* link; + Sym* sym; + Type* type; + long varlineno; + long offset; + short val; + ushort block; + char class; + char aused; +}; +#define D ((Decl*)0) + +struct Type +{ + Sym* sym; + Sym* tag; + Funct* funct; + 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 Init /* general purpose initialization */ +{ + int code; + ulong value; + char* s; +}; + +EXTERN 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) +EXTERN Hist* hist; + +struct Term +{ + vlong mult; + Node *node; +}; + +enum +{ + Axxx, + Ael1, + Ael2, + Asu2, + Aarg0, + Aarg1, + Aarg2, + Aaut3, + NALIGN, +}; + +enum /* also in ../{8a,0a}.h */ +{ + Plan9 = 1<<0, + Unix = 1<<1, + Windows = 1<<2, +}; + +enum +{ + DMARK, + DAUTO, + DSUE, + DLABEL, +}; +enum +{ + OXXX, + OADD, + OADDR, + OAND, + OANDAND, + OARRAY, + OAS, + OASI, + 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, + OSIGN, + OSIZE, + OSTRING, + OLSTRING, + OSTRUCT, + OSUB, + OSWITCH, + OUNION, + OUSED, + OWHILE, + OXOR, + ONEG, + OCOM, + OPOS, + OELEM, + + OTST, /* used in some compilers */ + OINDEX, + OFAS, + OREGPAIR, + + OEND +}; +enum +{ + TXXX, + TCHAR, + TUCHAR, + TSHORT, + TUSHORT, + TINT, + TUINT, + TLONG, + TULONG, + TVLONG, + TUVLONG, + TFLOAT, + TDOUBLE, + TIND, + TFUNC, + TARRAY, + TVOID, + TSTRUCT, + TUNION, + TENUM, + NTYPE, + + TAUTO = NTYPE, + TEXTERN, + TSTATIC, + TTYPEDEF, + TTYPESTR, + TREGISTER, + TCONSTNT, + TVOLATILE, + TUNSIGNED, + TSIGNED, + TDOT, + TFILE, + TOLD, + NALLTYPES, +}; +enum +{ + CXXX, + CAUTO, + CEXTERN, + CGLOBL, + CSTATIC, + CLOCAL, + CTYPEDEF, + CTYPESTR, + CPARAM, + CSELEM, + CLABEL, + CEXREG, + NCTYPES, +}; +enum +{ + GXXX = 0, + GCONSTNT = 1<<0, + GVOLATILE = 1<<1, + NGTYPES = 1<<2, + + GINCOMPLETE = 1<<2, +}; +enum +{ + BCHAR = 1L<<TCHAR, + BUCHAR = 1L<<TUCHAR, + BSHORT = 1L<<TSHORT, + BUSHORT = 1L<<TUSHORT, + BINT = 1L<<TINT, + BUINT = 1L<<TUINT, + BLONG = 1L<<TLONG, + BULONG = 1L<<TULONG, + BVLONG = 1L<<TVLONG, + BUVLONG = 1L<<TUVLONG, + BFLOAT = 1L<<TFLOAT, + BDOUBLE = 1L<<TDOUBLE, + BIND = 1L<<TIND, + BFUNC = 1L<<TFUNC, + BARRAY = 1L<<TARRAY, + BVOID = 1L<<TVOID, + BSTRUCT = 1L<<TSTRUCT, + BUNION = 1L<<TUNION, + BENUM = 1L<<TENUM, + BFILE = 1L<<TFILE, + BDOT = 1L<<TDOT, + BCONSTNT = 1L<<TCONSTNT, + BVOLATILE = 1L<<TVOLATILE, + BUNSIGNED = 1L<<TUNSIGNED, + BSIGNED = 1L<<TSIGNED, + BAUTO = 1L<<TAUTO, + BEXTERN = 1L<<TEXTERN, + BSTATIC = 1L<<TSTATIC, + BTYPEDEF = 1L<<TTYPEDEF, + BTYPESTR = 1L<<TTYPESTR, + BREGISTER = 1L<<TREGISTER, + + BINTEGER = BCHAR|BUCHAR|BSHORT|BUSHORT|BINT|BUINT| + BLONG|BULONG|BVLONG|BUVLONG, + BNUMBER = BINTEGER|BFLOAT|BDOUBLE, + +/* these can be overloaded with complex types */ + + BCLASS = BAUTO|BEXTERN|BSTATIC|BTYPEDEF|BTYPESTR|BREGISTER, + BGARB = BCONSTNT|BVOLATILE, +}; + +struct Funct +{ + Sym* sym[OEND]; + Sym* castto[NTYPE]; + Sym* castfr[NTYPE]; +}; + +EXTERN struct +{ + Type* tenum; /* type of entire enum */ + Type* cenum; /* type of current enum run */ + vlong lastenum; /* value of current enum */ + double floatenum; /* value of current enum */ +} en; + +EXTERN int autobn; +EXTERN long autoffset; +EXTERN int blockno; +EXTERN Decl* dclstack; +EXTERN char debug[256]; +EXTERN Hist* ehist; +EXTERN long firstbit; +EXTERN Sym* firstarg; +EXTERN Type* firstargtype; +EXTERN Decl* firstdcl; +EXTERN int fperror; +EXTERN Sym* hash[NHASH]; +EXTERN char* hunk; +EXTERN char* include[20]; +EXTERN Io* iofree; +EXTERN Io* ionext; +EXTERN Io* iostack; +EXTERN long lastbit; +EXTERN char lastclass; +EXTERN Type* lastdcl; +EXTERN long lastfield; +EXTERN Type* lasttype; +EXTERN long lineno; +EXTERN long nearln; +EXTERN int nerrors; +EXTERN int newflag; +EXTERN long nhunk; +EXTERN int ninclude; +EXTERN Node* nodproto; +EXTERN Node* nodcast; +EXTERN Biobuf outbuf; +EXTERN Biobuf diagbuf; +EXTERN char* outfile; +EXTERN char* pathname; +EXTERN int peekc; +EXTERN long stkoff; +EXTERN Type* strf; +EXTERN Type* strl; +EXTERN char symb[NSYMB]; +EXTERN Sym* symstring; +EXTERN int taggen; +EXTERN Type* tfield; +EXTERN Type* tufield; +EXTERN int thechar; +EXTERN char* thestring; +EXTERN Type* thisfn; +EXTERN long thunk; +EXTERN Type* types[NTYPE]; +EXTERN Type* fntypes[NTYPE]; +EXTERN Node* initlist; +EXTERN Term term[NTERM]; +EXTERN int nterm; +EXTERN int packflg; +EXTERN int fproundflg; +EXTERN int profileflg; +EXTERN Bits zbits; + +extern char *onames[], *tnames[], *gnames[]; +extern char *cnames[], *qnames[], *bnames[]; +extern char tab[NTYPE][NTYPE]; +extern char comrel[], invrel[], logrel[]; +extern long ncast[], tadd[], tand[]; +extern long targ[], tasadd[], tasign[], tcast[]; +extern long tdot[], tfunct[], tindir[], tmul[]; +extern long tnot[], trel[], tsub[]; + +extern char typeaf[]; +extern char typefd[]; +extern char typei[]; +extern char typesu[]; +extern char typesuv[]; +extern char typeu[]; +extern char typev[]; +extern char typec[]; +extern char typeh[]; +extern char typeil[]; +extern char typeilp[]; +extern char typechl[]; +extern char typechlv[]; +extern char typechlvp[]; +extern char typechlp[]; +extern char typechlpfd[]; + +extern ulong thash1; +extern ulong thash2; +extern ulong thash3; +extern ulong thash[]; + +/* + * Inferno.c/Posix.c/Nt.c + */ +int mywait(int*); +int mycreat(char*, int); +int systemtype(int); +int pathchar(void); +int myaccess(char*); +char* mygetwd(char*, int); +int myexec(char*, char*[]); +int mydup(int, int); +int myfork(void); +int mypipe(int*); +void* mysbrk(ulong); + +/* + * parser + */ +int yyparse(void); +int mpatof(char*, double*); +int mpatov(char*, vlong*); + +/* + * lex.c + */ +void* allocn(void*, long, long); +void* alloc(long); +void cinit(void); +int compile(char*, char**, int); +void errorexit(void); +int filbuf(void); +int getc(void); +long getr(void); +int getnsc(void); +Sym* lookup(void); +void main(int, char*[]); +void newfile(char*, int); +void newio(void); +void pushio(void); +long escchar(long, int, int); +Sym* slookup(char*); +void syminit(Sym*); +void unget(int); +long yylex(void); +int Lconv(Fmt*); +int Tconv(Fmt*); +int FNconv(Fmt*); +int Oconv(Fmt*); +int Qconv(Fmt*); +int VBconv(Fmt*); +void setinclude(char*); + +/* + * mac.c + */ +void dodefine(char*); +void domacro(void); +Sym* getsym(void); +long getnsn(void); +void linehist(char*, int); +void macdef(void); +void macprag(void); +void macend(void); +void macexpand(Sym*, char*); +void macif(int); +void macinc(void); +void maclin(void); +void macund(void); + +/* + * dcl.c + */ +Node* doinit(Sym*, Type*, long, Node*); +Type* tcopy(Type*); +Node* init1(Sym*, Type*, long, int); +Node* newlist(Node*, Node*); +void adecl(int, Type*, Sym*); +int anyproto(Node*); +void argmark(Node*, int); +void dbgdecl(Sym*); +Node* dcllabel(Sym*, int); +Node* dodecl(void(*)(int, Type*, Sym*), int, Type*, Node*); +Sym* mkstatic(Sym*); +void doenum(Sym*, Node*); +void snap(Type*); +Type* dotag(Sym*, int, int); +void edecl(int, Type*, Sym*); +Type* fnproto(Node*); +Type* fnproto1(Node*); +void markdcl(void); +Type* paramconv(Type*, int); +void pdecl(int, Type*, Sym*); +Decl* push(void); +Decl* push1(Sym*); +Node* revertdcl(void); +#undef round +#define round ccround +#undef log2 +#define log2 cclog2 +long round(long, int); +int rsametype(Type*, Type*, int, int); +int sametype(Type*, Type*); +ulong sign(Sym*); +ulong signature(Type*); +void suallign(Type*); +void tmerge(Type*, Sym*); +void walkparam(Node*, int); +void xdecl(int, Type*, Sym*); +Node* contig(Sym*, Node*, long); + +/* + * com.c + */ +void ccom(Node*); +void complex(Node*); +int tcom(Node*); +int tcoma(Node*, Node*, Type*, int); +int tcomd(Node*); +int tcomo(Node*, int); +int tcomx(Node*); +int tlvalue(Node*); +void constas(Node*, Type*, Type*); + +/* + * con.c + */ +void acom(Node*); +void acom1(vlong, Node*); +void acom2(Node*, Type*); +int acomcmp1(const void*, const void*); +int acomcmp2(const void*, const void*); +int addo(Node*); +void evconst(Node*); + +/* + * funct.c + */ +int isfunct(Node*); +void dclfunct(Type*, Sym*); + +/* + * sub.c + */ +void arith(Node*, int); +int deadheads(Node*); +Type* dotsearch(Sym*, Type*, Node*, long*); +long dotoffset(Type*, Type*, Node*); +void gethunk(void); +Node* invert(Node*); +int bitno(long); +void makedot(Node*, Type*, long); +int mixedasop(Type*, Type*); +Node* new(int, Node*, Node*); +Node* new1(int, Node*, Node*); +int nilcast(Type*, Type*); +int nocast(Type*, Type*); +void prtree(Node*, char*); +void prtree1(Node*, int, int); +void relcon(Node*, Node*); +int relindex(int); +int simpleg(long); +Type* garbt(Type*, long); +int simplec(long); +Type* simplet(long); +int stcompat(Node*, Type*, Type*, long[]); +int tcompat(Node*, Type*, Type*, long[]); +void tinit(void); +Type* typ(int, Type*); +Type* copytyp(Type*); +void typeext(Type*, Node*); +void typeext1(Type*, Node*); +int side(Node*); +int vconst(Node*); +int log2(uvlong); +int vlog(Node*); +int topbit(ulong); +void simplifyshift(Node*); +long typebitor(long, long); +void diag(Node*, char*, ...); +void warn(Node*, char*, ...); +void yyerror(char*, ...); +void fatal(Node*, char*, ...); + +/* + * acid.c + */ +void acidtype(Type*); +void acidvar(Sym*); + +/* + * pickle.c + */ +void pickletype(Type*); + +/* + * bits.c + */ +Bits bor(Bits, Bits); +Bits band(Bits, Bits); +Bits bnot(Bits); +int bany(Bits*); +int bnum(Bits); +Bits blsh(uint); +int beq(Bits, Bits); +int bset(Bits, uint); + +/* + * dpchk.c + */ +void dpcheck(Node*); +void arginit(void); +void pragvararg(void); +void pragpack(void); +void pragfpround(void); +void pragprofile(void); +void pragincomplete(void); + +/* + * calls to machine depend part + */ +void codgen(Node*, Node*); +void gclean(void); +void gextern(Sym*, Node*, long, long); +void ginit(void); +long outstring(char*, long); +long outlstring(ushort*, long); +void sextern(Sym*, Node*, long, long); +void xcom(Node*); +long exreg(Type*); +long align(long, Type*, int); +long maxround(long, long); + +extern schar ewidth[]; + +/* + * com64 + */ +int com64(Node*); +void com64init(void); +void bool64(Node*); +double convvtof(vlong); +vlong convftov(double); +double convftox(double, int); +vlong convvtox(vlong, int); + +/* + * machcap + */ +int machcap(Node*); + +#pragma varargck argpos warn 2 +#pragma varargck argpos diag 2 +#pragma varargck argpos yyerror 1 + +#pragma varargck type "F" Node* +#pragma varargck type "L" long +#pragma varargck type "Q" long +#pragma varargck type "O" int +#pragma varargck type "T" Type* +#pragma varargck type "|" int |
