1 #include <u.h> 2 #include <libc.h> 3 #include <bio.h> 4 #include "../vc/v.out.h" 5 6 typedef struct Adr Adr; 7 typedef struct Sym Sym; 8 typedef struct Autom Auto; 9 typedef struct Prog Prog; 10 typedef struct Optab Optab; 11 typedef struct Oprang Oprang; 12 typedef uchar Opcross[32][2][32]; 13 typedef struct Count Count; 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 offset; 24 char* sval; 25 Ieee* ieee; 26 }; 27 union 28 { 29 Auto* autom; 30 Sym* sym; 31 }; 32 char type; 33 char reg; 34 char name; 35 char class; 36 }; 37 struct Prog 38 { 39 Adr from; 40 Adr to; 41 union 42 { 43 long regused; 44 Prog* forwd; 45 }; 46 Prog* cond; 47 Prog* link; 48 long pc; 49 long line; 50 uchar mark; 51 uchar optab; 52 char as; 53 char reg; 54 }; 55 struct Sym 56 { 57 char *name; 58 short type; 59 short version; 60 short become; 61 short frame; 62 long value; 63 Sym* link; 64 }; 65 struct Autom 66 { 67 Sym* sym; 68 Auto* link; 69 long offset; 70 short type; 71 }; 72 struct Optab 73 { 74 char as; 75 char a1; 76 char a2; 77 char a3; 78 char type; 79 char size; 80 char param; 81 }; 82 struct Oprang 83 { 84 Optab* start; 85 Optab* stop; 86 }; 87 struct Count 88 { 89 long count; 90 long outof; 91 }; 92 93 enum 94 { 95 STEXT = 1, 96 SDATA, 97 SBSS, 98 SDATA1, 99 SXREF, 100 SLEAF, 101 SFILE, 102 SCONST, 103 104 C_NONE = 0, 105 C_REG, 106 C_FREG, 107 C_FCREG, 108 C_MREG, 109 C_HI, 110 C_LO, 111 C_ZCON, 112 C_SCON, 113 C_ADD0CON, 114 C_AND0CON, 115 C_ADDCON, 116 C_ANDCON, 117 C_UCON, 118 C_LCON, 119 C_SACON, 120 C_SECON, 121 C_LACON, 122 C_LECON, 123 C_SBRA, 124 C_LBRA, 125 C_SAUTO, 126 C_SEXT, 127 C_LAUTO, 128 C_LEXT, 129 C_ZOREG, 130 C_SOREG, 131 C_LOREG, 132 C_GOK, 133 134 NSCHED = 20, 135 136 /* mark flags */ 137 FOLL = 1<<0, 138 LABEL = 1<<1, 139 LEAF = 1<<2, 140 SYNC = 1<<3, 141 BRANCH = 1<<4, 142 LOAD = 1<<5, 143 FCMP = 1<<6, 144 NOSCHED = 1<<7, 145 146 BIG = 32766, 147 STRINGSZ = 200, 148 NHASH = 10007, 149 NHUNK = 100000, 150 MINSIZ = 64, 151 NENT = 100, 152 MAXIO = 8192, 153 MAXHIST = 20, /* limit of path elements for history symbols */ 154 }; 155 156 union 157 { 158 struct 159 { 160 uchar cbuf[MAXIO]; /* output buffer */ 161 uchar xbuf[MAXIO]; /* input buffer */ 162 }; 163 char dbuf[1]; 164 } buf; 165 166 long HEADR; /* length of header */ 167 int HEADTYPE; /* type of header */ 168 long INITDAT; /* data location */ 169 long INITRND; /* data round above text location */ 170 long INITTEXT; /* text location */ 171 char* INITENTRY; /* entry point */ 172 long autosize; 173 Biobuf bso; 174 long bsssize; 175 int cbc; 176 uchar* cbp; 177 int cout; 178 Auto* curauto; 179 Auto* curhist; 180 Prog* curp; 181 Prog* curtext; 182 Prog* datap; 183 long datsize; 184 char debug[128]; 185 Prog* etextp; 186 Prog* firstp; 187 char fnuxi8[8]; 188 char* noname; 189 Sym* hash[NHASH]; 190 Sym* histfrog[MAXHIST]; 191 int histfrogp; 192 int histgen; 193 char* library[50]; 194 int libraryp; 195 char* hunk; 196 char inuxi1[1]; 197 char inuxi2[2]; 198 char inuxi4[4]; 199 Prog* lastp; 200 long lcsize; 201 char literal[32]; 202 int nerrors; 203 long nhunk; 204 long offset; 205 Opcross opcross[8]; 206 Oprang oprange[ALAST]; 207 char* outfile; 208 long pc; 209 uchar repop[ALAST]; 210 long symsize; 211 Prog* textp; 212 long textsize; 213 long thunk; 214 int version; 215 char xcmp[32][32]; 216 Prog zprg; 217 int dtype; 218 219 struct 220 { 221 Count branch; 222 Count fcmp; 223 Count load; 224 Count mfrom; 225 Count page; 226 Count jump; 227 } nop; 228 229 extern char* anames[]; 230 extern Optab optab[]; 231 232 int Aconv(void*, Fconv*); 233 int Dconv(void*, Fconv*); 234 int Nconv(void*, Fconv*); 235 int Pconv(void*, Fconv*); 236 int Sconv(void*, Fconv*); 237 int aclass(Adr*); 238 void addhist(long, int); 239 void addnop(Prog*); 240 void append(Prog*, Prog*); 241 void asmb(void); 242 void asmlc(void); 243 int asmout(Prog*, Optab*, int); 244 void asmsym(void); 245 long atolwhex(char*); 246 Prog* brloop(Prog*); 247 Biobuf bso; 248 void buildop(void); 249 void buildrep(int, int); 250 void cflush(void); 251 int cmp(int, int); 252 int compound(Prog*); 253 double cputime(void); 254 void datblk(long, long); 255 void diag(char*, ...); 256 void dodata(void); 257 void doprof1(void); 258 void doprof2(void); 259 long entryvalue(void); 260 void errorexit(void); 261 void exchange(Prog*); 262 int find1(long, int); 263 void follow(void); 264 void gethunk(void); 265 void histtoauto(void); 266 double ieeedtod(Ieee*); 267 long ieeedtof(Ieee*); 268 int isnop(Prog*); 269 void ldobj(int, long, char*); 270 void loadlib(int, int); 271 void listinit(void); 272 Sym* lookup(char*, int); 273 void lput(long); 274 void mkfwd(void); 275 void names(void); 276 void nocache(Prog*); 277 void noops(void); 278 void nuxiinit(void); 279 void objfile(char*); 280 int ocmp(void*, void*); 281 long opirr(int); 282 Optab* oplook(Prog*); 283 long oprrr(int); 284 void patch(void); 285 void prasm(Prog*); 286 void prepend(Prog*, Prog*); 287 Prog* prg(void); 288 int pseudo(Prog*); 289 void putsymb(char*, int, long, int); 290 long regoff(Adr*); 291 int relinv(int); 292 long rnd(long, long); 293 void sched(Prog*, Prog*); 294 void span(void); 295 void strnput(char*, int); 296 void undef(void); 297 void xdefine(char*, int, long); 298 void xfol(Prog*); 299 void xfol(Prog*); 300 void nopstat(char*, Count*); 301