1 #include <lib9.h> 2 #include <bio.h> 3 #include "../6c/6.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 #define cput(c)\ 13 { *cbp++ = c;\ 14 if(--cbc <= 0)\ 15 cflush(); } 16 17 typedef struct Adr Adr; 18 typedef struct Prog Prog; 19 typedef struct Sym Sym; 20 typedef struct Auto Auto; 21 typedef struct Optab Optab; 22 typedef struct Movtab Movtab; 23 24 struct Adr 25 { 26 union 27 { 28 vlong 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 vlong pc; 59 long line; 60 uchar mark; /* work on these */ 61 uchar back; 62 63 short as; 64 char width; /* fake for DATA */ 65 char mode; /* 16, 32, or 64 */ 66 }; 67 struct Auto 68 { 69 Sym* asym; 70 Auto* link; 71 long aoffset; 72 short type; 73 }; 74 struct Sym 75 { 76 char *name; 77 short type; 78 short version; 79 short become; 80 short frame; 81 uchar subtype; 82 ushort file; 83 vlong value; 84 long sig; 85 Sym* link; 86 }; 87 struct Optab 88 { 89 short as; 90 uchar* ytab; 91 uchar prefix; 92 uchar op[20]; 93 }; 94 struct Movtab 95 { 96 short as; 97 uchar ft; 98 uchar tt; 99 uchar code; 100 uchar op[4]; 101 }; 102 103 enum 104 { 105 STEXT = 1, 106 SDATA, 107 SBSS, 108 SDATA1, 109 SXREF, 110 SFILE, 111 SCONST, 112 SUNDEF, 113 114 SIMPORT, 115 SEXPORT, 116 117 NHASH = 10007, 118 NHUNK = 100000, 119 MINSIZ = 8, 120 STRINGSZ = 200, 121 MINLC = 1, 122 MAXIO = 8192, 123 MAXHIST = 20, /* limit of path elements for history symbols */ 124 125 Yxxx = 0, 126 Ynone, 127 Yi0, 128 Yi1, 129 Yi8, 130 Ys32, 131 Yi32, 132 Yi64, 133 Yiauto, 134 Yal, 135 Ycl, 136 Yax, 137 Ycx, 138 Yrb, 139 Yrl, 140 Yrf, 141 Yf0, 142 Yrx, 143 Ymb, 144 Yml, 145 Ym, 146 Ybr, 147 Ycol, 148 149 Ycs, Yss, Yds, Yes, Yfs, Ygs, 150 Ygdtr, Yidtr, Yldtr, Ymsw, Ytask, 151 Ycr0, Ycr1, Ycr2, Ycr3, Ycr4, Ycr5, Ycr6, Ycr7, Ycr8, 152 Ydr0, Ydr1, Ydr2, Ydr3, Ydr4, Ydr5, Ydr6, Ydr7, 153 Ytr0, Ytr1, Ytr2, Ytr3, Ytr4, Ytr5, Ytr6, Ytr7, Yrl32, Yrl64, 154 Ymr, Ymm, 155 Yxr, Yxm, 156 Ymax, 157 158 Zxxx = 0, 159 160 Zlit, 161 Z_rp, 162 Zbr, 163 Zcall, 164 Zib_, 165 Zib_rp, 166 Zibo_m, 167 Zibo_m_xm, 168 Zil_, 169 Zil_rp, 170 Ziq_rp, 171 Zilo_m, 172 Ziqo_m, 173 Zjmp, 174 Zloop, 175 Zo_iw, 176 Zm_o, 177 Zm_r, 178 Zm_r_xm, 179 Zm_r_i_xm, 180 Zm_r_3d, 181 Zm_r_xm_nr, 182 Zr_m_xm_nr, 183 Zibm_r, /* mmx1,mmx2/mem64,imm8 */ 184 Zmb_r, 185 Zaut_r, 186 Zo_m, 187 Zo_m64, 188 Zpseudo, 189 Zr_m, 190 Zr_m_xm, 191 Zr_m_i_xm, 192 Zrp_, 193 Z_ib, 194 Z_il, 195 Zm_ibo, 196 Zm_ilo, 197 Zib_rr, 198 Zil_rr, 199 Zclr, 200 Zbyte, 201 Zmax, 202 203 Px = 0, 204 P32 = 0x32, /* 32-bit only */ 205 Pe = 0x66, /* operand escape */ 206 Pm = 0x0f, /* 2byte opcode escape */ 207 Pq = 0xff, /* both escape */ 208 Pb = 0xfe, /* byte operands */ 209 Pf2 = 0xf2, /* xmm escape 1 */ 210 Pf3 = 0xf3, /* xmm escape 2 */ 211 Pw = 0x48, /* Rex.w */ 212 Py = 0x80, /* defaults to 64-bit mode */ 213 214 Rxf = 1<<9, /* internal flag for Rxr on from */ 215 Rxt = 1<<8, /* internal flag for Rxr on to */ 216 Rxw = 1<<3, /* =1, 64-bit operand size */ 217 Rxr = 1<<2, /* extend modrm reg */ 218 Rxx = 1<<1, /* extend sib index */ 219 Rxb = 1<<0, /* extend modrm r/m, sib base, or opcode reg */ 220 221 Roffset = 22, /* no. bits for offset in relocation address */ 222 Rindex = 10, /* no. bits for index in relocation address */ 223 }; 224 225 EXTERN union 226 { 227 struct 228 { 229 char obuf[MAXIO]; /* output buffer */ 230 uchar ibuf[MAXIO]; /* input buffer */ 231 } u; 232 char dbuf[1]; 233 } buf; 234 235 #define cbuf u.obuf 236 #define xbuf u.ibuf 237 238 #pragma varargck type "A" uint 239 #pragma varargck type "D" Adr* 240 #pragma varargck type "P" Prog* 241 #pragma varargck type "R" int 242 #pragma varargck type "S" char* 243 244 EXTERN long HEADR; 245 EXTERN long HEADTYPE; 246 EXTERN vlong INITDAT; 247 EXTERN long INITRND; 248 EXTERN vlong INITTEXT; 249 EXTERN char* INITENTRY; /* entry point */ 250 EXTERN Biobuf bso; 251 EXTERN long bsssize; 252 EXTERN int cbc; 253 EXTERN char* cbp; 254 EXTERN char* pcstr; 255 EXTERN int cout; 256 EXTERN Auto* curauto; 257 EXTERN Auto* curhist; 258 EXTERN Prog* curp; 259 EXTERN Prog* curtext; 260 EXTERN Prog* datap; 261 EXTERN Prog* edatap; 262 EXTERN vlong datsize; 263 EXTERN char debug[128]; 264 EXTERN char literal[32]; 265 EXTERN Prog* etextp; 266 EXTERN Prog* firstp; 267 EXTERN uchar fnuxi8[8]; 268 EXTERN uchar fnuxi4[4]; 269 EXTERN Sym* hash[NHASH]; 270 EXTERN Sym* histfrog[MAXHIST]; 271 EXTERN int histfrogp; 272 EXTERN int histgen; 273 EXTERN char* library[50]; 274 EXTERN char* libraryobj[50]; 275 EXTERN int libraryp; 276 EXTERN int xrefresolv; 277 EXTERN char* hunk; 278 EXTERN uchar inuxi1[1]; 279 EXTERN uchar inuxi2[2]; 280 EXTERN uchar inuxi4[4]; 281 EXTERN uchar inuxi8[8]; 282 EXTERN char ycover[Ymax*Ymax]; 283 EXTERN uchar* andptr; 284 EXTERN uchar* rexptr; 285 EXTERN uchar and[30]; 286 EXTERN int reg[D_NONE]; 287 EXTERN int regrex[D_NONE+1]; 288 EXTERN Prog* lastp; 289 EXTERN long lcsize; 290 EXTERN int nerrors; 291 EXTERN long nhunk; 292 EXTERN long nsymbol; 293 EXTERN char* noname; 294 EXTERN char* outfile; 295 EXTERN vlong pc; 296 EXTERN long spsize; 297 EXTERN Sym* symlist; 298 EXTERN long symsize; 299 EXTERN Prog* textp; 300 EXTERN vlong textsize; 301 EXTERN long thunk; 302 EXTERN int version; 303 EXTERN Prog zprg; 304 EXTERN int dtype; 305 EXTERN char* paramspace; 306 307 EXTERN Adr* reloca; 308 EXTERN int doexp, dlm; 309 EXTERN int imports, nimports; 310 EXTERN int exports, nexports; 311 EXTERN char* EXPTAB; 312 EXTERN Prog undefp; 313 314 #define UP (&undefp) 315 316 extern Optab optab[]; 317 extern Optab* opindex[]; 318 extern char* anames[]; 319 320 int Aconv(Fmt*); 321 int Dconv(Fmt*); 322 int Pconv(Fmt*); 323 int Rconv(Fmt*); 324 int Sconv(Fmt*); 325 void addhist(long, int); 326 Prog* appendp(Prog*); 327 void asmb(void); 328 void asmdyn(void); 329 void asmins(Prog*); 330 void asmlc(void); 331 void asmsp(void); 332 void asmsym(void); 333 vlong atolwhex(char*); 334 Prog* brchain(Prog*); 335 Prog* brloop(Prog*); 336 void buildop(void); 337 void cflush(void); 338 void ckoff(Sym*, long); 339 Prog* copyp(Prog*); 340 double cputime(void); 341 void datblk(long, long); 342 void diag(char*, ...); 343 void dodata(void); 344 void doinit(void); 345 void doprof1(void); 346 void doprof2(void); 347 void dostkoff(void); 348 void dynreloc(Sym*, ulong, int); 349 vlong entryvalue(void); 350 void errorexit(void); 351 void export(void); 352 int find1(long, int); 353 int find2(long, int); 354 void follow(void); 355 void gethunk(void); 356 void histtoauto(void); 357 double ieeedtod(Ieee*); 358 long ieeedtof(Ieee*); 359 void import(void); 360 void ldobj(int, long, char*); 361 void loadlib(void); 362 void listinit(void); 363 Sym* lookup(char*, int); 364 void lput(long); 365 void lputl(long); 366 void main(int, char*[]); 367 void mkfwd(void); 368 void* mysbrk(ulong); 369 void nuxiinit(void); 370 void objfile(char*); 371 int opsize(Prog*); 372 void patch(void); 373 Prog* prg(void); 374 void readundefs(char*, int); 375 int relinv(int); 376 long reuse(Prog*, Sym*); 377 vlong rnd(vlong, vlong); 378 void span(void); 379 void undef(void); 380 void undefsym(Sym*); 381 vlong vaddr(Adr*); 382 void wput(ushort); 383 void xdefine(char*, int, vlong); 384 void xfol(Prog*); 385 int zaddr(uchar*, Adr*, Sym*[]); 386 void zerosig(char*); 387 388 #pragma varargck type "D" Adr* 389 #pragma varargck type "P" Prog* 390 #pragma varargck type "R" int 391 #pragma varargck type "A" int 392 #pragma varargck argpos diag 1 393