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