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 #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 union 31 { 32 Auto* u1autom; 33 Sym* u1sym; 34 } u1; 35 char type; 36 char reg; 37 char name; 38 char class; 39 }; 40 41 #define offset u0.u0offset 42 #define sval u0.u0sval 43 #define ieee u0.u0ieee 44 45 #define autom u1.u1autom 46 #define sym u1.u1sym 47 48 struct Prog 49 { 50 Adr from; 51 Adr to; 52 Prog *forwd; 53 Prog *cond; 54 Prog *link; 55 long pc; 56 long regused; 57 short line; 58 short mark; 59 uchar optab; 60 uchar as; 61 char reg; 62 }; 63 struct Sym 64 { 65 char *name; 66 short type; 67 short version; 68 short become; 69 short frame; 70 long value; 71 Sym *link; 72 }; 73 struct Autom 74 { 75 Sym *asym; 76 Auto *link; 77 long aoffset; 78 short type; 79 }; 80 struct Optab 81 { 82 uchar as; 83 char a1; 84 char a2; 85 char a3; 86 char type; 87 char size; 88 char param; 89 }; 90 EXTERN struct 91 { 92 Optab* start; 93 Optab* stop; 94 } oprange[AEND]; 95 96 enum 97 { 98 AXLD = AEND+1, 99 AXST, 100 FPCHIP = 1, 101 BIG = 4096-8, 102 STRINGSZ = 200, 103 MAXIO = 8192, 104 MAXHIST = 20, /* limit of path elements for history symbols */ 105 DATBLK = 1024, 106 NHASH = 10007, 107 NHUNK = 100000, 108 MINSIZ = 64, 109 NENT = 100, 110 NSCHED = 20, 111 112 /* mark flags */ 113 LABEL = 1<<0, 114 LEAF = 1<<1, 115 FLOAT = 1<<2, 116 BRANCH = 1<<3, 117 LOAD = 1<<4, 118 FCMP = 1<<5, 119 SYNC = 1<<6, 120 LIST = 1<<7, 121 FOLL = 1<<8, 122 NOSCHED = 1<<9, 123 124 STEXT = 1, 125 SDATA, 126 SBSS, 127 SDATA1, 128 SXREF, 129 SLEAF, 130 SFILE, 131 SCONST, 132 133 C_NONE = 0, 134 135 C_REG, 136 C_FREG, 137 C_CREG, 138 C_PREG, 139 C_FSR, 140 C_FQ, 141 142 C_ZCON, /* 0 */ 143 C_SCON, /* 13 bit signed */ 144 C_UCON, /* low 10 bits 0 */ 145 C_LCON, /* other */ 146 147 C_SACON, 148 C_SECON, 149 C_LACON, 150 C_LECON, 151 152 C_SBRA, 153 C_LBRA, 154 155 C_ESAUTO, 156 C_OSAUTO, 157 C_SAUTO, 158 C_OLAUTO, 159 C_ELAUTO, 160 C_LAUTO, 161 162 C_ESEXT, 163 C_OSEXT, 164 C_SEXT, 165 C_ELEXT, 166 C_OLEXT, 167 C_LEXT, 168 169 C_ZOREG, 170 C_SOREG, 171 C_LOREG, 172 C_ASI, 173 174 C_ANY, 175 176 C_GOK, 177 178 C_NCLASS 179 }; 180 181 EXTERN union 182 { 183 struct 184 { 185 uchar obuf[MAXIO]; /* output buffer */ 186 uchar ibuf[MAXIO]; /* input buffer */ 187 } u; 188 char dbuf[1]; 189 } buf; 190 191 #define cbuf u.obuf 192 #define xbuf u.ibuf 193 194 EXTERN long HEADR; /* length of header */ 195 EXTERN int HEADTYPE; /* type of header */ 196 EXTERN long INITDAT; /* data location */ 197 EXTERN long INITRND; /* data round above text location */ 198 EXTERN long INITTEXT; /* text location */ 199 EXTERN char* INITENTRY; /* entry point */ 200 EXTERN long autosize; 201 EXTERN Biobuf bso; 202 EXTERN long bsssize; 203 EXTERN int cbc; 204 EXTERN uchar* cbp; 205 EXTERN int cout; 206 EXTERN Auto* curauto; 207 EXTERN Auto* curhist; 208 EXTERN Prog* curp; 209 EXTERN Prog* curtext; 210 EXTERN Prog* datap; 211 EXTERN Prog* prog_mul; 212 EXTERN Prog* prog_div; 213 EXTERN Prog* prog_divl; 214 EXTERN Prog* prog_mod; 215 EXTERN Prog* prog_modl; 216 EXTERN long datsize; 217 EXTERN char debug[128]; 218 EXTERN Prog* firstp; 219 EXTERN char fnuxi8[8]; 220 EXTERN Sym* hash[NHASH]; 221 EXTERN Sym* histfrog[MAXHIST]; 222 EXTERN int histfrogp; 223 EXTERN int histgen; 224 EXTERN char* library[50]; 225 EXTERN char* libraryobj[50]; 226 EXTERN int libraryp; 227 EXTERN int xrefresolv; 228 EXTERN char* hunk; 229 EXTERN char inuxi1[1]; 230 EXTERN char inuxi2[2]; 231 EXTERN char inuxi4[4]; 232 EXTERN Prog* lastp; 233 EXTERN long lcsize; 234 EXTERN char literal[32]; 235 EXTERN int nerrors; 236 EXTERN long nhunk; 237 EXTERN char* noname; 238 EXTERN long instoffset; 239 EXTERN char* outfile; 240 EXTERN long pc; 241 EXTERN long symsize; 242 EXTERN long staticgen; 243 EXTERN Prog* textp; 244 EXTERN long textsize; 245 EXTERN long tothunk; 246 EXTERN char xcmp[C_NCLASS][C_NCLASS]; 247 EXTERN int version; 248 EXTERN Prog zprg; 249 EXTERN int dtype; 250 251 extern Optab optab[]; 252 extern char* anames[]; 253 254 #pragma varargck type "A" int 255 #pragma varargck type "A" uint 256 #pragma varargck type "D" Adr* 257 #pragma varargck type "N" Adr* 258 #pragma varargck type "P" Prog* 259 #pragma varargck type "S" char* 260 261 #pragma varargck argpos diag 1 262 263 int Aconv(Fmt*); 264 int Dconv(Fmt*); 265 int Nconv(Fmt*); 266 int Pconv(Fmt*); 267 int Sconv(Fmt*); 268 int aclass(Adr*); 269 void addhist(long, int); 270 void histtoauto(void); 271 void addlibpath(char*); 272 void addnop(Prog*); 273 void append(Prog*, Prog*); 274 void asmb(void); 275 void asmlc(void); 276 int asmout(Prog*, Optab*, int); 277 void asmsym(void); 278 long atolwhex(char*); 279 Prog* brloop(Prog*); 280 void buildop(void); 281 void cflush(void); 282 int cmp(int, int); 283 int compound(Prog*); 284 double cputime(void); 285 void datblk(long, long); 286 void diag(char*, ...); 287 void dodata(void); 288 void doprof1(void); 289 void doprof2(void); 290 long entryvalue(void); 291 void errorexit(void); 292 void exchange(Prog*); 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 int isnop(Prog*); 301 void ldobj(int, long, char*); 302 void loadlib(void); 303 void listinit(void); 304 void initmuldiv(void); 305 Sym* lookup(char*, int); 306 void lput(long); 307 void mkfwd(void); 308 void* mysbrk(ulong); 309 void names(void); 310 void nocache(Prog*); 311 void noops(void); 312 void nuxiinit(void); 313 void objfile(char*); 314 int ocmp(const void*, const void*); 315 long opcode(int); 316 Optab* oplook(Prog*); 317 void patch(void); 318 void prasm(Prog*); 319 void prepend(Prog*, Prog*); 320 Prog* prg(void); 321 int pseudo(Prog*); 322 void putsymb(char*, int, long, int); 323 long regoff(Adr*); 324 int relinv(int); 325 long rnd(long, long); 326 void sched(Prog*, Prog*); 327 void span(void); 328 void undef(void); 329 void xdefine(char*, int, long); 330 void xfol(Prog*); 331