17dd7cddfSDavid du Colombier #include <u.h> 27dd7cddfSDavid du Colombier #include <libc.h> 37dd7cddfSDavid du Colombier #include <bio.h> 47dd7cddfSDavid du Colombier #include "../qc/q.out.h" 5*8153b942SDavid du Colombier #include "../8l/elf.h" 67dd7cddfSDavid du Colombier 7375daca8SDavid du Colombier #ifndef EXTERN 8375daca8SDavid du Colombier #define EXTERN extern 9375daca8SDavid du Colombier #endif 10375daca8SDavid du Colombier 11b87cd620SDavid du Colombier #define LIBNAMELEN 300 12b87cd620SDavid du Colombier 137dd7cddfSDavid du Colombier typedef struct Adr Adr; 147dd7cddfSDavid du Colombier typedef struct Sym Sym; 157dd7cddfSDavid du Colombier typedef struct Autom Auto; 167dd7cddfSDavid du Colombier typedef struct Prog Prog; 177dd7cddfSDavid du Colombier typedef struct Optab Optab; 187dd7cddfSDavid du Colombier 197dd7cddfSDavid du Colombier #define P ((Prog*)0) 207dd7cddfSDavid du Colombier #define S ((Sym*)0) 217dd7cddfSDavid du Colombier #define TNAME (curtext&&curtext->from.sym?curtext->from.sym->name:noname) 227dd7cddfSDavid du Colombier 237dd7cddfSDavid du Colombier struct Adr 247dd7cddfSDavid du Colombier { 257dd7cddfSDavid du Colombier union 267dd7cddfSDavid du Colombier { 27375daca8SDavid du Colombier long u0offset; 28375daca8SDavid du Colombier char u0sval[NSNAME]; 29375daca8SDavid du Colombier Ieee u0ieee; 30375daca8SDavid du Colombier }u0; 317dd7cddfSDavid du Colombier Sym *sym; 327dd7cddfSDavid du Colombier Auto *autom; 337dd7cddfSDavid du Colombier char type; 347dd7cddfSDavid du Colombier uchar reg; 357dd7cddfSDavid du Colombier char name; 367dd7cddfSDavid du Colombier char class; 377dd7cddfSDavid du Colombier }; 38375daca8SDavid du Colombier 39375daca8SDavid du Colombier #define offset u0.u0offset 40375daca8SDavid du Colombier #define sval u0.u0sval 41375daca8SDavid du Colombier #define ieee u0.u0ieee 42375daca8SDavid du Colombier 437dd7cddfSDavid du Colombier struct Prog 447dd7cddfSDavid du Colombier { 457dd7cddfSDavid du Colombier Adr from; 467dd7cddfSDavid du Colombier Adr from3; /* fma and rlwm */ 477dd7cddfSDavid du Colombier Adr to; 487dd7cddfSDavid du Colombier Prog *forwd; 497dd7cddfSDavid du Colombier Prog *cond; 507dd7cddfSDavid du Colombier Prog *link; 517dd7cddfSDavid du Colombier long pc; 527dd7cddfSDavid du Colombier long regused; 537dd7cddfSDavid du Colombier short line; 547dd7cddfSDavid du Colombier short mark; 557dd7cddfSDavid du Colombier short optab; /* could be uchar */ 562ddf2468SDavid du Colombier ushort as; 577dd7cddfSDavid du Colombier char reg; 587dd7cddfSDavid du Colombier }; 597dd7cddfSDavid du Colombier struct Sym 607dd7cddfSDavid du Colombier { 617dd7cddfSDavid du Colombier char *name; 627dd7cddfSDavid du Colombier short type; 637dd7cddfSDavid du Colombier short version; 647dd7cddfSDavid du Colombier short become; 657dd7cddfSDavid du Colombier short frame; 66375daca8SDavid du Colombier uchar subtype; 67375daca8SDavid du Colombier ushort file; 687dd7cddfSDavid du Colombier long value; 69375daca8SDavid du Colombier long sig; 707dd7cddfSDavid du Colombier Sym *link; 717dd7cddfSDavid du Colombier }; 727dd7cddfSDavid du Colombier struct Autom 737dd7cddfSDavid du Colombier { 747dd7cddfSDavid du Colombier Sym *sym; 757dd7cddfSDavid du Colombier Auto *link; 76375daca8SDavid du Colombier long aoffset; 777dd7cddfSDavid du Colombier short type; 787dd7cddfSDavid du Colombier }; 797dd7cddfSDavid du Colombier struct Optab 807dd7cddfSDavid du Colombier { 812ddf2468SDavid du Colombier ushort as; 827dd7cddfSDavid du Colombier char a1; 837dd7cddfSDavid du Colombier char a2; 847dd7cddfSDavid du Colombier char a3; 857dd7cddfSDavid du Colombier char a4; 867dd7cddfSDavid du Colombier char type; 877dd7cddfSDavid du Colombier char size; 887dd7cddfSDavid du Colombier char param; 897dd7cddfSDavid du Colombier }; 907dd7cddfSDavid du Colombier struct 917dd7cddfSDavid du Colombier { 927dd7cddfSDavid du Colombier Optab* start; 937dd7cddfSDavid du Colombier Optab* stop; 943f193c01SDavid du Colombier } oprange[ALAST]; 957dd7cddfSDavid du Colombier 967dd7cddfSDavid du Colombier enum 977dd7cddfSDavid du Colombier { 987dd7cddfSDavid du Colombier FPCHIP = 1, 997dd7cddfSDavid du Colombier BIG = 32768-8, 1007dd7cddfSDavid du Colombier STRINGSZ = 200, 1017dd7cddfSDavid du Colombier MAXIO = 8192, 1027dd7cddfSDavid du Colombier MAXHIST = 20, /* limit of path elements for history symbols */ 1037dd7cddfSDavid du Colombier DATBLK = 1024, 1047dd7cddfSDavid du Colombier NHASH = 10007, 1057dd7cddfSDavid du Colombier NHUNK = 100000, 1067dd7cddfSDavid du Colombier MINSIZ = 64, 1077dd7cddfSDavid du Colombier NENT = 100, 1087dd7cddfSDavid du Colombier NSCHED = 20, 1097dd7cddfSDavid du Colombier 1107dd7cddfSDavid du Colombier /* mark flags */ 1117dd7cddfSDavid du Colombier LABEL = 1<<0, 1127dd7cddfSDavid du Colombier LEAF = 1<<1, 1137dd7cddfSDavid du Colombier FLOAT = 1<<2, 1147dd7cddfSDavid du Colombier BRANCH = 1<<3, 1157dd7cddfSDavid du Colombier LOAD = 1<<4, 1167dd7cddfSDavid du Colombier FCMP = 1<<5, 1177dd7cddfSDavid du Colombier SYNC = 1<<6, 1187dd7cddfSDavid du Colombier LIST = 1<<7, 1197dd7cddfSDavid du Colombier FOLL = 1<<8, 1207dd7cddfSDavid du Colombier NOSCHED = 1<<9, 1217dd7cddfSDavid du Colombier 1227dd7cddfSDavid du Colombier STEXT = 1, 1237dd7cddfSDavid du Colombier SDATA, 1247dd7cddfSDavid du Colombier SBSS, 1257dd7cddfSDavid du Colombier SDATA1, 1267dd7cddfSDavid du Colombier SXREF, 1277dd7cddfSDavid du Colombier SLEAF, 1287dd7cddfSDavid du Colombier SFILE, 1297dd7cddfSDavid du Colombier SCONST, 130375daca8SDavid du Colombier SUNDEF, 131375daca8SDavid du Colombier 132375daca8SDavid du Colombier SIMPORT, 133375daca8SDavid du Colombier SEXPORT, 1347dd7cddfSDavid du Colombier 1357dd7cddfSDavid du Colombier C_NONE = 0, 1367dd7cddfSDavid du Colombier C_REG, 1377dd7cddfSDavid du Colombier C_FREG, 1387dd7cddfSDavid du Colombier C_CREG, 1397dd7cddfSDavid du Colombier C_SPR, /* special processor register */ 1407dd7cddfSDavid du Colombier C_SREG, /* segment register (32 bit implementations only) */ 1417dd7cddfSDavid du Colombier C_ZCON, 1427dd7cddfSDavid du Colombier C_SCON, /* 16 bit signed */ 1437dd7cddfSDavid du Colombier C_UCON, /* low 16 bits 0 */ 1447dd7cddfSDavid du Colombier C_ADDCON, /* -0x8000 <= v < 0 */ 1457dd7cddfSDavid du Colombier C_ANDCON, /* 0 < v <= 0xFFFF */ 1467dd7cddfSDavid du Colombier C_LCON, /* other */ 1477dd7cddfSDavid du Colombier C_SACON, 1487dd7cddfSDavid du Colombier C_SECON, 1497dd7cddfSDavid du Colombier C_LACON, 1507dd7cddfSDavid du Colombier C_LECON, 1517dd7cddfSDavid du Colombier C_SBRA, 1527dd7cddfSDavid du Colombier C_LBRA, 1537dd7cddfSDavid du Colombier C_SAUTO, 1547dd7cddfSDavid du Colombier C_LAUTO, 1557dd7cddfSDavid du Colombier C_SEXT, 1567dd7cddfSDavid du Colombier C_LEXT, 1577dd7cddfSDavid du Colombier C_ZOREG, 1587dd7cddfSDavid du Colombier C_SOREG, 1597dd7cddfSDavid du Colombier C_LOREG, 1607dd7cddfSDavid du Colombier C_FPSCR, 1617dd7cddfSDavid du Colombier C_MSR, 1627dd7cddfSDavid du Colombier C_XER, 1637dd7cddfSDavid du Colombier C_LR, 1647dd7cddfSDavid du Colombier C_CTR, 1657dd7cddfSDavid du Colombier C_ANY, 1667dd7cddfSDavid du Colombier C_GOK, 167375daca8SDavid du Colombier C_ADDR, 1687dd7cddfSDavid du Colombier 169375daca8SDavid du Colombier C_NCLASS, 170375daca8SDavid du Colombier 171375daca8SDavid du Colombier Roffset = 22, /* no. bits for offset in relocation address */ 172375daca8SDavid du Colombier Rindex = 10 /* no. bits for index in relocation address */ 1737dd7cddfSDavid du Colombier }; 1747dd7cddfSDavid du Colombier 175375daca8SDavid du Colombier EXTERN union 1767dd7cddfSDavid du Colombier { 1777dd7cddfSDavid du Colombier struct 1787dd7cddfSDavid du Colombier { 179375daca8SDavid du Colombier uchar obuf[MAXIO]; /* output buffer */ 180375daca8SDavid du Colombier uchar ibuf[MAXIO]; /* input buffer */ 181375daca8SDavid du Colombier } u; 1827dd7cddfSDavid du Colombier char dbuf[1]; 1837dd7cddfSDavid du Colombier } buf; 1847dd7cddfSDavid du Colombier 185375daca8SDavid du Colombier #define cbuf u.obuf 186375daca8SDavid du Colombier #define xbuf u.ibuf 187375daca8SDavid du Colombier 188375daca8SDavid du Colombier EXTERN long HEADR; /* length of header */ 189375daca8SDavid du Colombier EXTERN int HEADTYPE; /* type of header */ 190375daca8SDavid du Colombier EXTERN long INITDAT; /* data location */ 191375daca8SDavid du Colombier EXTERN long INITRND; /* data round above text location */ 192375daca8SDavid du Colombier EXTERN long INITTEXT; /* text location */ 193*8153b942SDavid du Colombier EXTERN long INITTEXTP; /* text location (physical) */ 194375daca8SDavid du Colombier EXTERN char* INITENTRY; /* entry point */ 195375daca8SDavid du Colombier EXTERN long autosize; 196375daca8SDavid du Colombier EXTERN Biobuf bso; 197375daca8SDavid du Colombier EXTERN long bsssize; 198375daca8SDavid du Colombier EXTERN int cbc; 199375daca8SDavid du Colombier EXTERN uchar* cbp; 200375daca8SDavid du Colombier EXTERN int cout; 201375daca8SDavid du Colombier EXTERN Auto* curauto; 202375daca8SDavid du Colombier EXTERN Auto* curhist; 203375daca8SDavid du Colombier EXTERN Prog* curp; 204375daca8SDavid du Colombier EXTERN Prog* curtext; 205375daca8SDavid du Colombier EXTERN Prog* datap; 206375daca8SDavid du Colombier EXTERN Prog* prog_movsw; 207375daca8SDavid du Colombier EXTERN Prog* prog_movdw; 208375daca8SDavid du Colombier EXTERN Prog* prog_movws; 209375daca8SDavid du Colombier EXTERN Prog* prog_movwd; 210375daca8SDavid du Colombier EXTERN long datsize; 211375daca8SDavid du Colombier EXTERN char debug[128]; 212375daca8SDavid du Colombier EXTERN Prog* firstp; 213375daca8SDavid du Colombier EXTERN char fnuxi8[8]; 214375daca8SDavid du Colombier EXTERN Sym* hash[NHASH]; 215375daca8SDavid du Colombier EXTERN Sym* histfrog[MAXHIST]; 216375daca8SDavid du Colombier EXTERN int histfrogp; 217375daca8SDavid du Colombier EXTERN int histgen; 218375daca8SDavid du Colombier EXTERN char* library[50]; 219375daca8SDavid du Colombier EXTERN char* libraryobj[50]; 220375daca8SDavid du Colombier EXTERN int libraryp; 221375daca8SDavid du Colombier EXTERN int xrefresolv; 222375daca8SDavid du Colombier EXTERN char* hunk; 223375daca8SDavid du Colombier EXTERN char inuxi1[1]; 224375daca8SDavid du Colombier EXTERN char inuxi2[2]; 225375daca8SDavid du Colombier EXTERN char inuxi4[4]; 226375daca8SDavid du Colombier EXTERN Prog* lastp; 227375daca8SDavid du Colombier EXTERN long lcsize; 228375daca8SDavid du Colombier EXTERN char literal[32]; 229375daca8SDavid du Colombier EXTERN int nerrors; 230375daca8SDavid du Colombier EXTERN long nhunk; 231375daca8SDavid du Colombier EXTERN char* noname; 232375daca8SDavid du Colombier EXTERN long instoffset; 233375daca8SDavid du Colombier EXTERN char* outfile; 234375daca8SDavid du Colombier EXTERN long pc; 235375daca8SDavid du Colombier EXTERN int r0iszero; 236375daca8SDavid du Colombier EXTERN long symsize; 237375daca8SDavid du Colombier EXTERN long staticgen; 238375daca8SDavid du Colombier EXTERN Prog* textp; 239375daca8SDavid du Colombier EXTERN long textsize; 240375daca8SDavid du Colombier EXTERN long tothunk; 241375daca8SDavid du Colombier EXTERN char xcmp[C_NCLASS][C_NCLASS]; 242375daca8SDavid du Colombier EXTERN int version; 243375daca8SDavid du Colombier EXTERN Prog zprg; 244375daca8SDavid du Colombier EXTERN int dtype; 245375daca8SDavid du Colombier 246375daca8SDavid du Colombier EXTERN int doexp, dlm; 247375daca8SDavid du Colombier EXTERN int imports, nimports; 248375daca8SDavid du Colombier EXTERN int exports, nexports; 249375daca8SDavid du Colombier EXTERN char* EXPTAB; 250375daca8SDavid du Colombier EXTERN Prog undefp; 251375daca8SDavid du Colombier 252375daca8SDavid du Colombier #define UP (&undefp) 2537dd7cddfSDavid du Colombier 2547dd7cddfSDavid du Colombier extern Optab optab[]; 2557dd7cddfSDavid du Colombier extern char* anames[]; 2567dd7cddfSDavid du Colombier extern char* cnames[]; 2577dd7cddfSDavid du Colombier 2589a747e4fSDavid du Colombier int Aconv(Fmt*); 2599a747e4fSDavid du Colombier int Dconv(Fmt*); 2609a747e4fSDavid du Colombier int Nconv(Fmt*); 2619a747e4fSDavid du Colombier int Pconv(Fmt*); 2629a747e4fSDavid du Colombier int Sconv(Fmt*); 2639a747e4fSDavid du Colombier int Rconv(Fmt*); 2647dd7cddfSDavid du Colombier int aclass(Adr*); 2657dd7cddfSDavid du Colombier void addhist(long, int); 2667dd7cddfSDavid du Colombier void histtoauto(void); 267b87cd620SDavid du Colombier void addlibpath(char*); 2687dd7cddfSDavid du Colombier void addnop(Prog*); 2697dd7cddfSDavid du Colombier void append(Prog*, Prog*); 2707dd7cddfSDavid du Colombier void asmb(void); 271375daca8SDavid du Colombier void asmdyn(void); 2727dd7cddfSDavid du Colombier void asmlc(void); 2737dd7cddfSDavid du Colombier int asmout(Prog*, Optab*, int); 2747dd7cddfSDavid du Colombier void asmsym(void); 2757dd7cddfSDavid du Colombier long atolwhex(char*); 2767dd7cddfSDavid du Colombier Prog* brloop(Prog*); 2777dd7cddfSDavid du Colombier void buildop(void); 2787dd7cddfSDavid du Colombier void cflush(void); 279375daca8SDavid du Colombier void ckoff(Sym*, long); 2807dd7cddfSDavid du Colombier int cmp(int, int); 281375daca8SDavid du Colombier void cput(long); 2827dd7cddfSDavid du Colombier int compound(Prog*); 2837dd7cddfSDavid du Colombier double cputime(void); 2847dd7cddfSDavid du Colombier void datblk(long, long); 2857dd7cddfSDavid du Colombier void diag(char*, ...); 2867dd7cddfSDavid du Colombier void dodata(void); 2877dd7cddfSDavid du Colombier void doprof1(void); 2887dd7cddfSDavid du Colombier void doprof2(void); 289375daca8SDavid du Colombier void dynreloc(Sym*, long, int, int, int); 2907dd7cddfSDavid du Colombier long entryvalue(void); 2917dd7cddfSDavid du Colombier void errorexit(void); 2927dd7cddfSDavid du Colombier void exchange(Prog*); 293375daca8SDavid du Colombier void export(void); 294b87cd620SDavid du Colombier int fileexists(char*); 2957dd7cddfSDavid du Colombier int find1(long, int); 296b87cd620SDavid du Colombier char* findlib(char*); 2977dd7cddfSDavid du Colombier void follow(void); 2987dd7cddfSDavid du Colombier void gethunk(void); 2997dd7cddfSDavid du Colombier double ieeedtod(Ieee*); 3007dd7cddfSDavid du Colombier long ieeedtof(Ieee*); 301375daca8SDavid du Colombier void import(void); 3027dd7cddfSDavid du Colombier int isnop(Prog*); 3037dd7cddfSDavid du Colombier void ldobj(int, long, char*); 3047dd7cddfSDavid du Colombier void loadlib(void); 3057dd7cddfSDavid du Colombier void listinit(void); 3067dd7cddfSDavid du Colombier void initmuldiv(void); 3077dd7cddfSDavid du Colombier Sym* lookup(char*, int); 308*8153b942SDavid du Colombier void llput(vlong); 309*8153b942SDavid du Colombier void llputl(vlong); 3107dd7cddfSDavid du Colombier void lput(long); 311*8153b942SDavid du Colombier void lputl(long); 3127dd7cddfSDavid du Colombier void mkfwd(void); 313375daca8SDavid du Colombier void* mysbrk(ulong); 3147dd7cddfSDavid du Colombier void names(void); 3157dd7cddfSDavid du Colombier void nocache(Prog*); 3167dd7cddfSDavid du Colombier void noops(void); 3176891d857SDavid du Colombier void nopout(Prog*); 3187dd7cddfSDavid du Colombier void nuxiinit(void); 3197dd7cddfSDavid du Colombier void objfile(char*); 3207dd7cddfSDavid du Colombier int ocmp(void*, void*); 3217dd7cddfSDavid du Colombier long opcode(int); 3227dd7cddfSDavid du Colombier Optab* oplook(Prog*); 3237dd7cddfSDavid du Colombier void patch(void); 3247dd7cddfSDavid du Colombier void prasm(Prog*); 3257dd7cddfSDavid du Colombier void prepend(Prog*, Prog*); 3267dd7cddfSDavid du Colombier Prog* prg(void); 3277dd7cddfSDavid du Colombier int pseudo(Prog*); 3287dd7cddfSDavid du Colombier void putsymb(char*, int, long, int); 329375daca8SDavid du Colombier void readundefs(char*, int); 3307dd7cddfSDavid du Colombier long regoff(Adr*); 3317dd7cddfSDavid du Colombier int relinv(int); 3327dd7cddfSDavid du Colombier long rnd(long, long); 3337dd7cddfSDavid du Colombier void sched(Prog*, Prog*); 3347dd7cddfSDavid du Colombier void span(void); 335*8153b942SDavid du Colombier void strnput(char*, int); 3367dd7cddfSDavid du Colombier void undef(void); 337375daca8SDavid du Colombier void undefsym(Sym*); 338375daca8SDavid du Colombier void wput(long); 339*8153b942SDavid du Colombier void wputl(long); 3407dd7cddfSDavid du Colombier void xdefine(char*, int, long); 3417dd7cddfSDavid du Colombier void xfol(Prog*); 342375daca8SDavid du Colombier void zerosig(char*); 3437dd7cddfSDavid du Colombier 344406758d9SDavid du Colombier #pragma varargck type "A" int 345406758d9SDavid du Colombier #pragma varargck type "A" uint 3467dd7cddfSDavid du Colombier #pragma varargck type "D" Adr* 3477dd7cddfSDavid du Colombier #pragma varargck type "N" Adr* 3487dd7cddfSDavid du Colombier #pragma varargck type "P" Prog* 3497dd7cddfSDavid du Colombier #pragma varargck type "R" int 3507dd7cddfSDavid du Colombier #pragma varargck type "S" char* 351406758d9SDavid du Colombier 352406758d9SDavid du Colombier #pragma varargck argpos diag 1 353