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/c2l/cc.h | |
| parent | 46439007cf417cbd9ac8049bb4122c890097a0fa (diff) | |
20060303
Diffstat (limited to 'utils/c2l/cc.h')
| -rw-r--r-- | utils/c2l/cc.h | 849 |
1 files changed, 849 insertions, 0 deletions
diff --git a/utils/c2l/cc.h b/utils/c2l/cc.h new file mode 100644 index 00000000..3900506d --- /dev/null +++ b/utils/c2l/cc.h @@ -0,0 +1,849 @@ +#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 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]; +}; + +EXTERN int lastnumbase; + +#define KNIL 0 +#define KCHR 1 +#define KOCT 2 +#define KDEC 3 +#define KHEX 4 +#define KEXP 5 +#define KDROP 6 +#define KLAST 7 + +struct Node +{ + Node* left; + Node* right; + 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 garb; + char kind; + char blk; +}; +#define Z ((Node*)0) +#define ZZ ((Node*)-1) + +struct Sym +{ + Sym* link; + Type* type; + Type* suetag; + Type* tenum; + char* macro; + long lineno; + long offset; + vlong vconst; + double fconst; + Node* nconst; + char* cstring; + Node* label; + char *name; + char *lname; + char *mod; + ushort lexical; + ushort block; + ushort sueblock; + char class; + char kind; + char lkw; + char args; + char fd; + char limbo; +}; +#define S ((Sym*)0) + +struct Decl +{ + Decl* link; + Sym* sym; + Type* type; + long offset; + long lineno; + short val; + ushort block; + char class; +}; +#define D ((Decl*)0) + +struct Type +{ + Sym* sym; + Sym* tag; + Type* link; + Type* down; + Node* nwidth; + long width; + long offset; + long lineno; + char shift; + char nbits; + char etype; + char garb; + char vis; + char mark; +}; +#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 +{ + ONOOP, + 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, + OELEM, + + OTST, /* used in some compilers */ + OINDEX, + OFAS, + + OBLK, + OPOS, + ONUL, + ODOTIND, + OARRIND, + ODAS, + OASD, + OIOTA, + OLEN, + OBRACKET, + OREF, + OARRAYOF, + OSLICE, + OSADDR, + ONIL, + OS2AB, + OAB2S, + OFILDES, + OFD, + OTUPLE, + OT0, + ORETV, + OCAT, + OSBREAK, + OLDOT, + OMDOT, + + OCODE, + ODECE, + ODECT, + ODECV, + ODECF, + OPUSH, + OPOP, + + 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, + TREGISTER, + TCONSTNT, + TVOLATILE, + TUNSIGNED, + TSIGNED, + TDOT, + TFILE, + TOLD, + + TSTRING, + TFD, + TTUPLE, + + NALLTYPES, +}; +enum +{ + CXXX, + CAUTO, + CEXTERN, + CGLOBL, + CSTATIC, + CLOCAL, + CTYPEDEF, + CPARAM, + CSELEM, + CLABEL, + CEXREG, + NCTYPES, +}; +enum +{ + GXXX = 0, + GCONSTNT = 1<<0, + GVOLATILE = 1<<1, + NGTYPES = 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, + BOLD = 1L<<TOLD, + 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, + 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|BREGISTER, + + BGARB = BCONSTNT|BVOLATILE, +}; + +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 int comm; +EXTERN Decl* dclstack; +EXTERN int doaddr; +EXTERN int doalladdr; +EXTERN int doinc; +EXTERN int doloc; +EXTERN int domod; +EXTERN Hist* ehist; +EXTERN long firstbit; +EXTERN Decl* firstdcl; +EXTERN int fperror; +EXTERN Sym* hash[NHASH]; +EXTERN char* hunk; +EXTERN char* include[20]; +EXTERN Type* fdtype; +EXTERN int inmain; +EXTERN Io* iofree; +EXTERN Io* ionext; +EXTERN Io* iostack; +EXTERN int justcode; +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 int passes; +EXTERN char* pathname; +EXTERN int peekc; +EXTERN Type* pfdtype; +EXTERN long pline; +EXTERN long saveline; +EXTERN Type* strf; +EXTERN int strings; +EXTERN Type* stringtype; +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 Node* initlist; +EXTERN int nterm; +EXTERN int hjdickflg; +EXTERN int fproundflg; +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 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); +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 outbegin(char *); +void outend(void); +void outfun(Node*); +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*); +void 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*, int); +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); +#define round ccround +long round(long, int); +int rsametype(Type*, Type*, int, int); +int sametype(Type*, Type*); +ulong signature(Type*, int); +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*, Type*); +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*); + +/* + * sub.c + */ +void arith(Node*, int); +Type* dotsearch(Sym*, Type*, Node*); +long dotoffset(Type*, Type*, Node*); +void gethunk(void); +Node* invert(Node*); +int bitno(long); +void makedot(Node*, Type*, long); +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* typ1(int, Type*); +void typeext(Type*, Node*); +void typeext1(Type*, Node*); +int side(Node*); +int vconst(Node*); +int vlog(Node*); +int topbit(ulong); +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*); + +/* + * 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 praghjdicks(void); +void pragfpround(void); + +/* + * calls to machine depend part + */ +void codgen(Node*, Node*, int); +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); + +#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 + +/* output routines */ + +void prline(char*); +void prstr(char *); +void prlstr(ushort *); +void prkeywd(char *); +void prid(char *); +void prsym(Sym*, int); +void prsym0(Sym*); +void prdelim(char *); +void prchar(vlong); +void prreal(double, char*, int); +void prnum(vlong, int, Type*); +void prcom(char *, Node*); +void newline(void); +void incind(void); +void decind(void); +int zeroind(void); +void restoreind(int); +void startcom(int); +void addcom(int); +void endcom(void); +int outcom(int); +int arrow(Sym*); + +/* limbo generating routines */ + +void pgen(int); +void epgen(int); +void ttgen(Type*); +void vtgen(Node*); +void etgen(Sym*); +void expgen(Node*); + +/* -m routines */ + +void newsec(int); + +void outpush(char*); +void outpop(int); +void outpush0(char*, Node*); +void outpop0(int); +void outpush2(char*, Node*); +void outpop2(int); +char* outmod(char*, int); + +/* miscellaneous */ + +int iscon(char*); +Node* ncopy(Node*); +void doasenum(Sym*); +Type *maxtype(Type*, Type*); + +void linit(void); +void sysinit(void); + +int ism(void); +int isb(void); +int dolog(void); + +int line(Node*); + +void output(long, int); +void usemod(Sym*, int); +void setmod(Sym*); + +int exists(char*); +int isconsym(Sym *); + +void clbegin(void); +void clend(void); + +int gfltconv(Fmt*); |
