1 #include <u.h> 2 #include <libc.h> 3 #include <bio.h> 4 #include "../6c/6.out.h" 5 #include "../ld/elf.h" 6 7 #ifndef EXTERN 8 #define EXTERN extern 9 #endif 10 11 #define P ((Prog*)0) 12 #define S ((Sym*)0) 13 #define TNAME (curtext?curtext->from.sym->name:noname) 14 #define cput(c)\ 15 { *cbp++ = c;\ 16 if(--cbc <= 0)\ 17 cflush(); } 18 19 #define LIBNAMELEN 300 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 ushort 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 = (16*1024), 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, Yyr, Yxyr, 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 Pm38 = 0x38, /* 0f.38 opcode */ 215 Pm3a = 0x3a, /* 0f.3a opcode */ 216 Pw = 0x48, /* Rex.w */ 217 Py = 0x80, /* defaults to 64-bit mode */ 218 219 P2 = 1<<9, /* flag: two operand (avx only) */ 220 221 Rxf = 1<<9, /* internal flag for Rxr on from */ 222 Rxt = 1<<8, /* internal flag for Rxr on to */ 223 Rxw = 1<<3, /* =1, 64-bit operand size */ 224 Rxr = 1<<2, /* extend modrm reg */ 225 Rxx = 1<<1, /* extend sib index */ 226 Rxb = 1<<0, /* extend modrm r/m, sib base, or opcode reg */ 227 228 Vex2 = 0xc5, /* 2-byte vex prefix */ 229 Vex3 = 0xc4, /* 3-byte vex prefix */ 230 231 /* vex flags */ 232 Vexr = 1<<7, /* byte 1, both */ 233 Vexx = 1<<6, /* byte 1, 3-byte */ 234 Vexb = 1<<5, /* byte 1, 3-byte */ 235 Vexw = 1<<7, /* byte 2, 3-byte */ 236 Vexl = 1<<2, /* 256-bit vector */ 237 238 Vexnr = 0xF<<3, /* no reg */ 239 Vexp0 = 0, /* no SIMD prefix */ 240 Vexp66 = 1, /* prefix 66 */ 241 Vexpf3 = 2, /* prefix f3 */ 242 Vexpf2 = 3, /* prefix f2 */ 243 244 Vex0f = 1, /* 0F opcode byte */ 245 Vex0f38 = 2, /* 0F 38 opcode bytes */ 246 Vex0f3a = 3, /* 0F 3A opcode bytes */ 247 248 Roffset = 22, /* no. bits for offset in relocation address */ 249 Rindex = 10, /* no. bits for index in relocation address */ 250 }; 251 252 EXTERN union 253 { 254 struct 255 { 256 char obuf[MAXIO]; /* output buffer */ 257 uchar ibuf[MAXIO]; /* input buffer */ 258 } u; 259 char dbuf[1]; 260 } buf; 261 262 #define cbuf u.obuf 263 #define xbuf u.ibuf 264 265 #pragma varargck type "A" int 266 #pragma varargck type "A" uint 267 #pragma varargck type "D" Adr* 268 #pragma varargck type "P" Prog* 269 #pragma varargck type "R" int 270 #pragma varargck type "R" uint 271 #pragma varargck type "S" char* 272 273 #pragma varargck argpos diag 1 274 275 EXTERN long HEADR; 276 EXTERN long HEADTYPE; 277 EXTERN vlong INITDAT; 278 EXTERN long INITRND; 279 EXTERN vlong INITTEXT; 280 EXTERN vlong INITTEXTP; 281 EXTERN char* INITENTRY; /* entry point */ 282 EXTERN Biobuf bso; 283 EXTERN long bsssize; 284 EXTERN int cbc; 285 EXTERN char* cbp; 286 EXTERN char* pcstr; 287 EXTERN int cout; 288 EXTERN Auto* curauto; 289 EXTERN Auto* curhist; 290 EXTERN Prog* curp; 291 EXTERN Prog* curtext; 292 EXTERN Prog* datap; 293 EXTERN Prog* edatap; 294 EXTERN vlong datsize; 295 EXTERN char debug[128]; 296 EXTERN char literal[32]; 297 EXTERN Prog* etextp; 298 EXTERN Prog* firstp; 299 EXTERN uchar fnuxi8[8]; 300 EXTERN uchar fnuxi4[4]; 301 EXTERN Sym* hash[NHASH]; 302 EXTERN Sym* histfrog[MAXHIST]; 303 EXTERN int histfrogp; 304 EXTERN int histgen; 305 EXTERN char* library[50]; 306 EXTERN char* libraryobj[50]; 307 EXTERN int libraryp; 308 EXTERN int xrefresolv; 309 EXTERN char* hunk; 310 EXTERN uchar inuxi1[1]; 311 EXTERN uchar inuxi2[2]; 312 EXTERN uchar inuxi4[4]; 313 EXTERN uchar inuxi8[8]; 314 EXTERN char ycover[Ymax*Ymax]; 315 EXTERN uchar* andptr; 316 EXTERN uchar* rexptr; 317 EXTERN uchar and[30]; 318 EXTERN int reg[D_XREG]; 319 EXTERN int regrex[D_XREG+1]; 320 EXTERN Prog* lastp; 321 EXTERN long lcsize; 322 EXTERN int nerrors; 323 EXTERN long nhunk; 324 EXTERN long nsymbol; 325 EXTERN char* noname; 326 EXTERN char* outfile; 327 EXTERN vlong pc; 328 EXTERN long spsize; 329 EXTERN Sym* symlist; 330 EXTERN long symsize; 331 EXTERN Prog* textp; 332 EXTERN vlong textsize; 333 EXTERN long thunk; 334 EXTERN int version; 335 EXTERN int vexed; 336 EXTERN Prog zprg; 337 EXTERN int dtype; 338 EXTERN char* paramspace; 339 340 EXTERN Adr* reloca; 341 EXTERN int doexp, dlm; 342 EXTERN int imports, nimports; 343 EXTERN int exports, nexports, allexport; 344 EXTERN char* EXPTAB; 345 EXTERN Prog undefp; 346 347 #define UP (&undefp) 348 349 extern Optab optab[]; 350 extern Optab* opindex[]; 351 extern char* anames[]; 352 353 int Aconv(Fmt*); 354 int Dconv(Fmt*); 355 int Pconv(Fmt*); 356 int Rconv(Fmt*); 357 int Sconv(Fmt*); 358 void addhist(long, int); 359 void addlibpath(char*); 360 Prog* appendp(Prog*); 361 void asmb(void); 362 void asmdyn(void); 363 void asmins(Prog*); 364 void asmlc(void); 365 void asmsp(void); 366 void asmsym(void); 367 vlong atolwhex(char*); 368 Prog* brchain(Prog*); 369 Prog* brloop(Prog*); 370 void buildop(void); 371 void cflush(void); 372 void ckoff(Sym*, long); 373 Prog* copyp(Prog*); 374 double cputime(void); 375 void datblk(long, long); 376 void diag(char*, ...); 377 void dodata(void); 378 void doinit(void); 379 void doprof1(void); 380 void doprof2(void); 381 void dostkoff(void); 382 void dynreloc(Sym*, ulong, int); 383 vlong entryvalue(void); 384 void errorexit(void); 385 void export(void); 386 int fileexists(char*); 387 int find1(long, int); 388 int find2(long, int); 389 char* findlib(char*); 390 void follow(void); 391 void gethunk(void); 392 void histtoauto(void); 393 double ieeedtod(Ieee*); 394 long ieeedtof(Ieee*); 395 void import(void); 396 int isxyreg(int); 397 void ldobj(int, long, char*); 398 void loadlib(void); 399 void listinit(void); 400 void llput(vlong v); 401 void llputl(vlong v); 402 Sym* lookup(char*, int); 403 void lput(long); 404 void lputl(long); 405 void main(int, char*[]); 406 void mkfwd(void); 407 void* mysbrk(ulong); 408 void nuxiinit(void); 409 void objfile(char*); 410 int opsize(Prog*); 411 void patch(void); 412 Prog* prg(void); 413 void readundefs(char*, int); 414 int relinv(int); 415 long reuse(Prog*, Sym*); 416 vlong rnd(vlong, vlong); 417 void span(void); 418 void strnput(char*, int); 419 void undef(void); 420 void undefsym(Sym*); 421 vlong vaddr(Adr*); 422 void wput(long); 423 void wputl(long); 424 void xdefine(char*, int, vlong); 425 void xfol(Prog*); 426 int zaddr(uchar*, Adr*, Sym*[]); 427 void zerosig(char*); 428