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