1 #include <lib9.h> 2 #include <bio.h> 3 #include "../8c/8.out.h" 4 #include "../ld/elf.h" 5 6 #ifndef EXTERN 7 #define EXTERN extern 8 #endif 9 10 #define P ((Prog*)0) 11 #define S ((Sym*)0) 12 #define TNAME (curtext?curtext->from.sym->name:noname) 13 14 #define cput(c)\ 15 { *cbp++ = c;\ 16 if(--cbc <= 0)\ 17 cflush(); } 18 19 #define LIBNAMELEN 300 20 21 typedef struct Adr Adr; 22 typedef struct Prog Prog; 23 typedef struct Sym Sym; 24 typedef struct Auto Auto; 25 typedef struct Optab Optab; 26 27 struct Adr 28 { 29 union 30 { 31 long u0offset; 32 char u0scon[8]; 33 Prog *u0cond; /* not used, but should be D_BRANCH */ 34 Ieee u0ieee; 35 } u0; 36 union 37 { 38 Auto* u1autom; 39 Sym* u1sym; 40 } u1; 41 short type; 42 uchar index; 43 char scale; 44 }; 45 46 #define offset u0.u0offset 47 #define scon u0.u0scon 48 #define cond u0.u0cond 49 #define ieee u0.u0ieee 50 51 #define autom u1.u1autom 52 #define sym u1.u1sym 53 54 struct Prog 55 { 56 Adr from; 57 Adr to; 58 Prog *forwd; 59 Prog* link; 60 Prog* pcond; /* work on this */ 61 long pc; 62 long line; 63 short as; 64 char width; /* fake for DATA */ 65 char ft; /* oclass cache */ 66 char tt; 67 uchar mark; /* work on these */ 68 uchar back; 69 }; 70 struct Auto 71 { 72 Sym* asym; 73 Auto* link; 74 long aoffset; 75 short type; 76 }; 77 struct Sym 78 { 79 char *name; 80 short type; 81 short version; 82 short become; 83 short frame; 84 uchar subtype; 85 ushort file; 86 long value; 87 long sig; 88 Sym* link; 89 }; 90 struct Optab 91 { 92 short as; 93 uchar* ytab; 94 uchar prefix; 95 uchar op[10]; 96 }; 97 98 enum 99 { 100 STEXT = 1, 101 SDATA, 102 SBSS, 103 SDATA1, 104 SXREF, 105 SFILE, 106 SCONST, 107 SUNDEF, 108 109 SIMPORT, 110 SEXPORT, 111 112 NHASH = 10007, 113 NHUNK = 100000, 114 MINSIZ = 4, 115 STRINGSZ = 200, 116 MINLC = 1, 117 MAXIO = 8192, 118 MAXHIST = 20, /* limit of path elements for history symbols */ 119 120 Yxxx = 0, 121 Ynone, 122 Yi0, 123 Yi1, 124 Yi8, 125 Yi32, 126 Yiauto, 127 Yal, 128 Ycl, 129 Yax, 130 Ycx, 131 Yrb, 132 Yrl, 133 Yrf, 134 Yf0, 135 Yrx, 136 Ymb, 137 Yml, 138 Ym, 139 Ybr, 140 Ycol, 141 142 Ycs, Yss, Yds, Yes, Yfs, Ygs, 143 Ygdtr, Yidtr, Yldtr, Ymsw, Ytask, 144 Ycr0, Ycr1, Ycr2, Ycr3, Ycr4, Ycr5, Ycr6, Ycr7, 145 Ydr0, Ydr1, Ydr2, Ydr3, Ydr4, Ydr5, Ydr6, Ydr7, 146 Ytr0, Ytr1, Ytr2, Ytr3, Ytr4, Ytr5, Ytr6, Ytr7, 147 Ymax, 148 149 Zxxx = 0, 150 151 Zlit, 152 Z_rp, 153 Zbr, 154 Zcall, 155 Zib_, 156 Zib_rp, 157 Zibo_m, 158 Zil_, 159 Zil_rp, 160 Zilo_m, 161 Zjmp, 162 Zloop, 163 Zm_o, 164 Zm_r, 165 Zaut_r, 166 Zo_m, 167 Zpseudo, 168 Zr_m, 169 Zrp_, 170 Z_ib, 171 Z_il, 172 Zm_ibo, 173 Zm_ilo, 174 Zib_rr, 175 Zil_rr, 176 Zclr, 177 Zbyte, 178 Zmov, 179 Zmax, 180 181 Px = 0, 182 Pe = 0x66, /* operand escape */ 183 Pm = 0x0f, /* 2byte opcode escape */ 184 Pq = 0xff, /* both escape */ 185 Pb = 0xfe, /* byte operands */ 186 187 Roffset = 22, /* no. bits for offset in relocation address */ 188 Rindex = 10, /* no. bits for index in relocation address */ 189 }; 190 191 EXTERN union 192 { 193 struct 194 { 195 uchar obuf[MAXIO]; /* output buffer */ 196 uchar ibuf[MAXIO]; /* input buffer */ 197 } u; 198 char dbuf[1]; 199 } buf; 200 201 #define cbuf u.obuf 202 #define xbuf u.ibuf 203 204 #pragma varargck type "A" int 205 #pragma varargck type "A" uint 206 #pragma varargck type "D" Adr* 207 #pragma varargck type "P" Prog* 208 #pragma varargck type "R" int 209 #pragma varargck type "R" uint 210 #pragma varargck type "S" char* 211 212 #pragma varargck argpos diag 1 213 214 EXTERN long HEADR; 215 EXTERN long HEADTYPE; 216 EXTERN long INITDAT; 217 EXTERN long INITRND; 218 EXTERN long INITTEXT; 219 EXTERN long INITTEXTP; 220 EXTERN char* INITENTRY; /* entry point */ 221 EXTERN Biobuf bso; 222 EXTERN long bsssize; 223 EXTERN long casepc; 224 EXTERN int cbc; 225 EXTERN uchar* cbp; 226 EXTERN char* pcstr; 227 EXTERN int cout; 228 EXTERN Auto* curauto; 229 EXTERN Auto* curhist; 230 EXTERN Prog* curp; 231 EXTERN Prog* curtext; 232 EXTERN Prog* datap; 233 EXTERN Prog* edatap; 234 EXTERN long datsize; 235 EXTERN char debug[128]; 236 EXTERN char literal[32]; 237 EXTERN Prog* etextp; 238 EXTERN Prog* firstp; 239 EXTERN char fnuxi8[8]; 240 EXTERN char fnuxi4[4]; 241 EXTERN Sym* hash[NHASH]; 242 EXTERN Sym* histfrog[MAXHIST]; 243 EXTERN int histfrogp; 244 EXTERN int histgen; 245 EXTERN char* library[50]; 246 EXTERN char* libraryobj[50]; 247 EXTERN int libraryp; 248 EXTERN int xrefresolv; 249 EXTERN char* hunk; 250 EXTERN char inuxi1[1]; 251 EXTERN char inuxi2[2]; 252 EXTERN char inuxi4[4]; 253 EXTERN char ycover[Ymax*Ymax]; 254 EXTERN uchar* andptr; 255 EXTERN uchar and[30]; 256 EXTERN char reg[D_NONE]; 257 EXTERN Prog* lastp; 258 EXTERN long lcsize; 259 EXTERN int nerrors; 260 EXTERN long nhunk; 261 EXTERN long nsymbol; 262 EXTERN char* noname; 263 EXTERN char* outfile; 264 EXTERN long pc; 265 EXTERN long spsize; 266 EXTERN Sym* symlist; 267 EXTERN long symsize; 268 EXTERN Prog* textp; 269 EXTERN long textsize; 270 EXTERN long thunk; 271 EXTERN int version; 272 EXTERN Prog zprg; 273 EXTERN int dtype; 274 275 EXTERN Adr* reloca; 276 EXTERN int doexp, dlm; 277 EXTERN int imports, nimports; 278 EXTERN int exports, nexports, allexport; 279 EXTERN char* EXPTAB; 280 EXTERN Prog undefp; 281 282 #define UP (&undefp) 283 284 extern Optab optab[]; 285 extern char* anames[]; 286 287 int Aconv(Fmt*); 288 int Dconv(Fmt*); 289 int Pconv(Fmt*); 290 int Rconv(Fmt*); 291 int Sconv(Fmt*); 292 void addhist(long, int); 293 void addlibpath(char*); 294 Prog* appendp(Prog*); 295 void asmb(void); 296 void asmdyn(void); 297 void asmins(Prog*); 298 void asmlc(void); 299 void asmsp(void); 300 void asmsym(void); 301 long atolwhex(char*); 302 Prog* brchain(Prog*); 303 Prog* brloop(Prog*); 304 void cflush(void); 305 void ckoff(Sym*, long); 306 Prog* copyp(Prog*); 307 double cputime(void); 308 void datblk(long, long); 309 void diag(char*, ...); 310 void dodata(void); 311 void doinit(void); 312 void doprof1(void); 313 void doprof2(void); 314 void dostkoff(void); 315 void dynreloc(Sym*, ulong, int); 316 long entryvalue(void); 317 void errorexit(void); 318 void export(void); 319 int fileexists(char*); 320 int find1(long, int); 321 int find2(long, int); 322 char* findlib(char*); 323 void follow(void); 324 void gethunk(void); 325 void histtoauto(void); 326 double ieeedtod(Ieee*); 327 long ieeedtof(Ieee*); 328 void import(void); 329 void ldobj(int, long, char*); 330 void loadlib(void); 331 void listinit(void); 332 Sym* lookup(char*, int); 333 void lput(long); 334 void lputl(long); 335 void llput(vlong v); 336 void llputl(vlong v); 337 void main(int, char*[]); 338 void mkfwd(void); 339 void* mysbrk(ulong); 340 void nuxiinit(void); 341 void objfile(char*); 342 int opsize(Prog*); 343 void patch(void); 344 Prog* prg(void); 345 void readundefs(char*, int); 346 int relinv(int); 347 long reuse(Prog*, Sym*); 348 long rnd(long, long); 349 void span(void); 350 void strnput(char*, int); 351 void undef(void); 352 void undefsym(Sym*); 353 long vaddr(Adr*); 354 void wput(long); 355 void wputl(long); 356 void xdefine(char*, int, long); 357 void xfol(Prog*); 358 int zaddr(uchar*, Adr*, Sym*[]); 359 void zerosig(char*); 360 361 #pragma varargck type "D" Adr* 362 #pragma varargck type "P" Prog* 363 #pragma varargck type "R" int 364 #pragma varargck type "A" int 365