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 2382726826SDavid du Colombier typedef Rune TRune; /* target system type */ 2482726826SDavid du Colombier 253e12c5d1SDavid du Colombier #define NHUNK 50000L 26*2ec6491fSDavid du Colombier #define BUFSIZ 16*1024 27d40255d8SDavid du Colombier #define NSYMB 1500 283e12c5d1SDavid du Colombier #define NHASH 1024 293e12c5d1SDavid du Colombier #define STRINGSZ 200 303e12c5d1SDavid du Colombier #define HISTSZ 20 31d40255d8SDavid du Colombier #define YYMAXDEPTH 1500 32219b2ee8SDavid du Colombier #define NTERM 10 337dd7cddfSDavid du Colombier #define MAXALIGN 7 34219b2ee8SDavid du Colombier 3540d01547SDavid du Colombier #define SIGN(n) ((uvlong)1<<(n-1)) 36219b2ee8SDavid du Colombier #define MASK(n) (SIGN(n)|(SIGN(n)-1)) 373e12c5d1SDavid du Colombier 387dd7cddfSDavid du Colombier #define BITS 5 397dd7cddfSDavid du Colombier #define NVAR (BITS*sizeof(ulong)*8) 407dd7cddfSDavid du Colombier struct Bits 417dd7cddfSDavid du Colombier { 427dd7cddfSDavid du Colombier ulong b[BITS]; 437dd7cddfSDavid du Colombier }; 443e12c5d1SDavid du Colombier 453e12c5d1SDavid du Colombier struct Node 463e12c5d1SDavid du Colombier { 473e12c5d1SDavid du Colombier Node* left; 483e12c5d1SDavid du Colombier Node* right; 49219b2ee8SDavid du Colombier void* label; 50219b2ee8SDavid du Colombier long pc; 51219b2ee8SDavid du Colombier int reg; 52219b2ee8SDavid du Colombier long xoffset; 53219b2ee8SDavid du Colombier double fconst; /* fp constant */ 54219b2ee8SDavid du Colombier vlong vconst; /* non fp const */ 55219b2ee8SDavid du Colombier char* cstring; /* character string */ 5682726826SDavid du Colombier TRune* rstring; /* rune string */ 577dd7cddfSDavid du Colombier 583e12c5d1SDavid du Colombier Sym* sym; 593e12c5d1SDavid du Colombier Type* type; 603e12c5d1SDavid du Colombier long lineno; 613e12c5d1SDavid du Colombier char op; 6222a127bbSDavid du Colombier char oldop; 6322a127bbSDavid du Colombier char xcast; 643e12c5d1SDavid du Colombier char class; 653e12c5d1SDavid du Colombier char etype; 663e12c5d1SDavid du Colombier char complex; 673e12c5d1SDavid du Colombier char addable; 683e12c5d1SDavid du Colombier char scale; 697dd7cddfSDavid du Colombier char garb; 703e12c5d1SDavid du Colombier }; 713e12c5d1SDavid du Colombier #define Z ((Node*)0) 723e12c5d1SDavid du Colombier 733e12c5d1SDavid du Colombier struct Sym 743e12c5d1SDavid du Colombier { 753e12c5d1SDavid du Colombier Sym* link; 763e12c5d1SDavid du Colombier Type* type; 773e12c5d1SDavid du Colombier Type* suetag; 78219b2ee8SDavid du Colombier Type* tenum; 793e12c5d1SDavid du Colombier char* macro; 803e12c5d1SDavid du Colombier long varlineno; 813e12c5d1SDavid du Colombier long offset; 82219b2ee8SDavid du Colombier vlong vconst; 83219b2ee8SDavid du Colombier double fconst; 843e12c5d1SDavid du Colombier Node* label; 853e12c5d1SDavid du Colombier ushort lexical; 86219b2ee8SDavid du Colombier char *name; 879a747e4fSDavid du Colombier ushort block; 889a747e4fSDavid du Colombier ushort sueblock; 893e12c5d1SDavid du Colombier char class; 903e12c5d1SDavid du Colombier char sym; 913e12c5d1SDavid du Colombier char aused; 92375daca8SDavid du Colombier char sig; 933e12c5d1SDavid du Colombier }; 943e12c5d1SDavid du Colombier #define S ((Sym*)0) 953e12c5d1SDavid du Colombier 96375daca8SDavid du Colombier enum{ 97375daca8SDavid du Colombier SIGNONE = 0, 98375daca8SDavid du Colombier SIGDONE = 1, 99375daca8SDavid du Colombier SIGINTERN = 2, 100375daca8SDavid du Colombier 101375daca8SDavid du Colombier SIGNINTERN = 1729*325*1729, 102375daca8SDavid du Colombier }; 103375daca8SDavid du Colombier 1043e12c5d1SDavid du Colombier struct Decl 1053e12c5d1SDavid du Colombier { 1063e12c5d1SDavid du Colombier Decl* link; 1073e12c5d1SDavid du Colombier Sym* sym; 1083e12c5d1SDavid du Colombier Type* type; 1093e12c5d1SDavid du Colombier long varlineno; 1103e12c5d1SDavid du Colombier long offset; 1113e12c5d1SDavid du Colombier short val; 1129a747e4fSDavid du Colombier ushort block; 1133e12c5d1SDavid du Colombier char class; 1143e12c5d1SDavid du Colombier char aused; 1153e12c5d1SDavid du Colombier }; 1163e12c5d1SDavid du Colombier #define D ((Decl*)0) 1173e12c5d1SDavid du Colombier 1183e12c5d1SDavid du Colombier struct Type 1193e12c5d1SDavid du Colombier { 1203e12c5d1SDavid du Colombier Sym* sym; 1213e12c5d1SDavid du Colombier Sym* tag; 12280ee5cbfSDavid du Colombier Funct* funct; 1233e12c5d1SDavid du Colombier Type* link; 1243e12c5d1SDavid du Colombier Type* down; 1253e12c5d1SDavid du Colombier long width; 1263e12c5d1SDavid du Colombier long offset; 1273e12c5d1SDavid du Colombier long lineno; 1286891d857SDavid du Colombier schar shift; 1293e12c5d1SDavid du Colombier char nbits; 1303e12c5d1SDavid du Colombier char etype; 1317dd7cddfSDavid du Colombier char garb; 1323e12c5d1SDavid du Colombier }; 13380ee5cbfSDavid du Colombier 1343e12c5d1SDavid du Colombier #define T ((Type*)0) 1353e12c5d1SDavid du Colombier #define NODECL ((void(*)(int, Type*, Sym*))0) 1363e12c5d1SDavid du Colombier 1377dd7cddfSDavid du Colombier struct Init /* general purpose initialization */ 1387dd7cddfSDavid du Colombier { 1397dd7cddfSDavid du Colombier int code; 1407dd7cddfSDavid du Colombier ulong value; 1417dd7cddfSDavid du Colombier char* s; 1427dd7cddfSDavid du Colombier }; 1437dd7cddfSDavid du Colombier 1447dd7cddfSDavid du Colombier EXTERN struct 1453e12c5d1SDavid du Colombier { 1463e12c5d1SDavid du Colombier char* p; 1473e12c5d1SDavid du Colombier int c; 1483e12c5d1SDavid du Colombier } fi; 1493e12c5d1SDavid du Colombier 1503e12c5d1SDavid du Colombier struct Io 1513e12c5d1SDavid du Colombier { 1523e12c5d1SDavid du Colombier Io* link; 1533e12c5d1SDavid du Colombier char* p; 1543e12c5d1SDavid du Colombier char b[BUFSIZ]; 1553e12c5d1SDavid du Colombier short c; 1563e12c5d1SDavid du Colombier short f; 1573e12c5d1SDavid du Colombier }; 1583e12c5d1SDavid du Colombier #define I ((Io*)0) 1593e12c5d1SDavid du Colombier 1603e12c5d1SDavid du Colombier struct Hist 1613e12c5d1SDavid du Colombier { 1623e12c5d1SDavid du Colombier Hist* link; 1633e12c5d1SDavid du Colombier char* name; 1643e12c5d1SDavid du Colombier long line; 1653e12c5d1SDavid du Colombier long offset; 1663e12c5d1SDavid du Colombier }; 1673e12c5d1SDavid du Colombier #define H ((Hist*)0) 1687dd7cddfSDavid du Colombier EXTERN Hist* hist; 1693e12c5d1SDavid du Colombier 170219b2ee8SDavid du Colombier struct Term 171219b2ee8SDavid du Colombier { 172219b2ee8SDavid du Colombier vlong mult; 173219b2ee8SDavid du Colombier Node *node; 174219b2ee8SDavid du Colombier }; 175219b2ee8SDavid du Colombier 1763e12c5d1SDavid du Colombier enum 1773e12c5d1SDavid du Colombier { 1787dd7cddfSDavid du Colombier Axxx, 1797dd7cddfSDavid du Colombier Ael1, 1807dd7cddfSDavid du Colombier Ael2, 1817dd7cddfSDavid du Colombier Asu2, 1827dd7cddfSDavid du Colombier Aarg0, 1837dd7cddfSDavid du Colombier Aarg1, 1847dd7cddfSDavid du Colombier Aarg2, 1857dd7cddfSDavid du Colombier Aaut3, 1867dd7cddfSDavid du Colombier NALIGN, 1877dd7cddfSDavid du Colombier }; 1887dd7cddfSDavid du Colombier 1897dd7cddfSDavid du Colombier enum /* also in ../{8a,0a}.h */ 1907dd7cddfSDavid du Colombier { 1917dd7cddfSDavid du Colombier Plan9 = 1<<0, 1927dd7cddfSDavid du Colombier Unix = 1<<1, 1937dd7cddfSDavid du Colombier Windows = 1<<2, 1947dd7cddfSDavid du Colombier }; 1957dd7cddfSDavid du Colombier 1967dd7cddfSDavid du Colombier enum 1977dd7cddfSDavid du Colombier { 1983e12c5d1SDavid du Colombier DMARK, 1993e12c5d1SDavid du Colombier DAUTO, 2003e12c5d1SDavid du Colombier DSUE, 2013e12c5d1SDavid du Colombier DLABEL, 2023e12c5d1SDavid du Colombier }; 2033e12c5d1SDavid du Colombier enum 2043e12c5d1SDavid du Colombier { 2053e12c5d1SDavid du Colombier OXXX, 2067dd7cddfSDavid du Colombier OADD, 2077dd7cddfSDavid du Colombier OADDR, 2087dd7cddfSDavid du Colombier OAND, 2097dd7cddfSDavid du Colombier OANDAND, 2107dd7cddfSDavid du Colombier OARRAY, 2117dd7cddfSDavid du Colombier OAS, 2127dd7cddfSDavid du Colombier OASI, 2137dd7cddfSDavid du Colombier OASADD, 2147dd7cddfSDavid du Colombier OASAND, 2157dd7cddfSDavid du Colombier OASASHL, 2167dd7cddfSDavid du Colombier OASASHR, 2177dd7cddfSDavid du Colombier OASDIV, 2187dd7cddfSDavid du Colombier OASHL, 2197dd7cddfSDavid du Colombier OASHR, 2207dd7cddfSDavid du Colombier OASLDIV, 2217dd7cddfSDavid du Colombier OASLMOD, 2227dd7cddfSDavid du Colombier OASLMUL, 2237dd7cddfSDavid du Colombier OASLSHR, 2247dd7cddfSDavid du Colombier OASMOD, 2257dd7cddfSDavid du Colombier OASMUL, 2267dd7cddfSDavid du Colombier OASOR, 2277dd7cddfSDavid du Colombier OASSUB, 2287dd7cddfSDavid du Colombier OASXOR, 2297dd7cddfSDavid du Colombier OBIT, 2307dd7cddfSDavid du Colombier OBREAK, 2317dd7cddfSDavid du Colombier OCASE, 2327dd7cddfSDavid du Colombier OCAST, 2337dd7cddfSDavid du Colombier OCOMMA, 2347dd7cddfSDavid du Colombier OCOND, 2357dd7cddfSDavid du Colombier OCONST, 2367dd7cddfSDavid du Colombier OCONTINUE, 2377dd7cddfSDavid du Colombier ODIV, 2387dd7cddfSDavid du Colombier ODOT, 2397dd7cddfSDavid du Colombier ODOTDOT, 2407dd7cddfSDavid du Colombier ODWHILE, 2417dd7cddfSDavid du Colombier OENUM, 2427dd7cddfSDavid du Colombier OEQ, 2437dd7cddfSDavid du Colombier OFOR, 2447dd7cddfSDavid du Colombier OFUNC, 2457dd7cddfSDavid du Colombier OGE, 2467dd7cddfSDavid du Colombier OGOTO, 2477dd7cddfSDavid du Colombier OGT, 2487dd7cddfSDavid du Colombier OHI, 2497dd7cddfSDavid du Colombier OHS, 2507dd7cddfSDavid du Colombier OIF, 2517dd7cddfSDavid du Colombier OIND, 2527dd7cddfSDavid du Colombier OINDREG, 2537dd7cddfSDavid du Colombier OINIT, 2547dd7cddfSDavid du Colombier OLABEL, 2557dd7cddfSDavid du Colombier OLDIV, 2567dd7cddfSDavid du Colombier OLE, 2577dd7cddfSDavid du Colombier OLIST, 2587dd7cddfSDavid du Colombier OLMOD, 2597dd7cddfSDavid du Colombier OLMUL, 2607dd7cddfSDavid du Colombier OLO, 2617dd7cddfSDavid du Colombier OLS, 2627dd7cddfSDavid du Colombier OLSHR, 2637dd7cddfSDavid du Colombier OLT, 2647dd7cddfSDavid du Colombier OMOD, 2657dd7cddfSDavid du Colombier OMUL, 2667dd7cddfSDavid du Colombier ONAME, 2677dd7cddfSDavid du Colombier ONE, 2687dd7cddfSDavid du Colombier ONOT, 2697dd7cddfSDavid du Colombier OOR, 2707dd7cddfSDavid du Colombier OOROR, 2717dd7cddfSDavid du Colombier OPOSTDEC, 2727dd7cddfSDavid du Colombier OPOSTINC, 2737dd7cddfSDavid du Colombier OPREDEC, 2747dd7cddfSDavid du Colombier OPREINC, 2757dd7cddfSDavid du Colombier OPROTO, 2767dd7cddfSDavid du Colombier OREGISTER, 2777dd7cddfSDavid du Colombier ORETURN, 2787dd7cddfSDavid du Colombier OSET, 2797dd7cddfSDavid du Colombier OSIGN, 2807dd7cddfSDavid du Colombier OSIZE, 2817dd7cddfSDavid du Colombier OSTRING, 2827dd7cddfSDavid du Colombier OLSTRING, 2837dd7cddfSDavid du Colombier OSTRUCT, 2847dd7cddfSDavid du Colombier OSUB, 2857dd7cddfSDavid du Colombier OSWITCH, 2867dd7cddfSDavid du Colombier OUNION, 2877dd7cddfSDavid du Colombier OUSED, 2887dd7cddfSDavid du Colombier OWHILE, 2897dd7cddfSDavid du Colombier OXOR, 2907dd7cddfSDavid du Colombier ONEG, 2917dd7cddfSDavid du Colombier OCOM, 29280ee5cbfSDavid du Colombier OPOS, 2937dd7cddfSDavid du Colombier OELEM, 2947dd7cddfSDavid du Colombier 2957dd7cddfSDavid du Colombier OTST, /* used in some compilers */ 2967dd7cddfSDavid du Colombier OINDEX, 2977dd7cddfSDavid du Colombier OFAS, 298da51d93aSDavid du Colombier OREGPAIR, 299d40255d8SDavid du Colombier OEXREG, 3007dd7cddfSDavid du Colombier 3017dd7cddfSDavid du Colombier OEND 3023e12c5d1SDavid du Colombier }; 3033e12c5d1SDavid du Colombier enum 3043e12c5d1SDavid du Colombier { 3053e12c5d1SDavid du Colombier TXXX, 3067dd7cddfSDavid du Colombier TCHAR, 3077dd7cddfSDavid du Colombier TUCHAR, 3087dd7cddfSDavid du Colombier TSHORT, 3097dd7cddfSDavid du Colombier TUSHORT, 3107dd7cddfSDavid du Colombier TINT, 3117dd7cddfSDavid du Colombier TUINT, 3127dd7cddfSDavid du Colombier TLONG, 3137dd7cddfSDavid du Colombier TULONG, 3147dd7cddfSDavid du Colombier TVLONG, 3157dd7cddfSDavid du Colombier TUVLONG, 3167dd7cddfSDavid du Colombier TFLOAT, 3177dd7cddfSDavid du Colombier TDOUBLE, 3187dd7cddfSDavid du Colombier TIND, 3197dd7cddfSDavid du Colombier TFUNC, 3207dd7cddfSDavid du Colombier TARRAY, 3217dd7cddfSDavid du Colombier TVOID, 3227dd7cddfSDavid du Colombier TSTRUCT, 3237dd7cddfSDavid du Colombier TUNION, 3247dd7cddfSDavid du Colombier TENUM, 3256891d857SDavid du Colombier TDOT, 3267dd7cddfSDavid du Colombier NTYPE, 3277dd7cddfSDavid du Colombier 3287dd7cddfSDavid du Colombier TAUTO = NTYPE, 3297dd7cddfSDavid du Colombier TEXTERN, 3307dd7cddfSDavid du Colombier TSTATIC, 3317dd7cddfSDavid du Colombier TTYPEDEF, 33280ee5cbfSDavid du Colombier TTYPESTR, 3337dd7cddfSDavid du Colombier TREGISTER, 3347dd7cddfSDavid du Colombier TCONSTNT, 3357dd7cddfSDavid du Colombier TVOLATILE, 3367dd7cddfSDavid du Colombier TUNSIGNED, 3377dd7cddfSDavid du Colombier TSIGNED, 3387dd7cddfSDavid du Colombier TFILE, 3397dd7cddfSDavid du Colombier TOLD, 3407dd7cddfSDavid du Colombier NALLTYPES, 34182726826SDavid du Colombier 34282726826SDavid du Colombier /* adapt size of Rune to target system's size */ 34382726826SDavid du Colombier TRUNE = sizeof(TRune)==4? TUINT: TUSHORT, 3443e12c5d1SDavid du Colombier }; 3453e12c5d1SDavid du Colombier enum 3463e12c5d1SDavid du Colombier { 3473e12c5d1SDavid du Colombier CXXX, 3487dd7cddfSDavid du Colombier CAUTO, 3497dd7cddfSDavid du Colombier CEXTERN, 3507dd7cddfSDavid du Colombier CGLOBL, 3517dd7cddfSDavid du Colombier CSTATIC, 3527dd7cddfSDavid du Colombier CLOCAL, 3537dd7cddfSDavid du Colombier CTYPEDEF, 35480ee5cbfSDavid du Colombier CTYPESTR, 3557dd7cddfSDavid du Colombier CPARAM, 3567dd7cddfSDavid du Colombier CSELEM, 3577dd7cddfSDavid du Colombier CLABEL, 3587dd7cddfSDavid du Colombier CEXREG, 3597dd7cddfSDavid du Colombier NCTYPES, 3603e12c5d1SDavid du Colombier }; 3613e12c5d1SDavid du Colombier enum 3623e12c5d1SDavid du Colombier { 3637dd7cddfSDavid du Colombier GXXX = 0, 3647dd7cddfSDavid du Colombier GCONSTNT = 1<<0, 3657dd7cddfSDavid du Colombier GVOLATILE = 1<<1, 3667dd7cddfSDavid du Colombier NGTYPES = 1<<2, 367375daca8SDavid du Colombier 368375daca8SDavid du Colombier GINCOMPLETE = 1<<2, 3697dd7cddfSDavid du Colombier }; 3707dd7cddfSDavid du Colombier enum 3717dd7cddfSDavid du Colombier { 3723e12c5d1SDavid du Colombier BCHAR = 1L<<TCHAR, 3733e12c5d1SDavid du Colombier BUCHAR = 1L<<TUCHAR, 3743e12c5d1SDavid du Colombier BSHORT = 1L<<TSHORT, 3753e12c5d1SDavid du Colombier BUSHORT = 1L<<TUSHORT, 3767dd7cddfSDavid du Colombier BINT = 1L<<TINT, 3777dd7cddfSDavid du Colombier BUINT = 1L<<TUINT, 3783e12c5d1SDavid du Colombier BLONG = 1L<<TLONG, 3793e12c5d1SDavid du Colombier BULONG = 1L<<TULONG, 3803e12c5d1SDavid du Colombier BVLONG = 1L<<TVLONG, 381219b2ee8SDavid du Colombier BUVLONG = 1L<<TUVLONG, 3823e12c5d1SDavid du Colombier BFLOAT = 1L<<TFLOAT, 3833e12c5d1SDavid du Colombier BDOUBLE = 1L<<TDOUBLE, 3843e12c5d1SDavid du Colombier BIND = 1L<<TIND, 3857dd7cddfSDavid du Colombier BFUNC = 1L<<TFUNC, 3867dd7cddfSDavid du Colombier BARRAY = 1L<<TARRAY, 3873e12c5d1SDavid du Colombier BVOID = 1L<<TVOID, 3883e12c5d1SDavid du Colombier BSTRUCT = 1L<<TSTRUCT, 3893e12c5d1SDavid du Colombier BUNION = 1L<<TUNION, 3907dd7cddfSDavid du Colombier BENUM = 1L<<TENUM, 3917dd7cddfSDavid du Colombier BFILE = 1L<<TFILE, 3927dd7cddfSDavid du Colombier BDOT = 1L<<TDOT, 3937dd7cddfSDavid du Colombier BCONSTNT = 1L<<TCONSTNT, 3947dd7cddfSDavid du Colombier BVOLATILE = 1L<<TVOLATILE, 3957dd7cddfSDavid du Colombier BUNSIGNED = 1L<<TUNSIGNED, 3967dd7cddfSDavid du Colombier BSIGNED = 1L<<TSIGNED, 3977dd7cddfSDavid du Colombier BAUTO = 1L<<TAUTO, 3987dd7cddfSDavid du Colombier BEXTERN = 1L<<TEXTERN, 3997dd7cddfSDavid du Colombier BSTATIC = 1L<<TSTATIC, 4007dd7cddfSDavid du Colombier BTYPEDEF = 1L<<TTYPEDEF, 40180ee5cbfSDavid du Colombier BTYPESTR = 1L<<TTYPESTR, 4027dd7cddfSDavid du Colombier BREGISTER = 1L<<TREGISTER, 4033e12c5d1SDavid du Colombier 4047dd7cddfSDavid du Colombier BINTEGER = BCHAR|BUCHAR|BSHORT|BUSHORT|BINT|BUINT| 4057dd7cddfSDavid du Colombier BLONG|BULONG|BVLONG|BUVLONG, 4063e12c5d1SDavid du Colombier BNUMBER = BINTEGER|BFLOAT|BDOUBLE, 4073e12c5d1SDavid du Colombier 4083e12c5d1SDavid du Colombier /* these can be overloaded with complex types */ 4093e12c5d1SDavid du Colombier 41080ee5cbfSDavid du Colombier BCLASS = BAUTO|BEXTERN|BSTATIC|BTYPEDEF|BTYPESTR|BREGISTER, 4117dd7cddfSDavid du Colombier BGARB = BCONSTNT|BVOLATILE, 4123e12c5d1SDavid du Colombier }; 4133e12c5d1SDavid du Colombier 41480ee5cbfSDavid du Colombier struct Funct 41580ee5cbfSDavid du Colombier { 41680ee5cbfSDavid du Colombier Sym* sym[OEND]; 41780ee5cbfSDavid du Colombier Sym* castto[NTYPE]; 41880ee5cbfSDavid du Colombier Sym* castfr[NTYPE]; 41980ee5cbfSDavid du Colombier }; 42080ee5cbfSDavid du Colombier 4217dd7cddfSDavid du Colombier EXTERN struct 422219b2ee8SDavid du Colombier { 423219b2ee8SDavid du Colombier Type* tenum; /* type of entire enum */ 424219b2ee8SDavid du Colombier Type* cenum; /* type of current enum run */ 425219b2ee8SDavid du Colombier vlong lastenum; /* value of current enum */ 426219b2ee8SDavid du Colombier double floatenum; /* value of current enum */ 427219b2ee8SDavid du Colombier } en; 4283e12c5d1SDavid du Colombier 4297dd7cddfSDavid du Colombier EXTERN int autobn; 4307dd7cddfSDavid du Colombier EXTERN long autoffset; 4317dd7cddfSDavid du Colombier EXTERN int blockno; 4327dd7cddfSDavid du Colombier EXTERN Decl* dclstack; 4337dd7cddfSDavid du Colombier EXTERN char debug[256]; 4347dd7cddfSDavid du Colombier EXTERN Hist* ehist; 4357dd7cddfSDavid du Colombier EXTERN long firstbit; 4367dd7cddfSDavid du Colombier EXTERN Sym* firstarg; 4377dd7cddfSDavid du Colombier EXTERN Type* firstargtype; 4387dd7cddfSDavid du Colombier EXTERN Decl* firstdcl; 4397dd7cddfSDavid du Colombier EXTERN int fperror; 4407dd7cddfSDavid du Colombier EXTERN Sym* hash[NHASH]; 4416891d857SDavid du Colombier EXTERN int hasdoubled; 4427dd7cddfSDavid du Colombier EXTERN char* hunk; 4436bbfed0dSDavid du Colombier EXTERN char** include; 4447dd7cddfSDavid du Colombier EXTERN Io* iofree; 4457dd7cddfSDavid du Colombier EXTERN Io* ionext; 4467dd7cddfSDavid du Colombier EXTERN Io* iostack; 4477dd7cddfSDavid du Colombier EXTERN long lastbit; 4487dd7cddfSDavid du Colombier EXTERN char lastclass; 4497dd7cddfSDavid du Colombier EXTERN Type* lastdcl; 4507dd7cddfSDavid du Colombier EXTERN long lastfield; 4517dd7cddfSDavid du Colombier EXTERN Type* lasttype; 4527dd7cddfSDavid du Colombier EXTERN long lineno; 4536bbfed0dSDavid du Colombier EXTERN int maxinclude; 45440d01547SDavid du Colombier EXTERN long nearln; 4557dd7cddfSDavid du Colombier EXTERN int nerrors; 4567dd7cddfSDavid du Colombier EXTERN int newflag; 4577dd7cddfSDavid du Colombier EXTERN long nhunk; 4587dd7cddfSDavid du Colombier EXTERN int ninclude; 4597dd7cddfSDavid du Colombier EXTERN Node* nodproto; 4607dd7cddfSDavid du Colombier EXTERN Node* nodcast; 4617dd7cddfSDavid du Colombier EXTERN Biobuf outbuf; 46218027f8cSDavid du Colombier EXTERN Biobuf diagbuf; 4637dd7cddfSDavid du Colombier EXTERN char* outfile; 4647dd7cddfSDavid du Colombier EXTERN char* pathname; 4657dd7cddfSDavid du Colombier EXTERN int peekc; 4667dd7cddfSDavid du Colombier EXTERN long stkoff; 4677dd7cddfSDavid du Colombier EXTERN Type* strf; 4687dd7cddfSDavid du Colombier EXTERN Type* strl; 4697dd7cddfSDavid du Colombier EXTERN char symb[NSYMB]; 4707dd7cddfSDavid du Colombier EXTERN Sym* symstring; 4717dd7cddfSDavid du Colombier EXTERN int taggen; 4727dd7cddfSDavid du Colombier EXTERN Type* tfield; 4737dd7cddfSDavid du Colombier EXTERN Type* tufield; 4747dd7cddfSDavid du Colombier EXTERN int thechar; 4757dd7cddfSDavid du Colombier EXTERN char* thestring; 4767dd7cddfSDavid du Colombier EXTERN Type* thisfn; 4777dd7cddfSDavid du Colombier EXTERN long thunk; 4787dd7cddfSDavid du Colombier EXTERN Type* types[NTYPE]; 4797dd7cddfSDavid du Colombier EXTERN Type* fntypes[NTYPE]; 4807dd7cddfSDavid du Colombier EXTERN Node* initlist; 4817dd7cddfSDavid du Colombier EXTERN Term term[NTERM]; 4827dd7cddfSDavid du Colombier EXTERN int nterm; 4839847521cSDavid du Colombier EXTERN int packflg; 4847dd7cddfSDavid du Colombier EXTERN int fproundflg; 485e288d156SDavid du Colombier EXTERN int profileflg; 486b85a8364SDavid du Colombier EXTERN int ncontin; 487d40255d8SDavid du Colombier EXTERN int newvlongcode; 488b85a8364SDavid du Colombier EXTERN int canreach; 489b85a8364SDavid du Colombier EXTERN int warnreach; 4907dd7cddfSDavid du Colombier EXTERN Bits zbits; 4917dd7cddfSDavid du Colombier 4927dd7cddfSDavid du Colombier extern char *onames[], *tnames[], *gnames[]; 4937dd7cddfSDavid du Colombier extern char *cnames[], *qnames[], *bnames[]; 4943e12c5d1SDavid du Colombier extern char tab[NTYPE][NTYPE]; 495219b2ee8SDavid du Colombier extern char comrel[], invrel[], logrel[]; 4967dd7cddfSDavid du Colombier extern long ncast[], tadd[], tand[]; 4973e12c5d1SDavid du Colombier extern long targ[], tasadd[], tasign[], tcast[]; 4983e12c5d1SDavid du Colombier extern long tdot[], tfunct[], tindir[], tmul[]; 4993e12c5d1SDavid du Colombier extern long tnot[], trel[], tsub[]; 5003e12c5d1SDavid du Colombier 501219b2ee8SDavid du Colombier extern char typeaf[]; 502219b2ee8SDavid du Colombier extern char typefd[]; 503219b2ee8SDavid du Colombier extern char typei[]; 504219b2ee8SDavid du Colombier extern char typesu[]; 505219b2ee8SDavid du Colombier extern char typesuv[]; 506219b2ee8SDavid du Colombier extern char typeu[]; 507219b2ee8SDavid du Colombier extern char typev[]; 508219b2ee8SDavid du Colombier extern char typec[]; 509219b2ee8SDavid du Colombier extern char typeh[]; 5107dd7cddfSDavid du Colombier extern char typeil[]; 5117dd7cddfSDavid du Colombier extern char typeilp[]; 512219b2ee8SDavid du Colombier extern char typechl[]; 513da51d93aSDavid du Colombier extern char typechlv[]; 51422a127bbSDavid du Colombier extern char typechlvp[]; 515219b2ee8SDavid du Colombier extern char typechlp[]; 516219b2ee8SDavid du Colombier extern char typechlpfd[]; 517219b2ee8SDavid du Colombier 5183a276d32SDavid du Colombier EXTERN char* typeswitch; 5194ac975e2SDavid du Colombier EXTERN char* typeword; 5204ac975e2SDavid du Colombier EXTERN char* typecmplx; 5214ac975e2SDavid du Colombier 5227dd7cddfSDavid du Colombier extern ulong thash1; 5237dd7cddfSDavid du Colombier extern ulong thash2; 5247dd7cddfSDavid du Colombier extern ulong thash3; 5257dd7cddfSDavid du Colombier extern ulong thash[]; 5267dd7cddfSDavid du Colombier 5273e12c5d1SDavid du Colombier /* 5287dd7cddfSDavid du Colombier * compat.c/unix.c/windows.c 5293e12c5d1SDavid du Colombier */ 5307dd7cddfSDavid du Colombier int mywait(int*); 5313e12c5d1SDavid du Colombier int mycreat(char*, int); 5327dd7cddfSDavid du Colombier int systemtype(int); 5337dd7cddfSDavid du Colombier int pathchar(void); 53480ee5cbfSDavid du Colombier int myaccess(char*); 5357dd7cddfSDavid du Colombier char* mygetwd(char*, int); 5367dd7cddfSDavid du Colombier int myexec(char*, char*[]); 5377dd7cddfSDavid du Colombier int mydup(int, int); 5387dd7cddfSDavid du Colombier int myfork(void); 5397dd7cddfSDavid du Colombier int mypipe(int*); 5407dd7cddfSDavid du Colombier void* mysbrk(ulong); 5413e12c5d1SDavid du Colombier 5423e12c5d1SDavid du Colombier /* 5433e12c5d1SDavid du Colombier * parser 5443e12c5d1SDavid du Colombier */ 5453e12c5d1SDavid du Colombier int yyparse(void); 546219b2ee8SDavid du Colombier int mpatov(char*, vlong*); 5473e12c5d1SDavid du Colombier 5483e12c5d1SDavid du Colombier /* 5493e12c5d1SDavid du Colombier * lex.c 5503e12c5d1SDavid du Colombier */ 5517dd7cddfSDavid du Colombier void* allocn(void*, long, long); 5527dd7cddfSDavid du Colombier void* alloc(long); 5533e12c5d1SDavid du Colombier void cinit(void); 5547dd7cddfSDavid du Colombier int compile(char*, char**, int); 5553e12c5d1SDavid du Colombier void errorexit(void); 5563e12c5d1SDavid du Colombier int filbuf(void); 5573e12c5d1SDavid du Colombier int getc(void); 5583e12c5d1SDavid du Colombier long getr(void); 5593e12c5d1SDavid du Colombier int getnsc(void); 5603e12c5d1SDavid du Colombier Sym* lookup(void); 5613e12c5d1SDavid du Colombier void main(int, char*[]); 5623e12c5d1SDavid du Colombier void newfile(char*, int); 5633e12c5d1SDavid du Colombier void newio(void); 5643e12c5d1SDavid du Colombier void pushio(void); 5653e12c5d1SDavid du Colombier long escchar(long, int, int); 5663e12c5d1SDavid du Colombier Sym* slookup(char*); 5673e12c5d1SDavid du Colombier void syminit(Sym*); 5683e12c5d1SDavid du Colombier void unget(int); 5693e12c5d1SDavid du Colombier long yylex(void); 5709a747e4fSDavid du Colombier int Lconv(Fmt*); 5719a747e4fSDavid du Colombier int Tconv(Fmt*); 5729a747e4fSDavid du Colombier int FNconv(Fmt*); 5739a747e4fSDavid du Colombier int Oconv(Fmt*); 5749a747e4fSDavid du Colombier int Qconv(Fmt*); 5759a747e4fSDavid du Colombier int VBconv(Fmt*); 5767dd7cddfSDavid du Colombier void setinclude(char*); 5773e12c5d1SDavid du Colombier 5783e12c5d1SDavid du Colombier /* 5793e12c5d1SDavid du Colombier * mac.c 5803e12c5d1SDavid du Colombier */ 5813e12c5d1SDavid du Colombier void dodefine(char*); 5823e12c5d1SDavid du Colombier void domacro(void); 5833e12c5d1SDavid du Colombier Sym* getsym(void); 5847dd7cddfSDavid du Colombier long getnsn(void); 5853e12c5d1SDavid du Colombier void linehist(char*, int); 5863e12c5d1SDavid du Colombier void macdef(void); 5873e12c5d1SDavid du Colombier void macprag(void); 5883e12c5d1SDavid du Colombier void macend(void); 5893e12c5d1SDavid du Colombier void macexpand(Sym*, char*); 5903e12c5d1SDavid du Colombier void macif(int); 5913e12c5d1SDavid du Colombier void macinc(void); 5923e12c5d1SDavid du Colombier void maclin(void); 5933e12c5d1SDavid du Colombier void macund(void); 5943e12c5d1SDavid du Colombier 5953e12c5d1SDavid du Colombier /* 5963e12c5d1SDavid du Colombier * dcl.c 5973e12c5d1SDavid du Colombier */ 5983e12c5d1SDavid du Colombier Node* doinit(Sym*, Type*, long, Node*); 5993e12c5d1SDavid du Colombier Type* tcopy(Type*); 6003e12c5d1SDavid du Colombier Node* init1(Sym*, Type*, long, int); 6013e12c5d1SDavid du Colombier Node* newlist(Node*, Node*); 6023e12c5d1SDavid du Colombier void adecl(int, Type*, Sym*); 6033e12c5d1SDavid du Colombier int anyproto(Node*); 6043e12c5d1SDavid du Colombier void argmark(Node*, int); 6053e12c5d1SDavid du Colombier void dbgdecl(Sym*); 6063e12c5d1SDavid du Colombier Node* dcllabel(Sym*, int); 6073e12c5d1SDavid du Colombier Node* dodecl(void(*)(int, Type*, Sym*), int, Type*, Node*); 6083e12c5d1SDavid du Colombier Sym* mkstatic(Sym*); 6093e12c5d1SDavid du Colombier void doenum(Sym*, Node*); 6107dd7cddfSDavid du Colombier void snap(Type*); 611219b2ee8SDavid du Colombier Type* dotag(Sym*, int, int); 6123e12c5d1SDavid du Colombier void edecl(int, Type*, Sym*); 6133e12c5d1SDavid du Colombier Type* fnproto(Node*); 6143e12c5d1SDavid du Colombier Type* fnproto1(Node*); 6153e12c5d1SDavid du Colombier void markdcl(void); 6163e12c5d1SDavid du Colombier Type* paramconv(Type*, int); 6173e12c5d1SDavid du Colombier void pdecl(int, Type*, Sym*); 6183e12c5d1SDavid du Colombier Decl* push(void); 6193e12c5d1SDavid du Colombier Decl* push1(Sym*); 6207dd7cddfSDavid du Colombier Node* revertdcl(void); 6217dd7cddfSDavid du Colombier long round(long, int); 6227dd7cddfSDavid du Colombier int rsametype(Type*, Type*, int, int); 6233e12c5d1SDavid du Colombier int sametype(Type*, Type*); 624375daca8SDavid du Colombier ulong sign(Sym*); 625375daca8SDavid du Colombier ulong signature(Type*); 626d40255d8SDavid du Colombier void sualign(Type*); 6273e12c5d1SDavid du Colombier void tmerge(Type*, Sym*); 6283e12c5d1SDavid du Colombier void walkparam(Node*, int); 6293e12c5d1SDavid du Colombier void xdecl(int, Type*, Sym*); 6303e12c5d1SDavid du Colombier Node* contig(Sym*, Node*, long); 6313e12c5d1SDavid du Colombier 6323e12c5d1SDavid du Colombier /* 6333e12c5d1SDavid du Colombier * com.c 6343e12c5d1SDavid du Colombier */ 6353e12c5d1SDavid du Colombier void ccom(Node*); 6363e12c5d1SDavid du Colombier void complex(Node*); 6373e12c5d1SDavid du Colombier int tcom(Node*); 6383e12c5d1SDavid du Colombier int tcoma(Node*, Node*, Type*, int); 6393e12c5d1SDavid du Colombier int tcomd(Node*); 6403e12c5d1SDavid du Colombier int tcomo(Node*, int); 6413e12c5d1SDavid du Colombier int tcomx(Node*); 6423e12c5d1SDavid du Colombier int tlvalue(Node*); 6437dd7cddfSDavid du Colombier void constas(Node*, Type*, Type*); 644d40255d8SDavid du Colombier Node* uncomma(Node*); 645d40255d8SDavid du Colombier Node* uncomargs(Node*); 6463e12c5d1SDavid du Colombier 6473e12c5d1SDavid du Colombier /* 6483e12c5d1SDavid du Colombier * con.c 6493e12c5d1SDavid du Colombier */ 6503e12c5d1SDavid du Colombier void acom(Node*); 651219b2ee8SDavid du Colombier void acom1(vlong, Node*); 6523e12c5d1SDavid du Colombier void acom2(Node*, Type*); 6537dd7cddfSDavid du Colombier int acomcmp1(const void*, const void*); 6547dd7cddfSDavid du Colombier int acomcmp2(const void*, const void*); 6553e12c5d1SDavid du Colombier int addo(Node*); 6563e12c5d1SDavid du Colombier void evconst(Node*); 6573e12c5d1SDavid du Colombier 6583e12c5d1SDavid du Colombier /* 65980ee5cbfSDavid du Colombier * funct.c 66080ee5cbfSDavid du Colombier */ 66180ee5cbfSDavid du Colombier int isfunct(Node*); 66280ee5cbfSDavid du Colombier void dclfunct(Type*, Sym*); 66380ee5cbfSDavid du Colombier 66480ee5cbfSDavid du Colombier /* 6653e12c5d1SDavid du Colombier * sub.c 6663e12c5d1SDavid du Colombier */ 6673e12c5d1SDavid du Colombier void arith(Node*, int); 66840d01547SDavid du Colombier int castucom(Node*); 6699a747e4fSDavid du Colombier int deadheads(Node*); 67080ee5cbfSDavid du Colombier Type* dotsearch(Sym*, Type*, Node*, long*); 6713e12c5d1SDavid du Colombier long dotoffset(Type*, Type*, Node*); 6723e12c5d1SDavid du Colombier void gethunk(void); 6733e12c5d1SDavid du Colombier Node* invert(Node*); 6743e12c5d1SDavid du Colombier int bitno(long); 6753e12c5d1SDavid du Colombier void makedot(Node*, Type*, long); 676ce941d97SDavid du Colombier int mixedasop(Type*, Type*); 6773e12c5d1SDavid du Colombier Node* new(int, Node*, Node*); 6783e12c5d1SDavid du Colombier Node* new1(int, Node*, Node*); 6793e12c5d1SDavid du Colombier int nilcast(Type*, Type*); 6803e12c5d1SDavid du Colombier int nocast(Type*, Type*); 6813e12c5d1SDavid du Colombier void prtree(Node*, char*); 6823e12c5d1SDavid du Colombier void prtree1(Node*, int, int); 6833e12c5d1SDavid du Colombier void relcon(Node*, Node*); 6843e12c5d1SDavid du Colombier int relindex(int); 6857dd7cddfSDavid du Colombier int simpleg(long); 6867dd7cddfSDavid du Colombier Type* garbt(Type*, long); 6873e12c5d1SDavid du Colombier int simplec(long); 6883e12c5d1SDavid du Colombier Type* simplet(long); 6893e12c5d1SDavid du Colombier int stcompat(Node*, Type*, Type*, long[]); 6903e12c5d1SDavid du Colombier int tcompat(Node*, Type*, Type*, long[]); 6917dd7cddfSDavid du Colombier void tinit(void); 6923e12c5d1SDavid du Colombier Type* typ(int, Type*); 69380ee5cbfSDavid du Colombier Type* copytyp(Type*); 6943e12c5d1SDavid du Colombier void typeext(Type*, Node*); 695219b2ee8SDavid du Colombier void typeext1(Type*, Node*); 6963e12c5d1SDavid du Colombier int side(Node*); 6973e12c5d1SDavid du Colombier int vconst(Node*); 698282e677fSDavid du Colombier int log2(uvlong); 6997dd7cddfSDavid du Colombier int vlog(Node*); 7007dd7cddfSDavid du Colombier int topbit(ulong); 701375daca8SDavid du Colombier void simplifyshift(Node*); 7027dd7cddfSDavid du Colombier long typebitor(long, long); 7033e12c5d1SDavid du Colombier void diag(Node*, char*, ...); 7043e12c5d1SDavid du Colombier void warn(Node*, char*, ...); 7053e12c5d1SDavid du Colombier void yyerror(char*, ...); 706375daca8SDavid du Colombier void fatal(Node*, char*, ...); 7073e12c5d1SDavid du Colombier 7083e12c5d1SDavid du Colombier /* 709219b2ee8SDavid du Colombier * acid.c 710219b2ee8SDavid du Colombier */ 711219b2ee8SDavid du Colombier void acidtype(Type*); 712219b2ee8SDavid du Colombier void acidvar(Sym*); 713219b2ee8SDavid du Colombier 714219b2ee8SDavid du Colombier /* 71580ee5cbfSDavid du Colombier * pickle.c 71680ee5cbfSDavid du Colombier */ 71780ee5cbfSDavid du Colombier void pickletype(Type*); 71880ee5cbfSDavid du Colombier 71980ee5cbfSDavid du Colombier /* 7207dd7cddfSDavid du Colombier * bits.c 7217dd7cddfSDavid du Colombier */ 7227dd7cddfSDavid du Colombier Bits bor(Bits, Bits); 7237dd7cddfSDavid du Colombier Bits band(Bits, Bits); 7247dd7cddfSDavid du Colombier Bits bnot(Bits); 7257dd7cddfSDavid du Colombier int bany(Bits*); 7267dd7cddfSDavid du Colombier int bnum(Bits); 7277dd7cddfSDavid du Colombier Bits blsh(uint); 7287dd7cddfSDavid du Colombier int beq(Bits, Bits); 7297dd7cddfSDavid du Colombier int bset(Bits, uint); 7307dd7cddfSDavid du Colombier 7317dd7cddfSDavid du Colombier /* 7327dd7cddfSDavid du Colombier * dpchk.c 7337dd7cddfSDavid du Colombier */ 7347dd7cddfSDavid du Colombier void dpcheck(Node*); 7357dd7cddfSDavid du Colombier void arginit(void); 7367dd7cddfSDavid du Colombier void pragvararg(void); 7379847521cSDavid du Colombier void pragpack(void); 7387dd7cddfSDavid du Colombier void pragfpround(void); 739e288d156SDavid du Colombier void pragprofile(void); 740375daca8SDavid du Colombier void pragincomplete(void); 7417dd7cddfSDavid du Colombier 7427dd7cddfSDavid du Colombier /* 7433e12c5d1SDavid du Colombier * calls to machine depend part 7443e12c5d1SDavid du Colombier */ 7453e12c5d1SDavid du Colombier void codgen(Node*, Node*); 7463e12c5d1SDavid du Colombier void gclean(void); 7473e12c5d1SDavid du Colombier void gextern(Sym*, Node*, long, long); 7483e12c5d1SDavid du Colombier void ginit(void); 7493e12c5d1SDavid du Colombier long outstring(char*, long); 75082726826SDavid du Colombier long outlstring(TRune*, long); 7513e12c5d1SDavid du Colombier void xcom(Node*); 7523e12c5d1SDavid du Colombier long exreg(Type*); 7537dd7cddfSDavid du Colombier long align(long, Type*, int); 7547dd7cddfSDavid du Colombier long maxround(long, long); 7553e12c5d1SDavid du Colombier 7563e12c5d1SDavid du Colombier extern schar ewidth[]; 757219b2ee8SDavid du Colombier 758219b2ee8SDavid du Colombier /* 759219b2ee8SDavid du Colombier * com64 760219b2ee8SDavid du Colombier */ 761219b2ee8SDavid du Colombier int com64(Node*); 762219b2ee8SDavid du Colombier void com64init(void); 763219b2ee8SDavid du Colombier void bool64(Node*); 764219b2ee8SDavid du Colombier double convvtof(vlong); 765219b2ee8SDavid du Colombier vlong convftov(double); 766219b2ee8SDavid du Colombier double convftox(double, int); 767219b2ee8SDavid du Colombier vlong convvtox(vlong, int); 7687dd7cddfSDavid du Colombier 769da51d93aSDavid du Colombier /* 770da51d93aSDavid du Colombier * machcap 771da51d93aSDavid du Colombier */ 772da51d93aSDavid du Colombier int machcap(Node*); 773da51d93aSDavid du Colombier 7747dd7cddfSDavid du Colombier #pragma varargck argpos warn 2 7757dd7cddfSDavid du Colombier #pragma varargck argpos diag 2 7767dd7cddfSDavid du Colombier #pragma varargck argpos yyerror 1 7777dd7cddfSDavid du Colombier 7787dd7cddfSDavid du Colombier #pragma varargck type "F" Node* 7797dd7cddfSDavid du Colombier #pragma varargck type "L" long 7807dd7cddfSDavid du Colombier #pragma varargck type "Q" long 7817dd7cddfSDavid du Colombier #pragma varargck type "O" int 7827dd7cddfSDavid du Colombier #pragma varargck type "T" Type* 7837dd7cddfSDavid du Colombier #pragma varargck type "|" int 784