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