13e12c5d1SDavid du Colombier #include <u.h> 23e12c5d1SDavid du Colombier #include <libc.h> 33e12c5d1SDavid du Colombier #include <bio.h> 43e12c5d1SDavid du Colombier #include "../8c/8.out.h" 5*8153b942SDavid du Colombier #include "../8l/elf.h" 63e12c5d1SDavid du Colombier 77dd7cddfSDavid du Colombier #ifndef EXTERN 87dd7cddfSDavid du Colombier #define EXTERN extern 97dd7cddfSDavid du Colombier #endif 107dd7cddfSDavid du Colombier 113e12c5d1SDavid du Colombier #define P ((Prog*)0) 123e12c5d1SDavid du Colombier #define S ((Sym*)0) 133e12c5d1SDavid du Colombier #define TNAME (curtext?curtext->from.sym->name:noname) 143e12c5d1SDavid du Colombier 15375daca8SDavid du Colombier #define cput(c)\ 16375daca8SDavid du Colombier { *cbp++ = c;\ 17375daca8SDavid du Colombier if(--cbc <= 0)\ 18375daca8SDavid du Colombier cflush(); } 19375daca8SDavid du Colombier 20b87cd620SDavid du Colombier #define LIBNAMELEN 300 21b87cd620SDavid du Colombier 223e12c5d1SDavid du Colombier typedef struct Adr Adr; 233e12c5d1SDavid du Colombier typedef struct Prog Prog; 243e12c5d1SDavid du Colombier typedef struct Sym Sym; 253e12c5d1SDavid du Colombier typedef struct Auto Auto; 263e12c5d1SDavid du Colombier typedef struct Optab Optab; 273e12c5d1SDavid du Colombier 283e12c5d1SDavid du Colombier struct Adr 293e12c5d1SDavid du Colombier { 303e12c5d1SDavid du Colombier union 313e12c5d1SDavid du Colombier { 327dd7cddfSDavid du Colombier long u0offset; 337dd7cddfSDavid du Colombier char u0scon[8]; 347dd7cddfSDavid du Colombier Prog *u0cond; /* not used, but should be D_BRANCH */ 357dd7cddfSDavid du Colombier Ieee u0ieee; 367dd7cddfSDavid du Colombier } u0; 373e12c5d1SDavid du Colombier union 383e12c5d1SDavid du Colombier { 397dd7cddfSDavid du Colombier Auto* u1autom; 407dd7cddfSDavid du Colombier Sym* u1sym; 417dd7cddfSDavid du Colombier } u1; 423e12c5d1SDavid du Colombier short type; 436520663fSDavid du Colombier uchar index; 443e12c5d1SDavid du Colombier char scale; 453e12c5d1SDavid du Colombier }; 463e12c5d1SDavid du Colombier 477dd7cddfSDavid du Colombier #define offset u0.u0offset 487dd7cddfSDavid du Colombier #define scon u0.u0scon 497dd7cddfSDavid du Colombier #define cond u0.u0cond 507dd7cddfSDavid du Colombier #define ieee u0.u0ieee 517dd7cddfSDavid du Colombier 527dd7cddfSDavid du Colombier #define autom u1.u1autom 537dd7cddfSDavid du Colombier #define sym u1.u1sym 547dd7cddfSDavid du Colombier 553e12c5d1SDavid du Colombier struct Prog 563e12c5d1SDavid du Colombier { 573e12c5d1SDavid du Colombier Adr from; 583e12c5d1SDavid du Colombier Adr to; 593e12c5d1SDavid du Colombier Prog *forwd; 603e12c5d1SDavid du Colombier Prog* link; 617dd7cddfSDavid du Colombier Prog* pcond; /* work on this */ 623e12c5d1SDavid du Colombier long pc; 633e12c5d1SDavid du Colombier long line; 643e12c5d1SDavid du Colombier short as; 653e12c5d1SDavid du Colombier char width; /* fake for DATA */ 666520663fSDavid du Colombier char ft; /* oclass cache */ 676520663fSDavid du Colombier char tt; 686520663fSDavid du Colombier uchar mark; /* work on these */ 696520663fSDavid du Colombier uchar back; 703e12c5d1SDavid du Colombier }; 713e12c5d1SDavid du Colombier struct Auto 723e12c5d1SDavid du Colombier { 737dd7cddfSDavid du Colombier Sym* asym; 743e12c5d1SDavid du Colombier Auto* link; 757dd7cddfSDavid du Colombier long aoffset; 763e12c5d1SDavid du Colombier short type; 773e12c5d1SDavid du Colombier }; 783e12c5d1SDavid du Colombier struct Sym 793e12c5d1SDavid du Colombier { 80219b2ee8SDavid du Colombier char *name; 813e12c5d1SDavid du Colombier short type; 823e12c5d1SDavid du Colombier short version; 83219b2ee8SDavid du Colombier short become; 84219b2ee8SDavid du Colombier short frame; 85375daca8SDavid du Colombier uchar subtype; 86375daca8SDavid du Colombier ushort file; 873e12c5d1SDavid du Colombier long value; 88375daca8SDavid du Colombier long sig; 893e12c5d1SDavid du Colombier Sym* link; 903e12c5d1SDavid du Colombier }; 913e12c5d1SDavid du Colombier struct Optab 923e12c5d1SDavid du Colombier { 933e12c5d1SDavid du Colombier short as; 943e12c5d1SDavid du Colombier uchar* ytab; 953e12c5d1SDavid du Colombier uchar prefix; 963e12c5d1SDavid du Colombier uchar op[10]; 973e12c5d1SDavid du Colombier }; 983e12c5d1SDavid du Colombier 993e12c5d1SDavid du Colombier enum 1003e12c5d1SDavid du Colombier { 1013e12c5d1SDavid du Colombier STEXT = 1, 1023e12c5d1SDavid du Colombier SDATA, 1033e12c5d1SDavid du Colombier SBSS, 1043e12c5d1SDavid du Colombier SDATA1, 1053e12c5d1SDavid du Colombier SXREF, 1063e12c5d1SDavid du Colombier SFILE, 107219b2ee8SDavid du Colombier SCONST, 1089a747e4fSDavid du Colombier SUNDEF, 109219b2ee8SDavid du Colombier 110375daca8SDavid du Colombier SIMPORT, 111375daca8SDavid du Colombier SEXPORT, 112375daca8SDavid du Colombier 1133e12c5d1SDavid du Colombier NHASH = 10007, 1143e12c5d1SDavid du Colombier NHUNK = 100000, 1153e12c5d1SDavid du Colombier MINSIZ = 4, 1163e12c5d1SDavid du Colombier STRINGSZ = 200, 1173e12c5d1SDavid du Colombier MINLC = 1, 118219b2ee8SDavid du Colombier MAXIO = 8192, 119219b2ee8SDavid du Colombier MAXHIST = 20, /* limit of path elements for history symbols */ 1203e12c5d1SDavid du Colombier 1213e12c5d1SDavid du Colombier Yxxx = 0, 1223e12c5d1SDavid du Colombier Ynone, 1233e12c5d1SDavid du Colombier Yi0, 1243e12c5d1SDavid du Colombier Yi1, 1253e12c5d1SDavid du Colombier Yi8, 1263e12c5d1SDavid du Colombier Yi32, 127219b2ee8SDavid du Colombier Yiauto, 1283e12c5d1SDavid du Colombier Yal, 1293e12c5d1SDavid du Colombier Ycl, 1303e12c5d1SDavid du Colombier Yax, 1313e12c5d1SDavid du Colombier Ycx, 1323e12c5d1SDavid du Colombier Yrb, 1333e12c5d1SDavid du Colombier Yrl, 1343e12c5d1SDavid du Colombier Yrf, 1353e12c5d1SDavid du Colombier Yf0, 1363e12c5d1SDavid du Colombier Yrx, 1373e12c5d1SDavid du Colombier Ymb, 1383e12c5d1SDavid du Colombier Yml, 1393e12c5d1SDavid du Colombier Ym, 1403e12c5d1SDavid du Colombier Ybr, 1413e12c5d1SDavid du Colombier Ycol, 1423e12c5d1SDavid du Colombier 1433e12c5d1SDavid du Colombier Ycs, Yss, Yds, Yes, Yfs, Ygs, 1443e12c5d1SDavid du Colombier Ygdtr, Yidtr, Yldtr, Ymsw, Ytask, 1453e12c5d1SDavid du Colombier Ycr0, Ycr1, Ycr2, Ycr3, Ycr4, Ycr5, Ycr6, Ycr7, 1463e12c5d1SDavid du Colombier Ydr0, Ydr1, Ydr2, Ydr3, Ydr4, Ydr5, Ydr6, Ydr7, 1473e12c5d1SDavid du Colombier Ytr0, Ytr1, Ytr2, Ytr3, Ytr4, Ytr5, Ytr6, Ytr7, 1483e12c5d1SDavid du Colombier Ymax, 1493e12c5d1SDavid du Colombier 1503e12c5d1SDavid du Colombier Zxxx = 0, 1513e12c5d1SDavid du Colombier 1523e12c5d1SDavid du Colombier Zlit, 1533e12c5d1SDavid du Colombier Z_rp, 1543e12c5d1SDavid du Colombier Zbr, 1553e12c5d1SDavid du Colombier Zcall, 1563e12c5d1SDavid du Colombier Zib_, 1573e12c5d1SDavid du Colombier Zib_rp, 1583e12c5d1SDavid du Colombier Zibo_m, 1593e12c5d1SDavid du Colombier Zil_, 1603e12c5d1SDavid du Colombier Zil_rp, 1613e12c5d1SDavid du Colombier Zilo_m, 1623e12c5d1SDavid du Colombier Zjmp, 1633e12c5d1SDavid du Colombier Zloop, 1643e12c5d1SDavid du Colombier Zm_o, 1653e12c5d1SDavid du Colombier Zm_r, 166219b2ee8SDavid du Colombier Zaut_r, 1673e12c5d1SDavid du Colombier Zo_m, 1683e12c5d1SDavid du Colombier Zpseudo, 1693e12c5d1SDavid du Colombier Zr_m, 1703e12c5d1SDavid du Colombier Zrp_, 1713e12c5d1SDavid du Colombier Z_ib, 1723e12c5d1SDavid du Colombier Z_il, 1733e12c5d1SDavid du Colombier Zm_ibo, 1743e12c5d1SDavid du Colombier Zm_ilo, 1759a747e4fSDavid du Colombier Zib_rr, 1769a747e4fSDavid du Colombier Zil_rr, 1773e12c5d1SDavid du Colombier Zclr, 1783e12c5d1SDavid du Colombier Zbyte, 1793e12c5d1SDavid du Colombier Zmov, 1803e12c5d1SDavid du Colombier Zmax, 1813e12c5d1SDavid du Colombier 1823e12c5d1SDavid du Colombier Px = 0, 1833e12c5d1SDavid du Colombier Pe = 0x66, /* operand escape */ 1843e12c5d1SDavid du Colombier Pm = 0x0f, /* 2byte opcode escape */ 1853e12c5d1SDavid du Colombier Pq = 0xff, /* both escape */ 1863e12c5d1SDavid du Colombier Pb = 0xfe, /* byte operands */ 187375daca8SDavid du Colombier 188375daca8SDavid du Colombier Roffset = 22, /* no. bits for offset in relocation address */ 189375daca8SDavid du Colombier Rindex = 10, /* no. bits for index in relocation address */ 1903e12c5d1SDavid du Colombier }; 1913e12c5d1SDavid du Colombier 1927dd7cddfSDavid du Colombier EXTERN union 193219b2ee8SDavid du Colombier { 194219b2ee8SDavid du Colombier struct 195219b2ee8SDavid du Colombier { 1967dd7cddfSDavid du Colombier char obuf[MAXIO]; /* output buffer */ 1977dd7cddfSDavid du Colombier uchar ibuf[MAXIO]; /* input buffer */ 1987dd7cddfSDavid du Colombier } u; 199219b2ee8SDavid du Colombier char dbuf[1]; 200219b2ee8SDavid du Colombier } buf; 201219b2ee8SDavid du Colombier 2027dd7cddfSDavid du Colombier #define cbuf u.obuf 2037dd7cddfSDavid du Colombier #define xbuf u.ibuf 2047dd7cddfSDavid du Colombier 205406758d9SDavid du Colombier #pragma varargck type "A" int 2067dd7cddfSDavid du Colombier #pragma varargck type "A" uint 2077dd7cddfSDavid du Colombier #pragma varargck type "D" Adr* 2087dd7cddfSDavid du Colombier #pragma varargck type "P" Prog* 2097dd7cddfSDavid du Colombier #pragma varargck type "R" int 2106520663fSDavid du Colombier #pragma varargck type "R" uint 2117dd7cddfSDavid du Colombier #pragma varargck type "S" char* 2127dd7cddfSDavid du Colombier 213406758d9SDavid du Colombier #pragma varargck argpos diag 1 214406758d9SDavid du Colombier 2157dd7cddfSDavid du Colombier EXTERN long HEADR; 2167dd7cddfSDavid du Colombier EXTERN long HEADTYPE; 2177dd7cddfSDavid du Colombier EXTERN long INITDAT; 2187dd7cddfSDavid du Colombier EXTERN long INITRND; 2197dd7cddfSDavid du Colombier EXTERN long INITTEXT; 220*8153b942SDavid du Colombier EXTERN long INITTEXTP; 2217dd7cddfSDavid du Colombier EXTERN char* INITENTRY; /* entry point */ 2227dd7cddfSDavid du Colombier EXTERN Biobuf bso; 2237dd7cddfSDavid du Colombier EXTERN long bsssize; 2247dd7cddfSDavid du Colombier EXTERN long casepc; 2257dd7cddfSDavid du Colombier EXTERN int cbc; 2267dd7cddfSDavid du Colombier EXTERN char* cbp; 2277dd7cddfSDavid du Colombier EXTERN char* pcstr; 2287dd7cddfSDavid du Colombier EXTERN int cout; 2297dd7cddfSDavid du Colombier EXTERN Auto* curauto; 2307dd7cddfSDavid du Colombier EXTERN Auto* curhist; 2317dd7cddfSDavid du Colombier EXTERN Prog* curp; 2327dd7cddfSDavid du Colombier EXTERN Prog* curtext; 2337dd7cddfSDavid du Colombier EXTERN Prog* datap; 2347dd7cddfSDavid du Colombier EXTERN Prog* edatap; 2357dd7cddfSDavid du Colombier EXTERN long datsize; 2367dd7cddfSDavid du Colombier EXTERN char debug[128]; 2377dd7cddfSDavid du Colombier EXTERN char literal[32]; 2387dd7cddfSDavid du Colombier EXTERN Prog* etextp; 2397dd7cddfSDavid du Colombier EXTERN Prog* firstp; 2407dd7cddfSDavid du Colombier EXTERN char fnuxi8[8]; 2417dd7cddfSDavid du Colombier EXTERN char fnuxi4[4]; 2427dd7cddfSDavid du Colombier EXTERN Sym* hash[NHASH]; 2437dd7cddfSDavid du Colombier EXTERN Sym* histfrog[MAXHIST]; 2447dd7cddfSDavid du Colombier EXTERN int histfrogp; 2457dd7cddfSDavid du Colombier EXTERN int histgen; 2467dd7cddfSDavid du Colombier EXTERN char* library[50]; 24780ee5cbfSDavid du Colombier EXTERN char* libraryobj[50]; 2487dd7cddfSDavid du Colombier EXTERN int libraryp; 2497dd7cddfSDavid du Colombier EXTERN int xrefresolv; 2507dd7cddfSDavid du Colombier EXTERN char* hunk; 2517dd7cddfSDavid du Colombier EXTERN char inuxi1[1]; 2527dd7cddfSDavid du Colombier EXTERN char inuxi2[2]; 2537dd7cddfSDavid du Colombier EXTERN char inuxi4[4]; 2547dd7cddfSDavid du Colombier EXTERN char ycover[Ymax*Ymax]; 2557dd7cddfSDavid du Colombier EXTERN uchar* andptr; 2567dd7cddfSDavid du Colombier EXTERN uchar and[30]; 2577dd7cddfSDavid du Colombier EXTERN char reg[D_NONE]; 2587dd7cddfSDavid du Colombier EXTERN Prog* lastp; 2597dd7cddfSDavid du Colombier EXTERN long lcsize; 2607dd7cddfSDavid du Colombier EXTERN int nerrors; 2617dd7cddfSDavid du Colombier EXTERN long nhunk; 2627dd7cddfSDavid du Colombier EXTERN long nsymbol; 2637dd7cddfSDavid du Colombier EXTERN char* noname; 2647dd7cddfSDavid du Colombier EXTERN char* outfile; 2657dd7cddfSDavid du Colombier EXTERN long pc; 2667dd7cddfSDavid du Colombier EXTERN long spsize; 2677dd7cddfSDavid du Colombier EXTERN Sym* symlist; 2687dd7cddfSDavid du Colombier EXTERN long symsize; 2697dd7cddfSDavid du Colombier EXTERN Prog* textp; 2707dd7cddfSDavid du Colombier EXTERN long textsize; 2717dd7cddfSDavid du Colombier EXTERN long thunk; 2727dd7cddfSDavid du Colombier EXTERN int version; 2737dd7cddfSDavid du Colombier EXTERN Prog zprg; 2747dd7cddfSDavid du Colombier EXTERN int dtype; 2753e12c5d1SDavid du Colombier 2769a747e4fSDavid du Colombier EXTERN Adr* reloca; 277375daca8SDavid du Colombier EXTERN int doexp, dlm; 278375daca8SDavid du Colombier EXTERN int imports, nimports; 2796520663fSDavid du Colombier EXTERN int exports, nexports, allexport; 280375daca8SDavid du Colombier EXTERN char* EXPTAB; 2819a747e4fSDavid du Colombier EXTERN Prog undefp; 2829a747e4fSDavid du Colombier 2839a747e4fSDavid du Colombier #define UP (&undefp) 2849a747e4fSDavid du Colombier 2853e12c5d1SDavid du Colombier extern Optab optab[]; 2863e12c5d1SDavid du Colombier extern char* anames[]; 2873e12c5d1SDavid du Colombier 2889a747e4fSDavid du Colombier int Aconv(Fmt*); 2899a747e4fSDavid du Colombier int Dconv(Fmt*); 2909a747e4fSDavid du Colombier int Pconv(Fmt*); 2919a747e4fSDavid du Colombier int Rconv(Fmt*); 2929a747e4fSDavid du Colombier int Sconv(Fmt*); 2933e12c5d1SDavid du Colombier void addhist(long, int); 294b87cd620SDavid du Colombier void addlibpath(char*); 2953e12c5d1SDavid du Colombier Prog* appendp(Prog*); 2963e12c5d1SDavid du Colombier void asmb(void); 297375daca8SDavid du Colombier void asmdyn(void); 2983e12c5d1SDavid du Colombier void asmins(Prog*); 2993e12c5d1SDavid du Colombier void asmlc(void); 3003e12c5d1SDavid du Colombier void asmsp(void); 3013e12c5d1SDavid du Colombier void asmsym(void); 3023e12c5d1SDavid du Colombier long atolwhex(char*); 3033e12c5d1SDavid du Colombier Prog* brchain(Prog*); 3043e12c5d1SDavid du Colombier Prog* brloop(Prog*); 3053e12c5d1SDavid du Colombier void cflush(void); 306375daca8SDavid du Colombier void ckoff(Sym*, long); 3073e12c5d1SDavid du Colombier Prog* copyp(Prog*); 3083e12c5d1SDavid du Colombier double cputime(void); 3093e12c5d1SDavid du Colombier void datblk(long, long); 3103e12c5d1SDavid du Colombier void diag(char*, ...); 3113e12c5d1SDavid du Colombier void dodata(void); 3123e12c5d1SDavid du Colombier void doinit(void); 3133e12c5d1SDavid du Colombier void doprof1(void); 3143e12c5d1SDavid du Colombier void doprof2(void); 3153e12c5d1SDavid du Colombier void dostkoff(void); 316375daca8SDavid du Colombier void dynreloc(Sym*, ulong, int); 3173e12c5d1SDavid du Colombier long entryvalue(void); 3183e12c5d1SDavid du Colombier void errorexit(void); 319375daca8SDavid du Colombier void export(void); 320b87cd620SDavid du Colombier int fileexists(char*); 3213e12c5d1SDavid du Colombier int find1(long, int); 3223e12c5d1SDavid du Colombier int find2(long, int); 323b87cd620SDavid du Colombier char* findlib(char*); 3243e12c5d1SDavid du Colombier void follow(void); 3253e12c5d1SDavid du Colombier void gethunk(void); 3263e12c5d1SDavid du Colombier void histtoauto(void); 3273e12c5d1SDavid du Colombier double ieeedtod(Ieee*); 3283e12c5d1SDavid du Colombier long ieeedtof(Ieee*); 329375daca8SDavid du Colombier void import(void); 3303e12c5d1SDavid du Colombier void ldobj(int, long, char*); 3317dd7cddfSDavid du Colombier void loadlib(void); 3323e12c5d1SDavid du Colombier void listinit(void); 3333e12c5d1SDavid du Colombier Sym* lookup(char*, int); 3343e12c5d1SDavid du Colombier void lput(long); 3353e12c5d1SDavid du Colombier void lputl(long); 336*8153b942SDavid du Colombier void llput(vlong v); 337*8153b942SDavid du Colombier void llputl(vlong v); 3383e12c5d1SDavid du Colombier void main(int, char*[]); 3393e12c5d1SDavid du Colombier void mkfwd(void); 3407dd7cddfSDavid du Colombier void* mysbrk(ulong); 3413e12c5d1SDavid du Colombier void nuxiinit(void); 3423e12c5d1SDavid du Colombier void objfile(char*); 3433e12c5d1SDavid du Colombier int opsize(Prog*); 3443e12c5d1SDavid du Colombier void patch(void); 3453e12c5d1SDavid du Colombier Prog* prg(void); 346375daca8SDavid du Colombier void readundefs(char*, int); 3473e12c5d1SDavid du Colombier int relinv(int); 3483e12c5d1SDavid du Colombier long reuse(Prog*, Sym*); 3493e12c5d1SDavid du Colombier long rnd(long, long); 3503e12c5d1SDavid du Colombier void span(void); 351*8153b942SDavid du Colombier void strnput(char*, int); 3523e12c5d1SDavid du Colombier void undef(void); 353375daca8SDavid du Colombier void undefsym(Sym*); 3549a747e4fSDavid du Colombier long vaddr(Adr*); 355*8153b942SDavid du Colombier void wput(long); 356*8153b942SDavid du Colombier void wputl(long); 3573e12c5d1SDavid du Colombier void xdefine(char*, int, long); 3583e12c5d1SDavid du Colombier void xfol(Prog*); 3593e12c5d1SDavid du Colombier int zaddr(uchar*, Adr*, Sym*[]); 360375daca8SDavid du Colombier void zerosig(char*); 3616520663fSDavid du Colombier 3626520663fSDavid du Colombier #pragma varargck type "D" Adr* 3636520663fSDavid du Colombier #pragma varargck type "P" Prog* 3646520663fSDavid du Colombier #pragma varargck type "R" int 3656520663fSDavid du Colombier #pragma varargck type "A" int 366