1*ce95e1b3SDavid du Colombier #include <u.h> 2*ce95e1b3SDavid du Colombier #include <libc.h> 3*ce95e1b3SDavid du Colombier #include <bio.h> 4*ce95e1b3SDavid du Colombier #include "../ic/i.out.h" 5*ce95e1b3SDavid du Colombier #include "../8l/elf.h" 6*ce95e1b3SDavid du Colombier 7*ce95e1b3SDavid du Colombier #ifndef EXTERN 8*ce95e1b3SDavid du Colombier #define EXTERN extern 9*ce95e1b3SDavid du Colombier #endif 10*ce95e1b3SDavid du Colombier 11*ce95e1b3SDavid du Colombier typedef vlong xlong; 12*ce95e1b3SDavid du Colombier 13*ce95e1b3SDavid du Colombier typedef struct Adr Adr; 14*ce95e1b3SDavid du Colombier typedef struct Sym Sym; 15*ce95e1b3SDavid du Colombier typedef struct Autom Auto; 16*ce95e1b3SDavid du Colombier typedef struct Prog Prog; 17*ce95e1b3SDavid du Colombier typedef struct Optab Optab; 18*ce95e1b3SDavid du Colombier typedef struct Oprang Oprang; 19*ce95e1b3SDavid du Colombier typedef uchar Opcross[32][32]; 20*ce95e1b3SDavid du Colombier typedef struct Count Count; 21*ce95e1b3SDavid du Colombier 22*ce95e1b3SDavid du Colombier #define P ((Prog*)0) 23*ce95e1b3SDavid du Colombier #define S ((Sym*)0) 24*ce95e1b3SDavid du Colombier #define TNAME (curtext&&curtext->from.sym?curtext->from.sym->name:noname) 25*ce95e1b3SDavid du Colombier 26*ce95e1b3SDavid du Colombier struct Adr 27*ce95e1b3SDavid du Colombier { 28*ce95e1b3SDavid du Colombier union 29*ce95e1b3SDavid du Colombier { 30*ce95e1b3SDavid du Colombier long u0offset; 31*ce95e1b3SDavid du Colombier char* u0sval; 32*ce95e1b3SDavid du Colombier Ieee* u0ieee; 33*ce95e1b3SDavid du Colombier vlong* u0vval; 34*ce95e1b3SDavid du Colombier } u0; 35*ce95e1b3SDavid du Colombier union 36*ce95e1b3SDavid du Colombier { 37*ce95e1b3SDavid du Colombier Auto* u1autom; 38*ce95e1b3SDavid du Colombier Sym* u1sym; 39*ce95e1b3SDavid du Colombier } u1; 40*ce95e1b3SDavid du Colombier char type; 41*ce95e1b3SDavid du Colombier char reg; 42*ce95e1b3SDavid du Colombier char name; 43*ce95e1b3SDavid du Colombier char class; 44*ce95e1b3SDavid du Colombier }; 45*ce95e1b3SDavid du Colombier 46*ce95e1b3SDavid du Colombier #define offset u0.u0offset 47*ce95e1b3SDavid du Colombier #define sval u0.u0sval 48*ce95e1b3SDavid du Colombier #define ieee u0.u0ieee 49*ce95e1b3SDavid du Colombier #define vval u0.u0vval 50*ce95e1b3SDavid du Colombier 51*ce95e1b3SDavid du Colombier #define autom u1.u1autom 52*ce95e1b3SDavid du Colombier #define sym u1.u1sym 53*ce95e1b3SDavid du Colombier 54*ce95e1b3SDavid du Colombier struct Prog 55*ce95e1b3SDavid du Colombier { 56*ce95e1b3SDavid du Colombier Adr from; 57*ce95e1b3SDavid du Colombier Adr to; 58*ce95e1b3SDavid du Colombier union 59*ce95e1b3SDavid du Colombier { 60*ce95e1b3SDavid du Colombier long u0regused; 61*ce95e1b3SDavid du Colombier Prog* u0forwd; 62*ce95e1b3SDavid du Colombier } u0; 63*ce95e1b3SDavid du Colombier Prog* cond; 64*ce95e1b3SDavid du Colombier Prog* link; 65*ce95e1b3SDavid du Colombier long pc; 66*ce95e1b3SDavid du Colombier long line; 67*ce95e1b3SDavid du Colombier uchar mark; 68*ce95e1b3SDavid du Colombier uchar optab; 69*ce95e1b3SDavid du Colombier char as; 70*ce95e1b3SDavid du Colombier char reg; 71*ce95e1b3SDavid du Colombier }; 72*ce95e1b3SDavid du Colombier #define regused u0.u0regused 73*ce95e1b3SDavid du Colombier #define forwd u0.u0forwd 74*ce95e1b3SDavid du Colombier 75*ce95e1b3SDavid du Colombier struct Sym 76*ce95e1b3SDavid du Colombier { 77*ce95e1b3SDavid du Colombier char *name; 78*ce95e1b3SDavid du Colombier short type; 79*ce95e1b3SDavid du Colombier short version; 80*ce95e1b3SDavid du Colombier short become; 81*ce95e1b3SDavid du Colombier short frame; 82*ce95e1b3SDavid du Colombier ushort file; 83*ce95e1b3SDavid du Colombier long value; 84*ce95e1b3SDavid du Colombier long sig; 85*ce95e1b3SDavid du Colombier Sym* link; 86*ce95e1b3SDavid du Colombier }; 87*ce95e1b3SDavid du Colombier struct Autom 88*ce95e1b3SDavid du Colombier { 89*ce95e1b3SDavid du Colombier Sym* asym; 90*ce95e1b3SDavid du Colombier Auto* link; 91*ce95e1b3SDavid du Colombier long aoffset; 92*ce95e1b3SDavid du Colombier short type; 93*ce95e1b3SDavid du Colombier }; 94*ce95e1b3SDavid du Colombier struct Optab 95*ce95e1b3SDavid du Colombier { 96*ce95e1b3SDavid du Colombier char as; 97*ce95e1b3SDavid du Colombier char a1; 98*ce95e1b3SDavid du Colombier char a3; 99*ce95e1b3SDavid du Colombier char type; 100*ce95e1b3SDavid du Colombier char ctype; 101*ce95e1b3SDavid du Colombier char size; 102*ce95e1b3SDavid du Colombier char op; 103*ce95e1b3SDavid du Colombier char func3; 104*ce95e1b3SDavid du Colombier short param; 105*ce95e1b3SDavid du Colombier }; 106*ce95e1b3SDavid du Colombier struct Oprang 107*ce95e1b3SDavid du Colombier { 108*ce95e1b3SDavid du Colombier Optab* start; 109*ce95e1b3SDavid du Colombier Optab* stop; 110*ce95e1b3SDavid du Colombier }; 111*ce95e1b3SDavid du Colombier struct Count 112*ce95e1b3SDavid du Colombier { 113*ce95e1b3SDavid du Colombier long count; 114*ce95e1b3SDavid du Colombier long outof; 115*ce95e1b3SDavid du Colombier }; 116*ce95e1b3SDavid du Colombier 117*ce95e1b3SDavid du Colombier enum 118*ce95e1b3SDavid du Colombier { 119*ce95e1b3SDavid du Colombier STEXT = 1, 120*ce95e1b3SDavid du Colombier SDATA, 121*ce95e1b3SDavid du Colombier SBSS, 122*ce95e1b3SDavid du Colombier SDATA1, 123*ce95e1b3SDavid du Colombier SXREF, 124*ce95e1b3SDavid du Colombier SLEAF, 125*ce95e1b3SDavid du Colombier SFILE, 126*ce95e1b3SDavid du Colombier SCONST, 127*ce95e1b3SDavid du Colombier SSTRING, 128*ce95e1b3SDavid du Colombier 129*ce95e1b3SDavid du Colombier C_NONE = 0, 130*ce95e1b3SDavid du Colombier C_REG, 131*ce95e1b3SDavid du Colombier C_CTLREG, 132*ce95e1b3SDavid du Colombier C_FREG, 133*ce95e1b3SDavid du Colombier C_ZREG, 134*ce95e1b3SDavid du Colombier C_ZCON, 135*ce95e1b3SDavid du Colombier C_SCON, 136*ce95e1b3SDavid du Colombier C_UCON, 137*ce95e1b3SDavid du Colombier C_LCON, 138*ce95e1b3SDavid du Colombier C_VCON, 139*ce95e1b3SDavid du Colombier C_FCON, 140*ce95e1b3SDavid du Colombier C_SACON, 141*ce95e1b3SDavid du Colombier C_SECON, 142*ce95e1b3SDavid du Colombier C_LACON, 143*ce95e1b3SDavid du Colombier C_LECON, 144*ce95e1b3SDavid du Colombier C_SRCON, 145*ce95e1b3SDavid du Colombier C_LRCON, 146*ce95e1b3SDavid du Colombier C_SBRA, 147*ce95e1b3SDavid du Colombier C_LBRA, 148*ce95e1b3SDavid du Colombier C_SAUTO, 149*ce95e1b3SDavid du Colombier C_ZOREG, 150*ce95e1b3SDavid du Colombier C_SOREG, 151*ce95e1b3SDavid du Colombier C_LOREG, 152*ce95e1b3SDavid du Colombier C_LAUTO, 153*ce95e1b3SDavid du Colombier C_SEXT, 154*ce95e1b3SDavid du Colombier C_LEXT, 155*ce95e1b3SDavid du Colombier C_GOK, 156*ce95e1b3SDavid du Colombier 157*ce95e1b3SDavid du Colombier NSCHED = 20, 158*ce95e1b3SDavid du Colombier 159*ce95e1b3SDavid du Colombier /* mark flags */ 160*ce95e1b3SDavid du Colombier FOLL = 1<<0, 161*ce95e1b3SDavid du Colombier LABEL = 1<<1, 162*ce95e1b3SDavid du Colombier LEAF = 1<<2, 163*ce95e1b3SDavid du Colombier SYNC = 1<<3, 164*ce95e1b3SDavid du Colombier BRANCH = 1<<4, 165*ce95e1b3SDavid du Colombier COMPR = 1<<5, 166*ce95e1b3SDavid du Colombier SPASS = 1<<6, 167*ce95e1b3SDavid du Colombier 168*ce95e1b3SDavid du Colombier BIG = 2048, 169*ce95e1b3SDavid du Colombier STRINGSZ = 200, 170*ce95e1b3SDavid du Colombier NHASH = 10007, 171*ce95e1b3SDavid du Colombier NHUNK = 100000, 172*ce95e1b3SDavid du Colombier MINSIZ = 64, 173*ce95e1b3SDavid du Colombier NENT = 100, 174*ce95e1b3SDavid du Colombier MAXIO = 8192, 175*ce95e1b3SDavid du Colombier MAXHIST = 20, /* limit of path elements for history symbols */ 176*ce95e1b3SDavid du Colombier }; 177*ce95e1b3SDavid du Colombier 178*ce95e1b3SDavid du Colombier /* Major opcodes */ 179*ce95e1b3SDavid du Colombier enum { 180*ce95e1b3SDavid du Colombier OLOAD, OLOAD_FP, Ocustom_0, OMISC_MEM, OOP_IMM, OAUIPC, OOP_IMM_32, O48b, 181*ce95e1b3SDavid du Colombier OSTORE, OSTORE_FP, Ocustom_1, OAMO, OOP, OLUI, OOP_32, O64b, 182*ce95e1b3SDavid du Colombier OMADD, OMSUB, ONMSUB, ONMADD, OOP_FP, Ores_0, Ocustom_2, O48b_2, 183*ce95e1b3SDavid du Colombier OBRANCH, OJALR, Ores_1, OJAL, OSYSTEM, Ores_2, Ocustom_3, O80b 184*ce95e1b3SDavid du Colombier }; 185*ce95e1b3SDavid du Colombier 186*ce95e1b3SDavid du Colombier EXTERN union 187*ce95e1b3SDavid du Colombier { 188*ce95e1b3SDavid du Colombier struct 189*ce95e1b3SDavid du Colombier { 190*ce95e1b3SDavid du Colombier uchar obuf[MAXIO]; /* output buffer */ 191*ce95e1b3SDavid du Colombier uchar ibuf[MAXIO]; /* input buffer */ 192*ce95e1b3SDavid du Colombier } u; 193*ce95e1b3SDavid du Colombier char dbuf[1]; 194*ce95e1b3SDavid du Colombier } buf; 195*ce95e1b3SDavid du Colombier 196*ce95e1b3SDavid du Colombier #define cbuf u.obuf 197*ce95e1b3SDavid du Colombier #define xbuf u.ibuf 198*ce95e1b3SDavid du Colombier 199*ce95e1b3SDavid du Colombier EXTERN long HEADR; /* length of header */ 200*ce95e1b3SDavid du Colombier EXTERN int HEADTYPE; /* type of header */ 201*ce95e1b3SDavid du Colombier EXTERN xlong INITDAT; /* data location */ 202*ce95e1b3SDavid du Colombier EXTERN xlong INITRND; /* data round above text location */ 203*ce95e1b3SDavid du Colombier EXTERN xlong INITTEXT; /* text location */ 204*ce95e1b3SDavid du Colombier EXTERN xlong INITTEXTP; /* text location (physical) */ 205*ce95e1b3SDavid du Colombier EXTERN char* INITENTRY; /* entry point */ 206*ce95e1b3SDavid du Colombier EXTERN long autosize; 207*ce95e1b3SDavid du Colombier EXTERN Biobuf bso; 208*ce95e1b3SDavid du Colombier EXTERN long bsssize; 209*ce95e1b3SDavid du Colombier EXTERN int cbc; 210*ce95e1b3SDavid du Colombier EXTERN uchar* cbp; 211*ce95e1b3SDavid du Colombier EXTERN int cout; 212*ce95e1b3SDavid du Colombier EXTERN Auto* curauto; 213*ce95e1b3SDavid du Colombier EXTERN Auto* curhist; 214*ce95e1b3SDavid du Colombier EXTERN Prog* curp; 215*ce95e1b3SDavid du Colombier EXTERN Prog* curtext; 216*ce95e1b3SDavid du Colombier EXTERN Prog* datap; 217*ce95e1b3SDavid du Colombier EXTERN long datsize; 218*ce95e1b3SDavid du Colombier EXTERN char debug[128]; 219*ce95e1b3SDavid du Colombier EXTERN Prog* etextp; 220*ce95e1b3SDavid du Colombier EXTERN Prog* firstp; 221*ce95e1b3SDavid du Colombier EXTERN char fnuxi4[4]; /* for 3l [sic] */ 222*ce95e1b3SDavid du Colombier EXTERN char fnuxi8[8]; 223*ce95e1b3SDavid du Colombier EXTERN char* noname; 224*ce95e1b3SDavid du Colombier EXTERN Sym* hash[NHASH]; 225*ce95e1b3SDavid du Colombier EXTERN Sym* histfrog[MAXHIST]; 226*ce95e1b3SDavid du Colombier EXTERN int histfrogp; 227*ce95e1b3SDavid du Colombier EXTERN int histgen; 228*ce95e1b3SDavid du Colombier EXTERN char* library[50]; 229*ce95e1b3SDavid du Colombier EXTERN char* libraryobj[50]; 230*ce95e1b3SDavid du Colombier EXTERN int libraryp; 231*ce95e1b3SDavid du Colombier EXTERN int xrefresolv; 232*ce95e1b3SDavid du Colombier EXTERN char* hunk; 233*ce95e1b3SDavid du Colombier EXTERN char inuxi1[1]; 234*ce95e1b3SDavid du Colombier EXTERN char inuxi2[2]; 235*ce95e1b3SDavid du Colombier EXTERN char inuxi4[4]; 236*ce95e1b3SDavid du Colombier EXTERN char inuxi8[8]; 237*ce95e1b3SDavid du Colombier EXTERN Prog* lastp; 238*ce95e1b3SDavid du Colombier EXTERN long lcsize; 239*ce95e1b3SDavid du Colombier EXTERN char literal[32]; 240*ce95e1b3SDavid du Colombier EXTERN int nerrors; 241*ce95e1b3SDavid du Colombier EXTERN long nhunk; 242*ce95e1b3SDavid du Colombier EXTERN Prog nopalign; 243*ce95e1b3SDavid du Colombier EXTERN long instoffset; 244*ce95e1b3SDavid du Colombier EXTERN vlong instoffx; 245*ce95e1b3SDavid du Colombier EXTERN Opcross opcross[10]; 246*ce95e1b3SDavid du Colombier EXTERN Oprang oprange[ALAST]; 247*ce95e1b3SDavid du Colombier EXTERN char* outfile; 248*ce95e1b3SDavid du Colombier EXTERN long pc; 249*ce95e1b3SDavid du Colombier EXTERN int ptrsize; 250*ce95e1b3SDavid du Colombier EXTERN uchar repop[ALAST]; 251*ce95e1b3SDavid du Colombier EXTERN long symsize; 252*ce95e1b3SDavid du Colombier EXTERN Prog* textp; 253*ce95e1b3SDavid du Colombier EXTERN long textsize; 254*ce95e1b3SDavid du Colombier EXTERN long thunk; 255*ce95e1b3SDavid du Colombier EXTERN int version; 256*ce95e1b3SDavid du Colombier EXTERN char xcmp[32][32]; 257*ce95e1b3SDavid du Colombier EXTERN Prog zprg; 258*ce95e1b3SDavid du Colombier EXTERN int dtype; 259*ce95e1b3SDavid du Colombier EXTERN int little; 260*ce95e1b3SDavid du Colombier 261*ce95e1b3SDavid du Colombier EXTERN struct 262*ce95e1b3SDavid du Colombier { 263*ce95e1b3SDavid du Colombier Count branch; 264*ce95e1b3SDavid du Colombier Count fcmp; 265*ce95e1b3SDavid du Colombier Count load; 266*ce95e1b3SDavid du Colombier Count mfrom; 267*ce95e1b3SDavid du Colombier Count page; 268*ce95e1b3SDavid du Colombier Count jump; 269*ce95e1b3SDavid du Colombier } nop; 270*ce95e1b3SDavid du Colombier 271*ce95e1b3SDavid du Colombier extern char* anames[]; 272*ce95e1b3SDavid du Colombier extern Optab optab[]; 273*ce95e1b3SDavid du Colombier extern char thechar; 274*ce95e1b3SDavid du Colombier 275*ce95e1b3SDavid du Colombier #pragma varargck type "A" int 276*ce95e1b3SDavid du Colombier #pragma varargck type "D" Adr* 277*ce95e1b3SDavid du Colombier #pragma varargck type "N" Adr* 278*ce95e1b3SDavid du Colombier #pragma varargck type "P" Prog* 279*ce95e1b3SDavid du Colombier #pragma varargck type "S" char* 280*ce95e1b3SDavid du Colombier 281*ce95e1b3SDavid du Colombier #pragma varargck argpos diag 1 282*ce95e1b3SDavid du Colombier 283*ce95e1b3SDavid du Colombier int Aconv(Fmt*); 284*ce95e1b3SDavid du Colombier int Dconv(Fmt*); 285*ce95e1b3SDavid du Colombier int Nconv(Fmt*); 286*ce95e1b3SDavid du Colombier int Pconv(Fmt*); 287*ce95e1b3SDavid du Colombier int Sconv(Fmt*); 288*ce95e1b3SDavid du Colombier int aclass(Adr*); 289*ce95e1b3SDavid du Colombier void addhist(long, int); 290*ce95e1b3SDavid du Colombier void append(Prog*, Prog*); 291*ce95e1b3SDavid du Colombier void asmb(void); 292*ce95e1b3SDavid du Colombier int asmcompressed(Prog*, Optab*, int, int); 293*ce95e1b3SDavid du Colombier void asmlc(void); 294*ce95e1b3SDavid du Colombier int asmout(Prog*, Optab*, int); 295*ce95e1b3SDavid du Colombier void asmsym(void); 296*ce95e1b3SDavid du Colombier vlong atolwhex(char*); 297*ce95e1b3SDavid du Colombier Prog* brloop(Prog*); 298*ce95e1b3SDavid du Colombier void buildop(void); 299*ce95e1b3SDavid du Colombier void buildrep(int, int); 300*ce95e1b3SDavid du Colombier void cflush(void); 301*ce95e1b3SDavid du Colombier int cmp(int, int); 302*ce95e1b3SDavid du Colombier int compound(Prog*); 303*ce95e1b3SDavid du Colombier double cputime(void); 304*ce95e1b3SDavid du Colombier void datblk(long, long, int); 305*ce95e1b3SDavid du Colombier void diag(char*, ...); 306*ce95e1b3SDavid du Colombier void dodata(void); 307*ce95e1b3SDavid du Colombier void doprof1(void); 308*ce95e1b3SDavid du Colombier void doprof2(void); 309*ce95e1b3SDavid du Colombier vlong entryvalue(void); 310*ce95e1b3SDavid du Colombier void errorexit(void); 311*ce95e1b3SDavid du Colombier void exchange(Prog*); 312*ce95e1b3SDavid du Colombier int find1(long, int); 313*ce95e1b3SDavid du Colombier void follow(void); 314*ce95e1b3SDavid du Colombier void gethunk(void); 315*ce95e1b3SDavid du Colombier void histtoauto(void); 316*ce95e1b3SDavid du Colombier double ieeedtod(Ieee*); 317*ce95e1b3SDavid du Colombier long ieeedtof(Ieee*); 318*ce95e1b3SDavid du Colombier int isnop(Prog*); 319*ce95e1b3SDavid du Colombier void ldobj(int, long, char*); 320*ce95e1b3SDavid du Colombier void loadlib(void); 321*ce95e1b3SDavid du Colombier void listinit(void); 322*ce95e1b3SDavid du Colombier Sym* lookup(char*, int); 323*ce95e1b3SDavid du Colombier void cput(int); 324*ce95e1b3SDavid du Colombier void llput(vlong); 325*ce95e1b3SDavid du Colombier void llputl(vlong); 326*ce95e1b3SDavid du Colombier void lput(long); 327*ce95e1b3SDavid du Colombier void lputl(long); 328*ce95e1b3SDavid du Colombier void bput(long); 329*ce95e1b3SDavid du Colombier void mkfwd(void); 330*ce95e1b3SDavid du Colombier void* mysbrk(ulong); 331*ce95e1b3SDavid du Colombier void names(void); 332*ce95e1b3SDavid du Colombier void nocache(Prog*); 333*ce95e1b3SDavid du Colombier void noops(void); 334*ce95e1b3SDavid du Colombier void nuxiinit(void); 335*ce95e1b3SDavid du Colombier void objfile(char*); 336*ce95e1b3SDavid du Colombier int ocmp(void*, void*); 337*ce95e1b3SDavid du Colombier long opirr(int); 338*ce95e1b3SDavid du Colombier Optab* oplook(Prog*); 339*ce95e1b3SDavid du Colombier long oprrr(int); 340*ce95e1b3SDavid du Colombier void patch(void); 341*ce95e1b3SDavid du Colombier void prasm(Prog*); 342*ce95e1b3SDavid du Colombier void prepend(Prog*, Prog*); 343*ce95e1b3SDavid du Colombier Prog* prg(void); 344*ce95e1b3SDavid du Colombier int pseudo(Prog*); 345*ce95e1b3SDavid du Colombier void putsymb(char*, int, vlong, int); 346*ce95e1b3SDavid du Colombier long regoff(Adr*); 347*ce95e1b3SDavid du Colombier int classreg(Adr*); 348*ce95e1b3SDavid du Colombier int relinv(int); 349*ce95e1b3SDavid du Colombier int relrev(int); 350*ce95e1b3SDavid du Colombier vlong rnd(vlong, vlong); 351*ce95e1b3SDavid du Colombier void span(void); 352*ce95e1b3SDavid du Colombier void strnput(char*, int); 353*ce95e1b3SDavid du Colombier void undef(void); 354*ce95e1b3SDavid du Colombier int vconshift(vlong); 355*ce95e1b3SDavid du Colombier void wput(long); 356*ce95e1b3SDavid du Colombier void wputl(long); 357*ce95e1b3SDavid du Colombier void xdefine(char*, int, long); 358*ce95e1b3SDavid du Colombier void xfol(Prog*); 359*ce95e1b3SDavid du Colombier void xfol(Prog*); 360*ce95e1b3SDavid du Colombier void nopstat(char*, Count*); 361