17edc7532SDavid du Colombier #include <u.h> 27edc7532SDavid du Colombier #include <libc.h> 37edc7532SDavid du Colombier #include <bio.h> 4*f8bc6aafSDavid du Colombier #include "../4c/4.out.h" 5*f8bc6aafSDavid du Colombier #include "../8l/elf.h" 67edc7532SDavid du Colombier 77edc7532SDavid du Colombier #ifndef EXTERN 87edc7532SDavid du Colombier #define EXTERN extern 97edc7532SDavid du Colombier #endif 107edc7532SDavid du Colombier 11*f8bc6aafSDavid du Colombier #define LIBNAMELEN 300 12*f8bc6aafSDavid du Colombier 137edc7532SDavid du Colombier typedef struct Adr Adr; 147edc7532SDavid du Colombier typedef struct Sym Sym; 157edc7532SDavid du Colombier typedef struct Autom Auto; 167edc7532SDavid du Colombier typedef struct Prog Prog; 177edc7532SDavid du Colombier typedef struct Optab Optab; 187edc7532SDavid du Colombier typedef struct Oprang Oprang; 197edc7532SDavid du Colombier typedef uchar Opcross[32][2][32]; 207edc7532SDavid du Colombier typedef struct Count Count; 217edc7532SDavid du Colombier 227edc7532SDavid du Colombier #define P ((Prog*)0) 237edc7532SDavid du Colombier #define S ((Sym*)0) 247edc7532SDavid du Colombier #define TNAME (curtext&&curtext->from.sym?curtext->from.sym->name:noname) 257edc7532SDavid du Colombier 267edc7532SDavid du Colombier struct Adr 277edc7532SDavid du Colombier { 287edc7532SDavid du Colombier union 297edc7532SDavid du Colombier { 30*f8bc6aafSDavid du Colombier vlong u0offset; 317edc7532SDavid du Colombier char* u0sval; 327edc7532SDavid du Colombier Ieee* u0ieee; 337edc7532SDavid du Colombier } u0; 347edc7532SDavid du Colombier union 357edc7532SDavid du Colombier { 367edc7532SDavid du Colombier Auto* u1autom; 377edc7532SDavid du Colombier Sym* u1sym; 387edc7532SDavid du Colombier } u1; 397edc7532SDavid du Colombier char type; 407edc7532SDavid du Colombier char reg; 417edc7532SDavid du Colombier char name; 427edc7532SDavid du Colombier char class; 437edc7532SDavid du Colombier }; 447edc7532SDavid du Colombier 457edc7532SDavid du Colombier #define offset u0.u0offset 467edc7532SDavid du Colombier #define sval u0.u0sval 477edc7532SDavid du Colombier #define ieee u0.u0ieee 487edc7532SDavid du Colombier 497edc7532SDavid du Colombier #define autom u1.u1autom 507edc7532SDavid du Colombier #define sym u1.u1sym 517edc7532SDavid du Colombier 527edc7532SDavid du Colombier struct Prog 537edc7532SDavid du Colombier { 547edc7532SDavid du Colombier Adr from; 557edc7532SDavid du Colombier Adr to; 567edc7532SDavid du Colombier union 577edc7532SDavid du Colombier { 587edc7532SDavid du Colombier long u0regused; 597edc7532SDavid du Colombier Prog* u0forwd; 607edc7532SDavid du Colombier } u0; 617edc7532SDavid du Colombier Prog* cond; 627edc7532SDavid du Colombier Prog* link; 637edc7532SDavid du Colombier vlong pc; 647edc7532SDavid du Colombier long line; 657edc7532SDavid du Colombier uchar mark; 667edc7532SDavid du Colombier uchar optab; 677edc7532SDavid du Colombier char as; 687edc7532SDavid du Colombier char reg; 697edc7532SDavid du Colombier }; 707edc7532SDavid du Colombier #define regused u0.u0regused 717edc7532SDavid du Colombier #define forwd u0.u0forwd 727edc7532SDavid du Colombier 737edc7532SDavid du Colombier struct Sym 747edc7532SDavid du Colombier { 757edc7532SDavid du Colombier char *name; 767edc7532SDavid du Colombier short type; 777edc7532SDavid du Colombier short version; 787edc7532SDavid du Colombier short become; 797edc7532SDavid du Colombier short frame; 807edc7532SDavid du Colombier vlong value; 817edc7532SDavid du Colombier Sym* link; 827edc7532SDavid du Colombier }; 837edc7532SDavid du Colombier struct Autom 847edc7532SDavid du Colombier { 857edc7532SDavid du Colombier Sym* asym; 867edc7532SDavid du Colombier Auto* link; 877edc7532SDavid du Colombier long aoffset; 887edc7532SDavid du Colombier short type; 897edc7532SDavid du Colombier }; 907edc7532SDavid du Colombier struct Optab 917edc7532SDavid du Colombier { 927edc7532SDavid du Colombier char as; 937edc7532SDavid du Colombier char a1; 947edc7532SDavid du Colombier char a2; 957edc7532SDavid du Colombier char a3; 967edc7532SDavid du Colombier char type; 977edc7532SDavid du Colombier char size; 987edc7532SDavid du Colombier char param; 997edc7532SDavid du Colombier }; 1007edc7532SDavid du Colombier struct Oprang 1017edc7532SDavid du Colombier { 1027edc7532SDavid du Colombier Optab* start; 1037edc7532SDavid du Colombier Optab* stop; 1047edc7532SDavid du Colombier }; 1057edc7532SDavid du Colombier struct Count 1067edc7532SDavid du Colombier { 1077edc7532SDavid du Colombier long count; 1087edc7532SDavid du Colombier long outof; 1097edc7532SDavid du Colombier }; 1107edc7532SDavid du Colombier 1117edc7532SDavid du Colombier enum 1127edc7532SDavid du Colombier { 1137edc7532SDavid du Colombier STEXT = 1, 1147edc7532SDavid du Colombier SDATA, 1157edc7532SDavid du Colombier SBSS, 1167edc7532SDavid du Colombier SDATA1, 1177edc7532SDavid du Colombier SXREF, 1187edc7532SDavid du Colombier SLEAF, 1197edc7532SDavid du Colombier SFILE, 1207edc7532SDavid du Colombier SCONST, 121*f8bc6aafSDavid du Colombier SSTRING, 1227edc7532SDavid du Colombier 1237edc7532SDavid du Colombier C_NONE = 0, 1247edc7532SDavid du Colombier C_REG, 1257edc7532SDavid du Colombier C_FREG, 1267edc7532SDavid du Colombier C_FCREG, 1277edc7532SDavid du Colombier C_MREG, 1287edc7532SDavid du Colombier C_HI, 1297edc7532SDavid du Colombier C_LO, 1307edc7532SDavid du Colombier C_ZCON, 1317edc7532SDavid du Colombier C_SCON, 1327edc7532SDavid du Colombier C_ADD0CON, 1337edc7532SDavid du Colombier C_AND0CON, 1347edc7532SDavid du Colombier C_ADDCON, 1357edc7532SDavid du Colombier C_ANDCON, 1367edc7532SDavid du Colombier C_UCON, 1377edc7532SDavid du Colombier C_LCON, 1387edc7532SDavid du Colombier C_SACON, 1397edc7532SDavid du Colombier C_SECON, 1407edc7532SDavid du Colombier C_LACON, 1417edc7532SDavid du Colombier C_LECON, 1427edc7532SDavid du Colombier C_SBRA, 1437edc7532SDavid du Colombier C_LBRA, 1447edc7532SDavid du Colombier C_SAUTO, 1457edc7532SDavid du Colombier C_SEXT, 1467edc7532SDavid du Colombier C_LAUTO, 1477edc7532SDavid du Colombier C_LEXT, 1487edc7532SDavid du Colombier C_ZOREG, 1497edc7532SDavid du Colombier C_SOREG, 1507edc7532SDavid du Colombier C_LOREG, 1517edc7532SDavid du Colombier C_GOK, 1527edc7532SDavid du Colombier 1537edc7532SDavid du Colombier NSCHED = 20, 1547edc7532SDavid du Colombier 1557edc7532SDavid du Colombier /* mark flags */ 1567edc7532SDavid du Colombier FOLL = 1<<0, 1577edc7532SDavid du Colombier LABEL = 1<<1, 1587edc7532SDavid du Colombier LEAF = 1<<2, 1597edc7532SDavid du Colombier SYNC = 1<<3, 1607edc7532SDavid du Colombier BRANCH = 1<<4, 1617edc7532SDavid du Colombier LOAD = 1<<5, 1627edc7532SDavid du Colombier FCMP = 1<<6, 1637edc7532SDavid du Colombier NOSCHED = 1<<7, 1647edc7532SDavid du Colombier 1657edc7532SDavid du Colombier BIG = 32766, 1667edc7532SDavid du Colombier STRINGSZ = 200, 1677edc7532SDavid du Colombier NHASH = 10007, 1687edc7532SDavid du Colombier NHUNK = 100000, 1697edc7532SDavid du Colombier MINSIZ = 64, 1707edc7532SDavid du Colombier NENT = 100, 1717edc7532SDavid du Colombier MAXIO = 8192, 1727edc7532SDavid du Colombier MAXHIST = 20, /* limit of path elements for history symbols */ 1737edc7532SDavid du Colombier }; 1747edc7532SDavid du Colombier 1757edc7532SDavid du Colombier EXTERN union 1767edc7532SDavid du Colombier { 1777edc7532SDavid du Colombier struct 1787edc7532SDavid du Colombier { 1797edc7532SDavid du Colombier uchar obuf[MAXIO]; /* output buffer */ 1807edc7532SDavid du Colombier uchar ibuf[MAXIO]; /* input buffer */ 1817edc7532SDavid du Colombier } u; 1827edc7532SDavid du Colombier char dbuf[1]; 1837edc7532SDavid du Colombier } buf; 1847edc7532SDavid du Colombier 1857edc7532SDavid du Colombier #define cbuf u.obuf 1867edc7532SDavid du Colombier #define xbuf u.ibuf 1877edc7532SDavid du Colombier 1887edc7532SDavid du Colombier EXTERN long HEADR; /* length of header */ 1897edc7532SDavid du Colombier EXTERN int HEADTYPE; /* type of header */ 1907edc7532SDavid du Colombier EXTERN vlong INITDAT; /* data location */ 1917edc7532SDavid du Colombier EXTERN vlong INITRND; /* data round above text location */ 1927edc7532SDavid du Colombier EXTERN vlong INITTEXT; /* text location */ 193*f8bc6aafSDavid du Colombier EXTERN vlong INITTEXTP; /* text location (physical) */ 1947edc7532SDavid du Colombier EXTERN char* INITENTRY; /* entry point */ 1957edc7532SDavid du Colombier EXTERN int M64; 1967edc7532SDavid du Colombier EXTERN long autosize; 1977edc7532SDavid du Colombier EXTERN Biobuf bso; 1987edc7532SDavid du Colombier EXTERN long bsssize; 1997edc7532SDavid du Colombier EXTERN int cbc; 2007edc7532SDavid du Colombier EXTERN uchar* cbp; 2017edc7532SDavid du Colombier EXTERN int cout; 2027edc7532SDavid du Colombier EXTERN Auto* curauto; 2037edc7532SDavid du Colombier EXTERN Auto* curhist; 2047edc7532SDavid du Colombier EXTERN Prog* curp; 2057edc7532SDavid du Colombier EXTERN Prog* curtext; 2067edc7532SDavid du Colombier EXTERN Prog* datap; 2077edc7532SDavid du Colombier EXTERN long datsize; 2087edc7532SDavid du Colombier EXTERN char debug[128]; 2097edc7532SDavid du Colombier EXTERN Prog* etextp; 2107edc7532SDavid du Colombier EXTERN Prog* firstp; 211*f8bc6aafSDavid du Colombier EXTERN char fnuxi4[4]; /* for 3l [sic] */ 2127edc7532SDavid du Colombier EXTERN char fnuxi8[8]; 2137edc7532SDavid du Colombier EXTERN char* noname; 2147edc7532SDavid du Colombier EXTERN Sym* hash[NHASH]; 2157edc7532SDavid du Colombier EXTERN Sym* histfrog[MAXHIST]; 2167edc7532SDavid du Colombier EXTERN int histfrogp; 2177edc7532SDavid du Colombier EXTERN int histgen; 2187edc7532SDavid du Colombier EXTERN char* library[50]; 2197edc7532SDavid du Colombier EXTERN char* libraryobj[50]; 2207edc7532SDavid du Colombier EXTERN int libraryp; 221*f8bc6aafSDavid du Colombier EXTERN int xrefresolv; 2227edc7532SDavid du Colombier EXTERN char* hunk; 2237edc7532SDavid du Colombier EXTERN char inuxi1[1]; 2247edc7532SDavid du Colombier EXTERN char inuxi2[2]; 2257edc7532SDavid du Colombier EXTERN char inuxi4[4]; 226*f8bc6aafSDavid du Colombier EXTERN char inuxi8[8]; 2277edc7532SDavid du Colombier EXTERN Prog* lastp; 2287edc7532SDavid du Colombier EXTERN long lcsize; 2297edc7532SDavid du Colombier EXTERN char literal[32]; 2307edc7532SDavid du Colombier EXTERN int nerrors; 2317edc7532SDavid du Colombier EXTERN long nhunk; 2327edc7532SDavid du Colombier EXTERN vlong instoffset; 2337edc7532SDavid du Colombier EXTERN Opcross opcross[10]; 2347edc7532SDavid du Colombier EXTERN Oprang oprange[ALAST]; 2357edc7532SDavid du Colombier EXTERN char* outfile; 2367edc7532SDavid du Colombier EXTERN vlong pc; 2377edc7532SDavid du Colombier EXTERN uchar repop[ALAST]; 2387edc7532SDavid du Colombier EXTERN long symsize; 2397edc7532SDavid du Colombier EXTERN Prog* textp; 240*f8bc6aafSDavid du Colombier EXTERN vlong textsize; 2417edc7532SDavid du Colombier EXTERN long thunk; 2427edc7532SDavid du Colombier EXTERN int version; 2437edc7532SDavid du Colombier EXTERN char xcmp[32][32]; 2447edc7532SDavid du Colombier EXTERN Prog zprg; 2457edc7532SDavid du Colombier EXTERN int dtype; 246*f8bc6aafSDavid du Colombier EXTERN int little; 2477edc7532SDavid du Colombier 2487edc7532SDavid du Colombier EXTERN struct 2497edc7532SDavid du Colombier { 2507edc7532SDavid du Colombier Count branch; 2517edc7532SDavid du Colombier Count fcmp; 2527edc7532SDavid du Colombier Count load; 2537edc7532SDavid du Colombier Count mfrom; 2547edc7532SDavid du Colombier Count page; 2557edc7532SDavid du Colombier Count jump; 256*f8bc6aafSDavid du Colombier Count store; 2577edc7532SDavid du Colombier } nop; 2587edc7532SDavid du Colombier 2597edc7532SDavid du Colombier extern char* anames[]; 2607edc7532SDavid du Colombier extern Optab optab[]; 2617edc7532SDavid du Colombier 262*f8bc6aafSDavid du Colombier #pragma varargck type "A" int 263*f8bc6aafSDavid du Colombier #pragma varargck type "D" Adr* 264*f8bc6aafSDavid du Colombier #pragma varargck type "N" Adr* 265*f8bc6aafSDavid du Colombier #pragma varargck type "P" Prog* 266*f8bc6aafSDavid du Colombier #pragma varargck type "S" char* 267*f8bc6aafSDavid du Colombier 268*f8bc6aafSDavid du Colombier #pragma varargck argpos diag 1 269*f8bc6aafSDavid du Colombier 2707edc7532SDavid du Colombier int Aconv(Fmt*); 2717edc7532SDavid du Colombier int Dconv(Fmt*); 2727edc7532SDavid du Colombier int Nconv(Fmt*); 2737edc7532SDavid du Colombier int Pconv(Fmt*); 2747edc7532SDavid du Colombier int Sconv(Fmt*); 2757edc7532SDavid du Colombier int aclass(Adr*); 2767edc7532SDavid du Colombier void addhist(long, int); 277*f8bc6aafSDavid du Colombier void addlibpath(char*); 2787edc7532SDavid du Colombier void addnop(Prog*); 2797edc7532SDavid du Colombier void append(Prog*, Prog*); 2807edc7532SDavid du Colombier void asmb(void); 2817edc7532SDavid du Colombier void asmlc(void); 2827edc7532SDavid du Colombier int asmout(Prog*, Optab*, int); 2837edc7532SDavid du Colombier void asmsym(void); 284*f8bc6aafSDavid du Colombier vlong atolwhex(char*); 2857edc7532SDavid du Colombier vlong atovlwhex(char*); 2867edc7532SDavid du Colombier Prog* brloop(Prog*); 2877edc7532SDavid du Colombier void buildop(void); 2887edc7532SDavid du Colombier void buildrep(int, int); 2897edc7532SDavid du Colombier void cflush(void); 2907edc7532SDavid du Colombier int cmp(int, int); 291*f8bc6aafSDavid du Colombier void cput(long); 2927edc7532SDavid du Colombier int compound(Prog*); 2937edc7532SDavid du Colombier double cputime(void); 294*f8bc6aafSDavid du Colombier void datblk(long, long, int); 2957edc7532SDavid du Colombier void diag(char*, ...); 2967edc7532SDavid du Colombier void dodata(void); 2977edc7532SDavid du Colombier void doprof1(void); 2987edc7532SDavid du Colombier void doprof2(void); 299*f8bc6aafSDavid du Colombier vlong entryvalue(void); 3007edc7532SDavid du Colombier void errorexit(void); 3017edc7532SDavid du Colombier void exchange(Prog*); 302*f8bc6aafSDavid du Colombier int fileexists(char*); 3037edc7532SDavid du Colombier int find1(long, int); 304*f8bc6aafSDavid du Colombier char* findlib(char*); 3057edc7532SDavid du Colombier void follow(void); 3067edc7532SDavid du Colombier void gethunk(void); 3077edc7532SDavid du Colombier void histtoauto(void); 3087edc7532SDavid du Colombier vlong ieeedtov(Ieee*); 3097edc7532SDavid du Colombier double ieeedtod(Ieee*); 3107edc7532SDavid du Colombier long ieeedtof(Ieee*); 311*f8bc6aafSDavid du Colombier int isint32(vlong); 312*f8bc6aafSDavid du Colombier int isuint32(uvlong); 3137edc7532SDavid du Colombier int isnop(Prog*); 3147edc7532SDavid du Colombier void ldobj(int, long, char*); 315*f8bc6aafSDavid du Colombier void loadlib(void); 3167edc7532SDavid du Colombier void listinit(void); 3177edc7532SDavid du Colombier Sym* lookup(char*, int); 318*f8bc6aafSDavid du Colombier void llput(vlong); 319*f8bc6aafSDavid du Colombier void llputl(vlong); 3207edc7532SDavid du Colombier void lput(long); 321*f8bc6aafSDavid du Colombier void lputl(long); 322*f8bc6aafSDavid du Colombier void bput(long); 3237edc7532SDavid du Colombier void mkfwd(void); 3247edc7532SDavid du Colombier void* mysbrk(ulong); 3257edc7532SDavid du Colombier void names(void); 3267edc7532SDavid du Colombier void nocache(Prog*); 3277edc7532SDavid du Colombier void noops(void); 328*f8bc6aafSDavid du Colombier void nopstat(char*, Count*); 3297edc7532SDavid du Colombier void nuxiinit(void); 3307edc7532SDavid du Colombier void objfile(char*); 3317edc7532SDavid du Colombier int ocmp(const void*, const void*); 3327edc7532SDavid du Colombier long opirr(int); 3337edc7532SDavid du Colombier Optab* oplook(Prog*); 3347edc7532SDavid du Colombier long oprrr(int); 3357edc7532SDavid du Colombier void patch(void); 3367edc7532SDavid du Colombier void prasm(Prog*); 3377edc7532SDavid du Colombier void prepend(Prog*, Prog*); 3387edc7532SDavid du Colombier Prog* prg(void); 3397edc7532SDavid du Colombier int pseudo(Prog*); 340*f8bc6aafSDavid du Colombier void putsymb(char*, int, vlong, int); 3417edc7532SDavid du Colombier long regoff(Adr*); 3427edc7532SDavid du Colombier int relinv(int); 343*f8bc6aafSDavid du Colombier vlong rnd(vlong, long); 3447edc7532SDavid du Colombier void sched(Prog*, Prog*); 3457edc7532SDavid du Colombier void span(void); 3467edc7532SDavid du Colombier void strnput(char*, int); 3477edc7532SDavid du Colombier void undef(void); 348*f8bc6aafSDavid du Colombier void wput(long); 349*f8bc6aafSDavid du Colombier void wputl(long); 350*f8bc6aafSDavid du Colombier void xdefine(char*, int, vlong); 3517edc7532SDavid du Colombier void xfol(Prog*); 3527edc7532SDavid du Colombier void xfol(Prog*); 353