1 #include <lib9.h> 2 #include <bio.h> 3 #include "../6c/6.out.h" 4 #include "../ld/elf.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 uchar 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 vlong INITTEXTP; 256 EXTERN char* INITENTRY; /* entry point */ 257 EXTERN Biobuf bso; 258 EXTERN long bsssize; 259 EXTERN int cbc; 260 EXTERN uchar* cbp; 261 EXTERN char* pcstr; 262 EXTERN int cout; 263 EXTERN Auto* curauto; 264 EXTERN Auto* curhist; 265 EXTERN Prog* curp; 266 EXTERN Prog* curtext; 267 EXTERN Prog* datap; 268 EXTERN Prog* edatap; 269 EXTERN vlong datsize; 270 EXTERN char debug[128]; 271 EXTERN char literal[32]; 272 EXTERN Prog* etextp; 273 EXTERN Prog* firstp; 274 EXTERN uchar fnuxi8[8]; 275 EXTERN uchar fnuxi4[4]; 276 EXTERN Sym* hash[NHASH]; 277 EXTERN Sym* histfrog[MAXHIST]; 278 EXTERN int histfrogp; 279 EXTERN int histgen; 280 EXTERN char* library[50]; 281 EXTERN char* libraryobj[50]; 282 EXTERN int libraryp; 283 EXTERN int xrefresolv; 284 EXTERN char* hunk; 285 EXTERN uchar inuxi1[1]; 286 EXTERN uchar inuxi2[2]; 287 EXTERN uchar inuxi4[4]; 288 EXTERN uchar inuxi8[8]; 289 EXTERN char ycover[Ymax*Ymax]; 290 EXTERN uchar* andptr; 291 EXTERN uchar* rexptr; 292 EXTERN uchar and[30]; 293 EXTERN int reg[D_NONE]; 294 EXTERN int regrex[D_NONE+1]; 295 EXTERN Prog* lastp; 296 EXTERN long lcsize; 297 EXTERN int nerrors; 298 EXTERN long nhunk; 299 EXTERN long nsymbol; 300 EXTERN char* noname; 301 EXTERN char* outfile; 302 EXTERN vlong pc; 303 EXTERN long spsize; 304 EXTERN Sym* symlist; 305 EXTERN long symsize; 306 EXTERN Prog* textp; 307 EXTERN vlong textsize; 308 EXTERN long thunk; 309 EXTERN int version; 310 EXTERN Prog zprg; 311 EXTERN int dtype; 312 EXTERN char* paramspace; 313 314 EXTERN Adr* reloca; 315 EXTERN int doexp, dlm; 316 EXTERN int imports, nimports; 317 EXTERN int exports, nexports; 318 EXTERN char* EXPTAB; 319 EXTERN Prog undefp; 320 321 #define UP (&undefp) 322 323 extern Optab optab[]; 324 extern Optab* opindex[]; 325 extern char* anames[]; 326 327 int Aconv(Fmt*); 328 int Dconv(Fmt*); 329 int Pconv(Fmt*); 330 int Rconv(Fmt*); 331 int Sconv(Fmt*); 332 void addhist(long, int); 333 void addlibpath(char*); 334 Prog* appendp(Prog*); 335 void asmb(void); 336 void asmdyn(void); 337 void asmins(Prog*); 338 void asmlc(void); 339 void asmsp(void); 340 void asmsym(void); 341 vlong atolwhex(char*); 342 Prog* brchain(Prog*); 343 Prog* brloop(Prog*); 344 void buildop(void); 345 void cflush(void); 346 void ckoff(Sym*, long); 347 Prog* copyp(Prog*); 348 double cputime(void); 349 void datblk(long, long); 350 void diag(char*, ...); 351 void dodata(void); 352 void doinit(void); 353 void doprof1(void); 354 void doprof2(void); 355 void dostkoff(void); 356 void dynreloc(Sym*, ulong, int); 357 vlong entryvalue(void); 358 void errorexit(void); 359 void export(void); 360 int fileexists(char*); 361 int find1(long, int); 362 int find2(long, int); 363 char* findlib(char*); 364 void follow(void); 365 void gethunk(void); 366 void histtoauto(void); 367 double ieeedtod(Ieee*); 368 long ieeedtof(Ieee*); 369 void import(void); 370 void ldobj(int, long, char*); 371 void loadlib(void); 372 void listinit(void); 373 Sym* lookup(char*, int); 374 void llput(vlong v); 375 void llputl(vlong v); 376 void lput(long); 377 void lputl(long); 378 void main(int, char*[]); 379 void mkfwd(void); 380 void* mysbrk(ulong); 381 void nuxiinit(void); 382 void objfile(char*); 383 int opsize(Prog*); 384 void patch(void); 385 Prog* prg(void); 386 void readundefs(char*, int); 387 int relinv(int); 388 long reuse(Prog*, Sym*); 389 vlong rnd(vlong, vlong); 390 void span(void); 391 void strnput(char*, int); 392 void undef(void); 393 void undefsym(Sym*); 394 vlong vaddr(Adr*); 395 void wput(long); 396 void wputl(long); 397 void xdefine(char*, int, vlong); 398 void xfol(Prog*); 399 int zaddr(uchar*, Adr*, Sym*[]); 400 void zerosig(char*); 401