1 #include <lib9.h> 2 #include <bio.h> 3 #include "../5c/5.out.h" 4 #include "../ld/elf.h" 5 6 #ifndef EXTERN 7 #define EXTERN extern 8 #endif 9 10 #define LIBNAMELEN 300 11 12 void addlibpath(char*); 13 int fileexists(char*); 14 char* findlib(char*); 15 16 typedef struct Adr Adr; 17 typedef struct Sym Sym; 18 typedef struct Autom Auto; 19 typedef struct Prog Prog; 20 typedef struct Optab Optab; 21 typedef struct Oprang Oprang; 22 typedef uchar Opcross[32][2][32]; 23 typedef struct Count Count; 24 25 #define P ((Prog*)0) 26 #define S ((Sym*)0) 27 #define TNAME (curtext&&curtext->from.sym?curtext->from.sym->name:noname) 28 29 struct Adr 30 { 31 union 32 { 33 long u0offset; 34 char* u0sval; 35 Ieee* u0ieee; 36 } u0; 37 union 38 { 39 Auto* u1autom; 40 Sym* u1sym; 41 } u1; 42 char type; 43 char reg; 44 char name; 45 char class; 46 }; 47 48 #define offset u0.u0offset 49 #define sval u0.u0sval 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 union 60 { 61 long u0regused; 62 Prog* u0forwd; 63 } u0; 64 Prog* cond; 65 Prog* link; 66 long pc; 67 long line; 68 uchar mark; 69 uchar optab; 70 uchar as; 71 uchar scond; 72 uchar reg; 73 }; 74 #define regused u0.u0regused 75 #define forwd u0.u0forwd 76 77 struct Sym 78 { 79 char *name; 80 short type; 81 short version; 82 short become; 83 short frame; 84 uchar subtype; 85 uchar used; 86 ushort file; 87 long value; 88 long sig; 89 Sym* link; 90 }; 91 92 #define SIGNINTERN (1729*325*1729) 93 94 struct Autom 95 { 96 Sym* asym; 97 Auto* link; 98 long aoffset; 99 short type; 100 }; 101 struct Optab 102 { 103 char as; 104 char a1; 105 char a2; 106 char a3; 107 char type; 108 char size; 109 char param; 110 char flag; 111 }; 112 struct Oprang 113 { 114 Optab* start; 115 Optab* stop; 116 }; 117 struct Count 118 { 119 long count; 120 long outof; 121 }; 122 123 enum 124 { 125 STEXT = 1, 126 SDATA, 127 SBSS, 128 SDATA1, 129 SXREF, 130 SLEAF, 131 SFILE, 132 SCONST, 133 SSTRING, 134 SUNDEF, 135 136 SIMPORT, 137 SEXPORT, 138 139 LFROM = 1<<0, 140 LTO = 1<<1, 141 LPOOL = 1<<2, 142 V4 = 1<<3, /* arm v4 arch */ 143 VFP = 1<<4, /* arm vfpv3 floating point */ 144 145 C_NONE = 0, 146 C_REG, 147 C_REGREG, 148 C_SHIFT, 149 C_FREG, 150 C_PSR, 151 C_FCR, 152 153 C_RCON, /* 0xff rotated */ 154 C_NCON, /* ~RCON */ 155 C_SCON, /* 0xffff */ 156 C_LCON, 157 C_FCON, 158 159 C_RACON, 160 C_LACON, 161 162 C_RECON, 163 C_LECON, 164 165 C_SBRA, 166 C_LBRA, 167 168 C_HAUTO, /* halfword insn offset (-0xff to 0xff) */ 169 C_FAUTO, /* float insn offset (0 to 0x3fc, word aligned) */ 170 C_HFAUTO, /* both H and F */ 171 C_SAUTO, /* -0xfff to 0xfff */ 172 C_LAUTO, 173 174 C_HEXT, 175 C_FEXT, 176 C_HFEXT, 177 C_SEXT, 178 C_LEXT, 179 180 C_HOREG, 181 C_FOREG, 182 C_HFOREG, 183 C_SOREG, 184 C_ROREG, 185 C_SROREG, /* both S and R */ 186 C_LOREG, 187 188 C_ADDR, /* relocatable address */ 189 190 C_GOK, 191 192 /* mark flags */ 193 FOLL = 1<<0, 194 LABEL = 1<<1, 195 LEAF = 1<<2, 196 197 BIG = (1<<12)-4, 198 STRINGSZ = 200, 199 NHASH = 10007, 200 NHUNK = 100000, 201 MINSIZ = 64, 202 NENT = 100, 203 MAXIO = 8192, 204 MAXHIST = 20, /* limit of path elements for history symbols */ 205 206 Roffset = 22, /* no. bits for offset in relocation address */ 207 Rindex = 10, /* no. bits for index in relocation address */ 208 }; 209 210 EXTERN union 211 { 212 struct 213 { 214 uchar obuf[MAXIO]; /* output buffer */ 215 uchar ibuf[MAXIO]; /* input buffer */ 216 } u; 217 char dbuf[1]; 218 } buf; 219 220 #define cbuf u.obuf 221 #define xbuf u.ibuf 222 223 #ifndef COFFCVT 224 225 EXTERN long HEADR; /* length of header */ 226 EXTERN int HEADTYPE; /* type of header */ 227 EXTERN long INITDAT; /* data location */ 228 EXTERN long INITRND; /* data round above text location */ 229 EXTERN long INITTEXT; /* text location */ 230 EXTERN long INITTEXTP; /* text location (physical) */ 231 EXTERN char* INITENTRY; /* entry point */ 232 EXTERN long autosize; 233 EXTERN Biobuf bso; 234 EXTERN long bsssize; 235 EXTERN int cbc; 236 EXTERN uchar* cbp; 237 EXTERN int cout; 238 EXTERN Auto* curauto; 239 EXTERN Auto* curhist; 240 EXTERN Prog* curp; 241 EXTERN Prog* curtext; 242 EXTERN Prog* datap; 243 EXTERN long datsize; 244 EXTERN char debug[128]; 245 EXTERN Prog* etextp; 246 EXTERN Prog* firstp; 247 EXTERN char fnuxi4[4]; 248 EXTERN char fnuxi8[8]; 249 EXTERN char* noname; 250 EXTERN Sym* hash[NHASH]; 251 EXTERN Sym* histfrog[MAXHIST]; 252 EXTERN int histfrogp; 253 EXTERN int histgen; 254 EXTERN char* library[50]; 255 EXTERN char* libraryobj[50]; 256 EXTERN int libraryp; 257 EXTERN int xrefresolv; 258 EXTERN char* hunk; 259 EXTERN char inuxi1[1]; 260 EXTERN char inuxi2[2]; 261 EXTERN char inuxi4[4]; 262 EXTERN Prog* lastp; 263 EXTERN long lcsize; 264 EXTERN char literal[32]; 265 EXTERN int nerrors; 266 EXTERN long nhunk; 267 EXTERN long instoffset; 268 EXTERN Opcross opcross[8]; 269 EXTERN Oprang oprange[ALAST]; 270 EXTERN char* outfile; 271 EXTERN long pc; 272 EXTERN uchar repop[ALAST]; 273 EXTERN long symsize; 274 EXTERN Prog* textp; 275 EXTERN long textsize; 276 EXTERN long thunk; 277 EXTERN int version; 278 EXTERN char xcmp[C_GOK+1][C_GOK+1]; 279 EXTERN Prog zprg; 280 EXTERN int dtype; 281 EXTERN int armv4; 282 EXTERN int vfp; 283 284 EXTERN int doexp, dlm; 285 EXTERN int imports, nimports; 286 EXTERN int exports, nexports; 287 EXTERN char* EXPTAB; 288 EXTERN Prog undefp; 289 290 #define UP (&undefp) 291 292 extern char* anames[]; 293 extern Optab optab[]; 294 295 void addpool(Prog*, Adr*); 296 EXTERN Prog* blitrl; 297 EXTERN Prog* elitrl; 298 299 void initdiv(void); 300 EXTERN Prog* prog_div; 301 EXTERN Prog* prog_divu; 302 EXTERN Prog* prog_mod; 303 EXTERN Prog* prog_modu; 304 305 #pragma varargck type "A" int 306 #pragma varargck type "A" uint 307 #pragma varargck type "C" int 308 #pragma varargck type "D" Adr* 309 #pragma varargck type "N" Adr* 310 #pragma varargck type "P" Prog* 311 #pragma varargck type "S" char* 312 313 #pragma varargck argpos diag 1 314 315 int Aconv(Fmt*); 316 int Cconv(Fmt*); 317 int Dconv(Fmt*); 318 int Nconv(Fmt*); 319 int Pconv(Fmt*); 320 int Sconv(Fmt*); 321 int aclass(Adr*); 322 void addhist(long, int); 323 void addlibpath(char*); 324 void append(Prog*, Prog*); 325 void asmb(void); 326 void asmdyn(void); 327 void asmlc(void); 328 void asmout(Prog*, Optab*); 329 void asmsym(void); 330 long atolwhex(char*); 331 Prog* brloop(Prog*); 332 void buildop(void); 333 void buildrep(int, int); 334 void cflush(void); 335 void ckoff(Sym*, long); 336 int chipfloat(Ieee*); 337 int cmp(int, int); 338 int compound(Prog*); 339 double cputime(void); 340 void datblk(long, long, int); 341 void diag(char*, ...); 342 void divsig(void); 343 void dodata(void); 344 void doprof1(void); 345 void doprof2(void); 346 void dynreloc(Sym*, long, int); 347 long entryvalue(void); 348 void errorexit(void); 349 void exchange(Prog*); 350 void export(void); 351 int fileexists(char*); 352 int find1(long, int); 353 char* findlib(char*); 354 void follow(void); 355 void gethunk(void); 356 void histtoauto(void); 357 double ieeedtod(Ieee*); 358 long ieeedtof(Ieee*); 359 void import(void); 360 int isnop(Prog*); 361 void ldobj(int, long, char*); 362 void loadlib(void); 363 void listinit(void); 364 Sym* lookup(char*, int); 365 void cput(int); 366 void llput(vlong); 367 void llputl(vlong); 368 void lput(long); 369 void lputl(long); 370 void mkfwd(void); 371 void* mysbrk(ulong); 372 void names(void); 373 void nocache(Prog*); 374 void nuxiinit(void); 375 void objfile(char*); 376 int ocmp(void*, void*); 377 long opirr(int); 378 Optab* oplook(Prog*); 379 long oprrr(int, int); 380 long opvfprrr(int, int); 381 long olr(long, int, int, int); 382 long olhr(long, int, int, int); 383 long olrr(int, int, int, int); 384 long olhrr(int, int, int, int); 385 long osr(int, int, long, int, int); 386 long oshr(int, long, int, int); 387 long ofsr(int, int, long, int, int, Prog*); 388 long osrr(int, int, int, int); 389 long oshrr(int, int, int, int); 390 long omvl(Prog*, Adr*, int); 391 void patch(void); 392 void prasm(Prog*); 393 void prepend(Prog*, Prog*); 394 Prog* prg(void); 395 int pseudo(Prog*); 396 void putsymb(char*, int, long, int); 397 void readundefs(char*, int); 398 long regoff(Adr*); 399 int relinv(int); 400 long rnd(long, long); 401 void span(void); 402 void strnput(char*, int); 403 void undef(void); 404 void undefsym(Sym*); 405 void wput(long); 406 void wputl(long); 407 void xdefine(char*, int, long); 408 void xfol(Prog*); 409 void zerosig(char*); 410 void noops(void); 411 long immrot(ulong); 412 long immaddr(long); 413 long opbra(int, int); 414 415 #endif 416