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