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