1*375daca8SDavid du Colombier #include <u.h> 2*375daca8SDavid du Colombier #include <libc.h> 3*375daca8SDavid du Colombier #include <bio.h> 4*375daca8SDavid du Colombier #include "../qc/q.out.h" 5*375daca8SDavid du Colombier 6*375daca8SDavid du Colombier #ifndef EXTERN 7*375daca8SDavid du Colombier #define EXTERN extern 8*375daca8SDavid du Colombier #endif 97dd7cddfSDavid du Colombier 107dd7cddfSDavid du Colombier typedef struct Sym Sym; 117dd7cddfSDavid du Colombier typedef struct Gen Gen; 127dd7cddfSDavid du Colombier typedef struct Io Io; 137dd7cddfSDavid du Colombier typedef struct Hist Hist; 147dd7cddfSDavid du Colombier 157dd7cddfSDavid du Colombier #define MAXALIGN 7 167dd7cddfSDavid du Colombier #define FPCHIP 1 177dd7cddfSDavid du Colombier #define NSYMB 8192 187dd7cddfSDavid du Colombier #define BUFSIZ 8192 197dd7cddfSDavid du Colombier #define HISTSZ 20 207dd7cddfSDavid du Colombier #define NINCLUDE 10 217dd7cddfSDavid du Colombier #define NHUNK 10000 227dd7cddfSDavid du Colombier #define EOF (-1) 237dd7cddfSDavid du Colombier #define IGN (-2) 247dd7cddfSDavid du Colombier #define GETC() ((--fi.c < 0)? filbuf(): *fi.p++ & 0xff) 257dd7cddfSDavid du Colombier #define NHASH 503 267dd7cddfSDavid du Colombier #define STRINGSZ 200 277dd7cddfSDavid du Colombier #define NMACRO 10 287dd7cddfSDavid du Colombier 297dd7cddfSDavid du Colombier #define ALLOC(lhs, type)\ 307dd7cddfSDavid du Colombier while(nhunk < sizeof(type))\ 317dd7cddfSDavid du Colombier gethunk();\ 327dd7cddfSDavid du Colombier lhs = (type*)hunk;\ 337dd7cddfSDavid du Colombier nhunk -= sizeof(type);\ 347dd7cddfSDavid du Colombier hunk += sizeof(type); 357dd7cddfSDavid du Colombier 367dd7cddfSDavid du Colombier #define ALLOCN(lhs, len, n)\ 377dd7cddfSDavid du Colombier if(lhs+len != hunk || nhunk < n) {\ 387dd7cddfSDavid du Colombier while(nhunk <= len)\ 397dd7cddfSDavid du Colombier gethunk();\ 407dd7cddfSDavid du Colombier memmove(hunk, lhs, len);\ 417dd7cddfSDavid du Colombier lhs = hunk;\ 427dd7cddfSDavid du Colombier hunk += len;\ 437dd7cddfSDavid du Colombier nhunk -= len;\ 447dd7cddfSDavid du Colombier }\ 457dd7cddfSDavid du Colombier hunk += n;\ 467dd7cddfSDavid du Colombier nhunk -= n; 477dd7cddfSDavid du Colombier 487dd7cddfSDavid du Colombier struct Sym 497dd7cddfSDavid du Colombier { 507dd7cddfSDavid du Colombier Sym* link; 517dd7cddfSDavid du Colombier char* macro; 527dd7cddfSDavid du Colombier long value; 537dd7cddfSDavid du Colombier ushort type; 547dd7cddfSDavid du Colombier char *name; 557dd7cddfSDavid du Colombier char sym; 567dd7cddfSDavid du Colombier }; 577dd7cddfSDavid du Colombier #define S ((Sym*)0) 587dd7cddfSDavid du Colombier 597dd7cddfSDavid du Colombier struct 607dd7cddfSDavid du Colombier { 617dd7cddfSDavid du Colombier char* p; 627dd7cddfSDavid du Colombier int c; 637dd7cddfSDavid du Colombier } fi; 647dd7cddfSDavid du Colombier 657dd7cddfSDavid du Colombier struct Io 667dd7cddfSDavid du Colombier { 677dd7cddfSDavid du Colombier Io* link; 687dd7cddfSDavid du Colombier char b[BUFSIZ]; 697dd7cddfSDavid du Colombier char* p; 707dd7cddfSDavid du Colombier short c; 717dd7cddfSDavid du Colombier short f; 727dd7cddfSDavid du Colombier }; 737dd7cddfSDavid du Colombier #define I ((Io*)0) 747dd7cddfSDavid du Colombier 757dd7cddfSDavid du Colombier struct 767dd7cddfSDavid du Colombier { 777dd7cddfSDavid du Colombier Sym* sym; 787dd7cddfSDavid du Colombier short type; 797dd7cddfSDavid du Colombier } h[NSYM]; 807dd7cddfSDavid du Colombier 817dd7cddfSDavid du Colombier struct Gen 827dd7cddfSDavid du Colombier { 837dd7cddfSDavid du Colombier Sym* sym; 847dd7cddfSDavid du Colombier long offset; 857dd7cddfSDavid du Colombier short type; 867dd7cddfSDavid du Colombier short reg; 877dd7cddfSDavid du Colombier short xreg; 887dd7cddfSDavid du Colombier short name; 897dd7cddfSDavid du Colombier ushort mask; 907dd7cddfSDavid du Colombier double dval; 917dd7cddfSDavid du Colombier char sval[8]; 927dd7cddfSDavid du Colombier }; 937dd7cddfSDavid du Colombier 947dd7cddfSDavid du Colombier struct Hist 957dd7cddfSDavid du Colombier { 967dd7cddfSDavid du Colombier Hist* link; 977dd7cddfSDavid du Colombier char* name; 987dd7cddfSDavid du Colombier long line; 997dd7cddfSDavid du Colombier long offset; 1007dd7cddfSDavid du Colombier }; 1017dd7cddfSDavid du Colombier #define H ((Hist*)0) 1027dd7cddfSDavid du Colombier 1037dd7cddfSDavid du Colombier enum 1047dd7cddfSDavid du Colombier { 1057dd7cddfSDavid du Colombier CLAST, 1067dd7cddfSDavid du Colombier CMACARG, 1077dd7cddfSDavid du Colombier CMACRO, 108*375daca8SDavid du Colombier CPREPROC 1097dd7cddfSDavid du Colombier }; 1107dd7cddfSDavid du Colombier 111*375daca8SDavid du Colombier EXTERN char debug[256]; 112*375daca8SDavid du Colombier EXTERN Sym* hash[NHASH]; 113*375daca8SDavid du Colombier EXTERN char* Dlist[30]; 114*375daca8SDavid du Colombier EXTERN int nDlist; 115*375daca8SDavid du Colombier EXTERN Hist* ehist; 116*375daca8SDavid du Colombier EXTERN int newflag; 117*375daca8SDavid du Colombier EXTERN Hist* hist; 118*375daca8SDavid du Colombier EXTERN char* hunk; 119*375daca8SDavid du Colombier EXTERN char* include[NINCLUDE]; 120*375daca8SDavid du Colombier EXTERN Io* iofree; 121*375daca8SDavid du Colombier EXTERN Io* ionext; 122*375daca8SDavid du Colombier EXTERN Io* iostack; 123*375daca8SDavid du Colombier EXTERN long lineno; 124*375daca8SDavid du Colombier EXTERN int nerrors; 125*375daca8SDavid du Colombier EXTERN long nhunk; 126*375daca8SDavid du Colombier EXTERN int nosched; 127*375daca8SDavid du Colombier EXTERN int ninclude; 128*375daca8SDavid du Colombier EXTERN Gen nullgen; 129*375daca8SDavid du Colombier EXTERN char* outfile; 130*375daca8SDavid du Colombier EXTERN int pass; 131*375daca8SDavid du Colombier EXTERN char* pathname; 132*375daca8SDavid du Colombier EXTERN long pc; 133*375daca8SDavid du Colombier EXTERN int peekc; 134*375daca8SDavid du Colombier EXTERN int sym; 135*375daca8SDavid du Colombier EXTERN char symb[NSYMB]; 136*375daca8SDavid du Colombier EXTERN int thechar; 137*375daca8SDavid du Colombier EXTERN char* thestring; 138*375daca8SDavid du Colombier EXTERN long thunk; 139*375daca8SDavid du Colombier EXTERN Biobuf obuf; 1407dd7cddfSDavid du Colombier 1417dd7cddfSDavid du Colombier void errorexit(void); 1427dd7cddfSDavid du Colombier void pushio(void); 1437dd7cddfSDavid du Colombier void newio(void); 1447dd7cddfSDavid du Colombier void newfile(char*, int); 1457dd7cddfSDavid du Colombier Sym* slookup(char*); 1467dd7cddfSDavid du Colombier Sym* lookup(void); 1477dd7cddfSDavid du Colombier void syminit(Sym*); 1487dd7cddfSDavid du Colombier long yylex(void); 1497dd7cddfSDavid du Colombier int getc(void); 1507dd7cddfSDavid du Colombier int getnsc(void); 1517dd7cddfSDavid du Colombier void unget(int); 1527dd7cddfSDavid du Colombier int escchar(int); 1537dd7cddfSDavid du Colombier void cinit(void); 1547dd7cddfSDavid du Colombier void pinit(char*); 1557dd7cddfSDavid du Colombier void cclean(void); 1567dd7cddfSDavid du Colombier void outcode(int, Gen*, int, Gen*); 1577dd7cddfSDavid du Colombier void outgcode(int, Gen*, int, Gen*, Gen*); 1587dd7cddfSDavid du Colombier void zname(char*, int, int); 1597dd7cddfSDavid du Colombier void zaddr(Gen*, int); 1607dd7cddfSDavid du Colombier void ieeedtod(Ieee*, double); 1617dd7cddfSDavid du Colombier int filbuf(void); 1627dd7cddfSDavid du Colombier Sym* getsym(void); 1637dd7cddfSDavid du Colombier void domacro(void); 1647dd7cddfSDavid du Colombier void macund(void); 1657dd7cddfSDavid du Colombier void macdef(void); 1667dd7cddfSDavid du Colombier void macexpand(Sym*, char*); 1677dd7cddfSDavid du Colombier void macinc(void); 1687dd7cddfSDavid du Colombier void macprag(void); 1697dd7cddfSDavid du Colombier void maclin(void); 1707dd7cddfSDavid du Colombier void macif(int); 1717dd7cddfSDavid du Colombier void macend(void); 1727dd7cddfSDavid du Colombier void dodefine(char*); 1737dd7cddfSDavid du Colombier void prfile(long); 1747dd7cddfSDavid du Colombier void outhist(void); 1757dd7cddfSDavid du Colombier void linehist(char*, int); 1767dd7cddfSDavid du Colombier void gethunk(void); 1777dd7cddfSDavid du Colombier void yyerror(char*, ...); 1787dd7cddfSDavid du Colombier int yyparse(void); 1797dd7cddfSDavid du Colombier void setinclude(char*); 1807dd7cddfSDavid du Colombier int assemble(char*); 1817dd7cddfSDavid du Colombier 1827dd7cddfSDavid du Colombier /* 1837dd7cddfSDavid du Colombier * system-dependent stuff from ../cc/compat.c 1847dd7cddfSDavid du Colombier */ 1857dd7cddfSDavid du Colombier enum /* keep in synch with ../cc/cc.h */ 1867dd7cddfSDavid du Colombier { 1877dd7cddfSDavid du Colombier Plan9 = 1<<0, 1887dd7cddfSDavid du Colombier Unix = 1<<1, 189*375daca8SDavid du Colombier Windows = 1<<2 1907dd7cddfSDavid du Colombier }; 1917dd7cddfSDavid du Colombier int mywait(int*); 1927dd7cddfSDavid du Colombier int mycreat(char*, int); 1937dd7cddfSDavid du Colombier int systemtype(int); 1947dd7cddfSDavid du Colombier int pathchar(void); 1957dd7cddfSDavid du Colombier char* mygetwd(char*, int); 1967dd7cddfSDavid du Colombier int myexec(char*, char*[]); 1977dd7cddfSDavid du Colombier int mydup(int, int); 1987dd7cddfSDavid du Colombier int myfork(void); 1997dd7cddfSDavid du Colombier int mypipe(int*); 2007dd7cddfSDavid du Colombier void* mysbrk(ulong); 201