174a4d8c2SCharles.Forsyth #include <lib9.h> 274a4d8c2SCharles.Forsyth #include <bio.h> 374a4d8c2SCharles.Forsyth #include "../qc/q.out.h" 4*0c407e1dSforsyth #include "../ld/elf.h" 574a4d8c2SCharles.Forsyth 674a4d8c2SCharles.Forsyth #ifndef EXTERN 774a4d8c2SCharles.Forsyth #define EXTERN extern 874a4d8c2SCharles.Forsyth #endif 974a4d8c2SCharles.Forsyth 1045a20ab7Sforsyth #define LIBNAMELEN 300 1145a20ab7Sforsyth 1274a4d8c2SCharles.Forsyth typedef struct Adr Adr; 1374a4d8c2SCharles.Forsyth typedef struct Sym Sym; 1474a4d8c2SCharles.Forsyth typedef struct Autom Auto; 1574a4d8c2SCharles.Forsyth typedef struct Prog Prog; 1674a4d8c2SCharles.Forsyth typedef struct Optab Optab; 1774a4d8c2SCharles.Forsyth 1874a4d8c2SCharles.Forsyth #define P ((Prog*)0) 1974a4d8c2SCharles.Forsyth #define S ((Sym*)0) 2074a4d8c2SCharles.Forsyth #define TNAME (curtext&&curtext->from.sym?curtext->from.sym->name:noname) 2174a4d8c2SCharles.Forsyth 2274a4d8c2SCharles.Forsyth struct Adr 2374a4d8c2SCharles.Forsyth { 2474a4d8c2SCharles.Forsyth union 2574a4d8c2SCharles.Forsyth { 2674a4d8c2SCharles.Forsyth long u0offset; 2774a4d8c2SCharles.Forsyth char u0sval[NSNAME]; 2874a4d8c2SCharles.Forsyth Ieee u0ieee; 2974a4d8c2SCharles.Forsyth }u0; 3074a4d8c2SCharles.Forsyth Sym *sym; 3174a4d8c2SCharles.Forsyth Auto *autom; 3274a4d8c2SCharles.Forsyth char type; 3374a4d8c2SCharles.Forsyth uchar reg; 3474a4d8c2SCharles.Forsyth char name; 3574a4d8c2SCharles.Forsyth char class; 3674a4d8c2SCharles.Forsyth }; 3774a4d8c2SCharles.Forsyth 3874a4d8c2SCharles.Forsyth #define offset u0.u0offset 3974a4d8c2SCharles.Forsyth #define sval u0.u0sval 4074a4d8c2SCharles.Forsyth #define ieee u0.u0ieee 4174a4d8c2SCharles.Forsyth 4274a4d8c2SCharles.Forsyth struct Prog 4374a4d8c2SCharles.Forsyth { 4474a4d8c2SCharles.Forsyth Adr from; 4574a4d8c2SCharles.Forsyth Adr from3; /* fma and rlwm */ 4674a4d8c2SCharles.Forsyth Adr to; 4774a4d8c2SCharles.Forsyth Prog *forwd; 4874a4d8c2SCharles.Forsyth Prog *cond; 4974a4d8c2SCharles.Forsyth Prog *link; 5074a4d8c2SCharles.Forsyth long pc; 5174a4d8c2SCharles.Forsyth long regused; 5274a4d8c2SCharles.Forsyth short line; 5374a4d8c2SCharles.Forsyth short mark; 5474a4d8c2SCharles.Forsyth short optab; /* could be uchar */ 556e425a9dSCharles.Forsyth ushort as; 5674a4d8c2SCharles.Forsyth char reg; 5774a4d8c2SCharles.Forsyth }; 5874a4d8c2SCharles.Forsyth struct Sym 5974a4d8c2SCharles.Forsyth { 6074a4d8c2SCharles.Forsyth char *name; 6174a4d8c2SCharles.Forsyth short type; 6274a4d8c2SCharles.Forsyth short version; 6374a4d8c2SCharles.Forsyth short become; 6474a4d8c2SCharles.Forsyth short frame; 6574a4d8c2SCharles.Forsyth uchar subtype; 6674a4d8c2SCharles.Forsyth ushort file; 6774a4d8c2SCharles.Forsyth long value; 6874a4d8c2SCharles.Forsyth long sig; 6974a4d8c2SCharles.Forsyth Sym *link; 7074a4d8c2SCharles.Forsyth }; 7174a4d8c2SCharles.Forsyth struct Autom 7274a4d8c2SCharles.Forsyth { 7374a4d8c2SCharles.Forsyth Sym *sym; 7474a4d8c2SCharles.Forsyth Auto *link; 7574a4d8c2SCharles.Forsyth long aoffset; 7674a4d8c2SCharles.Forsyth short type; 7774a4d8c2SCharles.Forsyth }; 7874a4d8c2SCharles.Forsyth struct Optab 7974a4d8c2SCharles.Forsyth { 806e425a9dSCharles.Forsyth ushort as; 8174a4d8c2SCharles.Forsyth char a1; 8274a4d8c2SCharles.Forsyth char a2; 8374a4d8c2SCharles.Forsyth char a3; 8474a4d8c2SCharles.Forsyth char a4; 8574a4d8c2SCharles.Forsyth char type; 8674a4d8c2SCharles.Forsyth char size; 8774a4d8c2SCharles.Forsyth char param; 8874a4d8c2SCharles.Forsyth }; 8974a4d8c2SCharles.Forsyth struct 9074a4d8c2SCharles.Forsyth { 9174a4d8c2SCharles.Forsyth Optab* start; 9274a4d8c2SCharles.Forsyth Optab* stop; 9374a4d8c2SCharles.Forsyth } oprange[ALAST]; 9474a4d8c2SCharles.Forsyth 9574a4d8c2SCharles.Forsyth enum 9674a4d8c2SCharles.Forsyth { 9774a4d8c2SCharles.Forsyth FPCHIP = 1, 9874a4d8c2SCharles.Forsyth BIG = 32768-8, 9974a4d8c2SCharles.Forsyth STRINGSZ = 200, 10074a4d8c2SCharles.Forsyth MAXIO = 8192, 10174a4d8c2SCharles.Forsyth MAXHIST = 20, /* limit of path elements for history symbols */ 10274a4d8c2SCharles.Forsyth DATBLK = 1024, 10374a4d8c2SCharles.Forsyth NHASH = 10007, 10474a4d8c2SCharles.Forsyth NHUNK = 100000, 10574a4d8c2SCharles.Forsyth MINSIZ = 64, 10674a4d8c2SCharles.Forsyth NENT = 100, 10774a4d8c2SCharles.Forsyth NSCHED = 20, 10874a4d8c2SCharles.Forsyth 10974a4d8c2SCharles.Forsyth /* mark flags */ 11074a4d8c2SCharles.Forsyth LABEL = 1<<0, 11174a4d8c2SCharles.Forsyth LEAF = 1<<1, 11274a4d8c2SCharles.Forsyth FLOAT = 1<<2, 11374a4d8c2SCharles.Forsyth BRANCH = 1<<3, 11474a4d8c2SCharles.Forsyth LOAD = 1<<4, 11574a4d8c2SCharles.Forsyth FCMP = 1<<5, 11674a4d8c2SCharles.Forsyth SYNC = 1<<6, 11774a4d8c2SCharles.Forsyth LIST = 1<<7, 11874a4d8c2SCharles.Forsyth FOLL = 1<<8, 11974a4d8c2SCharles.Forsyth NOSCHED = 1<<9, 12074a4d8c2SCharles.Forsyth 12174a4d8c2SCharles.Forsyth STEXT = 1, 12274a4d8c2SCharles.Forsyth SDATA, 12374a4d8c2SCharles.Forsyth SBSS, 12474a4d8c2SCharles.Forsyth SDATA1, 12574a4d8c2SCharles.Forsyth SXREF, 12674a4d8c2SCharles.Forsyth SLEAF, 12774a4d8c2SCharles.Forsyth SFILE, 12874a4d8c2SCharles.Forsyth SCONST, 12974a4d8c2SCharles.Forsyth SUNDEF, 13074a4d8c2SCharles.Forsyth 13174a4d8c2SCharles.Forsyth SIMPORT, 13274a4d8c2SCharles.Forsyth SEXPORT, 13374a4d8c2SCharles.Forsyth 13474a4d8c2SCharles.Forsyth C_NONE = 0, 13574a4d8c2SCharles.Forsyth C_REG, 13674a4d8c2SCharles.Forsyth C_FREG, 13774a4d8c2SCharles.Forsyth C_CREG, 13874a4d8c2SCharles.Forsyth C_SPR, /* special processor register */ 13974a4d8c2SCharles.Forsyth C_SREG, /* segment register (32 bit implementations only) */ 14074a4d8c2SCharles.Forsyth C_ZCON, 14174a4d8c2SCharles.Forsyth C_SCON, /* 16 bit signed */ 14274a4d8c2SCharles.Forsyth C_UCON, /* low 16 bits 0 */ 14374a4d8c2SCharles.Forsyth C_ADDCON, /* -0x8000 <= v < 0 */ 14474a4d8c2SCharles.Forsyth C_ANDCON, /* 0 < v <= 0xFFFF */ 14574a4d8c2SCharles.Forsyth C_LCON, /* other */ 14674a4d8c2SCharles.Forsyth C_SACON, 14774a4d8c2SCharles.Forsyth C_SECON, 14874a4d8c2SCharles.Forsyth C_LACON, 14974a4d8c2SCharles.Forsyth C_LECON, 15074a4d8c2SCharles.Forsyth C_SBRA, 15174a4d8c2SCharles.Forsyth C_LBRA, 15274a4d8c2SCharles.Forsyth C_SAUTO, 15374a4d8c2SCharles.Forsyth C_LAUTO, 15474a4d8c2SCharles.Forsyth C_SEXT, 15574a4d8c2SCharles.Forsyth C_LEXT, 15674a4d8c2SCharles.Forsyth C_ZOREG, 15774a4d8c2SCharles.Forsyth C_SOREG, 15874a4d8c2SCharles.Forsyth C_LOREG, 15974a4d8c2SCharles.Forsyth C_FPSCR, 16074a4d8c2SCharles.Forsyth C_MSR, 16174a4d8c2SCharles.Forsyth C_XER, 16274a4d8c2SCharles.Forsyth C_LR, 16374a4d8c2SCharles.Forsyth C_CTR, 16474a4d8c2SCharles.Forsyth C_ANY, 16574a4d8c2SCharles.Forsyth C_GOK, 16674a4d8c2SCharles.Forsyth C_ADDR, 16774a4d8c2SCharles.Forsyth 16874a4d8c2SCharles.Forsyth C_NCLASS, 16974a4d8c2SCharles.Forsyth 17074a4d8c2SCharles.Forsyth Roffset = 22, /* no. bits for offset in relocation address */ 17174a4d8c2SCharles.Forsyth Rindex = 10 /* no. bits for index in relocation address */ 17274a4d8c2SCharles.Forsyth }; 17374a4d8c2SCharles.Forsyth 17474a4d8c2SCharles.Forsyth EXTERN union 17574a4d8c2SCharles.Forsyth { 17674a4d8c2SCharles.Forsyth struct 17774a4d8c2SCharles.Forsyth { 17874a4d8c2SCharles.Forsyth uchar obuf[MAXIO]; /* output buffer */ 17974a4d8c2SCharles.Forsyth uchar ibuf[MAXIO]; /* input buffer */ 18074a4d8c2SCharles.Forsyth } u; 18174a4d8c2SCharles.Forsyth char dbuf[1]; 18274a4d8c2SCharles.Forsyth } buf; 18374a4d8c2SCharles.Forsyth 18474a4d8c2SCharles.Forsyth #define cbuf u.obuf 18574a4d8c2SCharles.Forsyth #define xbuf u.ibuf 18674a4d8c2SCharles.Forsyth 18774a4d8c2SCharles.Forsyth EXTERN long HEADR; /* length of header */ 18874a4d8c2SCharles.Forsyth EXTERN int HEADTYPE; /* type of header */ 18974a4d8c2SCharles.Forsyth EXTERN long INITDAT; /* data location */ 19074a4d8c2SCharles.Forsyth EXTERN long INITRND; /* data round above text location */ 19174a4d8c2SCharles.Forsyth EXTERN long INITTEXT; /* text location */ 19245a20ab7Sforsyth EXTERN long INITTEXTP; /* text location (physical) */ 19374a4d8c2SCharles.Forsyth EXTERN char* INITENTRY; /* entry point */ 19474a4d8c2SCharles.Forsyth EXTERN long autosize; 19574a4d8c2SCharles.Forsyth EXTERN Biobuf bso; 19674a4d8c2SCharles.Forsyth EXTERN long bsssize; 19774a4d8c2SCharles.Forsyth EXTERN int cbc; 19874a4d8c2SCharles.Forsyth EXTERN uchar* cbp; 19974a4d8c2SCharles.Forsyth EXTERN int cout; 20074a4d8c2SCharles.Forsyth EXTERN Auto* curauto; 20174a4d8c2SCharles.Forsyth EXTERN Auto* curhist; 20274a4d8c2SCharles.Forsyth EXTERN Prog* curp; 20374a4d8c2SCharles.Forsyth EXTERN Prog* curtext; 20474a4d8c2SCharles.Forsyth EXTERN Prog* datap; 20574a4d8c2SCharles.Forsyth EXTERN Prog* prog_movsw; 20674a4d8c2SCharles.Forsyth EXTERN Prog* prog_movdw; 20774a4d8c2SCharles.Forsyth EXTERN Prog* prog_movws; 20874a4d8c2SCharles.Forsyth EXTERN Prog* prog_movwd; 20974a4d8c2SCharles.Forsyth EXTERN long datsize; 21074a4d8c2SCharles.Forsyth EXTERN char debug[128]; 21174a4d8c2SCharles.Forsyth EXTERN Prog* firstp; 21274a4d8c2SCharles.Forsyth EXTERN char fnuxi8[8]; 21374a4d8c2SCharles.Forsyth EXTERN Sym* hash[NHASH]; 21474a4d8c2SCharles.Forsyth EXTERN Sym* histfrog[MAXHIST]; 21574a4d8c2SCharles.Forsyth EXTERN int histfrogp; 21674a4d8c2SCharles.Forsyth EXTERN int histgen; 21774a4d8c2SCharles.Forsyth EXTERN char* library[50]; 21874a4d8c2SCharles.Forsyth EXTERN char* libraryobj[50]; 21974a4d8c2SCharles.Forsyth EXTERN int libraryp; 22074a4d8c2SCharles.Forsyth EXTERN int xrefresolv; 22174a4d8c2SCharles.Forsyth EXTERN char* hunk; 22274a4d8c2SCharles.Forsyth EXTERN char inuxi1[1]; 22374a4d8c2SCharles.Forsyth EXTERN char inuxi2[2]; 22474a4d8c2SCharles.Forsyth EXTERN char inuxi4[4]; 22574a4d8c2SCharles.Forsyth EXTERN Prog* lastp; 22674a4d8c2SCharles.Forsyth EXTERN long lcsize; 22774a4d8c2SCharles.Forsyth EXTERN char literal[32]; 22874a4d8c2SCharles.Forsyth EXTERN int nerrors; 22974a4d8c2SCharles.Forsyth EXTERN long nhunk; 23074a4d8c2SCharles.Forsyth EXTERN char* noname; 23174a4d8c2SCharles.Forsyth EXTERN long instoffset; 23274a4d8c2SCharles.Forsyth EXTERN char* outfile; 23374a4d8c2SCharles.Forsyth EXTERN long pc; 23474a4d8c2SCharles.Forsyth EXTERN int r0iszero; 23574a4d8c2SCharles.Forsyth EXTERN long symsize; 23674a4d8c2SCharles.Forsyth EXTERN long staticgen; 23774a4d8c2SCharles.Forsyth EXTERN Prog* textp; 23874a4d8c2SCharles.Forsyth EXTERN long textsize; 23974a4d8c2SCharles.Forsyth EXTERN long tothunk; 24074a4d8c2SCharles.Forsyth EXTERN char xcmp[C_NCLASS][C_NCLASS]; 24174a4d8c2SCharles.Forsyth EXTERN int version; 24274a4d8c2SCharles.Forsyth EXTERN Prog zprg; 24374a4d8c2SCharles.Forsyth EXTERN int dtype; 24474a4d8c2SCharles.Forsyth 24574a4d8c2SCharles.Forsyth EXTERN int doexp, dlm; 24674a4d8c2SCharles.Forsyth EXTERN int imports, nimports; 24774a4d8c2SCharles.Forsyth EXTERN int exports, nexports; 24874a4d8c2SCharles.Forsyth EXTERN char* EXPTAB; 24974a4d8c2SCharles.Forsyth EXTERN Prog undefp; 25074a4d8c2SCharles.Forsyth 25174a4d8c2SCharles.Forsyth #define UP (&undefp) 25274a4d8c2SCharles.Forsyth 25374a4d8c2SCharles.Forsyth extern Optab optab[]; 25474a4d8c2SCharles.Forsyth extern char* anames[]; 25574a4d8c2SCharles.Forsyth extern char* cnames[]; 25674a4d8c2SCharles.Forsyth 25774a4d8c2SCharles.Forsyth int Aconv(Fmt*); 25874a4d8c2SCharles.Forsyth int Dconv(Fmt*); 25974a4d8c2SCharles.Forsyth int Nconv(Fmt*); 26074a4d8c2SCharles.Forsyth int Pconv(Fmt*); 26174a4d8c2SCharles.Forsyth int Sconv(Fmt*); 26274a4d8c2SCharles.Forsyth int Rconv(Fmt*); 26374a4d8c2SCharles.Forsyth int aclass(Adr*); 26474a4d8c2SCharles.Forsyth void addhist(long, int); 26574a4d8c2SCharles.Forsyth void histtoauto(void); 26645a20ab7Sforsyth void addlibpath(char*); 26774a4d8c2SCharles.Forsyth void addnop(Prog*); 26874a4d8c2SCharles.Forsyth void append(Prog*, Prog*); 26974a4d8c2SCharles.Forsyth void asmb(void); 27074a4d8c2SCharles.Forsyth void asmdyn(void); 27174a4d8c2SCharles.Forsyth void asmlc(void); 27274a4d8c2SCharles.Forsyth int asmout(Prog*, Optab*, int); 27374a4d8c2SCharles.Forsyth void asmsym(void); 27474a4d8c2SCharles.Forsyth long atolwhex(char*); 27574a4d8c2SCharles.Forsyth Prog* brloop(Prog*); 27674a4d8c2SCharles.Forsyth void buildop(void); 27774a4d8c2SCharles.Forsyth void cflush(void); 27874a4d8c2SCharles.Forsyth void ckoff(Sym*, long); 27974a4d8c2SCharles.Forsyth int cmp(int, int); 28074a4d8c2SCharles.Forsyth void cput(long); 28174a4d8c2SCharles.Forsyth int compound(Prog*); 28274a4d8c2SCharles.Forsyth double cputime(void); 28374a4d8c2SCharles.Forsyth void datblk(long, long); 28474a4d8c2SCharles.Forsyth void diag(char*, ...); 28574a4d8c2SCharles.Forsyth void dodata(void); 28674a4d8c2SCharles.Forsyth void doprof1(void); 28774a4d8c2SCharles.Forsyth void doprof2(void); 28874a4d8c2SCharles.Forsyth void dynreloc(Sym*, long, int, int, int); 28974a4d8c2SCharles.Forsyth long entryvalue(void); 29074a4d8c2SCharles.Forsyth void errorexit(void); 29174a4d8c2SCharles.Forsyth void exchange(Prog*); 29274a4d8c2SCharles.Forsyth void export(void); 29345a20ab7Sforsyth int fileexists(char*); 29474a4d8c2SCharles.Forsyth int find1(long, int); 29545a20ab7Sforsyth char* findlib(char*); 29674a4d8c2SCharles.Forsyth void follow(void); 29774a4d8c2SCharles.Forsyth void gethunk(void); 29874a4d8c2SCharles.Forsyth double ieeedtod(Ieee*); 29974a4d8c2SCharles.Forsyth long ieeedtof(Ieee*); 30074a4d8c2SCharles.Forsyth void import(void); 30174a4d8c2SCharles.Forsyth int isnop(Prog*); 30274a4d8c2SCharles.Forsyth void ldobj(int, long, char*); 30374a4d8c2SCharles.Forsyth void loadlib(void); 30474a4d8c2SCharles.Forsyth void listinit(void); 30574a4d8c2SCharles.Forsyth void initmuldiv(void); 30674a4d8c2SCharles.Forsyth Sym* lookup(char*, int); 30745a20ab7Sforsyth void llput(vlong); 30845a20ab7Sforsyth void llputl(vlong); 30974a4d8c2SCharles.Forsyth void lput(long); 31045a20ab7Sforsyth void lputl(long); 31174a4d8c2SCharles.Forsyth void mkfwd(void); 31274a4d8c2SCharles.Forsyth void* mysbrk(ulong); 31374a4d8c2SCharles.Forsyth void names(void); 31474a4d8c2SCharles.Forsyth void nocache(Prog*); 31574a4d8c2SCharles.Forsyth void noops(void); 316647adfbcSforsyth void nopout(Prog*); 31774a4d8c2SCharles.Forsyth void nuxiinit(void); 31874a4d8c2SCharles.Forsyth void objfile(char*); 31974a4d8c2SCharles.Forsyth int ocmp(void*, void*); 32074a4d8c2SCharles.Forsyth long opcode(int); 32174a4d8c2SCharles.Forsyth Optab* oplook(Prog*); 32274a4d8c2SCharles.Forsyth void patch(void); 32374a4d8c2SCharles.Forsyth void prasm(Prog*); 32474a4d8c2SCharles.Forsyth void prepend(Prog*, Prog*); 32574a4d8c2SCharles.Forsyth Prog* prg(void); 32674a4d8c2SCharles.Forsyth int pseudo(Prog*); 32774a4d8c2SCharles.Forsyth void putsymb(char*, int, long, int); 32874a4d8c2SCharles.Forsyth void readundefs(char*, int); 32974a4d8c2SCharles.Forsyth long regoff(Adr*); 33074a4d8c2SCharles.Forsyth int relinv(int); 33174a4d8c2SCharles.Forsyth long rnd(long, long); 33274a4d8c2SCharles.Forsyth void sched(Prog*, Prog*); 33374a4d8c2SCharles.Forsyth void span(void); 33445a20ab7Sforsyth void strnput(char*, int); 33574a4d8c2SCharles.Forsyth void undef(void); 33674a4d8c2SCharles.Forsyth void undefsym(Sym*); 33774a4d8c2SCharles.Forsyth void wput(long); 33845a20ab7Sforsyth void wputl(long); 33974a4d8c2SCharles.Forsyth void xdefine(char*, int, long); 34074a4d8c2SCharles.Forsyth void xfol(Prog*); 34174a4d8c2SCharles.Forsyth void zerosig(char*); 34274a4d8c2SCharles.Forsyth 343647adfbcSforsyth #pragma varargck type "A" int 344647adfbcSforsyth #pragma varargck type "A" uint 34574a4d8c2SCharles.Forsyth #pragma varargck type "D" Adr* 34674a4d8c2SCharles.Forsyth #pragma varargck type "N" Adr* 34774a4d8c2SCharles.Forsyth #pragma varargck type "P" Prog* 34874a4d8c2SCharles.Forsyth #pragma varargck type "R" int 34974a4d8c2SCharles.Forsyth #pragma varargck type "S" char* 350647adfbcSforsyth 351647adfbcSforsyth #pragma varargck argpos diag 1 352