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