1 #include <lib9.h> 2 #include <bio.h> 3 #include "../kc/k.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 union 28 { 29 Auto* u1autom; 30 Sym* u1sym; 31 } u1; 32 char type; 33 char 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 #define autom u1.u1autom 43 #define sym u1.u1sym 44 45 struct Prog 46 { 47 Adr from; 48 Adr to; 49 Prog *forwd; 50 Prog *cond; 51 Prog *link; 52 long pc; 53 long regused; 54 short line; 55 short mark; 56 uchar optab; 57 uchar as; 58 char reg; 59 }; 60 struct Sym 61 { 62 char *name; 63 short type; 64 short version; 65 short become; 66 short frame; 67 long value; 68 Sym *link; 69 }; 70 struct Autom 71 { 72 Sym *asym; 73 Auto *link; 74 long aoffset; 75 short type; 76 }; 77 struct Optab 78 { 79 uchar as; 80 char a1; 81 char a2; 82 char a3; 83 char type; 84 char size; 85 char param; 86 }; 87 EXTERN struct 88 { 89 Optab* start; 90 Optab* stop; 91 } oprange[AEND]; 92 93 enum 94 { 95 AXLD = AEND+1, 96 AXST, 97 FPCHIP = 1, 98 BIG = 4096-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 130 C_NONE = 0, 131 132 C_REG, 133 C_FREG, 134 C_CREG, 135 C_PREG, 136 C_FSR, 137 C_FQ, 138 139 C_ZCON, /* 0 */ 140 C_SCON, /* 13 bit signed */ 141 C_UCON, /* low 10 bits 0 */ 142 C_LCON, /* other */ 143 144 C_SACON, 145 C_SECON, 146 C_LACON, 147 C_LECON, 148 149 C_SBRA, 150 C_LBRA, 151 152 C_ESAUTO, 153 C_OSAUTO, 154 C_SAUTO, 155 C_OLAUTO, 156 C_ELAUTO, 157 C_LAUTO, 158 159 C_ESEXT, 160 C_OSEXT, 161 C_SEXT, 162 C_ELEXT, 163 C_OLEXT, 164 C_LEXT, 165 166 C_ZOREG, 167 C_SOREG, 168 C_LOREG, 169 C_ASI, 170 171 C_ANY, 172 173 C_GOK, 174 175 C_NCLASS 176 }; 177 178 EXTERN union 179 { 180 struct 181 { 182 uchar obuf[MAXIO]; /* output buffer */ 183 uchar ibuf[MAXIO]; /* input buffer */ 184 } u; 185 char dbuf[1]; 186 } buf; 187 188 #define cbuf u.obuf 189 #define xbuf u.ibuf 190 191 EXTERN long HEADR; /* length of header */ 192 EXTERN int HEADTYPE; /* type of header */ 193 EXTERN long INITDAT; /* data location */ 194 EXTERN long INITRND; /* data round above text location */ 195 EXTERN long INITTEXT; /* text location */ 196 EXTERN char* INITENTRY; /* entry point */ 197 EXTERN long autosize; 198 EXTERN Biobuf bso; 199 EXTERN long bsssize; 200 EXTERN int cbc; 201 EXTERN uchar* cbp; 202 EXTERN int cout; 203 EXTERN Auto* curauto; 204 EXTERN Auto* curhist; 205 EXTERN Prog* curp; 206 EXTERN Prog* curtext; 207 EXTERN Prog* datap; 208 EXTERN Prog* prog_mul; 209 EXTERN Prog* prog_div; 210 EXTERN Prog* prog_divl; 211 EXTERN Prog* prog_mod; 212 EXTERN Prog* prog_modl; 213 EXTERN long datsize; 214 EXTERN char debug[128]; 215 EXTERN Prog* firstp; 216 EXTERN char fnuxi8[8]; 217 EXTERN Sym* hash[NHASH]; 218 EXTERN Sym* histfrog[MAXHIST]; 219 EXTERN int histfrogp; 220 EXTERN int histgen; 221 EXTERN char* library[50]; 222 EXTERN char* libraryobj[50]; 223 EXTERN int libraryp; 224 EXTERN int xrefresolv; 225 EXTERN char* hunk; 226 EXTERN char inuxi1[1]; 227 EXTERN char inuxi2[2]; 228 EXTERN char inuxi4[4]; 229 EXTERN Prog* lastp; 230 EXTERN long lcsize; 231 EXTERN char literal[32]; 232 EXTERN int nerrors; 233 EXTERN long nhunk; 234 EXTERN char* noname; 235 EXTERN long instoffset; 236 EXTERN char* outfile; 237 EXTERN long pc; 238 EXTERN long symsize; 239 EXTERN long staticgen; 240 EXTERN Prog* textp; 241 EXTERN long textsize; 242 EXTERN long tothunk; 243 EXTERN char xcmp[C_NCLASS][C_NCLASS]; 244 EXTERN int version; 245 EXTERN Prog zprg; 246 EXTERN int dtype; 247 248 extern Optab optab[]; 249 extern char* anames[]; 250 251 #pragma varargck type "A" int 252 #pragma varargck type "A" uint 253 #pragma varargck type "D" Adr* 254 #pragma varargck type "N" Adr* 255 #pragma varargck type "P" Prog* 256 #pragma varargck type "S" char* 257 258 #pragma varargck argpos diag 1 259 260 int Aconv(Fmt*); 261 int Dconv(Fmt*); 262 int Nconv(Fmt*); 263 int Pconv(Fmt*); 264 int Sconv(Fmt*); 265 int aclass(Adr*); 266 void addhist(long, int); 267 void histtoauto(void); 268 void addnop(Prog*); 269 void append(Prog*, Prog*); 270 void asmb(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 int cmp(int, int); 279 int compound(Prog*); 280 double cputime(void); 281 void datblk(long, long); 282 void diag(char*, ...); 283 void dodata(void); 284 void doprof1(void); 285 void doprof2(void); 286 long entryvalue(void); 287 void errorexit(void); 288 void exchange(Prog*); 289 int find1(long, int); 290 void follow(void); 291 void gethunk(void); 292 double ieeedtod(Ieee*); 293 long ieeedtof(Ieee*); 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 nuxiinit(void); 307 void objfile(char*); 308 int ocmp(const void*, const void*); 309 long opcode(int); 310 Optab* oplook(Prog*); 311 void patch(void); 312 void prasm(Prog*); 313 void prepend(Prog*, Prog*); 314 Prog* prg(void); 315 int pseudo(Prog*); 316 void putsymb(char*, int, long, int); 317 long regoff(Adr*); 318 int relinv(int); 319 long rnd(long, long); 320 void sched(Prog*, Prog*); 321 void span(void); 322 void undef(void); 323 void xdefine(char*, int, long); 324 void xfol(Prog*); 325