13e12c5d1SDavid du Colombier #include <u.h> 23e12c5d1SDavid du Colombier #include <libc.h> 3219b2ee8SDavid du Colombier #include <bio.h> 43e12c5d1SDavid du Colombier #include <ctype.h> 53e12c5d1SDavid du Colombier 63e12c5d1SDavid du Colombier #pragma lib "../cc/cc.a$O" 73e12c5d1SDavid du Colombier 87dd7cddfSDavid du Colombier #ifndef EXTERN 97dd7cddfSDavid du Colombier #define EXTERN extern 107dd7cddfSDavid du Colombier #endif 117dd7cddfSDavid du Colombier 123e12c5d1SDavid du Colombier typedef struct Node Node; 133e12c5d1SDavid du Colombier typedef struct Sym Sym; 143e12c5d1SDavid du Colombier typedef struct Type Type; 1580ee5cbfSDavid du Colombier typedef struct Funct Funct; 163e12c5d1SDavid du Colombier typedef struct Decl Decl; 173e12c5d1SDavid du Colombier typedef struct Io Io; 183e12c5d1SDavid du Colombier typedef struct Hist Hist; 19219b2ee8SDavid du Colombier typedef struct Term Term; 207dd7cddfSDavid du Colombier typedef struct Init Init; 217dd7cddfSDavid du Colombier typedef struct Bits Bits; 223e12c5d1SDavid du Colombier 233e12c5d1SDavid du Colombier #define NHUNK 50000L 243e12c5d1SDavid du Colombier #define BUFSIZ 8192 253e12c5d1SDavid du Colombier #define NSYMB 500 263e12c5d1SDavid du Colombier #define NHASH 1024 273e12c5d1SDavid du Colombier #define STRINGSZ 200 283e12c5d1SDavid du Colombier #define HISTSZ 20 293e12c5d1SDavid du Colombier #define YYMAXDEPTH 500 30219b2ee8SDavid du Colombier #define NTERM 10 317dd7cddfSDavid du Colombier #define MAXALIGN 7 32219b2ee8SDavid du Colombier 337dd7cddfSDavid du Colombier #define SIGN(n) ((vlong)1<<(n-1)) 34219b2ee8SDavid du Colombier #define MASK(n) (SIGN(n)|(SIGN(n)-1)) 353e12c5d1SDavid du Colombier 367dd7cddfSDavid du Colombier #define BITS 5 377dd7cddfSDavid du Colombier #define NVAR (BITS*sizeof(ulong)*8) 387dd7cddfSDavid du Colombier struct Bits 397dd7cddfSDavid du Colombier { 407dd7cddfSDavid du Colombier ulong b[BITS]; 417dd7cddfSDavid du Colombier }; 423e12c5d1SDavid du Colombier 433e12c5d1SDavid du Colombier struct Node 443e12c5d1SDavid du Colombier { 453e12c5d1SDavid du Colombier Node* left; 463e12c5d1SDavid du Colombier Node* right; 47219b2ee8SDavid du Colombier void* label; 48219b2ee8SDavid du Colombier long pc; 49219b2ee8SDavid du Colombier int reg; 50219b2ee8SDavid du Colombier long xoffset; 51219b2ee8SDavid du Colombier double fconst; /* fp constant */ 52219b2ee8SDavid du Colombier vlong vconst; /* non fp const */ 53219b2ee8SDavid du Colombier char* cstring; /* character string */ 54219b2ee8SDavid du Colombier ushort* rstring; /* rune string */ 557dd7cddfSDavid du Colombier 563e12c5d1SDavid du Colombier Sym* sym; 573e12c5d1SDavid du Colombier Type* type; 583e12c5d1SDavid du Colombier long lineno; 593e12c5d1SDavid du Colombier char op; 6022a127bbSDavid du Colombier char oldop; 6122a127bbSDavid du Colombier char xcast; 623e12c5d1SDavid du Colombier char class; 633e12c5d1SDavid du Colombier char etype; 643e12c5d1SDavid du Colombier char complex; 653e12c5d1SDavid du Colombier char addable; 663e12c5d1SDavid du Colombier char scale; 677dd7cddfSDavid du Colombier char garb; 683e12c5d1SDavid du Colombier }; 693e12c5d1SDavid du Colombier #define Z ((Node*)0) 703e12c5d1SDavid du Colombier 713e12c5d1SDavid du Colombier struct Sym 723e12c5d1SDavid du Colombier { 733e12c5d1SDavid du Colombier Sym* link; 743e12c5d1SDavid du Colombier Type* type; 753e12c5d1SDavid du Colombier Type* suetag; 76219b2ee8SDavid du Colombier Type* tenum; 773e12c5d1SDavid du Colombier char* macro; 783e12c5d1SDavid du Colombier long varlineno; 793e12c5d1SDavid du Colombier long offset; 80219b2ee8SDavid du Colombier vlong vconst; 81219b2ee8SDavid du Colombier double fconst; 823e12c5d1SDavid du Colombier Node* label; 833e12c5d1SDavid du Colombier ushort lexical; 84219b2ee8SDavid du Colombier char *name; 859a747e4fSDavid du Colombier ushort block; 869a747e4fSDavid du Colombier ushort sueblock; 873e12c5d1SDavid du Colombier char class; 883e12c5d1SDavid du Colombier char sym; 893e12c5d1SDavid du Colombier char aused; 90375daca8SDavid du Colombier char sig; 913e12c5d1SDavid du Colombier }; 923e12c5d1SDavid du Colombier #define S ((Sym*)0) 933e12c5d1SDavid du Colombier 94375daca8SDavid du Colombier enum{ 95375daca8SDavid du Colombier SIGNONE = 0, 96375daca8SDavid du Colombier SIGDONE = 1, 97375daca8SDavid du Colombier SIGINTERN = 2, 98375daca8SDavid du Colombier 99375daca8SDavid du Colombier SIGNINTERN = 1729*325*1729, 100375daca8SDavid du Colombier }; 101375daca8SDavid du Colombier 1023e12c5d1SDavid du Colombier struct Decl 1033e12c5d1SDavid du Colombier { 1043e12c5d1SDavid du Colombier Decl* link; 1053e12c5d1SDavid du Colombier Sym* sym; 1063e12c5d1SDavid du Colombier Type* type; 1073e12c5d1SDavid du Colombier long varlineno; 1083e12c5d1SDavid du Colombier long offset; 1093e12c5d1SDavid du Colombier short val; 1109a747e4fSDavid du Colombier ushort block; 1113e12c5d1SDavid du Colombier char class; 1123e12c5d1SDavid du Colombier char aused; 1133e12c5d1SDavid du Colombier }; 1143e12c5d1SDavid du Colombier #define D ((Decl*)0) 1153e12c5d1SDavid du Colombier 1163e12c5d1SDavid du Colombier struct Type 1173e12c5d1SDavid du Colombier { 1183e12c5d1SDavid du Colombier Sym* sym; 1193e12c5d1SDavid du Colombier Sym* tag; 12080ee5cbfSDavid du Colombier Funct* funct; 1213e12c5d1SDavid du Colombier Type* link; 1223e12c5d1SDavid du Colombier Type* down; 1233e12c5d1SDavid du Colombier long width; 1243e12c5d1SDavid du Colombier long offset; 1253e12c5d1SDavid du Colombier long lineno; 1263e12c5d1SDavid du Colombier char shift; 1273e12c5d1SDavid du Colombier char nbits; 1283e12c5d1SDavid du Colombier char etype; 1297dd7cddfSDavid du Colombier char garb; 1303e12c5d1SDavid du Colombier }; 13180ee5cbfSDavid du Colombier 1323e12c5d1SDavid du Colombier #define T ((Type*)0) 1333e12c5d1SDavid du Colombier #define NODECL ((void(*)(int, Type*, Sym*))0) 1343e12c5d1SDavid du Colombier 1357dd7cddfSDavid du Colombier struct Init /* general purpose initialization */ 1367dd7cddfSDavid du Colombier { 1377dd7cddfSDavid du Colombier int code; 1387dd7cddfSDavid du Colombier ulong value; 1397dd7cddfSDavid du Colombier char* s; 1407dd7cddfSDavid du Colombier }; 1417dd7cddfSDavid du Colombier 1427dd7cddfSDavid du Colombier EXTERN struct 1433e12c5d1SDavid du Colombier { 1443e12c5d1SDavid du Colombier char* p; 1453e12c5d1SDavid du Colombier int c; 1463e12c5d1SDavid du Colombier } fi; 1473e12c5d1SDavid du Colombier 1483e12c5d1SDavid du Colombier struct Io 1493e12c5d1SDavid du Colombier { 1503e12c5d1SDavid du Colombier Io* link; 1513e12c5d1SDavid du Colombier char* p; 1523e12c5d1SDavid du Colombier char b[BUFSIZ]; 1533e12c5d1SDavid du Colombier short c; 1543e12c5d1SDavid du Colombier short f; 1553e12c5d1SDavid du Colombier }; 1563e12c5d1SDavid du Colombier #define I ((Io*)0) 1573e12c5d1SDavid du Colombier 1583e12c5d1SDavid du Colombier struct Hist 1593e12c5d1SDavid du Colombier { 1603e12c5d1SDavid du Colombier Hist* link; 1613e12c5d1SDavid du Colombier char* name; 1623e12c5d1SDavid du Colombier long line; 1633e12c5d1SDavid du Colombier long offset; 1643e12c5d1SDavid du Colombier }; 1653e12c5d1SDavid du Colombier #define H ((Hist*)0) 1667dd7cddfSDavid du Colombier EXTERN Hist* hist; 1673e12c5d1SDavid du Colombier 168219b2ee8SDavid du Colombier struct Term 169219b2ee8SDavid du Colombier { 170219b2ee8SDavid du Colombier vlong mult; 171219b2ee8SDavid du Colombier Node *node; 172219b2ee8SDavid du Colombier }; 173219b2ee8SDavid du Colombier 1743e12c5d1SDavid du Colombier enum 1753e12c5d1SDavid du Colombier { 1767dd7cddfSDavid du Colombier Axxx, 1777dd7cddfSDavid du Colombier Ael1, 1787dd7cddfSDavid du Colombier Ael2, 1797dd7cddfSDavid du Colombier Asu2, 1807dd7cddfSDavid du Colombier Aarg0, 1817dd7cddfSDavid du Colombier Aarg1, 1827dd7cddfSDavid du Colombier Aarg2, 1837dd7cddfSDavid du Colombier Aaut3, 1847dd7cddfSDavid du Colombier NALIGN, 1857dd7cddfSDavid du Colombier }; 1867dd7cddfSDavid du Colombier 1877dd7cddfSDavid du Colombier enum /* also in ../{8a,0a}.h */ 1887dd7cddfSDavid du Colombier { 1897dd7cddfSDavid du Colombier Plan9 = 1<<0, 1907dd7cddfSDavid du Colombier Unix = 1<<1, 1917dd7cddfSDavid du Colombier Windows = 1<<2, 1927dd7cddfSDavid du Colombier }; 1937dd7cddfSDavid du Colombier 1947dd7cddfSDavid du Colombier enum 1957dd7cddfSDavid du Colombier { 1963e12c5d1SDavid du Colombier DMARK, 1973e12c5d1SDavid du Colombier DAUTO, 1983e12c5d1SDavid du Colombier DSUE, 1993e12c5d1SDavid du Colombier DLABEL, 2003e12c5d1SDavid du Colombier }; 2013e12c5d1SDavid du Colombier enum 2023e12c5d1SDavid du Colombier { 2033e12c5d1SDavid du Colombier OXXX, 2047dd7cddfSDavid du Colombier OADD, 2057dd7cddfSDavid du Colombier OADDR, 2067dd7cddfSDavid du Colombier OAND, 2077dd7cddfSDavid du Colombier OANDAND, 2087dd7cddfSDavid du Colombier OARRAY, 2097dd7cddfSDavid du Colombier OAS, 2107dd7cddfSDavid du Colombier OASI, 2117dd7cddfSDavid du Colombier OASADD, 2127dd7cddfSDavid du Colombier OASAND, 2137dd7cddfSDavid du Colombier OASASHL, 2147dd7cddfSDavid du Colombier OASASHR, 2157dd7cddfSDavid du Colombier OASDIV, 2167dd7cddfSDavid du Colombier OASHL, 2177dd7cddfSDavid du Colombier OASHR, 2187dd7cddfSDavid du Colombier OASLDIV, 2197dd7cddfSDavid du Colombier OASLMOD, 2207dd7cddfSDavid du Colombier OASLMUL, 2217dd7cddfSDavid du Colombier OASLSHR, 2227dd7cddfSDavid du Colombier OASMOD, 2237dd7cddfSDavid du Colombier OASMUL, 2247dd7cddfSDavid du Colombier OASOR, 2257dd7cddfSDavid du Colombier OASSUB, 2267dd7cddfSDavid du Colombier OASXOR, 2277dd7cddfSDavid du Colombier OBIT, 2287dd7cddfSDavid du Colombier OBREAK, 2297dd7cddfSDavid du Colombier OCASE, 2307dd7cddfSDavid du Colombier OCAST, 2317dd7cddfSDavid du Colombier OCOMMA, 2327dd7cddfSDavid du Colombier OCOND, 2337dd7cddfSDavid du Colombier OCONST, 2347dd7cddfSDavid du Colombier OCONTINUE, 2357dd7cddfSDavid du Colombier ODIV, 2367dd7cddfSDavid du Colombier ODOT, 2377dd7cddfSDavid du Colombier ODOTDOT, 2387dd7cddfSDavid du Colombier ODWHILE, 2397dd7cddfSDavid du Colombier OENUM, 2407dd7cddfSDavid du Colombier OEQ, 2417dd7cddfSDavid du Colombier OFOR, 2427dd7cddfSDavid du Colombier OFUNC, 2437dd7cddfSDavid du Colombier OGE, 2447dd7cddfSDavid du Colombier OGOTO, 2457dd7cddfSDavid du Colombier OGT, 2467dd7cddfSDavid du Colombier OHI, 2477dd7cddfSDavid du Colombier OHS, 2487dd7cddfSDavid du Colombier OIF, 2497dd7cddfSDavid du Colombier OIND, 2507dd7cddfSDavid du Colombier OINDREG, 2517dd7cddfSDavid du Colombier OINIT, 2527dd7cddfSDavid du Colombier OLABEL, 2537dd7cddfSDavid du Colombier OLDIV, 2547dd7cddfSDavid du Colombier OLE, 2557dd7cddfSDavid du Colombier OLIST, 2567dd7cddfSDavid du Colombier OLMOD, 2577dd7cddfSDavid du Colombier OLMUL, 2587dd7cddfSDavid du Colombier OLO, 2597dd7cddfSDavid du Colombier OLS, 2607dd7cddfSDavid du Colombier OLSHR, 2617dd7cddfSDavid du Colombier OLT, 2627dd7cddfSDavid du Colombier OMOD, 2637dd7cddfSDavid du Colombier OMUL, 2647dd7cddfSDavid du Colombier ONAME, 2657dd7cddfSDavid du Colombier ONE, 2667dd7cddfSDavid du Colombier ONOT, 2677dd7cddfSDavid du Colombier OOR, 2687dd7cddfSDavid du Colombier OOROR, 2697dd7cddfSDavid du Colombier OPOSTDEC, 2707dd7cddfSDavid du Colombier OPOSTINC, 2717dd7cddfSDavid du Colombier OPREDEC, 2727dd7cddfSDavid du Colombier OPREINC, 2737dd7cddfSDavid du Colombier OPROTO, 2747dd7cddfSDavid du Colombier OREGISTER, 2757dd7cddfSDavid du Colombier ORETURN, 2767dd7cddfSDavid du Colombier OSET, 2777dd7cddfSDavid du Colombier OSIGN, 2787dd7cddfSDavid du Colombier OSIZE, 2797dd7cddfSDavid du Colombier OSTRING, 2807dd7cddfSDavid du Colombier OLSTRING, 2817dd7cddfSDavid du Colombier OSTRUCT, 2827dd7cddfSDavid du Colombier OSUB, 2837dd7cddfSDavid du Colombier OSWITCH, 2847dd7cddfSDavid du Colombier OUNION, 2857dd7cddfSDavid du Colombier OUSED, 2867dd7cddfSDavid du Colombier OWHILE, 2877dd7cddfSDavid du Colombier OXOR, 2887dd7cddfSDavid du Colombier ONEG, 2897dd7cddfSDavid du Colombier OCOM, 29080ee5cbfSDavid du Colombier OPOS, 2917dd7cddfSDavid du Colombier OELEM, 2927dd7cddfSDavid du Colombier 2937dd7cddfSDavid du Colombier OTST, /* used in some compilers */ 2947dd7cddfSDavid du Colombier OINDEX, 2957dd7cddfSDavid du Colombier OFAS, 296da51d93aSDavid du Colombier OREGPAIR, 2977dd7cddfSDavid du Colombier 2987dd7cddfSDavid du Colombier OEND 2993e12c5d1SDavid du Colombier }; 3003e12c5d1SDavid du Colombier enum 3013e12c5d1SDavid du Colombier { 3023e12c5d1SDavid du Colombier TXXX, 3037dd7cddfSDavid du Colombier TCHAR, 3047dd7cddfSDavid du Colombier TUCHAR, 3057dd7cddfSDavid du Colombier TSHORT, 3067dd7cddfSDavid du Colombier TUSHORT, 3077dd7cddfSDavid du Colombier TINT, 3087dd7cddfSDavid du Colombier TUINT, 3097dd7cddfSDavid du Colombier TLONG, 3107dd7cddfSDavid du Colombier TULONG, 3117dd7cddfSDavid du Colombier TVLONG, 3127dd7cddfSDavid du Colombier TUVLONG, 3137dd7cddfSDavid du Colombier TFLOAT, 3147dd7cddfSDavid du Colombier TDOUBLE, 3157dd7cddfSDavid du Colombier TIND, 3167dd7cddfSDavid du Colombier TFUNC, 3177dd7cddfSDavid du Colombier TARRAY, 3187dd7cddfSDavid du Colombier TVOID, 3197dd7cddfSDavid du Colombier TSTRUCT, 3207dd7cddfSDavid du Colombier TUNION, 3217dd7cddfSDavid du Colombier TENUM, 3227dd7cddfSDavid du Colombier NTYPE, 3237dd7cddfSDavid du Colombier 3247dd7cddfSDavid du Colombier TAUTO = NTYPE, 3257dd7cddfSDavid du Colombier TEXTERN, 3267dd7cddfSDavid du Colombier TSTATIC, 3277dd7cddfSDavid du Colombier TTYPEDEF, 32880ee5cbfSDavid du Colombier TTYPESTR, 3297dd7cddfSDavid du Colombier TREGISTER, 3307dd7cddfSDavid du Colombier TCONSTNT, 3317dd7cddfSDavid du Colombier TVOLATILE, 3327dd7cddfSDavid du Colombier TUNSIGNED, 3337dd7cddfSDavid du Colombier TSIGNED, 3347dd7cddfSDavid du Colombier TDOT, 3357dd7cddfSDavid du Colombier TFILE, 3367dd7cddfSDavid du Colombier TOLD, 3377dd7cddfSDavid du Colombier NALLTYPES, 3383e12c5d1SDavid du Colombier }; 3393e12c5d1SDavid du Colombier enum 3403e12c5d1SDavid du Colombier { 3413e12c5d1SDavid du Colombier CXXX, 3427dd7cddfSDavid du Colombier CAUTO, 3437dd7cddfSDavid du Colombier CEXTERN, 3447dd7cddfSDavid du Colombier CGLOBL, 3457dd7cddfSDavid du Colombier CSTATIC, 3467dd7cddfSDavid du Colombier CLOCAL, 3477dd7cddfSDavid du Colombier CTYPEDEF, 34880ee5cbfSDavid du Colombier CTYPESTR, 3497dd7cddfSDavid du Colombier CPARAM, 3507dd7cddfSDavid du Colombier CSELEM, 3517dd7cddfSDavid du Colombier CLABEL, 3527dd7cddfSDavid du Colombier CEXREG, 3537dd7cddfSDavid du Colombier NCTYPES, 3543e12c5d1SDavid du Colombier }; 3553e12c5d1SDavid du Colombier enum 3563e12c5d1SDavid du Colombier { 3577dd7cddfSDavid du Colombier GXXX = 0, 3587dd7cddfSDavid du Colombier GCONSTNT = 1<<0, 3597dd7cddfSDavid du Colombier GVOLATILE = 1<<1, 3607dd7cddfSDavid du Colombier NGTYPES = 1<<2, 361375daca8SDavid du Colombier 362375daca8SDavid du Colombier GINCOMPLETE = 1<<2, 3637dd7cddfSDavid du Colombier }; 3647dd7cddfSDavid du Colombier enum 3657dd7cddfSDavid du Colombier { 3663e12c5d1SDavid du Colombier BCHAR = 1L<<TCHAR, 3673e12c5d1SDavid du Colombier BUCHAR = 1L<<TUCHAR, 3683e12c5d1SDavid du Colombier BSHORT = 1L<<TSHORT, 3693e12c5d1SDavid du Colombier BUSHORT = 1L<<TUSHORT, 3707dd7cddfSDavid du Colombier BINT = 1L<<TINT, 3717dd7cddfSDavid du Colombier BUINT = 1L<<TUINT, 3723e12c5d1SDavid du Colombier BLONG = 1L<<TLONG, 3733e12c5d1SDavid du Colombier BULONG = 1L<<TULONG, 3743e12c5d1SDavid du Colombier BVLONG = 1L<<TVLONG, 375219b2ee8SDavid du Colombier BUVLONG = 1L<<TUVLONG, 3763e12c5d1SDavid du Colombier BFLOAT = 1L<<TFLOAT, 3773e12c5d1SDavid du Colombier BDOUBLE = 1L<<TDOUBLE, 3783e12c5d1SDavid du Colombier BIND = 1L<<TIND, 3797dd7cddfSDavid du Colombier BFUNC = 1L<<TFUNC, 3807dd7cddfSDavid du Colombier BARRAY = 1L<<TARRAY, 3813e12c5d1SDavid du Colombier BVOID = 1L<<TVOID, 3823e12c5d1SDavid du Colombier BSTRUCT = 1L<<TSTRUCT, 3833e12c5d1SDavid du Colombier BUNION = 1L<<TUNION, 3847dd7cddfSDavid du Colombier BENUM = 1L<<TENUM, 3857dd7cddfSDavid du Colombier BFILE = 1L<<TFILE, 3867dd7cddfSDavid du Colombier BDOT = 1L<<TDOT, 3877dd7cddfSDavid du Colombier BCONSTNT = 1L<<TCONSTNT, 3887dd7cddfSDavid du Colombier BVOLATILE = 1L<<TVOLATILE, 3897dd7cddfSDavid du Colombier BUNSIGNED = 1L<<TUNSIGNED, 3907dd7cddfSDavid du Colombier BSIGNED = 1L<<TSIGNED, 3917dd7cddfSDavid du Colombier BAUTO = 1L<<TAUTO, 3927dd7cddfSDavid du Colombier BEXTERN = 1L<<TEXTERN, 3937dd7cddfSDavid du Colombier BSTATIC = 1L<<TSTATIC, 3947dd7cddfSDavid du Colombier BTYPEDEF = 1L<<TTYPEDEF, 39580ee5cbfSDavid du Colombier BTYPESTR = 1L<<TTYPESTR, 3967dd7cddfSDavid du Colombier BREGISTER = 1L<<TREGISTER, 3973e12c5d1SDavid du Colombier 3987dd7cddfSDavid du Colombier BINTEGER = BCHAR|BUCHAR|BSHORT|BUSHORT|BINT|BUINT| 3997dd7cddfSDavid du Colombier BLONG|BULONG|BVLONG|BUVLONG, 4003e12c5d1SDavid du Colombier BNUMBER = BINTEGER|BFLOAT|BDOUBLE, 4013e12c5d1SDavid du Colombier 4023e12c5d1SDavid du Colombier /* these can be overloaded with complex types */ 4033e12c5d1SDavid du Colombier 40480ee5cbfSDavid du Colombier BCLASS = BAUTO|BEXTERN|BSTATIC|BTYPEDEF|BTYPESTR|BREGISTER, 4057dd7cddfSDavid du Colombier BGARB = BCONSTNT|BVOLATILE, 4063e12c5d1SDavid du Colombier }; 4073e12c5d1SDavid du Colombier 40880ee5cbfSDavid du Colombier struct Funct 40980ee5cbfSDavid du Colombier { 41080ee5cbfSDavid du Colombier Sym* sym[OEND]; 41180ee5cbfSDavid du Colombier Sym* castto[NTYPE]; 41280ee5cbfSDavid du Colombier Sym* castfr[NTYPE]; 41380ee5cbfSDavid du Colombier }; 41480ee5cbfSDavid du Colombier 4157dd7cddfSDavid du Colombier EXTERN struct 416219b2ee8SDavid du Colombier { 417219b2ee8SDavid du Colombier Type* tenum; /* type of entire enum */ 418219b2ee8SDavid du Colombier Type* cenum; /* type of current enum run */ 419219b2ee8SDavid du Colombier vlong lastenum; /* value of current enum */ 420219b2ee8SDavid du Colombier double floatenum; /* value of current enum */ 421219b2ee8SDavid du Colombier } en; 4223e12c5d1SDavid du Colombier 4237dd7cddfSDavid du Colombier EXTERN int autobn; 4247dd7cddfSDavid du Colombier EXTERN long autoffset; 4257dd7cddfSDavid du Colombier EXTERN int blockno; 4267dd7cddfSDavid du Colombier EXTERN Decl* dclstack; 4277dd7cddfSDavid du Colombier EXTERN char debug[256]; 4287dd7cddfSDavid du Colombier EXTERN Hist* ehist; 4297dd7cddfSDavid du Colombier EXTERN long firstbit; 4307dd7cddfSDavid du Colombier EXTERN Sym* firstarg; 4317dd7cddfSDavid du Colombier EXTERN Type* firstargtype; 4327dd7cddfSDavid du Colombier EXTERN Decl* firstdcl; 4337dd7cddfSDavid du Colombier EXTERN int fperror; 4347dd7cddfSDavid du Colombier EXTERN Sym* hash[NHASH]; 4357dd7cddfSDavid du Colombier EXTERN char* hunk; 4367dd7cddfSDavid du Colombier EXTERN char* include[20]; 4377dd7cddfSDavid du Colombier EXTERN Io* iofree; 4387dd7cddfSDavid du Colombier EXTERN Io* ionext; 4397dd7cddfSDavid du Colombier EXTERN Io* iostack; 4407dd7cddfSDavid du Colombier EXTERN long lastbit; 4417dd7cddfSDavid du Colombier EXTERN char lastclass; 4427dd7cddfSDavid du Colombier EXTERN Type* lastdcl; 4437dd7cddfSDavid du Colombier EXTERN long lastfield; 4447dd7cddfSDavid du Colombier EXTERN Type* lasttype; 4457dd7cddfSDavid du Colombier EXTERN long lineno; 4467dd7cddfSDavid du Colombier EXTERN long nearln; 4477dd7cddfSDavid du Colombier EXTERN int nerrors; 4487dd7cddfSDavid du Colombier EXTERN int newflag; 4497dd7cddfSDavid du Colombier EXTERN long nhunk; 4507dd7cddfSDavid du Colombier EXTERN int ninclude; 4517dd7cddfSDavid du Colombier EXTERN Node* nodproto; 4527dd7cddfSDavid du Colombier EXTERN Node* nodcast; 4537dd7cddfSDavid du Colombier EXTERN Biobuf outbuf; 45418027f8cSDavid du Colombier EXTERN Biobuf diagbuf; 4557dd7cddfSDavid du Colombier EXTERN char* outfile; 4567dd7cddfSDavid du Colombier EXTERN char* pathname; 4577dd7cddfSDavid du Colombier EXTERN int peekc; 4587dd7cddfSDavid du Colombier EXTERN long stkoff; 4597dd7cddfSDavid du Colombier EXTERN Type* strf; 4607dd7cddfSDavid du Colombier EXTERN Type* strl; 4617dd7cddfSDavid du Colombier EXTERN char symb[NSYMB]; 4627dd7cddfSDavid du Colombier EXTERN Sym* symstring; 4637dd7cddfSDavid du Colombier EXTERN int taggen; 4647dd7cddfSDavid du Colombier EXTERN Type* tfield; 4657dd7cddfSDavid du Colombier EXTERN Type* tufield; 4667dd7cddfSDavid du Colombier EXTERN int thechar; 4677dd7cddfSDavid du Colombier EXTERN char* thestring; 4687dd7cddfSDavid du Colombier EXTERN Type* thisfn; 4697dd7cddfSDavid du Colombier EXTERN long thunk; 4707dd7cddfSDavid du Colombier EXTERN Type* types[NTYPE]; 4717dd7cddfSDavid du Colombier EXTERN Type* fntypes[NTYPE]; 4727dd7cddfSDavid du Colombier EXTERN Node* initlist; 4737dd7cddfSDavid du Colombier EXTERN Term term[NTERM]; 4747dd7cddfSDavid du Colombier EXTERN int nterm; 4759847521cSDavid du Colombier EXTERN int packflg; 4767dd7cddfSDavid du Colombier EXTERN int fproundflg; 477e288d156SDavid du Colombier EXTERN int profileflg; 4787dd7cddfSDavid du Colombier EXTERN Bits zbits; 4797dd7cddfSDavid du Colombier 4807dd7cddfSDavid du Colombier extern char *onames[], *tnames[], *gnames[]; 4817dd7cddfSDavid du Colombier extern char *cnames[], *qnames[], *bnames[]; 4823e12c5d1SDavid du Colombier extern char tab[NTYPE][NTYPE]; 483219b2ee8SDavid du Colombier extern char comrel[], invrel[], logrel[]; 4847dd7cddfSDavid du Colombier extern long ncast[], tadd[], tand[]; 4853e12c5d1SDavid du Colombier extern long targ[], tasadd[], tasign[], tcast[]; 4863e12c5d1SDavid du Colombier extern long tdot[], tfunct[], tindir[], tmul[]; 4873e12c5d1SDavid du Colombier extern long tnot[], trel[], tsub[]; 4883e12c5d1SDavid du Colombier 489219b2ee8SDavid du Colombier extern char typeaf[]; 490219b2ee8SDavid du Colombier extern char typefd[]; 491219b2ee8SDavid du Colombier extern char typei[]; 492219b2ee8SDavid du Colombier extern char typesu[]; 493219b2ee8SDavid du Colombier extern char typesuv[]; 494219b2ee8SDavid du Colombier extern char typeu[]; 495219b2ee8SDavid du Colombier extern char typev[]; 496219b2ee8SDavid du Colombier extern char typec[]; 497219b2ee8SDavid du Colombier extern char typeh[]; 4987dd7cddfSDavid du Colombier extern char typeil[]; 4997dd7cddfSDavid du Colombier extern char typeilp[]; 500219b2ee8SDavid du Colombier extern char typechl[]; 501da51d93aSDavid du Colombier extern char typechlv[]; 50222a127bbSDavid du Colombier extern char typechlvp[]; 503219b2ee8SDavid du Colombier extern char typechlp[]; 504219b2ee8SDavid du Colombier extern char typechlpfd[]; 505219b2ee8SDavid du Colombier 506*4ac975e2SDavid du Colombier EXTERN char* typeword; 507*4ac975e2SDavid du Colombier EXTERN char* typecmplx; 508*4ac975e2SDavid du Colombier 5097dd7cddfSDavid du Colombier extern ulong thash1; 5107dd7cddfSDavid du Colombier extern ulong thash2; 5117dd7cddfSDavid du Colombier extern ulong thash3; 5127dd7cddfSDavid du Colombier extern ulong thash[]; 5137dd7cddfSDavid du Colombier 5143e12c5d1SDavid du Colombier /* 5157dd7cddfSDavid du Colombier * compat.c/unix.c/windows.c 5163e12c5d1SDavid du Colombier */ 5177dd7cddfSDavid du Colombier int mywait(int*); 5183e12c5d1SDavid du Colombier int mycreat(char*, int); 5197dd7cddfSDavid du Colombier int systemtype(int); 5207dd7cddfSDavid du Colombier int pathchar(void); 52180ee5cbfSDavid du Colombier int myaccess(char*); 5227dd7cddfSDavid du Colombier char* mygetwd(char*, int); 5237dd7cddfSDavid du Colombier int myexec(char*, char*[]); 5247dd7cddfSDavid du Colombier int mydup(int, int); 5257dd7cddfSDavid du Colombier int myfork(void); 5267dd7cddfSDavid du Colombier int mypipe(int*); 5277dd7cddfSDavid du Colombier void* mysbrk(ulong); 5283e12c5d1SDavid du Colombier 5293e12c5d1SDavid du Colombier /* 5303e12c5d1SDavid du Colombier * parser 5313e12c5d1SDavid du Colombier */ 5323e12c5d1SDavid du Colombier int yyparse(void); 533219b2ee8SDavid du Colombier int mpatov(char*, vlong*); 5343e12c5d1SDavid du Colombier 5353e12c5d1SDavid du Colombier /* 5363e12c5d1SDavid du Colombier * lex.c 5373e12c5d1SDavid du Colombier */ 5387dd7cddfSDavid du Colombier void* allocn(void*, long, long); 5397dd7cddfSDavid du Colombier void* alloc(long); 5403e12c5d1SDavid du Colombier void cinit(void); 5417dd7cddfSDavid du Colombier int compile(char*, char**, int); 5423e12c5d1SDavid du Colombier void errorexit(void); 5433e12c5d1SDavid du Colombier int filbuf(void); 5443e12c5d1SDavid du Colombier int getc(void); 5453e12c5d1SDavid du Colombier long getr(void); 5463e12c5d1SDavid du Colombier int getnsc(void); 5473e12c5d1SDavid du Colombier Sym* lookup(void); 5483e12c5d1SDavid du Colombier void main(int, char*[]); 5493e12c5d1SDavid du Colombier void newfile(char*, int); 5503e12c5d1SDavid du Colombier void newio(void); 5513e12c5d1SDavid du Colombier void pushio(void); 5523e12c5d1SDavid du Colombier long escchar(long, int, int); 5533e12c5d1SDavid du Colombier Sym* slookup(char*); 5543e12c5d1SDavid du Colombier void syminit(Sym*); 5553e12c5d1SDavid du Colombier void unget(int); 5563e12c5d1SDavid du Colombier long yylex(void); 5579a747e4fSDavid du Colombier int Lconv(Fmt*); 5589a747e4fSDavid du Colombier int Tconv(Fmt*); 5599a747e4fSDavid du Colombier int FNconv(Fmt*); 5609a747e4fSDavid du Colombier int Oconv(Fmt*); 5619a747e4fSDavid du Colombier int Qconv(Fmt*); 5629a747e4fSDavid du Colombier int VBconv(Fmt*); 5637dd7cddfSDavid du Colombier void setinclude(char*); 5643e12c5d1SDavid du Colombier 5653e12c5d1SDavid du Colombier /* 5663e12c5d1SDavid du Colombier * mac.c 5673e12c5d1SDavid du Colombier */ 5683e12c5d1SDavid du Colombier void dodefine(char*); 5693e12c5d1SDavid du Colombier void domacro(void); 5703e12c5d1SDavid du Colombier Sym* getsym(void); 5717dd7cddfSDavid du Colombier long getnsn(void); 5723e12c5d1SDavid du Colombier void linehist(char*, int); 5733e12c5d1SDavid du Colombier void macdef(void); 5743e12c5d1SDavid du Colombier void macprag(void); 5753e12c5d1SDavid du Colombier void macend(void); 5763e12c5d1SDavid du Colombier void macexpand(Sym*, char*); 5773e12c5d1SDavid du Colombier void macif(int); 5783e12c5d1SDavid du Colombier void macinc(void); 5793e12c5d1SDavid du Colombier void maclin(void); 5803e12c5d1SDavid du Colombier void macund(void); 5813e12c5d1SDavid du Colombier 5823e12c5d1SDavid du Colombier /* 5833e12c5d1SDavid du Colombier * dcl.c 5843e12c5d1SDavid du Colombier */ 5853e12c5d1SDavid du Colombier Node* doinit(Sym*, Type*, long, Node*); 5863e12c5d1SDavid du Colombier Type* tcopy(Type*); 5873e12c5d1SDavid du Colombier Node* init1(Sym*, Type*, long, int); 5883e12c5d1SDavid du Colombier Node* newlist(Node*, Node*); 5893e12c5d1SDavid du Colombier void adecl(int, Type*, Sym*); 5903e12c5d1SDavid du Colombier int anyproto(Node*); 5913e12c5d1SDavid du Colombier void argmark(Node*, int); 5923e12c5d1SDavid du Colombier void dbgdecl(Sym*); 5933e12c5d1SDavid du Colombier Node* dcllabel(Sym*, int); 5943e12c5d1SDavid du Colombier Node* dodecl(void(*)(int, Type*, Sym*), int, Type*, Node*); 5953e12c5d1SDavid du Colombier Sym* mkstatic(Sym*); 5963e12c5d1SDavid du Colombier void doenum(Sym*, Node*); 5977dd7cddfSDavid du Colombier void snap(Type*); 598219b2ee8SDavid du Colombier Type* dotag(Sym*, int, int); 5993e12c5d1SDavid du Colombier void edecl(int, Type*, Sym*); 6003e12c5d1SDavid du Colombier Type* fnproto(Node*); 6013e12c5d1SDavid du Colombier Type* fnproto1(Node*); 6023e12c5d1SDavid du Colombier void markdcl(void); 6033e12c5d1SDavid du Colombier Type* paramconv(Type*, int); 6043e12c5d1SDavid du Colombier void pdecl(int, Type*, Sym*); 6053e12c5d1SDavid du Colombier Decl* push(void); 6063e12c5d1SDavid du Colombier Decl* push1(Sym*); 6077dd7cddfSDavid du Colombier Node* revertdcl(void); 6087dd7cddfSDavid du Colombier long round(long, int); 6097dd7cddfSDavid du Colombier int rsametype(Type*, Type*, int, int); 6103e12c5d1SDavid du Colombier int sametype(Type*, Type*); 611375daca8SDavid du Colombier ulong sign(Sym*); 612375daca8SDavid du Colombier ulong signature(Type*); 6133e12c5d1SDavid du Colombier void suallign(Type*); 6143e12c5d1SDavid du Colombier void tmerge(Type*, Sym*); 6153e12c5d1SDavid du Colombier void walkparam(Node*, int); 6163e12c5d1SDavid du Colombier void xdecl(int, Type*, Sym*); 6173e12c5d1SDavid du Colombier Node* contig(Sym*, Node*, long); 6183e12c5d1SDavid du Colombier 6193e12c5d1SDavid du Colombier /* 6203e12c5d1SDavid du Colombier * com.c 6213e12c5d1SDavid du Colombier */ 6223e12c5d1SDavid du Colombier void ccom(Node*); 6233e12c5d1SDavid du Colombier void complex(Node*); 6243e12c5d1SDavid du Colombier int tcom(Node*); 6253e12c5d1SDavid du Colombier int tcoma(Node*, Node*, Type*, int); 6263e12c5d1SDavid du Colombier int tcomd(Node*); 6273e12c5d1SDavid du Colombier int tcomo(Node*, int); 6283e12c5d1SDavid du Colombier int tcomx(Node*); 6293e12c5d1SDavid du Colombier int tlvalue(Node*); 6307dd7cddfSDavid du Colombier void constas(Node*, Type*, Type*); 6313e12c5d1SDavid du Colombier 6323e12c5d1SDavid du Colombier /* 6333e12c5d1SDavid du Colombier * con.c 6343e12c5d1SDavid du Colombier */ 6353e12c5d1SDavid du Colombier void acom(Node*); 636219b2ee8SDavid du Colombier void acom1(vlong, Node*); 6373e12c5d1SDavid du Colombier void acom2(Node*, Type*); 6387dd7cddfSDavid du Colombier int acomcmp1(const void*, const void*); 6397dd7cddfSDavid du Colombier int acomcmp2(const void*, const void*); 6403e12c5d1SDavid du Colombier int addo(Node*); 6413e12c5d1SDavid du Colombier void evconst(Node*); 6423e12c5d1SDavid du Colombier 6433e12c5d1SDavid du Colombier /* 64480ee5cbfSDavid du Colombier * funct.c 64580ee5cbfSDavid du Colombier */ 64680ee5cbfSDavid du Colombier int isfunct(Node*); 64780ee5cbfSDavid du Colombier void dclfunct(Type*, Sym*); 64880ee5cbfSDavid du Colombier 64980ee5cbfSDavid du Colombier /* 6503e12c5d1SDavid du Colombier * sub.c 6513e12c5d1SDavid du Colombier */ 6523e12c5d1SDavid du Colombier void arith(Node*, int); 6539a747e4fSDavid du Colombier int deadheads(Node*); 65480ee5cbfSDavid du Colombier Type* dotsearch(Sym*, Type*, Node*, long*); 6553e12c5d1SDavid du Colombier long dotoffset(Type*, Type*, Node*); 6563e12c5d1SDavid du Colombier void gethunk(void); 6573e12c5d1SDavid du Colombier Node* invert(Node*); 6583e12c5d1SDavid du Colombier int bitno(long); 6593e12c5d1SDavid du Colombier void makedot(Node*, Type*, long); 660ce941d97SDavid du Colombier int mixedasop(Type*, Type*); 6613e12c5d1SDavid du Colombier Node* new(int, Node*, Node*); 6623e12c5d1SDavid du Colombier Node* new1(int, Node*, Node*); 6633e12c5d1SDavid du Colombier int nilcast(Type*, Type*); 6643e12c5d1SDavid du Colombier int nocast(Type*, Type*); 6653e12c5d1SDavid du Colombier void prtree(Node*, char*); 6663e12c5d1SDavid du Colombier void prtree1(Node*, int, int); 6673e12c5d1SDavid du Colombier void relcon(Node*, Node*); 6683e12c5d1SDavid du Colombier int relindex(int); 6697dd7cddfSDavid du Colombier int simpleg(long); 6707dd7cddfSDavid du Colombier Type* garbt(Type*, long); 6713e12c5d1SDavid du Colombier int simplec(long); 6723e12c5d1SDavid du Colombier Type* simplet(long); 6733e12c5d1SDavid du Colombier int stcompat(Node*, Type*, Type*, long[]); 6743e12c5d1SDavid du Colombier int tcompat(Node*, Type*, Type*, long[]); 6757dd7cddfSDavid du Colombier void tinit(void); 6763e12c5d1SDavid du Colombier Type* typ(int, Type*); 67780ee5cbfSDavid du Colombier Type* copytyp(Type*); 6783e12c5d1SDavid du Colombier void typeext(Type*, Node*); 679219b2ee8SDavid du Colombier void typeext1(Type*, Node*); 6803e12c5d1SDavid du Colombier int side(Node*); 6813e12c5d1SDavid du Colombier int vconst(Node*); 682282e677fSDavid du Colombier int log2(uvlong); 6837dd7cddfSDavid du Colombier int vlog(Node*); 6847dd7cddfSDavid du Colombier int topbit(ulong); 685375daca8SDavid du Colombier void simplifyshift(Node*); 6867dd7cddfSDavid du Colombier long typebitor(long, long); 6873e12c5d1SDavid du Colombier void diag(Node*, char*, ...); 6883e12c5d1SDavid du Colombier void warn(Node*, char*, ...); 6893e12c5d1SDavid du Colombier void yyerror(char*, ...); 690375daca8SDavid du Colombier void fatal(Node*, char*, ...); 6913e12c5d1SDavid du Colombier 6923e12c5d1SDavid du Colombier /* 693219b2ee8SDavid du Colombier * acid.c 694219b2ee8SDavid du Colombier */ 695219b2ee8SDavid du Colombier void acidtype(Type*); 696219b2ee8SDavid du Colombier void acidvar(Sym*); 697219b2ee8SDavid du Colombier 698219b2ee8SDavid du Colombier /* 69980ee5cbfSDavid du Colombier * pickle.c 70080ee5cbfSDavid du Colombier */ 70180ee5cbfSDavid du Colombier void pickletype(Type*); 70280ee5cbfSDavid du Colombier 70380ee5cbfSDavid du Colombier /* 7047dd7cddfSDavid du Colombier * bits.c 7057dd7cddfSDavid du Colombier */ 7067dd7cddfSDavid du Colombier Bits bor(Bits, Bits); 7077dd7cddfSDavid du Colombier Bits band(Bits, Bits); 7087dd7cddfSDavid du Colombier Bits bnot(Bits); 7097dd7cddfSDavid du Colombier int bany(Bits*); 7107dd7cddfSDavid du Colombier int bnum(Bits); 7117dd7cddfSDavid du Colombier Bits blsh(uint); 7127dd7cddfSDavid du Colombier int beq(Bits, Bits); 7137dd7cddfSDavid du Colombier int bset(Bits, uint); 7147dd7cddfSDavid du Colombier 7157dd7cddfSDavid du Colombier /* 7167dd7cddfSDavid du Colombier * dpchk.c 7177dd7cddfSDavid du Colombier */ 7187dd7cddfSDavid du Colombier void dpcheck(Node*); 7197dd7cddfSDavid du Colombier void arginit(void); 7207dd7cddfSDavid du Colombier void pragvararg(void); 7219847521cSDavid du Colombier void pragpack(void); 7227dd7cddfSDavid du Colombier void pragfpround(void); 723e288d156SDavid du Colombier void pragprofile(void); 724375daca8SDavid du Colombier void pragincomplete(void); 7257dd7cddfSDavid du Colombier 7267dd7cddfSDavid du Colombier /* 7273e12c5d1SDavid du Colombier * calls to machine depend part 7283e12c5d1SDavid du Colombier */ 7293e12c5d1SDavid du Colombier void codgen(Node*, Node*); 7303e12c5d1SDavid du Colombier void gclean(void); 7313e12c5d1SDavid du Colombier void gextern(Sym*, Node*, long, long); 7323e12c5d1SDavid du Colombier void ginit(void); 7333e12c5d1SDavid du Colombier long outstring(char*, long); 7343e12c5d1SDavid du Colombier long outlstring(ushort*, long); 7353e12c5d1SDavid du Colombier void sextern(Sym*, Node*, long, long); 7363e12c5d1SDavid du Colombier void xcom(Node*); 7373e12c5d1SDavid du Colombier long exreg(Type*); 7387dd7cddfSDavid du Colombier long align(long, Type*, int); 7397dd7cddfSDavid du Colombier long maxround(long, long); 7403e12c5d1SDavid du Colombier 7413e12c5d1SDavid du Colombier extern schar ewidth[]; 742219b2ee8SDavid du Colombier 743219b2ee8SDavid du Colombier /* 744219b2ee8SDavid du Colombier * com64 745219b2ee8SDavid du Colombier */ 746219b2ee8SDavid du Colombier int com64(Node*); 747219b2ee8SDavid du Colombier void com64init(void); 748219b2ee8SDavid du Colombier void bool64(Node*); 749219b2ee8SDavid du Colombier double convvtof(vlong); 750219b2ee8SDavid du Colombier vlong convftov(double); 751219b2ee8SDavid du Colombier double convftox(double, int); 752219b2ee8SDavid du Colombier vlong convvtox(vlong, int); 7537dd7cddfSDavid du Colombier 754da51d93aSDavid du Colombier /* 755da51d93aSDavid du Colombier * machcap 756da51d93aSDavid du Colombier */ 757da51d93aSDavid du Colombier int machcap(Node*); 758da51d93aSDavid du Colombier 7597dd7cddfSDavid du Colombier #pragma varargck argpos warn 2 7607dd7cddfSDavid du Colombier #pragma varargck argpos diag 2 7617dd7cddfSDavid du Colombier #pragma varargck argpos yyerror 1 7627dd7cddfSDavid du Colombier 7637dd7cddfSDavid du Colombier #pragma varargck type "F" Node* 7647dd7cddfSDavid du Colombier #pragma varargck type "L" long 7657dd7cddfSDavid du Colombier #pragma varargck type "Q" long 7667dd7cddfSDavid du Colombier #pragma varargck type "O" int 7677dd7cddfSDavid du Colombier #pragma varargck type "T" Type* 7687dd7cddfSDavid du Colombier #pragma varargck type "|" int 769