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