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" 58153b942SDavid 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 11b87cd620SDavid du Colombier #define LIBNAMELEN 300 12b87cd620SDavid du Colombier 133e12c5d1SDavid du Colombier typedef struct Adr Adr; 143e12c5d1SDavid du Colombier typedef struct Sym Sym; 153e12c5d1SDavid du Colombier typedef struct Autom Auto; 163e12c5d1SDavid du Colombier typedef struct Prog Prog; 173e12c5d1SDavid du Colombier typedef struct Optab Optab; 183e12c5d1SDavid du Colombier typedef struct Oprang Oprang; 193e12c5d1SDavid du Colombier typedef uchar Opcross[32][2][32]; 20219b2ee8SDavid du Colombier typedef struct Count Count; 213e12c5d1SDavid du Colombier 223e12c5d1SDavid du Colombier #define P ((Prog*)0) 233e12c5d1SDavid du Colombier #define S ((Sym*)0) 24219b2ee8SDavid du Colombier #define TNAME (curtext&&curtext->from.sym?curtext->from.sym->name:noname) 253e12c5d1SDavid du Colombier 263e12c5d1SDavid du Colombier struct Adr 273e12c5d1SDavid du Colombier { 283e12c5d1SDavid du Colombier union 293e12c5d1SDavid du Colombier { 307dd7cddfSDavid du Colombier long u0offset; 317dd7cddfSDavid du Colombier char* u0sval; 327dd7cddfSDavid du Colombier Ieee* u0ieee; 337dd7cddfSDavid du Colombier } u0; 343e12c5d1SDavid du Colombier union 353e12c5d1SDavid du Colombier { 367dd7cddfSDavid du Colombier Auto* u1autom; 377dd7cddfSDavid du Colombier Sym* u1sym; 387dd7cddfSDavid du Colombier } u1; 393e12c5d1SDavid du Colombier char type; 403e12c5d1SDavid du Colombier char reg; 413e12c5d1SDavid du Colombier char name; 423e12c5d1SDavid du Colombier char class; 433e12c5d1SDavid du Colombier }; 447dd7cddfSDavid du Colombier 457dd7cddfSDavid du Colombier #define offset u0.u0offset 467dd7cddfSDavid du Colombier #define sval u0.u0sval 477dd7cddfSDavid du Colombier #define ieee u0.u0ieee 487dd7cddfSDavid du Colombier 497dd7cddfSDavid du Colombier #define autom u1.u1autom 507dd7cddfSDavid du Colombier #define sym u1.u1sym 517dd7cddfSDavid du Colombier 523e12c5d1SDavid du Colombier struct Prog 533e12c5d1SDavid du Colombier { 543e12c5d1SDavid du Colombier Adr from; 553e12c5d1SDavid du Colombier Adr to; 563e12c5d1SDavid du Colombier union 573e12c5d1SDavid du Colombier { 587dd7cddfSDavid du Colombier long u0regused; 597dd7cddfSDavid du Colombier Prog* u0forwd; 607dd7cddfSDavid du Colombier } u0; 613e12c5d1SDavid du Colombier Prog* cond; 623e12c5d1SDavid du Colombier Prog* link; 63*a587111cSDavid du Colombier vlong pc; 643e12c5d1SDavid du Colombier long line; 653e12c5d1SDavid du Colombier uchar mark; 663e12c5d1SDavid du Colombier uchar optab; 673e12c5d1SDavid du Colombier char as; 683e12c5d1SDavid du Colombier char reg; 693e12c5d1SDavid du Colombier }; 707dd7cddfSDavid du Colombier #define regused u0.u0regused 717dd7cddfSDavid du Colombier #define forwd u0.u0forwd 727dd7cddfSDavid du Colombier 733e12c5d1SDavid du Colombier struct Sym 743e12c5d1SDavid du Colombier { 75219b2ee8SDavid du Colombier char *name; 763e12c5d1SDavid du Colombier short type; 773e12c5d1SDavid du Colombier short version; 78219b2ee8SDavid du Colombier short become; 79219b2ee8SDavid du Colombier short frame; 80*a587111cSDavid du Colombier vlong value; 813e12c5d1SDavid du Colombier Sym* link; 823e12c5d1SDavid du Colombier }; 833e12c5d1SDavid du Colombier struct Autom 843e12c5d1SDavid du Colombier { 857dd7cddfSDavid du Colombier Sym* asym; 863e12c5d1SDavid du Colombier Auto* link; 877dd7cddfSDavid du Colombier long aoffset; 883e12c5d1SDavid du Colombier short type; 893e12c5d1SDavid du Colombier }; 903e12c5d1SDavid du Colombier struct Optab 913e12c5d1SDavid du Colombier { 923e12c5d1SDavid du Colombier char as; 933e12c5d1SDavid du Colombier char a1; 943e12c5d1SDavid du Colombier char a2; 953e12c5d1SDavid du Colombier char a3; 963e12c5d1SDavid du Colombier char type; 973e12c5d1SDavid du Colombier char size; 983e12c5d1SDavid du Colombier char param; 993e12c5d1SDavid du Colombier }; 1003e12c5d1SDavid du Colombier struct Oprang 1013e12c5d1SDavid du Colombier { 1023e12c5d1SDavid du Colombier Optab* start; 1033e12c5d1SDavid du Colombier Optab* stop; 1043e12c5d1SDavid du Colombier }; 105219b2ee8SDavid du Colombier struct Count 1063e12c5d1SDavid du Colombier { 107219b2ee8SDavid du Colombier long count; 108219b2ee8SDavid du Colombier long outof; 1093e12c5d1SDavid du Colombier }; 1103e12c5d1SDavid du Colombier 1113e12c5d1SDavid du Colombier enum 1123e12c5d1SDavid du Colombier { 1133e12c5d1SDavid du Colombier STEXT = 1, 1143e12c5d1SDavid du Colombier SDATA, 1153e12c5d1SDavid du Colombier SBSS, 1163e12c5d1SDavid du Colombier SDATA1, 1173e12c5d1SDavid du Colombier SXREF, 1183e12c5d1SDavid du Colombier SLEAF, 1193e12c5d1SDavid du Colombier SFILE, 120219b2ee8SDavid du Colombier SCONST, 1219a747e4fSDavid du Colombier SSTRING, 1223e12c5d1SDavid du Colombier 1233e12c5d1SDavid du Colombier C_NONE = 0, 1243e12c5d1SDavid du Colombier C_REG, 1253e12c5d1SDavid du Colombier C_FREG, 1263e12c5d1SDavid du Colombier C_FCREG, 1273e12c5d1SDavid du Colombier C_MREG, 1283e12c5d1SDavid du Colombier C_HI, 1293e12c5d1SDavid du Colombier C_LO, 1303e12c5d1SDavid du Colombier C_ZCON, 1313e12c5d1SDavid du Colombier C_SCON, 1323e12c5d1SDavid du Colombier C_ADD0CON, 1333e12c5d1SDavid du Colombier C_AND0CON, 1343e12c5d1SDavid du Colombier C_ADDCON, 1353e12c5d1SDavid du Colombier C_ANDCON, 1363e12c5d1SDavid du Colombier C_UCON, 1373e12c5d1SDavid du Colombier C_LCON, 1383e12c5d1SDavid du Colombier C_SACON, 1393e12c5d1SDavid du Colombier C_SECON, 1403e12c5d1SDavid du Colombier C_LACON, 1413e12c5d1SDavid du Colombier C_LECON, 1423e12c5d1SDavid du Colombier C_SBRA, 1433e12c5d1SDavid du Colombier C_LBRA, 1443e12c5d1SDavid du Colombier C_SAUTO, 1453e12c5d1SDavid du Colombier C_SEXT, 1463e12c5d1SDavid du Colombier C_LAUTO, 1473e12c5d1SDavid du Colombier C_LEXT, 1483e12c5d1SDavid du Colombier C_ZOREG, 1493e12c5d1SDavid du Colombier C_SOREG, 1503e12c5d1SDavid du Colombier C_LOREG, 1513e12c5d1SDavid du Colombier C_GOK, 1523e12c5d1SDavid du Colombier 153219b2ee8SDavid du Colombier NSCHED = 20, 1543e12c5d1SDavid du Colombier 155219b2ee8SDavid du Colombier /* mark flags */ 156219b2ee8SDavid du Colombier FOLL = 1<<0, 157219b2ee8SDavid du Colombier LABEL = 1<<1, 158219b2ee8SDavid du Colombier LEAF = 1<<2, 159219b2ee8SDavid du Colombier SYNC = 1<<3, 1603e12c5d1SDavid du Colombier BRANCH = 1<<4, 1613e12c5d1SDavid du Colombier LOAD = 1<<5, 162219b2ee8SDavid du Colombier FCMP = 1<<6, 163219b2ee8SDavid du Colombier NOSCHED = 1<<7, 1643e12c5d1SDavid du Colombier 1653e12c5d1SDavid du Colombier BIG = 32766, 1663e12c5d1SDavid du Colombier STRINGSZ = 200, 1673e12c5d1SDavid du Colombier NHASH = 10007, 1683e12c5d1SDavid du Colombier NHUNK = 100000, 1693e12c5d1SDavid du Colombier MINSIZ = 64, 1703e12c5d1SDavid du Colombier NENT = 100, 171219b2ee8SDavid du Colombier MAXIO = 8192, 172219b2ee8SDavid du Colombier MAXHIST = 20, /* limit of path elements for history symbols */ 1733e12c5d1SDavid du Colombier }; 1743e12c5d1SDavid du Colombier 1757dd7cddfSDavid du Colombier EXTERN union 176219b2ee8SDavid du Colombier { 177219b2ee8SDavid du Colombier struct 178219b2ee8SDavid du Colombier { 1797dd7cddfSDavid du Colombier uchar obuf[MAXIO]; /* output buffer */ 1807dd7cddfSDavid du Colombier uchar ibuf[MAXIO]; /* input buffer */ 1817dd7cddfSDavid du Colombier } u; 182219b2ee8SDavid du Colombier char dbuf[1]; 183219b2ee8SDavid du Colombier } buf; 184219b2ee8SDavid du Colombier 1857dd7cddfSDavid du Colombier #define cbuf u.obuf 1867dd7cddfSDavid du Colombier #define xbuf u.ibuf 187219b2ee8SDavid du Colombier 1887dd7cddfSDavid du Colombier EXTERN long HEADR; /* length of header */ 1897dd7cddfSDavid du Colombier EXTERN int HEADTYPE; /* type of header */ 190*a587111cSDavid du Colombier EXTERN vlong INITDAT; /* data location */ 191*a587111cSDavid du Colombier EXTERN vlong INITRND; /* data round above text location */ 192*a587111cSDavid du Colombier EXTERN vlong INITTEXT; /* text location */ 193*a587111cSDavid du Colombier EXTERN vlong INITTEXTP; /* text location (physical) */ 1947dd7cddfSDavid du Colombier EXTERN char* INITENTRY; /* entry point */ 1957dd7cddfSDavid du Colombier EXTERN long autosize; 1967dd7cddfSDavid du Colombier EXTERN Biobuf bso; 1977dd7cddfSDavid du Colombier EXTERN long bsssize; 1987dd7cddfSDavid du Colombier EXTERN int cbc; 1997dd7cddfSDavid du Colombier EXTERN uchar* cbp; 2007dd7cddfSDavid du Colombier EXTERN int cout; 2017dd7cddfSDavid du Colombier EXTERN Auto* curauto; 2027dd7cddfSDavid du Colombier EXTERN Auto* curhist; 2037dd7cddfSDavid du Colombier EXTERN Prog* curp; 2047dd7cddfSDavid du Colombier EXTERN Prog* curtext; 2057dd7cddfSDavid du Colombier EXTERN Prog* datap; 2067dd7cddfSDavid du Colombier EXTERN long datsize; 2077dd7cddfSDavid du Colombier EXTERN char debug[128]; 2087dd7cddfSDavid du Colombier EXTERN Prog* etextp; 2097dd7cddfSDavid du Colombier EXTERN Prog* firstp; 2106a9fc400SDavid du Colombier EXTERN char fnuxi4[4]; /* for 3l [sic] */ 2117dd7cddfSDavid du Colombier EXTERN char fnuxi8[8]; 2127dd7cddfSDavid du Colombier EXTERN char* noname; 2137dd7cddfSDavid du Colombier EXTERN Sym* hash[NHASH]; 2147dd7cddfSDavid du Colombier EXTERN Sym* histfrog[MAXHIST]; 2157dd7cddfSDavid du Colombier EXTERN int histfrogp; 2167dd7cddfSDavid du Colombier EXTERN int histgen; 2177dd7cddfSDavid du Colombier EXTERN char* library[50]; 21880ee5cbfSDavid du Colombier EXTERN char* libraryobj[50]; 2197dd7cddfSDavid du Colombier EXTERN int libraryp; 2207dd7cddfSDavid du Colombier EXTERN int xrefresolv; 2217dd7cddfSDavid du Colombier EXTERN char* hunk; 2227dd7cddfSDavid du Colombier EXTERN char inuxi1[1]; 2237dd7cddfSDavid du Colombier EXTERN char inuxi2[2]; 2247dd7cddfSDavid du Colombier EXTERN char inuxi4[4]; 2257dd7cddfSDavid du Colombier EXTERN Prog* lastp; 2267dd7cddfSDavid du Colombier EXTERN long lcsize; 2277dd7cddfSDavid du Colombier EXTERN char literal[32]; 2287dd7cddfSDavid du Colombier EXTERN int nerrors; 2297dd7cddfSDavid du Colombier EXTERN long nhunk; 2307dd7cddfSDavid du Colombier EXTERN long instoffset; 2317dd7cddfSDavid du Colombier EXTERN Opcross opcross[10]; 2327dd7cddfSDavid du Colombier EXTERN Oprang oprange[ALAST]; 2337dd7cddfSDavid du Colombier EXTERN char* outfile; 234*a587111cSDavid du Colombier EXTERN vlong pc; 2357dd7cddfSDavid du Colombier EXTERN uchar repop[ALAST]; 2367dd7cddfSDavid du Colombier EXTERN long symsize; 2377dd7cddfSDavid du Colombier EXTERN Prog* textp; 238*a587111cSDavid du Colombier EXTERN vlong textsize; 2397dd7cddfSDavid du Colombier EXTERN long thunk; 2407dd7cddfSDavid du Colombier EXTERN int version; 2417dd7cddfSDavid du Colombier EXTERN char xcmp[32][32]; 2427dd7cddfSDavid du Colombier EXTERN Prog zprg; 2437dd7cddfSDavid du Colombier EXTERN int dtype; 24491178603SDavid du Colombier EXTERN int little; 2457dd7cddfSDavid du Colombier 2467dd7cddfSDavid du Colombier EXTERN struct 247219b2ee8SDavid du Colombier { 248219b2ee8SDavid du Colombier Count branch; 249219b2ee8SDavid du Colombier Count fcmp; 250219b2ee8SDavid du Colombier Count load; 251219b2ee8SDavid du Colombier Count mfrom; 252219b2ee8SDavid du Colombier Count page; 253219b2ee8SDavid du Colombier Count jump; 25458b97a46SDavid du Colombier Count store; 255219b2ee8SDavid du Colombier } nop; 2563e12c5d1SDavid du Colombier 2573e12c5d1SDavid du Colombier extern char* anames[]; 2583e12c5d1SDavid du Colombier extern Optab optab[]; 2593e12c5d1SDavid du Colombier 2607dd7cddfSDavid du Colombier #pragma varargck type "A" int 2617dd7cddfSDavid du Colombier #pragma varargck type "D" Adr* 2627dd7cddfSDavid du Colombier #pragma varargck type "N" Adr* 2637dd7cddfSDavid du Colombier #pragma varargck type "P" Prog* 2647dd7cddfSDavid du Colombier #pragma varargck type "S" char* 2657dd7cddfSDavid du Colombier 266406758d9SDavid du Colombier #pragma varargck argpos diag 1 267406758d9SDavid du Colombier 2689a747e4fSDavid du Colombier int Aconv(Fmt*); 2699a747e4fSDavid du Colombier int Dconv(Fmt*); 2709a747e4fSDavid du Colombier int Nconv(Fmt*); 2719a747e4fSDavid du Colombier int Pconv(Fmt*); 2729a747e4fSDavid du Colombier int Sconv(Fmt*); 2733e12c5d1SDavid du Colombier int aclass(Adr*); 2743e12c5d1SDavid du Colombier void addhist(long, int); 275b87cd620SDavid du Colombier void addlibpath(char*); 2763e12c5d1SDavid du Colombier void addnop(Prog*); 2773e12c5d1SDavid du Colombier void append(Prog*, Prog*); 2783e12c5d1SDavid du Colombier void asmb(void); 2793e12c5d1SDavid du Colombier void asmlc(void); 2803e12c5d1SDavid du Colombier int asmout(Prog*, Optab*, int); 2813e12c5d1SDavid du Colombier void asmsym(void); 282*a587111cSDavid du Colombier vlong atolwhex(char*); 2833e12c5d1SDavid du Colombier Prog* brloop(Prog*); 2843e12c5d1SDavid du Colombier void buildop(void); 2853e12c5d1SDavid du Colombier void buildrep(int, int); 2863e12c5d1SDavid du Colombier void cflush(void); 2873e12c5d1SDavid du Colombier int cmp(int, int); 2888153b942SDavid du Colombier void cput(long); 2893e12c5d1SDavid du Colombier int compound(Prog*); 2903e12c5d1SDavid du Colombier double cputime(void); 2919a747e4fSDavid du Colombier void datblk(long, long, int); 2923e12c5d1SDavid du Colombier void diag(char*, ...); 2933e12c5d1SDavid du Colombier void dodata(void); 2943e12c5d1SDavid du Colombier void doprof1(void); 2953e12c5d1SDavid du Colombier void doprof2(void); 2963e12c5d1SDavid du Colombier long entryvalue(void); 2973e12c5d1SDavid du Colombier void errorexit(void); 2983e12c5d1SDavid du Colombier void exchange(Prog*); 299b87cd620SDavid du Colombier int fileexists(char*); 3003e12c5d1SDavid du Colombier int find1(long, int); 301b87cd620SDavid du Colombier char* findlib(char*); 3023e12c5d1SDavid du Colombier void follow(void); 3033e12c5d1SDavid du Colombier void gethunk(void); 3043e12c5d1SDavid du Colombier void histtoauto(void); 3053e12c5d1SDavid du Colombier double ieeedtod(Ieee*); 3063e12c5d1SDavid du Colombier long ieeedtof(Ieee*); 307219b2ee8SDavid du Colombier int isnop(Prog*); 3083e12c5d1SDavid du Colombier void ldobj(int, long, char*); 3097dd7cddfSDavid du Colombier void loadlib(void); 3103e12c5d1SDavid du Colombier void listinit(void); 3113e12c5d1SDavid du Colombier Sym* lookup(char*, int); 3128153b942SDavid du Colombier void llput(vlong); 3138153b942SDavid du Colombier void llputl(vlong); 3143e12c5d1SDavid du Colombier void lput(long); 3158153b942SDavid du Colombier void lputl(long); 31691178603SDavid du Colombier void bput(long); 3173e12c5d1SDavid du Colombier void mkfwd(void); 3187dd7cddfSDavid du Colombier void* mysbrk(ulong); 3193e12c5d1SDavid du Colombier void names(void); 3203e12c5d1SDavid du Colombier void nocache(Prog*); 3213e12c5d1SDavid du Colombier void noops(void); 322*a587111cSDavid du Colombier void nopstat(char*, Count*); 3233e12c5d1SDavid du Colombier void nuxiinit(void); 3243e12c5d1SDavid du Colombier void objfile(char*); 3257dd7cddfSDavid du Colombier int ocmp(const void*, const void*); 3263e12c5d1SDavid du Colombier long opirr(int); 3273e12c5d1SDavid du Colombier Optab* oplook(Prog*); 3283e12c5d1SDavid du Colombier long oprrr(int); 3293e12c5d1SDavid du Colombier void patch(void); 3303e12c5d1SDavid du Colombier void prasm(Prog*); 3313e12c5d1SDavid du Colombier void prepend(Prog*, Prog*); 3323e12c5d1SDavid du Colombier Prog* prg(void); 3333e12c5d1SDavid du Colombier int pseudo(Prog*); 3343e12c5d1SDavid du Colombier void putsymb(char*, int, long, int); 3353e12c5d1SDavid du Colombier long regoff(Adr*); 3363e12c5d1SDavid du Colombier int relinv(int); 337*a587111cSDavid du Colombier vlong rnd(vlong, long); 3383e12c5d1SDavid du Colombier void sched(Prog*, Prog*); 3393e12c5d1SDavid du Colombier void span(void); 340219b2ee8SDavid du Colombier void strnput(char*, int); 3413e12c5d1SDavid du Colombier void undef(void); 3428153b942SDavid du Colombier void wput(long); 3438153b942SDavid du Colombier void wputl(long); 3443e12c5d1SDavid du Colombier void xdefine(char*, int, long); 3453e12c5d1SDavid du Colombier void xfol(Prog*); 3463e12c5d1SDavid du Colombier void xfol(Prog*); 347