1 #include <u.h> 2 #include <libc.h> 3 #include <bio.h> 4 #include "../qc/q.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 19 #define P ((Prog*)0) 20 #define S ((Sym*)0) 21 #define TNAME (curtext&&curtext->from.sym?curtext->from.sym->name:noname) 22 23 struct Adr 24 { 25 union 26 { 27 long u0offset; 28 char u0sval[NSNAME]; 29 Ieee u0ieee; 30 }u0; 31 Sym *sym; 32 Auto *autom; 33 char type; 34 uchar reg; 35 char name; 36 char class; 37 }; 38 39 #define offset u0.u0offset 40 #define sval u0.u0sval 41 #define ieee u0.u0ieee 42 43 struct Prog 44 { 45 Adr from; 46 Adr from3; /* fma and rlwm */ 47 Adr to; 48 Prog *forwd; 49 Prog *cond; 50 Prog *link; 51 long pc; 52 long regused; 53 short line; 54 short mark; 55 short optab; /* could be uchar */ 56 ushort as; 57 char reg; 58 }; 59 struct Sym 60 { 61 char *name; 62 short type; 63 short version; 64 short become; 65 short frame; 66 uchar subtype; 67 ushort file; 68 long value; 69 long sig; 70 Sym *link; 71 }; 72 struct Autom 73 { 74 Sym *sym; 75 Auto *link; 76 long aoffset; 77 short type; 78 }; 79 struct Optab 80 { 81 ushort as; 82 char a1; 83 char a2; 84 char a3; 85 char a4; 86 char type; 87 char size; 88 char param; 89 }; 90 struct 91 { 92 Optab* start; 93 Optab* stop; 94 } oprange[ALAST]; 95 96 enum 97 { 98 FPCHIP = 1, 99 BIG = 32768-8, 100 STRINGSZ = 200, 101 MAXIO = 8192, 102 MAXHIST = 20, /* limit of path elements for history symbols */ 103 DATBLK = 1024, 104 NHASH = 10007, 105 NHUNK = 100000, 106 MINSIZ = 64, 107 NENT = 100, 108 NSCHED = 20, 109 110 /* mark flags */ 111 LABEL = 1<<0, 112 LEAF = 1<<1, 113 FLOAT = 1<<2, 114 BRANCH = 1<<3, 115 LOAD = 1<<4, 116 FCMP = 1<<5, 117 SYNC = 1<<6, 118 LIST = 1<<7, 119 FOLL = 1<<8, 120 NOSCHED = 1<<9, 121 122 STEXT = 1, 123 SDATA, 124 SBSS, 125 SDATA1, 126 SXREF, 127 SLEAF, 128 SFILE, 129 SCONST, 130 SUNDEF, 131 132 SIMPORT, 133 SEXPORT, 134 135 C_NONE = 0, 136 C_REG, 137 C_FREG, 138 C_CREG, 139 C_SPR, /* special processor register */ 140 C_SREG, /* segment register (32 bit implementations only) */ 141 C_ZCON, 142 C_SCON, /* 16 bit signed */ 143 C_UCON, /* low 16 bits 0 */ 144 C_ADDCON, /* -0x8000 <= v < 0 */ 145 C_ANDCON, /* 0 < v <= 0xFFFF */ 146 C_LCON, /* other */ 147 C_SACON, 148 C_SECON, 149 C_LACON, 150 C_LECON, 151 C_SBRA, 152 C_LBRA, 153 C_SAUTO, 154 C_LAUTO, 155 C_SEXT, 156 C_LEXT, 157 C_ZOREG, 158 C_SOREG, 159 C_LOREG, 160 C_FPSCR, 161 C_MSR, 162 C_XER, 163 C_LR, 164 C_CTR, 165 C_ANY, 166 C_GOK, 167 C_ADDR, 168 169 C_NCLASS, 170 171 Roffset = 22, /* no. bits for offset in relocation address */ 172 Rindex = 10 /* no. bits for index in relocation address */ 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 long INITDAT; /* data location */ 191 EXTERN long INITRND; /* data round above text location */ 192 EXTERN long INITTEXT; /* text location */ 193 EXTERN long INITTEXTP; /* text location (physical) */ 194 EXTERN char* INITENTRY; /* entry point */ 195 EXTERN long autosize; 196 EXTERN Biobuf bso; 197 EXTERN long bsssize; 198 EXTERN int cbc; 199 EXTERN uchar* cbp; 200 EXTERN int cout; 201 EXTERN Auto* curauto; 202 EXTERN Auto* curhist; 203 EXTERN Prog* curp; 204 EXTERN Prog* curtext; 205 EXTERN Prog* datap; 206 EXTERN Prog* prog_movsw; 207 EXTERN Prog* prog_movdw; 208 EXTERN Prog* prog_movws; 209 EXTERN Prog* prog_movwd; 210 EXTERN long datsize; 211 EXTERN char debug[128]; 212 EXTERN Prog* firstp; 213 EXTERN char fnuxi8[8]; 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 Prog* lastp; 227 EXTERN long lcsize; 228 EXTERN char literal[32]; 229 EXTERN int nerrors; 230 EXTERN long nhunk; 231 EXTERN char* noname; 232 EXTERN long instoffset; 233 EXTERN char* outfile; 234 EXTERN long pc; 235 EXTERN int r0iszero; 236 EXTERN long symsize; 237 EXTERN long staticgen; 238 EXTERN Prog* textp; 239 EXTERN long textsize; 240 EXTERN long tothunk; 241 EXTERN char xcmp[C_NCLASS][C_NCLASS]; 242 EXTERN int version; 243 EXTERN Prog zprg; 244 EXTERN int dtype; 245 246 EXTERN int doexp, dlm; 247 EXTERN int imports, nimports; 248 EXTERN int exports, nexports; 249 EXTERN char* EXPTAB; 250 EXTERN Prog undefp; 251 252 #define UP (&undefp) 253 254 extern Optab optab[]; 255 extern char* anames[]; 256 extern char* cnames[]; 257 258 int Aconv(Fmt*); 259 int Dconv(Fmt*); 260 int Nconv(Fmt*); 261 int Pconv(Fmt*); 262 int Sconv(Fmt*); 263 int Rconv(Fmt*); 264 int aclass(Adr*); 265 void addhist(long, int); 266 void histtoauto(void); 267 void addlibpath(char*); 268 void addnop(Prog*); 269 void append(Prog*, Prog*); 270 void asmb(void); 271 void asmdyn(void); 272 void asmlc(void); 273 int asmout(Prog*, Optab*, int); 274 void asmsym(void); 275 long atolwhex(char*); 276 Prog* brloop(Prog*); 277 void buildop(void); 278 void cflush(void); 279 void ckoff(Sym*, long); 280 int cmp(int, int); 281 void cput(long); 282 int compound(Prog*); 283 double cputime(void); 284 void datblk(long, long); 285 void diag(char*, ...); 286 void dodata(void); 287 void doprof1(void); 288 void doprof2(void); 289 void dynreloc(Sym*, long, int, int, int); 290 long entryvalue(void); 291 void errorexit(void); 292 void exchange(Prog*); 293 void export(void); 294 int fileexists(char*); 295 int find1(long, int); 296 char* findlib(char*); 297 void follow(void); 298 void gethunk(void); 299 double ieeedtod(Ieee*); 300 long ieeedtof(Ieee*); 301 void import(void); 302 int isnop(Prog*); 303 void ldobj(int, long, char*); 304 void loadlib(void); 305 void listinit(void); 306 void initmuldiv(void); 307 Sym* lookup(char*, int); 308 void llput(vlong); 309 void llputl(vlong); 310 void lput(long); 311 void lputl(long); 312 void mkfwd(void); 313 void* mysbrk(ulong); 314 void names(void); 315 void nocache(Prog*); 316 void noops(void); 317 void nopout(Prog*); 318 void nuxiinit(void); 319 void objfile(char*); 320 int ocmp(void*, void*); 321 long opcode(int); 322 Optab* oplook(Prog*); 323 void patch(void); 324 void prasm(Prog*); 325 void prepend(Prog*, Prog*); 326 Prog* prg(void); 327 int pseudo(Prog*); 328 void putsymb(char*, int, long, int); 329 void readundefs(char*, int); 330 long regoff(Adr*); 331 int relinv(int); 332 long rnd(long, long); 333 void sched(Prog*, Prog*); 334 void span(void); 335 void strnput(char*, int); 336 void undef(void); 337 void undefsym(Sym*); 338 void wput(long); 339 void wputl(long); 340 void xdefine(char*, int, long); 341 void xfol(Prog*); 342 void zerosig(char*); 343 344 #pragma varargck type "A" int 345 #pragma varargck type "A" uint 346 #pragma varargck type "D" Adr* 347 #pragma varargck type "N" Adr* 348 #pragma varargck type "P" Prog* 349 #pragma varargck type "R" int 350 #pragma varargck type "S" char* 351 352 #pragma varargck argpos diag 1 353