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" 53e12c5d1SDavid du Colombier 63e12c5d1SDavid du Colombier #define P ((Prog*)0) 73e12c5d1SDavid du Colombier #define S ((Sym*)0) 83e12c5d1SDavid du Colombier #define TNAME (curtext?curtext->from.sym->name:noname) 93e12c5d1SDavid du Colombier #define CPUT(c)\ 103e12c5d1SDavid du Colombier { *cbp++ = c;\ 113e12c5d1SDavid du Colombier if(--cbc <= 0)\ 123e12c5d1SDavid du Colombier cflush(); } 133e12c5d1SDavid du Colombier 143e12c5d1SDavid du Colombier typedef struct Adr Adr; 153e12c5d1SDavid du Colombier typedef struct Prog Prog; 163e12c5d1SDavid du Colombier typedef struct Sym Sym; 173e12c5d1SDavid du Colombier typedef struct Auto Auto; 183e12c5d1SDavid du Colombier typedef struct Optab Optab; 193e12c5d1SDavid du Colombier 203e12c5d1SDavid du Colombier struct Adr 213e12c5d1SDavid du Colombier { 223e12c5d1SDavid du Colombier union 233e12c5d1SDavid du Colombier { 243e12c5d1SDavid du Colombier long offset; 253e12c5d1SDavid du Colombier char scon[8]; 263e12c5d1SDavid du Colombier Prog *cond; /* not used, but should be D_BRANCH */ 273e12c5d1SDavid du Colombier Ieee ieee; 283e12c5d1SDavid du Colombier }; 293e12c5d1SDavid du Colombier union 303e12c5d1SDavid du Colombier { 313e12c5d1SDavid du Colombier Auto* autom; 323e12c5d1SDavid du Colombier Sym* sym; 333e12c5d1SDavid du Colombier }; 343e12c5d1SDavid du Colombier short type; 353e12c5d1SDavid du Colombier char index; 363e12c5d1SDavid du Colombier char scale; 373e12c5d1SDavid du Colombier }; 383e12c5d1SDavid du Colombier 393e12c5d1SDavid du Colombier struct Prog 403e12c5d1SDavid du Colombier { 413e12c5d1SDavid du Colombier Adr from; 423e12c5d1SDavid du Colombier Adr to; 433e12c5d1SDavid du Colombier union 443e12c5d1SDavid du Colombier { 453e12c5d1SDavid du Colombier Prog *forwd; 463e12c5d1SDavid du Colombier }; 473e12c5d1SDavid du Colombier Prog* link; 483e12c5d1SDavid du Colombier Prog* cond; /* work on this */ 493e12c5d1SDavid du Colombier long pc; 503e12c5d1SDavid du Colombier long line; 513e12c5d1SDavid du Colombier uchar mark; /* work on these */ 523e12c5d1SDavid du Colombier uchar back; 533e12c5d1SDavid du Colombier 543e12c5d1SDavid du Colombier short as; 553e12c5d1SDavid du Colombier char width; /* fake for DATA */ 563e12c5d1SDavid du Colombier }; 573e12c5d1SDavid du Colombier struct Auto 583e12c5d1SDavid du Colombier { 593e12c5d1SDavid du Colombier Sym* sym; 603e12c5d1SDavid du Colombier Auto* link; 613e12c5d1SDavid du Colombier long offset; 623e12c5d1SDavid du Colombier short type; 633e12c5d1SDavid du Colombier }; 643e12c5d1SDavid du Colombier struct Sym 653e12c5d1SDavid du Colombier { 66*219b2ee8SDavid du Colombier char *name; 673e12c5d1SDavid du Colombier short type; 683e12c5d1SDavid du Colombier short version; 69*219b2ee8SDavid du Colombier short become; 70*219b2ee8SDavid du Colombier short frame; 713e12c5d1SDavid du Colombier long value; 723e12c5d1SDavid du Colombier Sym* link; 733e12c5d1SDavid du Colombier }; 743e12c5d1SDavid du Colombier struct Optab 753e12c5d1SDavid du Colombier { 763e12c5d1SDavid du Colombier short as; 773e12c5d1SDavid du Colombier uchar* ytab; 783e12c5d1SDavid du Colombier uchar prefix; 793e12c5d1SDavid du Colombier uchar op[10]; 803e12c5d1SDavid du Colombier }; 813e12c5d1SDavid du Colombier 823e12c5d1SDavid du Colombier enum 833e12c5d1SDavid du Colombier { 843e12c5d1SDavid du Colombier STEXT = 1, 853e12c5d1SDavid du Colombier SDATA, 863e12c5d1SDavid du Colombier SBSS, 873e12c5d1SDavid du Colombier SDATA1, 883e12c5d1SDavid du Colombier SXREF, 893e12c5d1SDavid du Colombier SFILE, 90*219b2ee8SDavid du Colombier SCONST, 91*219b2ee8SDavid du Colombier 923e12c5d1SDavid du Colombier NHASH = 10007, 933e12c5d1SDavid du Colombier NHUNK = 100000, 943e12c5d1SDavid du Colombier MINSIZ = 4, 953e12c5d1SDavid du Colombier STRINGSZ = 200, 963e12c5d1SDavid du Colombier MINLC = 1, 97*219b2ee8SDavid du Colombier MAXIO = 8192, 98*219b2ee8SDavid du Colombier MAXHIST = 20, /* limit of path elements for history symbols */ 993e12c5d1SDavid du Colombier 1003e12c5d1SDavid du Colombier Yxxx = 0, 1013e12c5d1SDavid du Colombier Ynone, 1023e12c5d1SDavid du Colombier Yi0, 1033e12c5d1SDavid du Colombier Yi1, 1043e12c5d1SDavid du Colombier Yi8, 1053e12c5d1SDavid du Colombier Yi32, 106*219b2ee8SDavid du Colombier Yiauto, 1073e12c5d1SDavid du Colombier Yal, 1083e12c5d1SDavid du Colombier Ycl, 1093e12c5d1SDavid du Colombier Yax, 1103e12c5d1SDavid du Colombier Ycx, 1113e12c5d1SDavid du Colombier Yrb, 1123e12c5d1SDavid du Colombier Yrl, 1133e12c5d1SDavid du Colombier Yrf, 1143e12c5d1SDavid du Colombier Yf0, 1153e12c5d1SDavid du Colombier Yrx, 1163e12c5d1SDavid du Colombier Ymb, 1173e12c5d1SDavid du Colombier Yml, 1183e12c5d1SDavid du Colombier Ym, 1193e12c5d1SDavid du Colombier Ybr, 1203e12c5d1SDavid du Colombier Ycol, 1213e12c5d1SDavid du Colombier 1223e12c5d1SDavid du Colombier Ycs, Yss, Yds, Yes, Yfs, Ygs, 1233e12c5d1SDavid du Colombier Ygdtr, Yidtr, Yldtr, Ymsw, Ytask, 1243e12c5d1SDavid du Colombier Ycr0, Ycr1, Ycr2, Ycr3, Ycr4, Ycr5, Ycr6, Ycr7, 1253e12c5d1SDavid du Colombier Ydr0, Ydr1, Ydr2, Ydr3, Ydr4, Ydr5, Ydr6, Ydr7, 1263e12c5d1SDavid du Colombier Ytr0, Ytr1, Ytr2, Ytr3, Ytr4, Ytr5, Ytr6, Ytr7, 1273e12c5d1SDavid du Colombier Ymax, 1283e12c5d1SDavid du Colombier 1293e12c5d1SDavid du Colombier Zxxx = 0, 1303e12c5d1SDavid du Colombier 1313e12c5d1SDavid du Colombier Zlit, 1323e12c5d1SDavid du Colombier Z_rp, 1333e12c5d1SDavid du Colombier Zbr, 1343e12c5d1SDavid du Colombier Zcall, 1353e12c5d1SDavid du Colombier Zib_, 1363e12c5d1SDavid du Colombier Zib_rp, 1373e12c5d1SDavid du Colombier Zibo_m, 1383e12c5d1SDavid du Colombier Zil_, 1393e12c5d1SDavid du Colombier Zil_rp, 1403e12c5d1SDavid du Colombier Zilo_m, 1413e12c5d1SDavid du Colombier Zjmp, 1423e12c5d1SDavid du Colombier Zloop, 1433e12c5d1SDavid du Colombier Zm_o, 1443e12c5d1SDavid du Colombier Zm_r, 145*219b2ee8SDavid du Colombier Zaut_r, 1463e12c5d1SDavid du Colombier Zo_m, 1473e12c5d1SDavid du Colombier Zpseudo, 1483e12c5d1SDavid du Colombier Zr_m, 1493e12c5d1SDavid du Colombier Zrp_, 1503e12c5d1SDavid du Colombier Z_ib, 1513e12c5d1SDavid du Colombier Z_il, 1523e12c5d1SDavid du Colombier Zm_ibo, 1533e12c5d1SDavid du Colombier Zm_ilo, 1543e12c5d1SDavid du Colombier Zclr, 1553e12c5d1SDavid du Colombier Zbyte, 1563e12c5d1SDavid du Colombier Zmov, 1573e12c5d1SDavid du Colombier Zmax, 1583e12c5d1SDavid du Colombier 1593e12c5d1SDavid du Colombier Px = 0, 1603e12c5d1SDavid du Colombier Pe = 0x66, /* operand escape */ 1613e12c5d1SDavid du Colombier Pm = 0x0f, /* 2byte opcode escape */ 1623e12c5d1SDavid du Colombier Pq = 0xff, /* both escape */ 1633e12c5d1SDavid du Colombier Pb = 0xfe, /* byte operands */ 1643e12c5d1SDavid du Colombier }; 1653e12c5d1SDavid du Colombier 166*219b2ee8SDavid du Colombier union 167*219b2ee8SDavid du Colombier { 168*219b2ee8SDavid du Colombier struct 169*219b2ee8SDavid du Colombier { 170*219b2ee8SDavid du Colombier char cbuf[MAXIO]; /* output buffer */ 171*219b2ee8SDavid du Colombier uchar xbuf[MAXIO]; /* input buffer */ 172*219b2ee8SDavid du Colombier }; 173*219b2ee8SDavid du Colombier char dbuf[1]; 174*219b2ee8SDavid du Colombier } buf; 175*219b2ee8SDavid du Colombier 1763e12c5d1SDavid du Colombier long HEADR; 1773e12c5d1SDavid du Colombier long HEADTYPE; 1783e12c5d1SDavid du Colombier long INITDAT; 1793e12c5d1SDavid du Colombier long INITRND; 1803e12c5d1SDavid du Colombier long INITTEXT; 1813e12c5d1SDavid du Colombier char* INITENTRY; /* entry point */ 1823e12c5d1SDavid du Colombier Biobuf bso; 1833e12c5d1SDavid du Colombier long bsssize; 1843e12c5d1SDavid du Colombier long casepc; 1853e12c5d1SDavid du Colombier int cbc; 1863e12c5d1SDavid du Colombier char* cbp; 1873e12c5d1SDavid du Colombier char* pcstr; 1883e12c5d1SDavid du Colombier int cout; 1893e12c5d1SDavid du Colombier Auto* curauto; 1903e12c5d1SDavid du Colombier Auto* curhist; 1913e12c5d1SDavid du Colombier Prog* curp; 1923e12c5d1SDavid du Colombier Prog* curtext; 1933e12c5d1SDavid du Colombier Prog* datap; 1943e12c5d1SDavid du Colombier Prog* edatap; 1953e12c5d1SDavid du Colombier long datsize; 1963e12c5d1SDavid du Colombier char debug[128]; 197*219b2ee8SDavid du Colombier char literal[32]; 1983e12c5d1SDavid du Colombier Prog* etextp; 1993e12c5d1SDavid du Colombier Prog* firstp; 2003e12c5d1SDavid du Colombier char fnuxi8[8]; 2013e12c5d1SDavid du Colombier char fnuxi4[4]; 2023e12c5d1SDavid du Colombier Sym* hash[NHASH]; 203*219b2ee8SDavid du Colombier Sym* histfrog[MAXHIST]; 2043e12c5d1SDavid du Colombier int histfrogp; 2053e12c5d1SDavid du Colombier int histgen; 2063e12c5d1SDavid du Colombier char* library[50]; 2073e12c5d1SDavid du Colombier int libraryp; 2083e12c5d1SDavid du Colombier char* hunk; 2093e12c5d1SDavid du Colombier char inuxi1[1]; 2103e12c5d1SDavid du Colombier char inuxi2[2]; 2113e12c5d1SDavid du Colombier char inuxi4[4]; 2123e12c5d1SDavid du Colombier char ycover[Ymax*Ymax]; 2133e12c5d1SDavid du Colombier uchar* andptr; 2143e12c5d1SDavid du Colombier uchar and[10]; 2153e12c5d1SDavid du Colombier char reg[D_NONE]; 2163e12c5d1SDavid du Colombier Prog* lastp; 2173e12c5d1SDavid du Colombier long lcsize; 2183e12c5d1SDavid du Colombier int maxop; 2193e12c5d1SDavid du Colombier int nerrors; 2203e12c5d1SDavid du Colombier long nhunk; 2213e12c5d1SDavid du Colombier long nsymbol; 2223e12c5d1SDavid du Colombier char* noname; 2233e12c5d1SDavid du Colombier char* outfile; 2243e12c5d1SDavid du Colombier long pc; 2253e12c5d1SDavid du Colombier int printcol; 2263e12c5d1SDavid du Colombier long spsize; 2273e12c5d1SDavid du Colombier Sym* symlist; 2283e12c5d1SDavid du Colombier long symsize; 2293e12c5d1SDavid du Colombier Prog* textp; 2303e12c5d1SDavid du Colombier long textsize; 2313e12c5d1SDavid du Colombier long thunk; 2323e12c5d1SDavid du Colombier int version; 2333e12c5d1SDavid du Colombier Prog zprg; 234*219b2ee8SDavid du Colombier int dtype; 2353e12c5d1SDavid du Colombier 2363e12c5d1SDavid du Colombier extern Optab optab[]; 2373e12c5d1SDavid du Colombier extern char* anames[]; 2383e12c5d1SDavid du Colombier 239bd389b36SDavid du Colombier int Aconv(void*, Fconv*); 240bd389b36SDavid du Colombier int Dconv(void*, Fconv*); 241bd389b36SDavid du Colombier int Pconv(void*, Fconv*); 242bd389b36SDavid du Colombier int Rconv(void*, Fconv*); 243bd389b36SDavid du Colombier int Sconv(void*, Fconv*); 244bd389b36SDavid du Colombier int Xconv(void*, Fconv*); 2453e12c5d1SDavid du Colombier void addhist(long, int); 2463e12c5d1SDavid du Colombier Prog* appendp(Prog*); 2473e12c5d1SDavid du Colombier void asmb(void); 2483e12c5d1SDavid du Colombier void asmins(Prog*); 2493e12c5d1SDavid du Colombier void asmlc(void); 2503e12c5d1SDavid du Colombier void asmsp(void); 2513e12c5d1SDavid du Colombier void asmsym(void); 2523e12c5d1SDavid du Colombier int atoi(char*); 2533e12c5d1SDavid du Colombier long atolwhex(char*); 2543e12c5d1SDavid du Colombier Prog* brchain(Prog*); 2553e12c5d1SDavid du Colombier Prog* brloop(Prog*); 2563e12c5d1SDavid du Colombier void cflush(void); 2573e12c5d1SDavid du Colombier Prog* copyp(Prog*); 2583e12c5d1SDavid du Colombier double cputime(void); 2593e12c5d1SDavid du Colombier void datblk(long, long); 2603e12c5d1SDavid du Colombier void diag(char*, ...); 2613e12c5d1SDavid du Colombier void dodata(void); 2623e12c5d1SDavid du Colombier void doinit(void); 2633e12c5d1SDavid du Colombier void doprof1(void); 2643e12c5d1SDavid du Colombier void doprof2(void); 2653e12c5d1SDavid du Colombier void dostkoff(void); 2663e12c5d1SDavid du Colombier long entryvalue(void); 2673e12c5d1SDavid du Colombier void errorexit(void); 2683e12c5d1SDavid du Colombier int find1(long, int); 2693e12c5d1SDavid du Colombier int find2(long, int); 2703e12c5d1SDavid du Colombier void follow(void); 2713e12c5d1SDavid du Colombier void gethunk(void); 2723e12c5d1SDavid du Colombier void histtoauto(void); 2733e12c5d1SDavid du Colombier double ieeedtod(Ieee*); 2743e12c5d1SDavid du Colombier long ieeedtof(Ieee*); 2753e12c5d1SDavid du Colombier void ldobj(int, long, char*); 2763e12c5d1SDavid du Colombier void loadlib(int, int); 2773e12c5d1SDavid du Colombier void listinit(void); 2783e12c5d1SDavid du Colombier Sym* lookup(char*, int); 2793e12c5d1SDavid du Colombier void lput(long); 2803e12c5d1SDavid du Colombier void lputl(long); 2813e12c5d1SDavid du Colombier void main(int, char*[]); 2823e12c5d1SDavid du Colombier void mkfwd(void); 2833e12c5d1SDavid du Colombier void nuxiinit(void); 2843e12c5d1SDavid du Colombier void objfile(char*); 2853e12c5d1SDavid du Colombier int opsize(Prog*); 2863e12c5d1SDavid du Colombier void patch(void); 2873e12c5d1SDavid du Colombier Prog* prg(void); 2883e12c5d1SDavid du Colombier int relinv(int); 2893e12c5d1SDavid du Colombier long reuse(Prog*, Sym*); 2903e12c5d1SDavid du Colombier long rnd(long, long); 2913e12c5d1SDavid du Colombier void s8put(char*); 2923e12c5d1SDavid du Colombier void span(void); 2933e12c5d1SDavid du Colombier void undef(void); 2943e12c5d1SDavid du Colombier void xdefine(char*, int, long); 2953e12c5d1SDavid du Colombier void xfol(Prog*); 2963e12c5d1SDavid du Colombier int zaddr(uchar*, Adr*, Sym*[]); 2973e12c5d1SDavid du Colombier long vaddr(Adr*); 298