1fbadb1c4SDavid du Colombier #include <u.h> 2fbadb1c4SDavid du Colombier #include <libc.h> 3fbadb1c4SDavid du Colombier #include <bio.h> 4fbadb1c4SDavid du Colombier #include "../9c/9.out.h" 5fbadb1c4SDavid du Colombier 6fbadb1c4SDavid du Colombier #ifndef EXTERN 7fbadb1c4SDavid du Colombier #define EXTERN extern 8fbadb1c4SDavid du Colombier #endif 9fbadb1c4SDavid du Colombier 10fbadb1c4SDavid du Colombier typedef struct Sym Sym; 11fbadb1c4SDavid du Colombier typedef struct Gen Gen; 12fbadb1c4SDavid du Colombier typedef struct Io Io; 13fbadb1c4SDavid du Colombier typedef struct Hist Hist; 14fbadb1c4SDavid du Colombier 15fbadb1c4SDavid du Colombier #define MAXALIGN 7 16fbadb1c4SDavid du Colombier #define FPCHIP 1 17fbadb1c4SDavid du Colombier #define NSYMB 8192 18*2ec6491fSDavid du Colombier #define BUFSIZ (16*1024) 19fbadb1c4SDavid du Colombier #define HISTSZ 20 20fbadb1c4SDavid du Colombier #define NINCLUDE 10 21fbadb1c4SDavid du Colombier #define NHUNK 10000 22fbadb1c4SDavid du Colombier #define EOF (-1) 23fbadb1c4SDavid du Colombier #define IGN (-2) 24fbadb1c4SDavid du Colombier #define GETC() ((--fi.c < 0)? filbuf(): *fi.p++ & 0xff) 25fbadb1c4SDavid du Colombier #define NHASH 503 26fbadb1c4SDavid du Colombier #define STRINGSZ 200 27fbadb1c4SDavid du Colombier #define NMACRO 10 28fbadb1c4SDavid du Colombier 29fbadb1c4SDavid du Colombier #define ALLOC(lhs, type)\ 30fbadb1c4SDavid du Colombier while(nhunk < sizeof(type))\ 31fbadb1c4SDavid du Colombier gethunk();\ 32fbadb1c4SDavid du Colombier lhs = (type*)hunk;\ 33fbadb1c4SDavid du Colombier nhunk -= sizeof(type);\ 34fbadb1c4SDavid du Colombier hunk += sizeof(type); 35fbadb1c4SDavid du Colombier 36fbadb1c4SDavid du Colombier #define ALLOCN(lhs, len, n)\ 37fbadb1c4SDavid du Colombier if(lhs+len != hunk || nhunk < n) {\ 38fbadb1c4SDavid du Colombier while(nhunk <= len)\ 39fbadb1c4SDavid du Colombier gethunk();\ 40fbadb1c4SDavid du Colombier memmove(hunk, lhs, len);\ 41fbadb1c4SDavid du Colombier lhs = hunk;\ 42fbadb1c4SDavid du Colombier hunk += len;\ 43fbadb1c4SDavid du Colombier nhunk -= len;\ 44fbadb1c4SDavid du Colombier }\ 45fbadb1c4SDavid du Colombier hunk += n;\ 46fbadb1c4SDavid du Colombier nhunk -= n; 47fbadb1c4SDavid du Colombier 48fbadb1c4SDavid du Colombier struct Sym 49fbadb1c4SDavid du Colombier { 50fbadb1c4SDavid du Colombier Sym* link; 51fbadb1c4SDavid du Colombier char* macro; 52fbadb1c4SDavid du Colombier vlong value; 53fbadb1c4SDavid du Colombier ushort type; 54fbadb1c4SDavid du Colombier char *name; 55fbadb1c4SDavid du Colombier char sym; 56fbadb1c4SDavid du Colombier }; 57fbadb1c4SDavid du Colombier #define S ((Sym*)0) 58fbadb1c4SDavid du Colombier 59fbadb1c4SDavid du Colombier struct 60fbadb1c4SDavid du Colombier { 61fbadb1c4SDavid du Colombier char* p; 62fbadb1c4SDavid du Colombier int c; 63fbadb1c4SDavid du Colombier } fi; 64fbadb1c4SDavid du Colombier 65fbadb1c4SDavid du Colombier struct Io 66fbadb1c4SDavid du Colombier { 67fbadb1c4SDavid du Colombier Io* link; 68fbadb1c4SDavid du Colombier char b[BUFSIZ]; 69fbadb1c4SDavid du Colombier char* p; 70fbadb1c4SDavid du Colombier short c; 71fbadb1c4SDavid du Colombier short f; 72fbadb1c4SDavid du Colombier }; 73fbadb1c4SDavid du Colombier #define I ((Io*)0) 74fbadb1c4SDavid du Colombier 75fbadb1c4SDavid du Colombier struct 76fbadb1c4SDavid du Colombier { 77fbadb1c4SDavid du Colombier Sym* sym; 78fbadb1c4SDavid du Colombier short type; 79fbadb1c4SDavid du Colombier } h[NSYM]; 80fbadb1c4SDavid du Colombier 81fbadb1c4SDavid du Colombier struct Gen 82fbadb1c4SDavid du Colombier { 83fbadb1c4SDavid du Colombier Sym* sym; 84fbadb1c4SDavid du Colombier vlong offset; 85fbadb1c4SDavid du Colombier short type; 86fbadb1c4SDavid du Colombier short reg; 87fbadb1c4SDavid du Colombier short xreg; 88fbadb1c4SDavid du Colombier short name; 89fbadb1c4SDavid du Colombier ushort mask; 90fbadb1c4SDavid du Colombier double dval; 91fbadb1c4SDavid du Colombier char sval[8]; 92fbadb1c4SDavid du Colombier }; 93fbadb1c4SDavid du Colombier 94fbadb1c4SDavid du Colombier struct Hist 95fbadb1c4SDavid du Colombier { 96fbadb1c4SDavid du Colombier Hist* link; 97fbadb1c4SDavid du Colombier char* name; 98fbadb1c4SDavid du Colombier long line; 99fbadb1c4SDavid du Colombier vlong offset; 100fbadb1c4SDavid du Colombier }; 101fbadb1c4SDavid du Colombier #define H ((Hist*)0) 102fbadb1c4SDavid du Colombier 103fbadb1c4SDavid du Colombier enum 104fbadb1c4SDavid du Colombier { 105fbadb1c4SDavid du Colombier CLAST, 106fbadb1c4SDavid du Colombier CMACARG, 107fbadb1c4SDavid du Colombier CMACRO, 108fbadb1c4SDavid du Colombier CPREPROC 109fbadb1c4SDavid du Colombier }; 110fbadb1c4SDavid du Colombier 111fbadb1c4SDavid du Colombier EXTERN char debug[256]; 112fbadb1c4SDavid du Colombier EXTERN Sym* hash[NHASH]; 113fbadb1c4SDavid du Colombier EXTERN char* Dlist[30]; 114fbadb1c4SDavid du Colombier EXTERN int nDlist; 115fbadb1c4SDavid du Colombier EXTERN Hist* ehist; 116fbadb1c4SDavid du Colombier EXTERN int newflag; 117fbadb1c4SDavid du Colombier EXTERN Hist* hist; 118fbadb1c4SDavid du Colombier EXTERN char* hunk; 119fbadb1c4SDavid du Colombier EXTERN char* include[NINCLUDE]; 120fbadb1c4SDavid du Colombier EXTERN Io* iofree; 121fbadb1c4SDavid du Colombier EXTERN Io* ionext; 122fbadb1c4SDavid du Colombier EXTERN Io* iostack; 123fbadb1c4SDavid du Colombier EXTERN long lineno; 124fbadb1c4SDavid du Colombier EXTERN int nerrors; 125fbadb1c4SDavid du Colombier EXTERN long nhunk; 126fbadb1c4SDavid du Colombier EXTERN int nosched; 127fbadb1c4SDavid du Colombier EXTERN int ninclude; 128fbadb1c4SDavid du Colombier EXTERN Gen nullgen; 129fbadb1c4SDavid du Colombier EXTERN char* outfile; 130fbadb1c4SDavid du Colombier EXTERN int pass; 131fbadb1c4SDavid du Colombier EXTERN char* pathname; 132fbadb1c4SDavid du Colombier EXTERN long pc; 133fbadb1c4SDavid du Colombier EXTERN int peekc; 134fbadb1c4SDavid du Colombier EXTERN int sym; 135fbadb1c4SDavid du Colombier EXTERN char symb[NSYMB]; 136fbadb1c4SDavid du Colombier EXTERN int thechar; 137fbadb1c4SDavid du Colombier EXTERN char* thestring; 138fbadb1c4SDavid du Colombier EXTERN long thunk; 139fbadb1c4SDavid du Colombier EXTERN Biobuf obuf; 140fbadb1c4SDavid du Colombier 141fbadb1c4SDavid du Colombier void errorexit(void); 142fbadb1c4SDavid du Colombier void pushio(void); 143fbadb1c4SDavid du Colombier void newio(void); 144fbadb1c4SDavid du Colombier void newfile(char*, int); 145fbadb1c4SDavid du Colombier Sym* slookup(char*); 146fbadb1c4SDavid du Colombier Sym* lookup(void); 147fbadb1c4SDavid du Colombier void syminit(Sym*); 148fbadb1c4SDavid du Colombier long yylex(void); 149fbadb1c4SDavid du Colombier int getc(void); 150fbadb1c4SDavid du Colombier int getnsc(void); 151fbadb1c4SDavid du Colombier void unget(int); 152fbadb1c4SDavid du Colombier int escchar(int); 153fbadb1c4SDavid du Colombier void cinit(void); 154fbadb1c4SDavid du Colombier void pinit(char*); 155fbadb1c4SDavid du Colombier void cclean(void); 156fbadb1c4SDavid du Colombier void outcode(int, Gen*, int, Gen*); 157fbadb1c4SDavid du Colombier void outgcode(int, Gen*, int, Gen*, Gen*); 158fbadb1c4SDavid du Colombier void zname(char*, int, int); 159fbadb1c4SDavid du Colombier void zaddr(Gen*, int); 160fbadb1c4SDavid du Colombier void ieeedtod(Ieee*, double); 161fbadb1c4SDavid du Colombier int filbuf(void); 162fbadb1c4SDavid du Colombier Sym* getsym(void); 163fbadb1c4SDavid du Colombier void domacro(void); 164fbadb1c4SDavid du Colombier void macund(void); 165fbadb1c4SDavid du Colombier void macdef(void); 166fbadb1c4SDavid du Colombier void macexpand(Sym*, char*); 167fbadb1c4SDavid du Colombier void macinc(void); 168fbadb1c4SDavid du Colombier void macprag(void); 169fbadb1c4SDavid du Colombier void maclin(void); 170fbadb1c4SDavid du Colombier void macif(int); 171fbadb1c4SDavid du Colombier void macend(void); 172fbadb1c4SDavid du Colombier void dodefine(char*); 173fbadb1c4SDavid du Colombier void prfile(long); 174fbadb1c4SDavid du Colombier void outhist(void); 175fbadb1c4SDavid du Colombier void linehist(char*, int); 176fbadb1c4SDavid du Colombier void gethunk(void); 177fbadb1c4SDavid du Colombier void yyerror(char*, ...); 178fbadb1c4SDavid du Colombier int yyparse(void); 179fbadb1c4SDavid du Colombier void setinclude(char*); 180fbadb1c4SDavid du Colombier int assemble(char*); 181fbadb1c4SDavid du Colombier 182fbadb1c4SDavid du Colombier /* 183fbadb1c4SDavid du Colombier * system-dependent stuff from ../cc/compat.c 184fbadb1c4SDavid du Colombier */ 185fbadb1c4SDavid du Colombier enum /* keep in synch with ../cc/cc.h */ 186fbadb1c4SDavid du Colombier { 187fbadb1c4SDavid du Colombier Plan9 = 1<<0, 188fbadb1c4SDavid du Colombier Unix = 1<<1, 189fbadb1c4SDavid du Colombier Windows = 1<<2 190fbadb1c4SDavid du Colombier }; 191fbadb1c4SDavid du Colombier int mywait(int*); 192fbadb1c4SDavid du Colombier int mycreat(char*, int); 193fbadb1c4SDavid du Colombier int systemtype(int); 194fbadb1c4SDavid du Colombier int pathchar(void); 195fbadb1c4SDavid du Colombier char* mygetwd(char*, int); 196fbadb1c4SDavid du Colombier int myexec(char*, char*[]); 197fbadb1c4SDavid du Colombier int mydup(int, int); 198fbadb1c4SDavid du Colombier int myfork(void); 199fbadb1c4SDavid du Colombier int mypipe(int*); 200fbadb1c4SDavid du Colombier void* mysbrk(ulong); 201