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