1 #include <u.h> 2 #include <libc.h> 3 #include <bio.h> 4 #include "../8c/8.out.h" 5 6 #define P ((Prog*)0) 7 #define S ((Sym*)0) 8 #define TNAME (curtext?curtext->from.sym->name:noname) 9 #define CPUT(c)\ 10 { *cbp++ = c;\ 11 if(--cbc <= 0)\ 12 cflush(); } 13 14 typedef struct Adr Adr; 15 typedef struct Prog Prog; 16 typedef struct Sym Sym; 17 typedef struct Auto Auto; 18 typedef struct Optab Optab; 19 20 struct Adr 21 { 22 union 23 { 24 long offset; 25 char scon[8]; 26 Prog *cond; /* not used, but should be D_BRANCH */ 27 Ieee ieee; 28 }; 29 union 30 { 31 Auto* autom; 32 Sym* sym; 33 }; 34 short type; 35 char index; 36 char scale; 37 }; 38 39 struct Prog 40 { 41 Adr from; 42 Adr to; 43 union 44 { 45 Prog *forwd; 46 }; 47 Prog* link; 48 Prog* cond; /* work on this */ 49 long pc; 50 long line; 51 uchar mark; /* work on these */ 52 uchar back; 53 54 short as; 55 char width; /* fake for DATA */ 56 }; 57 struct Auto 58 { 59 Sym* sym; 60 Auto* link; 61 long offset; 62 short type; 63 }; 64 struct Sym 65 { 66 char *name; 67 short type; 68 short version; 69 short become; 70 short frame; 71 long value; 72 Sym* link; 73 }; 74 struct Optab 75 { 76 short as; 77 uchar* ytab; 78 uchar prefix; 79 uchar op[10]; 80 }; 81 82 enum 83 { 84 STEXT = 1, 85 SDATA, 86 SBSS, 87 SDATA1, 88 SXREF, 89 SFILE, 90 SCONST, 91 92 NHASH = 10007, 93 NHUNK = 100000, 94 MINSIZ = 4, 95 STRINGSZ = 200, 96 MINLC = 1, 97 MAXIO = 8192, 98 MAXHIST = 20, /* limit of path elements for history symbols */ 99 100 Yxxx = 0, 101 Ynone, 102 Yi0, 103 Yi1, 104 Yi8, 105 Yi32, 106 Yiauto, 107 Yal, 108 Ycl, 109 Yax, 110 Ycx, 111 Yrb, 112 Yrl, 113 Yrf, 114 Yf0, 115 Yrx, 116 Ymb, 117 Yml, 118 Ym, 119 Ybr, 120 Ycol, 121 122 Ycs, Yss, Yds, Yes, Yfs, Ygs, 123 Ygdtr, Yidtr, Yldtr, Ymsw, Ytask, 124 Ycr0, Ycr1, Ycr2, Ycr3, Ycr4, Ycr5, Ycr6, Ycr7, 125 Ydr0, Ydr1, Ydr2, Ydr3, Ydr4, Ydr5, Ydr6, Ydr7, 126 Ytr0, Ytr1, Ytr2, Ytr3, Ytr4, Ytr5, Ytr6, Ytr7, 127 Ymax, 128 129 Zxxx = 0, 130 131 Zlit, 132 Z_rp, 133 Zbr, 134 Zcall, 135 Zib_, 136 Zib_rp, 137 Zibo_m, 138 Zil_, 139 Zil_rp, 140 Zilo_m, 141 Zjmp, 142 Zloop, 143 Zm_o, 144 Zm_r, 145 Zaut_r, 146 Zo_m, 147 Zpseudo, 148 Zr_m, 149 Zrp_, 150 Z_ib, 151 Z_il, 152 Zm_ibo, 153 Zm_ilo, 154 Zclr, 155 Zbyte, 156 Zmov, 157 Zmax, 158 159 Px = 0, 160 Pe = 0x66, /* operand escape */ 161 Pm = 0x0f, /* 2byte opcode escape */ 162 Pq = 0xff, /* both escape */ 163 Pb = 0xfe, /* byte operands */ 164 }; 165 166 union 167 { 168 struct 169 { 170 char cbuf[MAXIO]; /* output buffer */ 171 uchar xbuf[MAXIO]; /* input buffer */ 172 }; 173 char dbuf[1]; 174 } buf; 175 176 long HEADR; 177 long HEADTYPE; 178 long INITDAT; 179 long INITRND; 180 long INITTEXT; 181 char* INITENTRY; /* entry point */ 182 Biobuf bso; 183 long bsssize; 184 long casepc; 185 int cbc; 186 char* cbp; 187 char* pcstr; 188 int cout; 189 Auto* curauto; 190 Auto* curhist; 191 Prog* curp; 192 Prog* curtext; 193 Prog* datap; 194 Prog* edatap; 195 long datsize; 196 char debug[128]; 197 char literal[32]; 198 Prog* etextp; 199 Prog* firstp; 200 char fnuxi8[8]; 201 char fnuxi4[4]; 202 Sym* hash[NHASH]; 203 Sym* histfrog[MAXHIST]; 204 int histfrogp; 205 int histgen; 206 char* library[50]; 207 int libraryp; 208 char* hunk; 209 char inuxi1[1]; 210 char inuxi2[2]; 211 char inuxi4[4]; 212 char ycover[Ymax*Ymax]; 213 uchar* andptr; 214 uchar and[10]; 215 char reg[D_NONE]; 216 Prog* lastp; 217 long lcsize; 218 int maxop; 219 int nerrors; 220 long nhunk; 221 long nsymbol; 222 char* noname; 223 char* outfile; 224 long pc; 225 int printcol; 226 long spsize; 227 Sym* symlist; 228 long symsize; 229 Prog* textp; 230 long textsize; 231 long thunk; 232 int version; 233 Prog zprg; 234 int dtype; 235 236 extern Optab optab[]; 237 extern char* anames[]; 238 239 int Aconv(void*, Fconv*); 240 int Dconv(void*, Fconv*); 241 int Pconv(void*, Fconv*); 242 int Rconv(void*, Fconv*); 243 int Sconv(void*, Fconv*); 244 int Xconv(void*, Fconv*); 245 void addhist(long, int); 246 Prog* appendp(Prog*); 247 void asmb(void); 248 void asmins(Prog*); 249 void asmlc(void); 250 void asmsp(void); 251 void asmsym(void); 252 int atoi(char*); 253 long atolwhex(char*); 254 Prog* brchain(Prog*); 255 Prog* brloop(Prog*); 256 void cflush(void); 257 Prog* copyp(Prog*); 258 double cputime(void); 259 void datblk(long, long); 260 void diag(char*, ...); 261 void dodata(void); 262 void doinit(void); 263 void doprof1(void); 264 void doprof2(void); 265 void dostkoff(void); 266 long entryvalue(void); 267 void errorexit(void); 268 int find1(long, int); 269 int find2(long, int); 270 void follow(void); 271 void gethunk(void); 272 void histtoauto(void); 273 double ieeedtod(Ieee*); 274 long ieeedtof(Ieee*); 275 void ldobj(int, long, char*); 276 void loadlib(int, int); 277 void listinit(void); 278 Sym* lookup(char*, int); 279 void lput(long); 280 void lputl(long); 281 void main(int, char*[]); 282 void mkfwd(void); 283 void nuxiinit(void); 284 void objfile(char*); 285 int opsize(Prog*); 286 void patch(void); 287 Prog* prg(void); 288 int relinv(int); 289 long reuse(Prog*, Sym*); 290 long rnd(long, long); 291 void s8put(char*); 292 void span(void); 293 void undef(void); 294 void xdefine(char*, int, long); 295 void xfol(Prog*); 296 int zaddr(uchar*, Adr*, Sym*[]); 297 long vaddr(Adr*); 298