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