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