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