1*7dd7cddfSDavid du Colombier #include <u.h> 2*7dd7cddfSDavid du Colombier #include <libc.h> 3*7dd7cddfSDavid du Colombier #include <bio.h> 4*7dd7cddfSDavid du Colombier #include "../5c/5.out.h" 5*7dd7cddfSDavid du Colombier 6*7dd7cddfSDavid du Colombier #ifndef EXTERN 7*7dd7cddfSDavid du Colombier #define EXTERN extern 8*7dd7cddfSDavid du Colombier #endif 9*7dd7cddfSDavid du Colombier 10*7dd7cddfSDavid du Colombier 11*7dd7cddfSDavid du Colombier typedef struct Adr Adr; 12*7dd7cddfSDavid du Colombier typedef struct Sym Sym; 13*7dd7cddfSDavid du Colombier typedef struct Autom Auto; 14*7dd7cddfSDavid du Colombier typedef struct Prog Prog; 15*7dd7cddfSDavid du Colombier typedef struct Optab Optab; 16*7dd7cddfSDavid du Colombier typedef struct Oprang Oprang; 17*7dd7cddfSDavid du Colombier typedef uchar Opcross[32][2][32]; 18*7dd7cddfSDavid du Colombier typedef struct Count Count; 19*7dd7cddfSDavid du Colombier 20*7dd7cddfSDavid du Colombier #define P ((Prog*)0) 21*7dd7cddfSDavid du Colombier #define S ((Sym*)0) 22*7dd7cddfSDavid du Colombier #define TNAME (curtext&&curtext->from.sym?curtext->from.sym->name:noname) 23*7dd7cddfSDavid du Colombier 24*7dd7cddfSDavid du Colombier struct Adr 25*7dd7cddfSDavid du Colombier { 26*7dd7cddfSDavid du Colombier union 27*7dd7cddfSDavid du Colombier { 28*7dd7cddfSDavid du Colombier long u0offset; 29*7dd7cddfSDavid du Colombier char* u0sval; 30*7dd7cddfSDavid du Colombier Ieee* u0ieee; 31*7dd7cddfSDavid du Colombier } u0; 32*7dd7cddfSDavid du Colombier union 33*7dd7cddfSDavid du Colombier { 34*7dd7cddfSDavid du Colombier Auto* u1autom; 35*7dd7cddfSDavid du Colombier Sym* u1sym; 36*7dd7cddfSDavid du Colombier } u1; 37*7dd7cddfSDavid du Colombier char type; 38*7dd7cddfSDavid du Colombier char reg; 39*7dd7cddfSDavid du Colombier char name; 40*7dd7cddfSDavid du Colombier char class; 41*7dd7cddfSDavid du Colombier }; 42*7dd7cddfSDavid du Colombier 43*7dd7cddfSDavid du Colombier #define offset u0.u0offset 44*7dd7cddfSDavid du Colombier #define sval u0.u0sval 45*7dd7cddfSDavid du Colombier #define ieee u0.u0ieee 46*7dd7cddfSDavid du Colombier 47*7dd7cddfSDavid du Colombier #define autom u1.u1autom 48*7dd7cddfSDavid du Colombier #define sym u1.u1sym 49*7dd7cddfSDavid du Colombier 50*7dd7cddfSDavid du Colombier struct Prog 51*7dd7cddfSDavid du Colombier { 52*7dd7cddfSDavid du Colombier Adr from; 53*7dd7cddfSDavid du Colombier Adr to; 54*7dd7cddfSDavid du Colombier union 55*7dd7cddfSDavid du Colombier { 56*7dd7cddfSDavid du Colombier long u0regused; 57*7dd7cddfSDavid du Colombier Prog* u0forwd; 58*7dd7cddfSDavid du Colombier } u0; 59*7dd7cddfSDavid du Colombier Prog* cond; 60*7dd7cddfSDavid du Colombier Prog* link; 61*7dd7cddfSDavid du Colombier long pc; 62*7dd7cddfSDavid du Colombier long line; 63*7dd7cddfSDavid du Colombier uchar mark; 64*7dd7cddfSDavid du Colombier uchar optab; 65*7dd7cddfSDavid du Colombier uchar as; 66*7dd7cddfSDavid du Colombier uchar scond; 67*7dd7cddfSDavid du Colombier uchar reg; 68*7dd7cddfSDavid du Colombier }; 69*7dd7cddfSDavid du Colombier #define regused u0.u0regused 70*7dd7cddfSDavid du Colombier #define forwd u0.u0forwd 71*7dd7cddfSDavid du Colombier 72*7dd7cddfSDavid du Colombier struct Sym 73*7dd7cddfSDavid du Colombier { 74*7dd7cddfSDavid du Colombier char *name; 75*7dd7cddfSDavid du Colombier short type; 76*7dd7cddfSDavid du Colombier short version; 77*7dd7cddfSDavid du Colombier short become; 78*7dd7cddfSDavid du Colombier short frame; 79*7dd7cddfSDavid du Colombier long value; 80*7dd7cddfSDavid du Colombier Sym* link; 81*7dd7cddfSDavid du Colombier }; 82*7dd7cddfSDavid du Colombier struct Autom 83*7dd7cddfSDavid du Colombier { 84*7dd7cddfSDavid du Colombier Sym* asym; 85*7dd7cddfSDavid du Colombier Auto* link; 86*7dd7cddfSDavid du Colombier long aoffset; 87*7dd7cddfSDavid du Colombier short type; 88*7dd7cddfSDavid du Colombier }; 89*7dd7cddfSDavid du Colombier struct Optab 90*7dd7cddfSDavid du Colombier { 91*7dd7cddfSDavid du Colombier char as; 92*7dd7cddfSDavid du Colombier char a1; 93*7dd7cddfSDavid du Colombier char a2; 94*7dd7cddfSDavid du Colombier char a3; 95*7dd7cddfSDavid du Colombier char type; 96*7dd7cddfSDavid du Colombier char size; 97*7dd7cddfSDavid du Colombier char param; 98*7dd7cddfSDavid du Colombier char lit; 99*7dd7cddfSDavid du Colombier }; 100*7dd7cddfSDavid du Colombier struct Oprang 101*7dd7cddfSDavid du Colombier { 102*7dd7cddfSDavid du Colombier Optab* start; 103*7dd7cddfSDavid du Colombier Optab* stop; 104*7dd7cddfSDavid du Colombier }; 105*7dd7cddfSDavid du Colombier struct Count 106*7dd7cddfSDavid du Colombier { 107*7dd7cddfSDavid du Colombier long count; 108*7dd7cddfSDavid du Colombier long outof; 109*7dd7cddfSDavid du Colombier }; 110*7dd7cddfSDavid du Colombier 111*7dd7cddfSDavid du Colombier enum 112*7dd7cddfSDavid du Colombier { 113*7dd7cddfSDavid du Colombier STEXT = 1, 114*7dd7cddfSDavid du Colombier SDATA, 115*7dd7cddfSDavid du Colombier SBSS, 116*7dd7cddfSDavid du Colombier SDATA1, 117*7dd7cddfSDavid du Colombier SXREF, 118*7dd7cddfSDavid du Colombier SLEAF, 119*7dd7cddfSDavid du Colombier SFILE, 120*7dd7cddfSDavid du Colombier SCONST, 121*7dd7cddfSDavid du Colombier 122*7dd7cddfSDavid du Colombier LFROM = 1, 123*7dd7cddfSDavid du Colombier LTO, 124*7dd7cddfSDavid du Colombier LPOOL, 125*7dd7cddfSDavid du Colombier 126*7dd7cddfSDavid du Colombier C_NONE = 0, 127*7dd7cddfSDavid du Colombier C_REG, 128*7dd7cddfSDavid du Colombier C_SHIFT, 129*7dd7cddfSDavid du Colombier C_FREG, 130*7dd7cddfSDavid du Colombier C_PSR, 131*7dd7cddfSDavid du Colombier C_FCR, 132*7dd7cddfSDavid du Colombier 133*7dd7cddfSDavid du Colombier C_RCON, /* 0xff rotated */ 134*7dd7cddfSDavid du Colombier C_NCON, /* ~RCON */ 135*7dd7cddfSDavid du Colombier C_SCON, /* 0xffff */ 136*7dd7cddfSDavid du Colombier C_LCON, 137*7dd7cddfSDavid du Colombier C_FCON, 138*7dd7cddfSDavid du Colombier 139*7dd7cddfSDavid du Colombier C_RACON, 140*7dd7cddfSDavid du Colombier C_LACON, 141*7dd7cddfSDavid du Colombier 142*7dd7cddfSDavid du Colombier C_RECON, 143*7dd7cddfSDavid du Colombier C_LECON, 144*7dd7cddfSDavid du Colombier 145*7dd7cddfSDavid du Colombier C_SBRA, 146*7dd7cddfSDavid du Colombier C_LBRA, 147*7dd7cddfSDavid du Colombier 148*7dd7cddfSDavid du Colombier C_FAUTO, 149*7dd7cddfSDavid du Colombier C_SAUTO, 150*7dd7cddfSDavid du Colombier C_LAUTO, 151*7dd7cddfSDavid du Colombier 152*7dd7cddfSDavid du Colombier C_FEXT, 153*7dd7cddfSDavid du Colombier C_SEXT, 154*7dd7cddfSDavid du Colombier C_LEXT, 155*7dd7cddfSDavid du Colombier 156*7dd7cddfSDavid du Colombier C_FOREG, 157*7dd7cddfSDavid du Colombier C_BOREG, /* both */ 158*7dd7cddfSDavid du Colombier C_ROREG, 159*7dd7cddfSDavid du Colombier C_SOREG, 160*7dd7cddfSDavid du Colombier C_LOREG, 161*7dd7cddfSDavid du Colombier 162*7dd7cddfSDavid du Colombier C_GOK, 163*7dd7cddfSDavid du Colombier 164*7dd7cddfSDavid du Colombier /* mark flags */ 165*7dd7cddfSDavid du Colombier FOLL = 1<<0, 166*7dd7cddfSDavid du Colombier LABEL = 1<<1, 167*7dd7cddfSDavid du Colombier LEAF = 1<<2, 168*7dd7cddfSDavid du Colombier 169*7dd7cddfSDavid du Colombier BIG = (1<<12)-4, 170*7dd7cddfSDavid du Colombier STRINGSZ = 200, 171*7dd7cddfSDavid du Colombier NHASH = 10007, 172*7dd7cddfSDavid du Colombier NHUNK = 100000, 173*7dd7cddfSDavid du Colombier MINSIZ = 64, 174*7dd7cddfSDavid du Colombier NENT = 100, 175*7dd7cddfSDavid du Colombier MAXIO = 8192, 176*7dd7cddfSDavid du Colombier MAXHIST = 20, /* limit of path elements for history symbols */ 177*7dd7cddfSDavid du Colombier }; 178*7dd7cddfSDavid du Colombier 179*7dd7cddfSDavid du Colombier EXTERN union 180*7dd7cddfSDavid du Colombier { 181*7dd7cddfSDavid du Colombier struct 182*7dd7cddfSDavid du Colombier { 183*7dd7cddfSDavid du Colombier uchar obuf[MAXIO]; /* output buffer */ 184*7dd7cddfSDavid du Colombier uchar ibuf[MAXIO]; /* input buffer */ 185*7dd7cddfSDavid du Colombier } u; 186*7dd7cddfSDavid du Colombier char dbuf[1]; 187*7dd7cddfSDavid du Colombier } buf; 188*7dd7cddfSDavid du Colombier 189*7dd7cddfSDavid du Colombier #define cbuf u.obuf 190*7dd7cddfSDavid du Colombier #define xbuf u.ibuf 191*7dd7cddfSDavid du Colombier 192*7dd7cddfSDavid du Colombier EXTERN long HEADR; /* length of header */ 193*7dd7cddfSDavid du Colombier EXTERN int HEADTYPE; /* type of header */ 194*7dd7cddfSDavid du Colombier EXTERN long INITDAT; /* data location */ 195*7dd7cddfSDavid du Colombier EXTERN long INITRND; /* data round above text location */ 196*7dd7cddfSDavid du Colombier EXTERN long INITTEXT; /* text location */ 197*7dd7cddfSDavid du Colombier EXTERN char* INITENTRY; /* entry point */ 198*7dd7cddfSDavid du Colombier EXTERN long autosize; 199*7dd7cddfSDavid du Colombier EXTERN Biobuf bso; 200*7dd7cddfSDavid du Colombier EXTERN long bsssize; 201*7dd7cddfSDavid du Colombier EXTERN int cbc; 202*7dd7cddfSDavid du Colombier EXTERN uchar* cbp; 203*7dd7cddfSDavid du Colombier EXTERN int cout; 204*7dd7cddfSDavid du Colombier EXTERN Auto* curauto; 205*7dd7cddfSDavid du Colombier EXTERN Auto* curhist; 206*7dd7cddfSDavid du Colombier EXTERN Prog* curp; 207*7dd7cddfSDavid du Colombier EXTERN Prog* curtext; 208*7dd7cddfSDavid du Colombier EXTERN Prog* datap; 209*7dd7cddfSDavid du Colombier EXTERN long datsize; 210*7dd7cddfSDavid du Colombier EXTERN char debug[128]; 211*7dd7cddfSDavid du Colombier EXTERN Prog* etextp; 212*7dd7cddfSDavid du Colombier EXTERN Prog* firstp; 213*7dd7cddfSDavid du Colombier EXTERN char fnuxi4[4]; 214*7dd7cddfSDavid du Colombier EXTERN char fnuxi8[8]; 215*7dd7cddfSDavid du Colombier EXTERN char* noname; 216*7dd7cddfSDavid du Colombier EXTERN Sym* hash[NHASH]; 217*7dd7cddfSDavid du Colombier EXTERN Sym* histfrog[MAXHIST]; 218*7dd7cddfSDavid du Colombier EXTERN int histfrogp; 219*7dd7cddfSDavid du Colombier EXTERN int histgen; 220*7dd7cddfSDavid du Colombier EXTERN char* library[50]; 221*7dd7cddfSDavid du Colombier EXTERN int libraryp; 222*7dd7cddfSDavid du Colombier EXTERN char* hunk; 223*7dd7cddfSDavid du Colombier EXTERN char inuxi1[1]; 224*7dd7cddfSDavid du Colombier EXTERN char inuxi2[2]; 225*7dd7cddfSDavid du Colombier EXTERN char inuxi4[4]; 226*7dd7cddfSDavid du Colombier EXTERN Prog* lastp; 227*7dd7cddfSDavid du Colombier EXTERN long lcsize; 228*7dd7cddfSDavid du Colombier EXTERN char literal[32]; 229*7dd7cddfSDavid du Colombier EXTERN int nerrors; 230*7dd7cddfSDavid du Colombier EXTERN long nhunk; 231*7dd7cddfSDavid du Colombier EXTERN long instoffset; 232*7dd7cddfSDavid du Colombier EXTERN Opcross opcross[8]; 233*7dd7cddfSDavid du Colombier EXTERN Oprang oprange[ALAST]; 234*7dd7cddfSDavid du Colombier EXTERN char* outfile; 235*7dd7cddfSDavid du Colombier EXTERN long pc; 236*7dd7cddfSDavid du Colombier EXTERN uchar repop[ALAST]; 237*7dd7cddfSDavid du Colombier EXTERN long symsize; 238*7dd7cddfSDavid du Colombier EXTERN Prog* textp; 239*7dd7cddfSDavid du Colombier EXTERN long textsize; 240*7dd7cddfSDavid du Colombier EXTERN long thunk; 241*7dd7cddfSDavid du Colombier EXTERN int version; 242*7dd7cddfSDavid du Colombier EXTERN char xcmp[32][32]; 243*7dd7cddfSDavid du Colombier EXTERN Prog zprg; 244*7dd7cddfSDavid du Colombier EXTERN int dtype; 245*7dd7cddfSDavid du Colombier 246*7dd7cddfSDavid du Colombier extern char* anames[]; 247*7dd7cddfSDavid du Colombier extern Optab optab[]; 248*7dd7cddfSDavid du Colombier 249*7dd7cddfSDavid du Colombier void addpool(Prog*, Adr*); 250*7dd7cddfSDavid du Colombier EXTERN Prog* blitrl; 251*7dd7cddfSDavid du Colombier EXTERN Prog* elitrl; 252*7dd7cddfSDavid du Colombier 253*7dd7cddfSDavid du Colombier void initdiv(void); 254*7dd7cddfSDavid du Colombier EXTERN Prog* prog_div; 255*7dd7cddfSDavid du Colombier EXTERN Prog* prog_divu; 256*7dd7cddfSDavid du Colombier EXTERN Prog* prog_mod; 257*7dd7cddfSDavid du Colombier EXTERN Prog* prog_modu; 258*7dd7cddfSDavid du Colombier 259*7dd7cddfSDavid du Colombier #pragma varargck type "A" int 260*7dd7cddfSDavid du Colombier #pragma varargck type "C" int 261*7dd7cddfSDavid du Colombier #pragma varargck type "D" Adr* 262*7dd7cddfSDavid du Colombier #pragma varargck type "P" Prog* 263*7dd7cddfSDavid du Colombier #pragma varargck type "N" Adr* 264*7dd7cddfSDavid du Colombier #pragma varargck type "S" char* 265*7dd7cddfSDavid du Colombier 266*7dd7cddfSDavid du Colombier int Aconv(va_list*, Fconv*); 267*7dd7cddfSDavid du Colombier int Cconv(va_list*, Fconv*); 268*7dd7cddfSDavid du Colombier int Dconv(va_list*, Fconv*); 269*7dd7cddfSDavid du Colombier int Nconv(va_list*, Fconv*); 270*7dd7cddfSDavid du Colombier int Pconv(va_list*, Fconv*); 271*7dd7cddfSDavid du Colombier int Sconv(va_list*, Fconv*); 272*7dd7cddfSDavid du Colombier int aclass(Adr*); 273*7dd7cddfSDavid du Colombier void addhist(long, int); 274*7dd7cddfSDavid du Colombier void append(Prog*, Prog*); 275*7dd7cddfSDavid du Colombier void asmb(void); 276*7dd7cddfSDavid du Colombier void asmlc(void); 277*7dd7cddfSDavid du Colombier void asmout(Prog*, Optab*); 278*7dd7cddfSDavid du Colombier void asmsym(void); 279*7dd7cddfSDavid du Colombier long atolwhex(char*); 280*7dd7cddfSDavid du Colombier Prog* brloop(Prog*); 281*7dd7cddfSDavid du Colombier Biobuf bso; 282*7dd7cddfSDavid du Colombier void buildop(void); 283*7dd7cddfSDavid du Colombier void buildrep(int, int); 284*7dd7cddfSDavid du Colombier void cflush(void); 285*7dd7cddfSDavid du Colombier int chipfloat(Ieee*); 286*7dd7cddfSDavid du Colombier int cmp(int, int); 287*7dd7cddfSDavid du Colombier int compound(Prog*); 288*7dd7cddfSDavid du Colombier double cputime(void); 289*7dd7cddfSDavid du Colombier void datblk(long, long); 290*7dd7cddfSDavid du Colombier void diag(char*, ...); 291*7dd7cddfSDavid du Colombier void dodata(void); 292*7dd7cddfSDavid du Colombier void doprof1(void); 293*7dd7cddfSDavid du Colombier void doprof2(void); 294*7dd7cddfSDavid du Colombier long entryvalue(void); 295*7dd7cddfSDavid du Colombier void errorexit(void); 296*7dd7cddfSDavid du Colombier void exchange(Prog*); 297*7dd7cddfSDavid du Colombier int find1(long, int); 298*7dd7cddfSDavid du Colombier void follow(void); 299*7dd7cddfSDavid du Colombier void gethunk(void); 300*7dd7cddfSDavid du Colombier void histtoauto(void); 301*7dd7cddfSDavid du Colombier double ieeedtod(Ieee*); 302*7dd7cddfSDavid du Colombier long ieeedtof(Ieee*); 303*7dd7cddfSDavid du Colombier int isnop(Prog*); 304*7dd7cddfSDavid du Colombier void ldobj(int, long, char*); 305*7dd7cddfSDavid du Colombier void loadlib(int, int); 306*7dd7cddfSDavid du Colombier void listinit(void); 307*7dd7cddfSDavid du Colombier Sym* lookup(char*, int); 308*7dd7cddfSDavid du Colombier void lput(long); 309*7dd7cddfSDavid du Colombier void lputl(long); 310*7dd7cddfSDavid du Colombier void mkfwd(void); 311*7dd7cddfSDavid du Colombier void* mysbrk(ulong); 312*7dd7cddfSDavid du Colombier void names(void); 313*7dd7cddfSDavid du Colombier void nocache(Prog*); 314*7dd7cddfSDavid du Colombier void nuxiinit(void); 315*7dd7cddfSDavid du Colombier void objfile(char*); 316*7dd7cddfSDavid du Colombier int ocmp(const void*, const void*); 317*7dd7cddfSDavid du Colombier long opirr(int); 318*7dd7cddfSDavid du Colombier Optab* oplook(Prog*); 319*7dd7cddfSDavid du Colombier long oprrr(int, int); 320*7dd7cddfSDavid du Colombier long olr(long, int, int, int); 321*7dd7cddfSDavid du Colombier long olrr(int, int, int, int); 322*7dd7cddfSDavid du Colombier long osr(int, int, long, int, int); 323*7dd7cddfSDavid du Colombier long ofsr(int, int, long, int, int); 324*7dd7cddfSDavid du Colombier long osrr(int, int, int, int); 325*7dd7cddfSDavid du Colombier long oshrr(int, int, int, int); 326*7dd7cddfSDavid du Colombier void patch(void); 327*7dd7cddfSDavid du Colombier void prasm(Prog*); 328*7dd7cddfSDavid du Colombier void prepend(Prog*, Prog*); 329*7dd7cddfSDavid du Colombier Prog* prg(void); 330*7dd7cddfSDavid du Colombier int pseudo(Prog*); 331*7dd7cddfSDavid du Colombier void putsymb(char*, int, long, int); 332*7dd7cddfSDavid du Colombier long regoff(Adr*); 333*7dd7cddfSDavid du Colombier int relinv(int); 334*7dd7cddfSDavid du Colombier long rnd(long, long); 335*7dd7cddfSDavid du Colombier void span(void); 336*7dd7cddfSDavid du Colombier void strnput(char*, int); 337*7dd7cddfSDavid du Colombier void undef(void); 338*7dd7cddfSDavid du Colombier void xdefine(char*, int, long); 339*7dd7cddfSDavid du Colombier void xfol(Prog*); 340*7dd7cddfSDavid du Colombier void xfol(Prog*); 341*7dd7cddfSDavid du Colombier void noops(void); 342*7dd7cddfSDavid du Colombier long immrot(ulong); 343*7dd7cddfSDavid du Colombier long immaddr(long); 344*7dd7cddfSDavid du Colombier long opbra(int, int); 345