13e12c5d1SDavid du Colombier #include <u.h> 23e12c5d1SDavid du Colombier #include <libc.h> 33e12c5d1SDavid du Colombier #include <bio.h> 43e12c5d1SDavid du Colombier #include "../vc/v.out.h" 53e12c5d1SDavid du Colombier 67dd7cddfSDavid du Colombier #ifndef EXTERN 77dd7cddfSDavid du Colombier #define EXTERN extern 87dd7cddfSDavid du Colombier #endif 97dd7cddfSDavid du Colombier 103e12c5d1SDavid du Colombier typedef struct Adr Adr; 113e12c5d1SDavid du Colombier typedef struct Sym Sym; 123e12c5d1SDavid du Colombier typedef struct Autom Auto; 133e12c5d1SDavid du Colombier typedef struct Prog Prog; 143e12c5d1SDavid du Colombier typedef struct Optab Optab; 153e12c5d1SDavid du Colombier typedef struct Oprang Oprang; 163e12c5d1SDavid du Colombier typedef uchar Opcross[32][2][32]; 17219b2ee8SDavid du Colombier typedef struct Count Count; 183e12c5d1SDavid du Colombier 193e12c5d1SDavid du Colombier #define P ((Prog*)0) 203e12c5d1SDavid du Colombier #define S ((Sym*)0) 21219b2ee8SDavid du Colombier #define TNAME (curtext&&curtext->from.sym?curtext->from.sym->name:noname) 223e12c5d1SDavid du Colombier 233e12c5d1SDavid du Colombier struct Adr 243e12c5d1SDavid du Colombier { 253e12c5d1SDavid du Colombier union 263e12c5d1SDavid du Colombier { 277dd7cddfSDavid du Colombier long u0offset; 287dd7cddfSDavid du Colombier char* u0sval; 297dd7cddfSDavid du Colombier Ieee* u0ieee; 307dd7cddfSDavid du Colombier } u0; 313e12c5d1SDavid du Colombier union 323e12c5d1SDavid du Colombier { 337dd7cddfSDavid du Colombier Auto* u1autom; 347dd7cddfSDavid du Colombier Sym* u1sym; 357dd7cddfSDavid du Colombier } u1; 363e12c5d1SDavid du Colombier char type; 373e12c5d1SDavid du Colombier char reg; 383e12c5d1SDavid du Colombier char name; 393e12c5d1SDavid du Colombier char class; 403e12c5d1SDavid du Colombier }; 417dd7cddfSDavid du Colombier 427dd7cddfSDavid du Colombier #define offset u0.u0offset 437dd7cddfSDavid du Colombier #define sval u0.u0sval 447dd7cddfSDavid du Colombier #define ieee u0.u0ieee 457dd7cddfSDavid du Colombier 467dd7cddfSDavid du Colombier #define autom u1.u1autom 477dd7cddfSDavid du Colombier #define sym u1.u1sym 487dd7cddfSDavid du Colombier 493e12c5d1SDavid du Colombier struct Prog 503e12c5d1SDavid du Colombier { 513e12c5d1SDavid du Colombier Adr from; 523e12c5d1SDavid du Colombier Adr to; 533e12c5d1SDavid du Colombier union 543e12c5d1SDavid du Colombier { 557dd7cddfSDavid du Colombier long u0regused; 567dd7cddfSDavid du Colombier Prog* u0forwd; 577dd7cddfSDavid du Colombier } u0; 583e12c5d1SDavid du Colombier Prog* cond; 593e12c5d1SDavid du Colombier Prog* link; 603e12c5d1SDavid du Colombier long pc; 613e12c5d1SDavid du Colombier long line; 623e12c5d1SDavid du Colombier uchar mark; 633e12c5d1SDavid du Colombier uchar optab; 643e12c5d1SDavid du Colombier char as; 653e12c5d1SDavid du Colombier char reg; 663e12c5d1SDavid du Colombier }; 677dd7cddfSDavid du Colombier #define regused u0.u0regused 687dd7cddfSDavid du Colombier #define forwd u0.u0forwd 697dd7cddfSDavid du Colombier 703e12c5d1SDavid du Colombier struct Sym 713e12c5d1SDavid du Colombier { 72219b2ee8SDavid du Colombier char *name; 733e12c5d1SDavid du Colombier short type; 743e12c5d1SDavid du Colombier short version; 75219b2ee8SDavid du Colombier short become; 76219b2ee8SDavid du Colombier short frame; 773e12c5d1SDavid du Colombier long value; 783e12c5d1SDavid du Colombier Sym* link; 793e12c5d1SDavid du Colombier }; 803e12c5d1SDavid du Colombier struct Autom 813e12c5d1SDavid du Colombier { 827dd7cddfSDavid du Colombier Sym* asym; 833e12c5d1SDavid du Colombier Auto* link; 847dd7cddfSDavid du Colombier long aoffset; 853e12c5d1SDavid du Colombier short type; 863e12c5d1SDavid du Colombier }; 873e12c5d1SDavid du Colombier struct Optab 883e12c5d1SDavid du Colombier { 893e12c5d1SDavid du Colombier char as; 903e12c5d1SDavid du Colombier char a1; 913e12c5d1SDavid du Colombier char a2; 923e12c5d1SDavid du Colombier char a3; 933e12c5d1SDavid du Colombier char type; 943e12c5d1SDavid du Colombier char size; 953e12c5d1SDavid du Colombier char param; 963e12c5d1SDavid du Colombier }; 973e12c5d1SDavid du Colombier struct Oprang 983e12c5d1SDavid du Colombier { 993e12c5d1SDavid du Colombier Optab* start; 1003e12c5d1SDavid du Colombier Optab* stop; 1013e12c5d1SDavid du Colombier }; 102219b2ee8SDavid du Colombier struct Count 1033e12c5d1SDavid du Colombier { 104219b2ee8SDavid du Colombier long count; 105219b2ee8SDavid du Colombier long outof; 1063e12c5d1SDavid du Colombier }; 1073e12c5d1SDavid du Colombier 1083e12c5d1SDavid du Colombier enum 1093e12c5d1SDavid du Colombier { 1103e12c5d1SDavid du Colombier STEXT = 1, 1113e12c5d1SDavid du Colombier SDATA, 1123e12c5d1SDavid du Colombier SBSS, 1133e12c5d1SDavid du Colombier SDATA1, 1143e12c5d1SDavid du Colombier SXREF, 1153e12c5d1SDavid du Colombier SLEAF, 1163e12c5d1SDavid du Colombier SFILE, 117219b2ee8SDavid du Colombier SCONST, 118*9a747e4fSDavid du Colombier SSTRING, 1193e12c5d1SDavid du Colombier 1203e12c5d1SDavid du Colombier C_NONE = 0, 1213e12c5d1SDavid du Colombier C_REG, 1223e12c5d1SDavid du Colombier C_FREG, 1233e12c5d1SDavid du Colombier C_FCREG, 1243e12c5d1SDavid du Colombier C_MREG, 1253e12c5d1SDavid du Colombier C_HI, 1263e12c5d1SDavid du Colombier C_LO, 1273e12c5d1SDavid du Colombier C_ZCON, 1283e12c5d1SDavid du Colombier C_SCON, 1293e12c5d1SDavid du Colombier C_ADD0CON, 1303e12c5d1SDavid du Colombier C_AND0CON, 1313e12c5d1SDavid du Colombier C_ADDCON, 1323e12c5d1SDavid du Colombier C_ANDCON, 1333e12c5d1SDavid du Colombier C_UCON, 1343e12c5d1SDavid du Colombier C_LCON, 1353e12c5d1SDavid du Colombier C_SACON, 1363e12c5d1SDavid du Colombier C_SECON, 1373e12c5d1SDavid du Colombier C_LACON, 1383e12c5d1SDavid du Colombier C_LECON, 1393e12c5d1SDavid du Colombier C_SBRA, 1403e12c5d1SDavid du Colombier C_LBRA, 1413e12c5d1SDavid du Colombier C_SAUTO, 1423e12c5d1SDavid du Colombier C_SEXT, 1433e12c5d1SDavid du Colombier C_LAUTO, 1443e12c5d1SDavid du Colombier C_LEXT, 1453e12c5d1SDavid du Colombier C_ZOREG, 1463e12c5d1SDavid du Colombier C_SOREG, 1473e12c5d1SDavid du Colombier C_LOREG, 1483e12c5d1SDavid du Colombier C_GOK, 1493e12c5d1SDavid du Colombier 150219b2ee8SDavid du Colombier NSCHED = 20, 1513e12c5d1SDavid du Colombier 152219b2ee8SDavid du Colombier /* mark flags */ 153219b2ee8SDavid du Colombier FOLL = 1<<0, 154219b2ee8SDavid du Colombier LABEL = 1<<1, 155219b2ee8SDavid du Colombier LEAF = 1<<2, 156219b2ee8SDavid du Colombier SYNC = 1<<3, 1573e12c5d1SDavid du Colombier BRANCH = 1<<4, 1583e12c5d1SDavid du Colombier LOAD = 1<<5, 159219b2ee8SDavid du Colombier FCMP = 1<<6, 160219b2ee8SDavid du Colombier NOSCHED = 1<<7, 1613e12c5d1SDavid du Colombier 1623e12c5d1SDavid du Colombier BIG = 32766, 1633e12c5d1SDavid du Colombier STRINGSZ = 200, 1643e12c5d1SDavid du Colombier NHASH = 10007, 1653e12c5d1SDavid du Colombier NHUNK = 100000, 1663e12c5d1SDavid du Colombier MINSIZ = 64, 1673e12c5d1SDavid du Colombier NENT = 100, 168219b2ee8SDavid du Colombier MAXIO = 8192, 169219b2ee8SDavid du Colombier MAXHIST = 20, /* limit of path elements for history symbols */ 1703e12c5d1SDavid du Colombier }; 1713e12c5d1SDavid du Colombier 1727dd7cddfSDavid du Colombier EXTERN union 173219b2ee8SDavid du Colombier { 174219b2ee8SDavid du Colombier struct 175219b2ee8SDavid du Colombier { 1767dd7cddfSDavid du Colombier uchar obuf[MAXIO]; /* output buffer */ 1777dd7cddfSDavid du Colombier uchar ibuf[MAXIO]; /* input buffer */ 1787dd7cddfSDavid du Colombier } u; 179219b2ee8SDavid du Colombier char dbuf[1]; 180219b2ee8SDavid du Colombier } buf; 181219b2ee8SDavid du Colombier 1827dd7cddfSDavid du Colombier #define cbuf u.obuf 1837dd7cddfSDavid du Colombier #define xbuf u.ibuf 184219b2ee8SDavid du Colombier 1857dd7cddfSDavid du Colombier EXTERN long HEADR; /* length of header */ 1867dd7cddfSDavid du Colombier EXTERN int HEADTYPE; /* type of header */ 1877dd7cddfSDavid du Colombier EXTERN long INITDAT; /* data location */ 1887dd7cddfSDavid du Colombier EXTERN long INITRND; /* data round above text location */ 1897dd7cddfSDavid du Colombier EXTERN long INITTEXT; /* text location */ 1907dd7cddfSDavid du Colombier EXTERN char* INITENTRY; /* entry point */ 1917dd7cddfSDavid du Colombier EXTERN long autosize; 1927dd7cddfSDavid du Colombier EXTERN Biobuf bso; 1937dd7cddfSDavid du Colombier EXTERN long bsssize; 1947dd7cddfSDavid du Colombier EXTERN int cbc; 1957dd7cddfSDavid du Colombier EXTERN uchar* cbp; 1967dd7cddfSDavid du Colombier EXTERN int cout; 1977dd7cddfSDavid du Colombier EXTERN Auto* curauto; 1987dd7cddfSDavid du Colombier EXTERN Auto* curhist; 1997dd7cddfSDavid du Colombier EXTERN Prog* curp; 2007dd7cddfSDavid du Colombier EXTERN Prog* curtext; 2017dd7cddfSDavid du Colombier EXTERN Prog* datap; 2027dd7cddfSDavid du Colombier EXTERN long datsize; 2037dd7cddfSDavid du Colombier EXTERN char debug[128]; 2047dd7cddfSDavid du Colombier EXTERN Prog* etextp; 2057dd7cddfSDavid du Colombier EXTERN Prog* firstp; 2067dd7cddfSDavid du Colombier EXTERN char fnuxi8[8]; 2077dd7cddfSDavid du Colombier EXTERN char* noname; 2087dd7cddfSDavid du Colombier EXTERN Sym* hash[NHASH]; 2097dd7cddfSDavid du Colombier EXTERN Sym* histfrog[MAXHIST]; 2107dd7cddfSDavid du Colombier EXTERN int histfrogp; 2117dd7cddfSDavid du Colombier EXTERN int histgen; 2127dd7cddfSDavid du Colombier EXTERN char* library[50]; 21380ee5cbfSDavid du Colombier EXTERN char* libraryobj[50]; 2147dd7cddfSDavid du Colombier EXTERN int libraryp; 2157dd7cddfSDavid du Colombier EXTERN int xrefresolv; 2167dd7cddfSDavid du Colombier EXTERN char* hunk; 2177dd7cddfSDavid du Colombier EXTERN char inuxi1[1]; 2187dd7cddfSDavid du Colombier EXTERN char inuxi2[2]; 2197dd7cddfSDavid du Colombier EXTERN char inuxi4[4]; 2207dd7cddfSDavid du Colombier EXTERN Prog* lastp; 2217dd7cddfSDavid du Colombier EXTERN long lcsize; 2227dd7cddfSDavid du Colombier EXTERN char literal[32]; 2237dd7cddfSDavid du Colombier EXTERN int nerrors; 2247dd7cddfSDavid du Colombier EXTERN long nhunk; 2257dd7cddfSDavid du Colombier EXTERN long instoffset; 2267dd7cddfSDavid du Colombier EXTERN Opcross opcross[10]; 2277dd7cddfSDavid du Colombier EXTERN Oprang oprange[ALAST]; 2287dd7cddfSDavid du Colombier EXTERN char* outfile; 2297dd7cddfSDavid du Colombier EXTERN long pc; 2307dd7cddfSDavid du Colombier EXTERN uchar repop[ALAST]; 2317dd7cddfSDavid du Colombier EXTERN long symsize; 2327dd7cddfSDavid du Colombier EXTERN Prog* textp; 2337dd7cddfSDavid du Colombier EXTERN long textsize; 2347dd7cddfSDavid du Colombier EXTERN long thunk; 2357dd7cddfSDavid du Colombier EXTERN int version; 2367dd7cddfSDavid du Colombier EXTERN char xcmp[32][32]; 2377dd7cddfSDavid du Colombier EXTERN Prog zprg; 2387dd7cddfSDavid du Colombier EXTERN int dtype; 2397dd7cddfSDavid du Colombier 2407dd7cddfSDavid du Colombier EXTERN struct 241219b2ee8SDavid du Colombier { 242219b2ee8SDavid du Colombier Count branch; 243219b2ee8SDavid du Colombier Count fcmp; 244219b2ee8SDavid du Colombier Count load; 245219b2ee8SDavid du Colombier Count mfrom; 246219b2ee8SDavid du Colombier Count page; 247219b2ee8SDavid du Colombier Count jump; 248219b2ee8SDavid du Colombier } nop; 2493e12c5d1SDavid du Colombier 2503e12c5d1SDavid du Colombier extern char* anames[]; 2513e12c5d1SDavid du Colombier extern Optab optab[]; 2523e12c5d1SDavid du Colombier 2537dd7cddfSDavid du Colombier #pragma varargck type "A" int 2547dd7cddfSDavid du Colombier #pragma varargck type "D" Adr* 2557dd7cddfSDavid du Colombier #pragma varargck type "N" Adr* 2567dd7cddfSDavid du Colombier #pragma varargck type "P" Prog* 2577dd7cddfSDavid du Colombier #pragma varargck type "S" char* 2587dd7cddfSDavid du Colombier 259*9a747e4fSDavid du Colombier int Aconv(Fmt*); 260*9a747e4fSDavid du Colombier int Dconv(Fmt*); 261*9a747e4fSDavid du Colombier int Nconv(Fmt*); 262*9a747e4fSDavid du Colombier int Pconv(Fmt*); 263*9a747e4fSDavid du Colombier int Sconv(Fmt*); 2643e12c5d1SDavid du Colombier int aclass(Adr*); 2653e12c5d1SDavid du Colombier void addhist(long, int); 2663e12c5d1SDavid du Colombier void addnop(Prog*); 2673e12c5d1SDavid du Colombier void append(Prog*, Prog*); 2683e12c5d1SDavid du Colombier void asmb(void); 2693e12c5d1SDavid du Colombier void asmlc(void); 2703e12c5d1SDavid du Colombier int asmout(Prog*, Optab*, int); 2713e12c5d1SDavid du Colombier void asmsym(void); 2723e12c5d1SDavid du Colombier long atolwhex(char*); 2733e12c5d1SDavid du Colombier Prog* brloop(Prog*); 2743e12c5d1SDavid du Colombier Biobuf bso; 2753e12c5d1SDavid du Colombier void buildop(void); 2763e12c5d1SDavid du Colombier void buildrep(int, int); 2773e12c5d1SDavid du Colombier void cflush(void); 2783e12c5d1SDavid du Colombier int cmp(int, int); 2793e12c5d1SDavid du Colombier int compound(Prog*); 2803e12c5d1SDavid du Colombier double cputime(void); 281*9a747e4fSDavid du Colombier void datblk(long, long, int); 2823e12c5d1SDavid du Colombier void diag(char*, ...); 2833e12c5d1SDavid du Colombier void dodata(void); 2843e12c5d1SDavid du Colombier void doprof1(void); 2853e12c5d1SDavid du Colombier void doprof2(void); 2863e12c5d1SDavid du Colombier long entryvalue(void); 2873e12c5d1SDavid du Colombier void errorexit(void); 2883e12c5d1SDavid du Colombier void exchange(Prog*); 2893e12c5d1SDavid du Colombier int find1(long, int); 2903e12c5d1SDavid du Colombier void follow(void); 2913e12c5d1SDavid du Colombier void gethunk(void); 2923e12c5d1SDavid du Colombier void histtoauto(void); 2933e12c5d1SDavid du Colombier double ieeedtod(Ieee*); 2943e12c5d1SDavid du Colombier long ieeedtof(Ieee*); 295219b2ee8SDavid du Colombier int isnop(Prog*); 2963e12c5d1SDavid du Colombier void ldobj(int, long, char*); 2977dd7cddfSDavid du Colombier void loadlib(void); 2983e12c5d1SDavid du Colombier void listinit(void); 2993e12c5d1SDavid du Colombier Sym* lookup(char*, int); 3003e12c5d1SDavid du Colombier void lput(long); 3013e12c5d1SDavid du Colombier void mkfwd(void); 3027dd7cddfSDavid du Colombier void* mysbrk(ulong); 3033e12c5d1SDavid du Colombier void names(void); 3043e12c5d1SDavid du Colombier void nocache(Prog*); 3053e12c5d1SDavid du Colombier void noops(void); 3063e12c5d1SDavid du Colombier void nuxiinit(void); 3073e12c5d1SDavid du Colombier void objfile(char*); 3087dd7cddfSDavid du Colombier int ocmp(const void*, const void*); 3093e12c5d1SDavid du Colombier long opirr(int); 3103e12c5d1SDavid du Colombier Optab* oplook(Prog*); 3113e12c5d1SDavid du Colombier long oprrr(int); 3123e12c5d1SDavid du Colombier void patch(void); 3133e12c5d1SDavid du Colombier void prasm(Prog*); 3143e12c5d1SDavid du Colombier void prepend(Prog*, Prog*); 3153e12c5d1SDavid du Colombier Prog* prg(void); 3163e12c5d1SDavid du Colombier int pseudo(Prog*); 3173e12c5d1SDavid du Colombier void putsymb(char*, int, long, int); 3183e12c5d1SDavid du Colombier long regoff(Adr*); 3193e12c5d1SDavid du Colombier int relinv(int); 3203e12c5d1SDavid du Colombier long rnd(long, long); 3213e12c5d1SDavid du Colombier void sched(Prog*, Prog*); 3223e12c5d1SDavid du Colombier void span(void); 323219b2ee8SDavid du Colombier void strnput(char*, int); 3243e12c5d1SDavid du Colombier void undef(void); 3253e12c5d1SDavid du Colombier void xdefine(char*, int, long); 3263e12c5d1SDavid du Colombier void xfol(Prog*); 3273e12c5d1SDavid du Colombier void xfol(Prog*); 328219b2ee8SDavid du Colombier void nopstat(char*, Count*); 329