13e12c5d1SDavid du Colombier #include <u.h> 23e12c5d1SDavid du Colombier #include <libc.h> 33e12c5d1SDavid du Colombier #include <bio.h> 43e12c5d1SDavid du Colombier #include "../kc/k.out.h" 53e12c5d1SDavid du Colombier 67dd7cddfSDavid du Colombier #ifndef EXTERN 77dd7cddfSDavid du Colombier #define EXTERN extern 87dd7cddfSDavid du Colombier #endif 97dd7cddfSDavid du Colombier 10*b87cd620SDavid du Colombier #define LIBNAMELEN 300 11*b87cd620SDavid du Colombier 123e12c5d1SDavid du Colombier typedef struct Adr Adr; 133e12c5d1SDavid du Colombier typedef struct Sym Sym; 143e12c5d1SDavid du Colombier typedef struct Autom Auto; 153e12c5d1SDavid du Colombier typedef struct Prog Prog; 163e12c5d1SDavid du Colombier typedef struct Optab Optab; 173e12c5d1SDavid du Colombier 183e12c5d1SDavid du Colombier #define P ((Prog*)0) 193e12c5d1SDavid du Colombier #define S ((Sym*)0) 20219b2ee8SDavid du Colombier #define TNAME (curtext&&curtext->from.sym?curtext->from.sym->name:noname) 213e12c5d1SDavid du Colombier 223e12c5d1SDavid du Colombier struct Adr 233e12c5d1SDavid du Colombier { 243e12c5d1SDavid du Colombier union 253e12c5d1SDavid du Colombier { 267dd7cddfSDavid du Colombier long u0offset; 277dd7cddfSDavid du Colombier char u0sval[NSNAME]; 287dd7cddfSDavid du Colombier Ieee u0ieee; 297dd7cddfSDavid du Colombier } u0; 307dd7cddfSDavid du Colombier union 317dd7cddfSDavid du Colombier { 327dd7cddfSDavid du Colombier Auto* u1autom; 337dd7cddfSDavid du Colombier Sym* u1sym; 347dd7cddfSDavid du Colombier } u1; 353e12c5d1SDavid du Colombier char type; 363e12c5d1SDavid du Colombier char reg; 373e12c5d1SDavid du Colombier char name; 383e12c5d1SDavid du Colombier char class; 393e12c5d1SDavid du Colombier }; 407dd7cddfSDavid du Colombier 417dd7cddfSDavid du Colombier #define offset u0.u0offset 427dd7cddfSDavid du Colombier #define sval u0.u0sval 437dd7cddfSDavid du Colombier #define ieee u0.u0ieee 447dd7cddfSDavid du Colombier 457dd7cddfSDavid du Colombier #define autom u1.u1autom 467dd7cddfSDavid du Colombier #define sym u1.u1sym 477dd7cddfSDavid du Colombier 483e12c5d1SDavid du Colombier struct Prog 493e12c5d1SDavid du Colombier { 503e12c5d1SDavid du Colombier Adr from; 513e12c5d1SDavid du Colombier Adr to; 523e12c5d1SDavid du Colombier Prog *forwd; 533e12c5d1SDavid du Colombier Prog *cond; 543e12c5d1SDavid du Colombier Prog *link; 553e12c5d1SDavid du Colombier long pc; 563e12c5d1SDavid du Colombier long regused; 573e12c5d1SDavid du Colombier short line; 583e12c5d1SDavid du Colombier short mark; 597dd7cddfSDavid du Colombier uchar optab; 603e12c5d1SDavid du Colombier uchar as; 613e12c5d1SDavid du Colombier char reg; 623e12c5d1SDavid du Colombier }; 633e12c5d1SDavid du Colombier struct Sym 643e12c5d1SDavid du Colombier { 65219b2ee8SDavid du Colombier char *name; 663e12c5d1SDavid du Colombier short type; 673e12c5d1SDavid du Colombier short version; 68219b2ee8SDavid du Colombier short become; 69219b2ee8SDavid du Colombier short frame; 703e12c5d1SDavid du Colombier long value; 713e12c5d1SDavid du Colombier Sym *link; 723e12c5d1SDavid du Colombier }; 733e12c5d1SDavid du Colombier struct Autom 743e12c5d1SDavid du Colombier { 757dd7cddfSDavid du Colombier Sym *asym; 763e12c5d1SDavid du Colombier Auto *link; 777dd7cddfSDavid du Colombier long aoffset; 783e12c5d1SDavid du Colombier short type; 793e12c5d1SDavid du Colombier }; 803e12c5d1SDavid du Colombier struct Optab 813e12c5d1SDavid du Colombier { 823e12c5d1SDavid du Colombier uchar as; 833e12c5d1SDavid du Colombier char a1; 843e12c5d1SDavid du Colombier char a2; 853e12c5d1SDavid du Colombier char a3; 863e12c5d1SDavid du Colombier char type; 873e12c5d1SDavid du Colombier char size; 883e12c5d1SDavid du Colombier char param; 893e12c5d1SDavid du Colombier }; 907dd7cddfSDavid du Colombier EXTERN struct 913e12c5d1SDavid du Colombier { 923e12c5d1SDavid du Colombier Optab* start; 933e12c5d1SDavid du Colombier Optab* stop; 943e12c5d1SDavid du Colombier } oprange[AEND]; 953e12c5d1SDavid du Colombier 963e12c5d1SDavid du Colombier enum 973e12c5d1SDavid du Colombier { 983e12c5d1SDavid du Colombier AXLD = AEND+1, 993e12c5d1SDavid du Colombier AXST, 1003e12c5d1SDavid du Colombier FPCHIP = 1, 1013e12c5d1SDavid du Colombier BIG = 4096-8, 1023e12c5d1SDavid du Colombier STRINGSZ = 200, 103219b2ee8SDavid du Colombier MAXIO = 8192, 104219b2ee8SDavid du Colombier MAXHIST = 20, /* limit of path elements for history symbols */ 1053e12c5d1SDavid du Colombier DATBLK = 1024, 1063e12c5d1SDavid du Colombier NHASH = 10007, 1073e12c5d1SDavid du Colombier NHUNK = 100000, 1083e12c5d1SDavid du Colombier MINSIZ = 64, 1093e12c5d1SDavid du Colombier NENT = 100, 1103e12c5d1SDavid du Colombier NSCHED = 20, 1113e12c5d1SDavid du Colombier 1123e12c5d1SDavid du Colombier /* mark flags */ 1133e12c5d1SDavid du Colombier LABEL = 1<<0, 1143e12c5d1SDavid du Colombier LEAF = 1<<1, 1153e12c5d1SDavid du Colombier FLOAT = 1<<2, 1163e12c5d1SDavid du Colombier BRANCH = 1<<3, 1173e12c5d1SDavid du Colombier LOAD = 1<<4, 1183e12c5d1SDavid du Colombier FCMP = 1<<5, 1193e12c5d1SDavid du Colombier SYNC = 1<<6, 1203e12c5d1SDavid du Colombier LIST = 1<<7, 1213e12c5d1SDavid du Colombier FOLL = 1<<8, 122219b2ee8SDavid du Colombier NOSCHED = 1<<9, 1233e12c5d1SDavid du Colombier 1243e12c5d1SDavid du Colombier STEXT = 1, 1253e12c5d1SDavid du Colombier SDATA, 1263e12c5d1SDavid du Colombier SBSS, 1273e12c5d1SDavid du Colombier SDATA1, 1283e12c5d1SDavid du Colombier SXREF, 1293e12c5d1SDavid du Colombier SLEAF, 1303e12c5d1SDavid du Colombier SFILE, 131219b2ee8SDavid du Colombier SCONST, 1323e12c5d1SDavid du Colombier 1333e12c5d1SDavid du Colombier C_NONE = 0, 1343e12c5d1SDavid du Colombier 1353e12c5d1SDavid du Colombier C_REG, 1363e12c5d1SDavid du Colombier C_FREG, 1373e12c5d1SDavid du Colombier C_CREG, 1383e12c5d1SDavid du Colombier C_PREG, 1393e12c5d1SDavid du Colombier C_FSR, 1403e12c5d1SDavid du Colombier C_FQ, 1413e12c5d1SDavid du Colombier 1423e12c5d1SDavid du Colombier C_ZCON, /* 0 */ 1433e12c5d1SDavid du Colombier C_SCON, /* 13 bit signed */ 1443e12c5d1SDavid du Colombier C_UCON, /* low 10 bits 0 */ 1453e12c5d1SDavid du Colombier C_LCON, /* other */ 1463e12c5d1SDavid du Colombier 1473e12c5d1SDavid du Colombier C_SACON, 1483e12c5d1SDavid du Colombier C_SECON, 1493e12c5d1SDavid du Colombier C_LACON, 1503e12c5d1SDavid du Colombier C_LECON, 1513e12c5d1SDavid du Colombier 1523e12c5d1SDavid du Colombier C_SBRA, 1533e12c5d1SDavid du Colombier C_LBRA, 1543e12c5d1SDavid du Colombier 1553e12c5d1SDavid du Colombier C_ESAUTO, 1563e12c5d1SDavid du Colombier C_OSAUTO, 1573e12c5d1SDavid du Colombier C_SAUTO, 1583e12c5d1SDavid du Colombier C_OLAUTO, 1593e12c5d1SDavid du Colombier C_ELAUTO, 1603e12c5d1SDavid du Colombier C_LAUTO, 1613e12c5d1SDavid du Colombier 1623e12c5d1SDavid du Colombier C_ESEXT, 1633e12c5d1SDavid du Colombier C_OSEXT, 1643e12c5d1SDavid du Colombier C_SEXT, 1653e12c5d1SDavid du Colombier C_ELEXT, 1663e12c5d1SDavid du Colombier C_OLEXT, 1673e12c5d1SDavid du Colombier C_LEXT, 1683e12c5d1SDavid du Colombier 1693e12c5d1SDavid du Colombier C_ZOREG, 1703e12c5d1SDavid du Colombier C_SOREG, 1713e12c5d1SDavid du Colombier C_LOREG, 1723e12c5d1SDavid du Colombier C_ASI, 1733e12c5d1SDavid du Colombier 1743e12c5d1SDavid du Colombier C_ANY, 1753e12c5d1SDavid du Colombier 1763e12c5d1SDavid du Colombier C_GOK, 1773e12c5d1SDavid du Colombier 1783e12c5d1SDavid du Colombier C_NCLASS 1793e12c5d1SDavid du Colombier }; 1803e12c5d1SDavid du Colombier 1817dd7cddfSDavid du Colombier EXTERN union 182219b2ee8SDavid du Colombier { 183219b2ee8SDavid du Colombier struct 184219b2ee8SDavid du Colombier { 1857dd7cddfSDavid du Colombier uchar obuf[MAXIO]; /* output buffer */ 1867dd7cddfSDavid du Colombier uchar ibuf[MAXIO]; /* input buffer */ 1877dd7cddfSDavid du Colombier } u; 188219b2ee8SDavid du Colombier char dbuf[1]; 189219b2ee8SDavid du Colombier } buf; 190219b2ee8SDavid du Colombier 1917dd7cddfSDavid du Colombier #define cbuf u.obuf 1927dd7cddfSDavid du Colombier #define xbuf u.ibuf 1937dd7cddfSDavid du Colombier 1947dd7cddfSDavid du Colombier EXTERN long HEADR; /* length of header */ 1957dd7cddfSDavid du Colombier EXTERN int HEADTYPE; /* type of header */ 1967dd7cddfSDavid du Colombier EXTERN long INITDAT; /* data location */ 1977dd7cddfSDavid du Colombier EXTERN long INITRND; /* data round above text location */ 1987dd7cddfSDavid du Colombier EXTERN long INITTEXT; /* text location */ 1997dd7cddfSDavid du Colombier EXTERN char* INITENTRY; /* entry point */ 2007dd7cddfSDavid du Colombier EXTERN long autosize; 2017dd7cddfSDavid du Colombier EXTERN Biobuf bso; 2027dd7cddfSDavid du Colombier EXTERN long bsssize; 2037dd7cddfSDavid du Colombier EXTERN int cbc; 2047dd7cddfSDavid du Colombier EXTERN uchar* cbp; 2057dd7cddfSDavid du Colombier EXTERN int cout; 2067dd7cddfSDavid du Colombier EXTERN Auto* curauto; 2077dd7cddfSDavid du Colombier EXTERN Auto* curhist; 2087dd7cddfSDavid du Colombier EXTERN Prog* curp; 2097dd7cddfSDavid du Colombier EXTERN Prog* curtext; 2107dd7cddfSDavid du Colombier EXTERN Prog* datap; 2117dd7cddfSDavid du Colombier EXTERN Prog* prog_mul; 2127dd7cddfSDavid du Colombier EXTERN Prog* prog_div; 2137dd7cddfSDavid du Colombier EXTERN Prog* prog_divl; 2147dd7cddfSDavid du Colombier EXTERN Prog* prog_mod; 2157dd7cddfSDavid du Colombier EXTERN Prog* prog_modl; 2167dd7cddfSDavid du Colombier EXTERN long datsize; 2177dd7cddfSDavid du Colombier EXTERN char debug[128]; 2187dd7cddfSDavid du Colombier EXTERN Prog* firstp; 2197dd7cddfSDavid du Colombier EXTERN char fnuxi8[8]; 2207dd7cddfSDavid du Colombier EXTERN Sym* hash[NHASH]; 2217dd7cddfSDavid du Colombier EXTERN Sym* histfrog[MAXHIST]; 2227dd7cddfSDavid du Colombier EXTERN int histfrogp; 2237dd7cddfSDavid du Colombier EXTERN int histgen; 2247dd7cddfSDavid du Colombier EXTERN char* library[50]; 22580ee5cbfSDavid du Colombier EXTERN char* libraryobj[50]; 2267dd7cddfSDavid du Colombier EXTERN int libraryp; 227b7b24591SDavid du Colombier EXTERN int xrefresolv; 2287dd7cddfSDavid du Colombier EXTERN char* hunk; 2297dd7cddfSDavid du Colombier EXTERN char inuxi1[1]; 2307dd7cddfSDavid du Colombier EXTERN char inuxi2[2]; 2317dd7cddfSDavid du Colombier EXTERN char inuxi4[4]; 2327dd7cddfSDavid du Colombier EXTERN Prog* lastp; 2337dd7cddfSDavid du Colombier EXTERN long lcsize; 2347dd7cddfSDavid du Colombier EXTERN char literal[32]; 2357dd7cddfSDavid du Colombier EXTERN int nerrors; 2367dd7cddfSDavid du Colombier EXTERN long nhunk; 2377dd7cddfSDavid du Colombier EXTERN char* noname; 2387dd7cddfSDavid du Colombier EXTERN long instoffset; 2397dd7cddfSDavid du Colombier EXTERN char* outfile; 2407dd7cddfSDavid du Colombier EXTERN long pc; 2417dd7cddfSDavid du Colombier EXTERN long symsize; 2427dd7cddfSDavid du Colombier EXTERN long staticgen; 2437dd7cddfSDavid du Colombier EXTERN Prog* textp; 2447dd7cddfSDavid du Colombier EXTERN long textsize; 2457dd7cddfSDavid du Colombier EXTERN long tothunk; 2467dd7cddfSDavid du Colombier EXTERN char xcmp[C_NCLASS][C_NCLASS]; 2477dd7cddfSDavid du Colombier EXTERN int version; 2487dd7cddfSDavid du Colombier EXTERN Prog zprg; 2497dd7cddfSDavid du Colombier EXTERN int dtype; 2503e12c5d1SDavid du Colombier 2513e12c5d1SDavid du Colombier extern Optab optab[]; 2523e12c5d1SDavid du Colombier extern char* anames[]; 2533e12c5d1SDavid du Colombier 2547dd7cddfSDavid du Colombier #pragma varargck type "A" int 255406758d9SDavid du Colombier #pragma varargck type "A" uint 2567dd7cddfSDavid du Colombier #pragma varargck type "D" Adr* 2577dd7cddfSDavid du Colombier #pragma varargck type "N" Adr* 2587dd7cddfSDavid du Colombier #pragma varargck type "P" Prog* 2597dd7cddfSDavid du Colombier #pragma varargck type "S" char* 2607dd7cddfSDavid du Colombier 261406758d9SDavid du Colombier #pragma varargck argpos diag 1 262406758d9SDavid du Colombier 2639a747e4fSDavid du Colombier int Aconv(Fmt*); 2649a747e4fSDavid du Colombier int Dconv(Fmt*); 2659a747e4fSDavid du Colombier int Nconv(Fmt*); 2669a747e4fSDavid du Colombier int Pconv(Fmt*); 2679a747e4fSDavid du Colombier int Sconv(Fmt*); 2683e12c5d1SDavid du Colombier int aclass(Adr*); 2693e12c5d1SDavid du Colombier void addhist(long, int); 2703e12c5d1SDavid du Colombier void histtoauto(void); 271*b87cd620SDavid du Colombier void addlibpath(char*); 2723e12c5d1SDavid du Colombier void addnop(Prog*); 2733e12c5d1SDavid du Colombier void append(Prog*, Prog*); 2743e12c5d1SDavid du Colombier void asmb(void); 2753e12c5d1SDavid du Colombier void asmlc(void); 2763e12c5d1SDavid du Colombier int asmout(Prog*, Optab*, int); 2773e12c5d1SDavid du Colombier void asmsym(void); 2783e12c5d1SDavid du Colombier long atolwhex(char*); 2793e12c5d1SDavid du Colombier Prog* brloop(Prog*); 2803e12c5d1SDavid du Colombier void buildop(void); 2813e12c5d1SDavid du Colombier void cflush(void); 2823e12c5d1SDavid du Colombier int cmp(int, int); 2833e12c5d1SDavid du Colombier int compound(Prog*); 2843e12c5d1SDavid du Colombier double cputime(void); 2853e12c5d1SDavid du Colombier void datblk(long, long); 2863e12c5d1SDavid du Colombier void diag(char*, ...); 2873e12c5d1SDavid du Colombier void dodata(void); 2883e12c5d1SDavid du Colombier void doprof1(void); 2893e12c5d1SDavid du Colombier void doprof2(void); 2903e12c5d1SDavid du Colombier long entryvalue(void); 2913e12c5d1SDavid du Colombier void errorexit(void); 2923e12c5d1SDavid du Colombier void exchange(Prog*); 293*b87cd620SDavid du Colombier int fileexists(char*); 2943e12c5d1SDavid du Colombier int find1(long, int); 295*b87cd620SDavid du Colombier char* findlib(char*); 2963e12c5d1SDavid du Colombier void follow(void); 2973e12c5d1SDavid du Colombier void gethunk(void); 2983e12c5d1SDavid du Colombier double ieeedtod(Ieee*); 2993e12c5d1SDavid du Colombier long ieeedtof(Ieee*); 300219b2ee8SDavid du Colombier int isnop(Prog*); 3013e12c5d1SDavid du Colombier void ldobj(int, long, char*); 302b7b24591SDavid du Colombier void loadlib(void); 3033e12c5d1SDavid du Colombier void listinit(void); 3043e12c5d1SDavid du Colombier void initmuldiv(void); 3053e12c5d1SDavid du Colombier Sym* lookup(char*, int); 3063e12c5d1SDavid du Colombier void lput(long); 3073e12c5d1SDavid du Colombier void mkfwd(void); 3087dd7cddfSDavid du Colombier void* mysbrk(ulong); 3093e12c5d1SDavid du Colombier void names(void); 3103e12c5d1SDavid du Colombier void nocache(Prog*); 3113e12c5d1SDavid du Colombier void noops(void); 3123e12c5d1SDavid du Colombier void nuxiinit(void); 3133e12c5d1SDavid du Colombier void objfile(char*); 3147dd7cddfSDavid du Colombier int ocmp(const void*, const void*); 3153e12c5d1SDavid du Colombier long opcode(int); 3163e12c5d1SDavid du Colombier Optab* oplook(Prog*); 3173e12c5d1SDavid du Colombier void patch(void); 3183e12c5d1SDavid du Colombier void prasm(Prog*); 3193e12c5d1SDavid du Colombier void prepend(Prog*, Prog*); 3203e12c5d1SDavid du Colombier Prog* prg(void); 3213e12c5d1SDavid du Colombier int pseudo(Prog*); 3223e12c5d1SDavid du Colombier void putsymb(char*, int, long, int); 3233e12c5d1SDavid du Colombier long regoff(Adr*); 3243e12c5d1SDavid du Colombier int relinv(int); 3253e12c5d1SDavid du Colombier long rnd(long, long); 3263e12c5d1SDavid du Colombier void sched(Prog*, Prog*); 3273e12c5d1SDavid du Colombier void span(void); 3283e12c5d1SDavid du Colombier void undef(void); 3293e12c5d1SDavid du Colombier void xdefine(char*, int, long); 3303e12c5d1SDavid du Colombier void xfol(Prog*); 331