1 #include <lib9.h> 2 #include <bio.h> 3 #include "../vc/v.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 typedef struct Oprang Oprang; 15 typedef uchar Opcross[32][2][32]; 16 typedef struct Count Count; 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; 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 union 53 { 54 long u0regused; 55 Prog* u0forwd; 56 } u0; 57 Prog* cond; 58 Prog* link; 59 long pc; 60 long line; 61 uchar mark; 62 uchar optab; 63 char as; 64 char reg; 65 }; 66 #define regused u0.u0regused 67 #define forwd u0.u0forwd 68 69 struct Sym 70 { 71 char *name; 72 short type; 73 short version; 74 short become; 75 short frame; 76 long value; 77 Sym* link; 78 }; 79 struct Autom 80 { 81 Sym* asym; 82 Auto* link; 83 long aoffset; 84 short type; 85 }; 86 struct Optab 87 { 88 char as; 89 char a1; 90 char a2; 91 char a3; 92 char type; 93 char size; 94 char param; 95 }; 96 struct Oprang 97 { 98 Optab* start; 99 Optab* stop; 100 }; 101 struct Count 102 { 103 long count; 104 long outof; 105 }; 106 107 enum 108 { 109 STEXT = 1, 110 SDATA, 111 SBSS, 112 SDATA1, 113 SXREF, 114 SLEAF, 115 SFILE, 116 SCONST, 117 SSTRING, 118 119 C_NONE = 0, 120 C_REG, 121 C_FREG, 122 C_FCREG, 123 C_MREG, 124 C_HI, 125 C_LO, 126 C_ZCON, 127 C_SCON, 128 C_ADD0CON, 129 C_AND0CON, 130 C_ADDCON, 131 C_ANDCON, 132 C_UCON, 133 C_LCON, 134 C_SACON, 135 C_SECON, 136 C_LACON, 137 C_LECON, 138 C_SBRA, 139 C_LBRA, 140 C_SAUTO, 141 C_SEXT, 142 C_LAUTO, 143 C_LEXT, 144 C_ZOREG, 145 C_SOREG, 146 C_LOREG, 147 C_GOK, 148 149 NSCHED = 20, 150 151 /* mark flags */ 152 FOLL = 1<<0, 153 LABEL = 1<<1, 154 LEAF = 1<<2, 155 SYNC = 1<<3, 156 BRANCH = 1<<4, 157 LOAD = 1<<5, 158 FCMP = 1<<6, 159 NOSCHED = 1<<7, 160 161 BIG = 32766, 162 STRINGSZ = 200, 163 NHASH = 10007, 164 NHUNK = 100000, 165 MINSIZ = 64, 166 NENT = 100, 167 MAXIO = 8192, 168 MAXHIST = 20, /* limit of path elements for history symbols */ 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 long datsize; 202 EXTERN char debug[128]; 203 EXTERN Prog* etextp; 204 EXTERN Prog* firstp; 205 EXTERN char fnuxi4[4]; /* for 3l [sic] */ 206 EXTERN char fnuxi8[8]; 207 EXTERN char* noname; 208 EXTERN Sym* hash[NHASH]; 209 EXTERN Sym* histfrog[MAXHIST]; 210 EXTERN int histfrogp; 211 EXTERN int histgen; 212 EXTERN char* library[50]; 213 EXTERN char* libraryobj[50]; 214 EXTERN int libraryp; 215 EXTERN int xrefresolv; 216 EXTERN char* hunk; 217 EXTERN char inuxi1[1]; 218 EXTERN char inuxi2[2]; 219 EXTERN char inuxi4[4]; 220 EXTERN Prog* lastp; 221 EXTERN long lcsize; 222 EXTERN char literal[32]; 223 EXTERN int nerrors; 224 EXTERN long nhunk; 225 EXTERN long instoffset; 226 EXTERN Opcross opcross[10]; 227 EXTERN Oprang oprange[ALAST]; 228 EXTERN char* outfile; 229 EXTERN long pc; 230 EXTERN uchar repop[ALAST]; 231 EXTERN long symsize; 232 EXTERN Prog* textp; 233 EXTERN long textsize; 234 EXTERN long thunk; 235 EXTERN int version; 236 EXTERN char xcmp[32][32]; 237 EXTERN Prog zprg; 238 EXTERN int dtype; 239 EXTERN int little; 240 241 EXTERN struct 242 { 243 Count branch; 244 Count fcmp; 245 Count load; 246 Count mfrom; 247 Count page; 248 Count jump; 249 } nop; 250 251 extern char* anames[]; 252 extern Optab optab[]; 253 254 #pragma varargck type "A" int 255 #pragma varargck type "D" Adr* 256 #pragma varargck type "N" Adr* 257 #pragma varargck type "P" Prog* 258 #pragma varargck type "S" char* 259 260 #pragma varargck argpos diag 1 261 262 int Aconv(Fmt*); 263 int Dconv(Fmt*); 264 int Nconv(Fmt*); 265 int Pconv(Fmt*); 266 int Sconv(Fmt*); 267 int aclass(Adr*); 268 void addhist(long, int); 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 buildrep(int, int); 279 void cflush(void); 280 int cmp(int, int); 281 int compound(Prog*); 282 double cputime(void); 283 void datblk(long, long, int); 284 void diag(char*, ...); 285 void dodata(void); 286 void doprof1(void); 287 void doprof2(void); 288 long entryvalue(void); 289 void errorexit(void); 290 void exchange(Prog*); 291 int find1(long, int); 292 void follow(void); 293 void gethunk(void); 294 void histtoauto(void); 295 double ieeedtod(Ieee*); 296 long ieeedtof(Ieee*); 297 int isnop(Prog*); 298 void ldobj(int, long, char*); 299 void loadlib(void); 300 void listinit(void); 301 Sym* lookup(char*, int); 302 void lput(long); 303 void bput(long); 304 void mkfwd(void); 305 void* mysbrk(ulong); 306 void names(void); 307 void nocache(Prog*); 308 void noops(void); 309 void nuxiinit(void); 310 void objfile(char*); 311 int ocmp(const void*, const void*); 312 long opirr(int); 313 Optab* oplook(Prog*); 314 long oprrr(int); 315 void patch(void); 316 void prasm(Prog*); 317 void prepend(Prog*, Prog*); 318 Prog* prg(void); 319 int pseudo(Prog*); 320 void putsymb(char*, int, long, int); 321 long regoff(Adr*); 322 int relinv(int); 323 long rnd(long, long); 324 void sched(Prog*, Prog*); 325 void span(void); 326 void strnput(char*, int); 327 void undef(void); 328 void xdefine(char*, int, long); 329 void xfol(Prog*); 330 void xfol(Prog*); 331 void nopstat(char*, Count*); 332