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