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 67 #define regused u0.u0regused 68 #define forwd u0.u0forwd 69 70 struct Sym 71 { 72 char *name; 73 short type; 74 short version; 75 short become; 76 short frame; 77 long value; 78 Sym* link; 79 }; 80 struct Autom 81 { 82 Sym* asym; 83 Auto* link; 84 long aoffset; 85 short type; 86 }; 87 struct Optab 88 { 89 char as; 90 char a1; 91 char a2; 92 char a3; 93 char type; 94 char size; 95 char param; 96 }; 97 struct Oprang 98 { 99 Optab* start; 100 Optab* stop; 101 }; 102 struct Count 103 { 104 long count; 105 long outof; 106 }; 107 108 enum 109 { 110 STEXT = 1, 111 SDATA, 112 SBSS, 113 SDATA1, 114 SXREF, 115 SLEAF, 116 SFILE, 117 SCONST, 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 char 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]; 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 240 EXTERN struct 241 { 242 Count branch; 243 Count fcmp; 244 Count load; 245 Count mfrom; 246 Count page; 247 Count jump; 248 } nop; 249 250 extern char* anames[]; 251 extern Optab optab[]; 252 253 #pragma varargck type "A" int 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 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 addnop(Prog*); 268 void append(Prog*, Prog*); 269 void asmb(void); 270 void asmlc(void); 271 int asmout(Prog*, Optab*, int); 272 void asmsym(void); 273 long atolwhex(char*); 274 Prog* brloop(Prog*); 275 void buildop(void); 276 void buildrep(int, int); 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 void histtoauto(void); 293 vlong ieeedtov(Ieee*); 294 double ieeedtod(Ieee*); 295 long ieeedtof(Ieee*); 296 int isnop(Prog*); 297 void ldobj(int, long, char*); 298 void loadlib(void); 299 void listinit(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(void*, void*); 310 long opirr(int); 311 Optab* oplook(Prog*); 312 long oprrr(int); 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 long regoff(Adr*); 320 int relinv(int); 321 long rnd(long, long); 322 void sched(Prog*, Prog*); 323 void span(void); 324 void strnput(char*, int); 325 void undef(void); 326 void xdefine(char*, int, long); 327 void xfol(Prog*); 328 void xfol(Prog*); 329 void nopstat(char*, Count*); 330