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