1fbadb1c4SDavid du Colombier #include <u.h> 2fbadb1c4SDavid du Colombier #include <libc.h> 3fbadb1c4SDavid du Colombier #include <bio.h> 4fbadb1c4SDavid du Colombier #include "../9c/9.out.h" 5fbadb1c4SDavid du Colombier #include "../8l/elf.h" 6fbadb1c4SDavid du Colombier 7fbadb1c4SDavid du Colombier #ifndef EXTERN 8fbadb1c4SDavid du Colombier #define EXTERN extern 9fbadb1c4SDavid du Colombier #endif 10fbadb1c4SDavid du Colombier 11fbadb1c4SDavid du Colombier #define LIBNAMELEN 300 12fbadb1c4SDavid du Colombier 13fbadb1c4SDavid du Colombier typedef struct Adr Adr; 14fbadb1c4SDavid du Colombier typedef struct Sym Sym; 15fbadb1c4SDavid du Colombier typedef struct Autom Auto; 16fbadb1c4SDavid du Colombier typedef struct Prog Prog; 17fbadb1c4SDavid du Colombier typedef struct Optab Optab; 18fbadb1c4SDavid du Colombier 19fbadb1c4SDavid du Colombier #define P ((Prog*)0) 20fbadb1c4SDavid du Colombier #define S ((Sym*)0) 21fbadb1c4SDavid du Colombier #define TNAME (curtext&&curtext->from.sym?curtext->from.sym->name:noname) 22fbadb1c4SDavid du Colombier 23fbadb1c4SDavid du Colombier struct Adr 24fbadb1c4SDavid du Colombier { 25fbadb1c4SDavid du Colombier union 26fbadb1c4SDavid du Colombier { 27fbadb1c4SDavid du Colombier vlong u0offset; 28fbadb1c4SDavid du Colombier char u0sval[NSNAME]; 29fbadb1c4SDavid du Colombier Ieee u0ieee; 30fbadb1c4SDavid du Colombier }u0; 31fbadb1c4SDavid du Colombier Sym *sym; 32fbadb1c4SDavid du Colombier Auto *autom; 33fbadb1c4SDavid du Colombier char type; 34fbadb1c4SDavid du Colombier uchar reg; 35fbadb1c4SDavid du Colombier char name; 36fbadb1c4SDavid du Colombier char class; 37fbadb1c4SDavid du Colombier }; 38fbadb1c4SDavid du Colombier 39fbadb1c4SDavid du Colombier #define offset u0.u0offset 40fbadb1c4SDavid du Colombier #define sval u0.u0sval 41fbadb1c4SDavid du Colombier #define ieee u0.u0ieee 42fbadb1c4SDavid du Colombier 43fbadb1c4SDavid du Colombier struct Prog 44fbadb1c4SDavid du Colombier { 45fbadb1c4SDavid du Colombier Adr from; 46fbadb1c4SDavid du Colombier Adr from3; /* fma and rlwm */ 47fbadb1c4SDavid du Colombier Adr to; 48fbadb1c4SDavid du Colombier Prog *forwd; 49fbadb1c4SDavid du Colombier Prog *cond; 50fbadb1c4SDavid du Colombier Prog *link; 51fbadb1c4SDavid du Colombier vlong pc; 52fbadb1c4SDavid du Colombier long regused; 53fbadb1c4SDavid du Colombier short line; 54fbadb1c4SDavid du Colombier short mark; 55fbadb1c4SDavid du Colombier short optab; /* could be uchar */ 56fbadb1c4SDavid du Colombier short as; 57fbadb1c4SDavid du Colombier char reg; 58fbadb1c4SDavid du Colombier }; 59fbadb1c4SDavid du Colombier struct Sym 60fbadb1c4SDavid du Colombier { 61fbadb1c4SDavid du Colombier char *name; 62fbadb1c4SDavid du Colombier short type; 63fbadb1c4SDavid du Colombier short version; 64fbadb1c4SDavid du Colombier short become; 65fbadb1c4SDavid du Colombier short frame; 66fbadb1c4SDavid du Colombier uchar subtype; 67fbadb1c4SDavid du Colombier ushort file; 68fbadb1c4SDavid du Colombier vlong value; 69fbadb1c4SDavid du Colombier long sig; 70fbadb1c4SDavid du Colombier Sym *link; 71fbadb1c4SDavid du Colombier }; 72fbadb1c4SDavid du Colombier struct Autom 73fbadb1c4SDavid du Colombier { 74fbadb1c4SDavid du Colombier Sym *sym; 75fbadb1c4SDavid du Colombier Auto *link; 76fbadb1c4SDavid du Colombier vlong aoffset; 77fbadb1c4SDavid du Colombier short type; 78fbadb1c4SDavid du Colombier }; 79fbadb1c4SDavid du Colombier struct Optab 80fbadb1c4SDavid du Colombier { 81fbadb1c4SDavid du Colombier short as; 82fbadb1c4SDavid du Colombier char a1; 83fbadb1c4SDavid du Colombier char a2; 84fbadb1c4SDavid du Colombier char a3; 85fbadb1c4SDavid du Colombier char a4; 86fbadb1c4SDavid du Colombier char type; 87fbadb1c4SDavid du Colombier char size; 88fbadb1c4SDavid du Colombier char param; 89fbadb1c4SDavid du Colombier }; 90fbadb1c4SDavid du Colombier struct 91fbadb1c4SDavid du Colombier { 92fbadb1c4SDavid du Colombier Optab* start; 93fbadb1c4SDavid du Colombier Optab* stop; 94fbadb1c4SDavid du Colombier } oprange[ALAST]; 95fbadb1c4SDavid du Colombier 96fbadb1c4SDavid du Colombier enum 97fbadb1c4SDavid du Colombier { 98fbadb1c4SDavid du Colombier FPCHIP = 1, 99fbadb1c4SDavid du Colombier BIG = 32768-8, 100fbadb1c4SDavid du Colombier STRINGSZ = 200, 101*2ec6491fSDavid du Colombier MAXIO = (16*1024), 102fbadb1c4SDavid du Colombier MAXHIST = 20, /* limit of path elements for history symbols */ 103fbadb1c4SDavid du Colombier DATBLK = 1024, 104fbadb1c4SDavid du Colombier NHASH = 10007, 105fbadb1c4SDavid du Colombier NHUNK = 100000, 106fbadb1c4SDavid du Colombier MINSIZ = 64, 107fbadb1c4SDavid du Colombier NENT = 100, 108fbadb1c4SDavid du Colombier NSCHED = 20, 109fbadb1c4SDavid du Colombier 110fbadb1c4SDavid du Colombier /* mark flags */ 111fbadb1c4SDavid du Colombier LABEL = 1<<0, 112fbadb1c4SDavid du Colombier LEAF = 1<<1, 113fbadb1c4SDavid du Colombier FLOAT = 1<<2, 114fbadb1c4SDavid du Colombier BRANCH = 1<<3, 115fbadb1c4SDavid du Colombier LOAD = 1<<4, 116fbadb1c4SDavid du Colombier FCMP = 1<<5, 117fbadb1c4SDavid du Colombier SYNC = 1<<6, 118fbadb1c4SDavid du Colombier LIST = 1<<7, 119fbadb1c4SDavid du Colombier FOLL = 1<<8, 120fbadb1c4SDavid du Colombier NOSCHED = 1<<9, 121fbadb1c4SDavid du Colombier 122fbadb1c4SDavid du Colombier STEXT = 1, 123fbadb1c4SDavid du Colombier SDATA, 124fbadb1c4SDavid du Colombier SBSS, 125fbadb1c4SDavid du Colombier SDATA1, 126fbadb1c4SDavid du Colombier SXREF, 127fbadb1c4SDavid du Colombier SLEAF, 128fbadb1c4SDavid du Colombier SFILE, 129fbadb1c4SDavid du Colombier SCONST, 130fbadb1c4SDavid du Colombier SUNDEF, 131fbadb1c4SDavid du Colombier 132fbadb1c4SDavid du Colombier SIMPORT, 133fbadb1c4SDavid du Colombier SEXPORT, 134fbadb1c4SDavid du Colombier 135fbadb1c4SDavid du Colombier C_NONE = 0, 136fbadb1c4SDavid du Colombier C_REG, 137fbadb1c4SDavid du Colombier C_FREG, 138fbadb1c4SDavid du Colombier C_CREG, 139fbadb1c4SDavid du Colombier C_SPR, /* special processor register */ 140fbadb1c4SDavid du Colombier C_ZCON, 141fbadb1c4SDavid du Colombier C_SCON, /* 16 bit signed */ 142fbadb1c4SDavid du Colombier C_UCON, /* low 16 bits 0 */ 143fbadb1c4SDavid du Colombier C_ADDCON, /* -0x8000 <= v < 0 */ 144fbadb1c4SDavid du Colombier C_ANDCON, /* 0 < v <= 0xFFFF */ 145fbadb1c4SDavid du Colombier C_LCON, /* other 32 */ 146fbadb1c4SDavid du Colombier C_DCON, /* other 64 (could subdivide further) */ 147fbadb1c4SDavid du Colombier C_SACON, 148fbadb1c4SDavid du Colombier C_SECON, 149fbadb1c4SDavid du Colombier C_LACON, 150fbadb1c4SDavid du Colombier C_LECON, 151fbadb1c4SDavid du Colombier C_SBRA, 152fbadb1c4SDavid du Colombier C_LBRA, 153fbadb1c4SDavid du Colombier C_SAUTO, 154fbadb1c4SDavid du Colombier C_LAUTO, 155fbadb1c4SDavid du Colombier C_SEXT, 156fbadb1c4SDavid du Colombier C_LEXT, 157fbadb1c4SDavid du Colombier C_ZOREG, 158fbadb1c4SDavid du Colombier C_SOREG, 159fbadb1c4SDavid du Colombier C_LOREG, 160fbadb1c4SDavid du Colombier C_FPSCR, 161fbadb1c4SDavid du Colombier C_MSR, 162fbadb1c4SDavid du Colombier C_XER, 163fbadb1c4SDavid du Colombier C_LR, 164fbadb1c4SDavid du Colombier C_CTR, 165fbadb1c4SDavid du Colombier C_ANY, 166fbadb1c4SDavid du Colombier C_GOK, 167fbadb1c4SDavid du Colombier C_ADDR, 168fbadb1c4SDavid du Colombier 169fbadb1c4SDavid du Colombier C_NCLASS, 170fbadb1c4SDavid du Colombier 171fbadb1c4SDavid du Colombier Roffset = 22, /* no. bits for offset in relocation address */ 172fbadb1c4SDavid du Colombier Rindex = 10 /* no. bits for index in relocation address */ 173fbadb1c4SDavid du Colombier }; 174fbadb1c4SDavid du Colombier 175fbadb1c4SDavid du Colombier EXTERN union 176fbadb1c4SDavid du Colombier { 177fbadb1c4SDavid du Colombier struct 178fbadb1c4SDavid du Colombier { 179fbadb1c4SDavid du Colombier uchar obuf[MAXIO]; /* output buffer */ 180fbadb1c4SDavid du Colombier uchar ibuf[MAXIO]; /* input buffer */ 181fbadb1c4SDavid du Colombier } u; 182fbadb1c4SDavid du Colombier char dbuf[1]; 183fbadb1c4SDavid du Colombier } buf; 184fbadb1c4SDavid du Colombier 185fbadb1c4SDavid du Colombier #define cbuf u.obuf 186fbadb1c4SDavid du Colombier #define xbuf u.ibuf 187fbadb1c4SDavid du Colombier 188fbadb1c4SDavid du Colombier EXTERN long HEADR; /* length of header */ 189fbadb1c4SDavid du Colombier EXTERN int HEADTYPE; /* type of header */ 190fbadb1c4SDavid du Colombier EXTERN vlong INITDAT; /* data location */ 191fbadb1c4SDavid du Colombier EXTERN long INITRND; /* data round above text location */ 192fbadb1c4SDavid du Colombier EXTERN vlong INITTEXT; /* text location */ 193fbadb1c4SDavid du Colombier EXTERN long INITTEXTP; /* text location (physical) */ 194fbadb1c4SDavid du Colombier EXTERN char* INITENTRY; /* entry point */ 195fbadb1c4SDavid du Colombier EXTERN long autosize; 196fbadb1c4SDavid du Colombier EXTERN Biobuf bso; 197fbadb1c4SDavid du Colombier EXTERN long bsssize; 198fbadb1c4SDavid du Colombier EXTERN int cbc; 199fbadb1c4SDavid du Colombier EXTERN uchar* cbp; 200fbadb1c4SDavid du Colombier EXTERN int cout; 201fbadb1c4SDavid du Colombier EXTERN Auto* curauto; 202fbadb1c4SDavid du Colombier EXTERN Auto* curhist; 203fbadb1c4SDavid du Colombier EXTERN Prog* curp; 204fbadb1c4SDavid du Colombier EXTERN Prog* curtext; 205fbadb1c4SDavid du Colombier EXTERN Prog* datap; 206fbadb1c4SDavid du Colombier EXTERN Prog* prog_movsw; 207fbadb1c4SDavid du Colombier EXTERN Prog* prog_movdw; 208fbadb1c4SDavid du Colombier EXTERN Prog* prog_movws; 209fbadb1c4SDavid du Colombier EXTERN Prog* prog_movwd; 210fbadb1c4SDavid du Colombier EXTERN vlong datsize; 211fbadb1c4SDavid du Colombier EXTERN char debug[128]; 212fbadb1c4SDavid du Colombier EXTERN Prog* firstp; 213fbadb1c4SDavid du Colombier EXTERN uchar fnuxi8[8]; 214fbadb1c4SDavid du Colombier EXTERN uchar fnuxi4[4]; 215fbadb1c4SDavid du Colombier EXTERN Sym* hash[NHASH]; 216fbadb1c4SDavid du Colombier EXTERN Sym* histfrog[MAXHIST]; 217fbadb1c4SDavid du Colombier EXTERN int histfrogp; 218fbadb1c4SDavid du Colombier EXTERN int histgen; 219fbadb1c4SDavid du Colombier EXTERN char* library[50]; 220fbadb1c4SDavid du Colombier EXTERN char* libraryobj[50]; 221fbadb1c4SDavid du Colombier EXTERN int libraryp; 222fbadb1c4SDavid du Colombier EXTERN int xrefresolv; 223fbadb1c4SDavid du Colombier EXTERN char* hunk; 224fbadb1c4SDavid du Colombier EXTERN uchar inuxi1[1]; 225fbadb1c4SDavid du Colombier EXTERN uchar inuxi2[2]; 226fbadb1c4SDavid du Colombier EXTERN uchar inuxi4[4]; 227fbadb1c4SDavid du Colombier EXTERN uchar inuxi8[8]; 228fbadb1c4SDavid du Colombier EXTERN Prog* lastp; 229fbadb1c4SDavid du Colombier EXTERN long lcsize; 230fbadb1c4SDavid du Colombier EXTERN char literal[32]; 231fbadb1c4SDavid du Colombier EXTERN int nerrors; 232fbadb1c4SDavid du Colombier EXTERN long nhunk; 233fbadb1c4SDavid du Colombier EXTERN char* noname; 234fbadb1c4SDavid du Colombier EXTERN vlong instoffset; 235fbadb1c4SDavid du Colombier EXTERN char* outfile; 236fbadb1c4SDavid du Colombier EXTERN vlong pc; 237fbadb1c4SDavid du Colombier EXTERN int r0iszero; 238fbadb1c4SDavid du Colombier EXTERN long symsize; 239fbadb1c4SDavid du Colombier EXTERN long staticgen; 240fbadb1c4SDavid du Colombier EXTERN Prog* textp; 241fbadb1c4SDavid du Colombier EXTERN vlong textsize; 242fbadb1c4SDavid du Colombier EXTERN long tothunk; 243fbadb1c4SDavid du Colombier EXTERN char xcmp[C_NCLASS][C_NCLASS]; 244fbadb1c4SDavid du Colombier EXTERN int version; 245fbadb1c4SDavid du Colombier EXTERN Prog zprg; 246fbadb1c4SDavid du Colombier EXTERN int dtype; 247fbadb1c4SDavid du Colombier 248fbadb1c4SDavid du Colombier EXTERN int doexp, dlm; 249fbadb1c4SDavid du Colombier EXTERN int imports, nimports; 250fbadb1c4SDavid du Colombier EXTERN int exports, nexports, allexport; 251fbadb1c4SDavid du Colombier EXTERN char* EXPTAB; 252fbadb1c4SDavid du Colombier EXTERN Prog undefp; 253fbadb1c4SDavid du Colombier 254fbadb1c4SDavid du Colombier #define UP (&undefp) 255fbadb1c4SDavid du Colombier 256fbadb1c4SDavid du Colombier extern Optab optab[]; 257fbadb1c4SDavid du Colombier extern char* anames[]; 258fbadb1c4SDavid du Colombier extern char* cnames[]; 259fbadb1c4SDavid du Colombier 260fbadb1c4SDavid du Colombier int Aconv(Fmt*); 261fbadb1c4SDavid du Colombier int Dconv(Fmt*); 262fbadb1c4SDavid du Colombier int Nconv(Fmt*); 263fbadb1c4SDavid du Colombier int Pconv(Fmt*); 264fbadb1c4SDavid du Colombier int Sconv(Fmt*); 265fbadb1c4SDavid du Colombier int Rconv(Fmt*); 266fbadb1c4SDavid du Colombier int aclass(Adr*); 267fbadb1c4SDavid du Colombier void addhist(long, int); 268fbadb1c4SDavid du Colombier void histtoauto(void); 269fbadb1c4SDavid du Colombier void addlibpath(char*); 270fbadb1c4SDavid du Colombier void addnop(Prog*); 271fbadb1c4SDavid du Colombier void append(Prog*, Prog*); 272fbadb1c4SDavid du Colombier void asmb(void); 273fbadb1c4SDavid du Colombier void asmdyn(void); 274fbadb1c4SDavid du Colombier void asmlc(void); 275fbadb1c4SDavid du Colombier int asmout(Prog*, Optab*, int); 276fbadb1c4SDavid du Colombier void asmsym(void); 277fbadb1c4SDavid du Colombier vlong atolwhex(char*); 278fbadb1c4SDavid du Colombier Prog* brloop(Prog*); 279fbadb1c4SDavid du Colombier void buildop(void); 280fbadb1c4SDavid du Colombier void cflush(void); 281fbadb1c4SDavid du Colombier void ckoff(Sym*, vlong); 282fbadb1c4SDavid du Colombier int cmp(int, int); 283fbadb1c4SDavid du Colombier void cput(long); 284fbadb1c4SDavid du Colombier int compound(Prog*); 285fbadb1c4SDavid du Colombier double cputime(void); 286fbadb1c4SDavid du Colombier void datblk(long, long); 287fbadb1c4SDavid du Colombier void diag(char*, ...); 288fbadb1c4SDavid du Colombier void dodata(void); 289fbadb1c4SDavid du Colombier void doprof1(void); 290fbadb1c4SDavid du Colombier void doprof2(void); 291fbadb1c4SDavid du Colombier void dynreloc(Sym*, long, int, int, int); 292fbadb1c4SDavid du Colombier vlong entryvalue(void); 293fbadb1c4SDavid du Colombier void errorexit(void); 294fbadb1c4SDavid du Colombier void exchange(Prog*); 295fbadb1c4SDavid du Colombier void export(void); 296fbadb1c4SDavid du Colombier int fileexists(char*); 297fbadb1c4SDavid du Colombier int find1(long, int); 298fbadb1c4SDavid du Colombier char* findlib(char*); 299fbadb1c4SDavid du Colombier void follow(void); 300fbadb1c4SDavid du Colombier void gethunk(void); 301fbadb1c4SDavid du Colombier double ieeedtod(Ieee*); 302fbadb1c4SDavid du Colombier long ieeedtof(Ieee*); 303fbadb1c4SDavid du Colombier void import(void); 304fbadb1c4SDavid du Colombier int isint32(vlong); 305fbadb1c4SDavid du Colombier int isuint32(uvlong); 306fbadb1c4SDavid du Colombier int isnop(Prog*); 307fbadb1c4SDavid du Colombier void ldobj(int, long, char*); 308fbadb1c4SDavid du Colombier void loadlib(void); 309fbadb1c4SDavid du Colombier void listinit(void); 310fbadb1c4SDavid du Colombier void initmuldiv(void); 311fbadb1c4SDavid du Colombier Sym* lookup(char*, int); 312fbadb1c4SDavid du Colombier void llput(vlong); 313fbadb1c4SDavid du Colombier void llputl(vlong); 314fbadb1c4SDavid du Colombier void lput(long); 315fbadb1c4SDavid du Colombier void lputl(long); 316fbadb1c4SDavid du Colombier void mkfwd(void); 317fbadb1c4SDavid du Colombier void* mysbrk(ulong); 318fbadb1c4SDavid du Colombier void names(void); 319fbadb1c4SDavid du Colombier void nocache(Prog*); 320fbadb1c4SDavid du Colombier void noops(void); 321fbadb1c4SDavid du Colombier void nopout(Prog*); 322fbadb1c4SDavid du Colombier void nuxiinit(void); 323fbadb1c4SDavid du Colombier void objfile(char*); 324fbadb1c4SDavid du Colombier int ocmp(void*, void*); 325fbadb1c4SDavid du Colombier long opcode(int); 326fbadb1c4SDavid du Colombier Optab* oplook(Prog*); 327fbadb1c4SDavid du Colombier void patch(void); 328fbadb1c4SDavid du Colombier void prasm(Prog*); 329fbadb1c4SDavid du Colombier void prepend(Prog*, Prog*); 330fbadb1c4SDavid du Colombier Prog* prg(void); 331fbadb1c4SDavid du Colombier int pseudo(Prog*); 332fbadb1c4SDavid du Colombier void putsymb(char*, int, vlong, int); 333fbadb1c4SDavid du Colombier void readundefs(char*, int); 334fbadb1c4SDavid du Colombier long regoff(Adr*); 335fbadb1c4SDavid du Colombier int relinv(int); 336fbadb1c4SDavid du Colombier vlong rnd(vlong, long); 337fbadb1c4SDavid du Colombier void sched(Prog*, Prog*); 338fbadb1c4SDavid du Colombier void span(void); 339fbadb1c4SDavid du Colombier void strnput(char*, int); 340fbadb1c4SDavid du Colombier void undef(void); 341fbadb1c4SDavid du Colombier void undefsym(Sym*); 342fbadb1c4SDavid du Colombier vlong vregoff(Adr*); 343fbadb1c4SDavid du Colombier void wput(long); 344fbadb1c4SDavid du Colombier void wputl(long); 345fbadb1c4SDavid du Colombier void xdefine(char*, int, vlong); 346fbadb1c4SDavid du Colombier void xfol(Prog*); 347fbadb1c4SDavid du Colombier void zerosig(char*); 348fbadb1c4SDavid du Colombier 349fbadb1c4SDavid du Colombier #pragma varargck type "D" Adr* 350fbadb1c4SDavid du Colombier #pragma varargck type "N" Adr* 351fbadb1c4SDavid du Colombier #pragma varargck type "P" Prog* 352fbadb1c4SDavid du Colombier #pragma varargck type "R" int 353fbadb1c4SDavid du Colombier #pragma varargck type "A" int 354fbadb1c4SDavid du Colombier #pragma varargck type "S" char* 355fbadb1c4SDavid du Colombier #pragma varargck argpos diag 1 356