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