1 #include <u.h> 2 #include <libc.h> 3 #include <bio.h> 4 #include "../5c/5.out.h" 5 #include "../8l/elf.h" 6 7 #ifndef EXTERN 8 #define EXTERN extern 9 #endif 10 11 #define LIBNAMELEN 300 12 13 void addlibpath(char*); 14 int fileexists(char*); 15 char* findlib(char*); 16 17 typedef struct Adr Adr; 18 typedef struct Sym Sym; 19 typedef struct Autom Auto; 20 typedef struct Prog Prog; 21 typedef struct Optab Optab; 22 typedef struct Oprang Oprang; 23 typedef uchar Opcross[32][2][32]; 24 typedef struct Count Count; 25 26 #define P ((Prog*)0) 27 #define S ((Sym*)0) 28 #define TNAME (curtext&&curtext->from.sym?curtext->from.sym->name:noname) 29 30 struct Adr 31 { 32 union 33 { 34 long u0offset; 35 char* u0sval; 36 Ieee* u0ieee; 37 } u0; 38 union 39 { 40 Auto* u1autom; 41 Sym* u1sym; 42 } u1; 43 char type; 44 char reg; 45 char name; 46 char class; 47 }; 48 49 #define offset u0.u0offset 50 #define sval u0.u0sval 51 #define ieee u0.u0ieee 52 53 #define autom u1.u1autom 54 #define sym u1.u1sym 55 56 struct Prog 57 { 58 Adr from; 59 Adr to; 60 union 61 { 62 long u0regused; 63 Prog* u0forwd; 64 } u0; 65 Prog* cond; 66 Prog* link; 67 long pc; 68 long line; 69 uchar mark; 70 uchar optab; 71 uchar as; 72 uchar scond; 73 uchar reg; 74 }; 75 #define regused u0.u0regused 76 #define forwd u0.u0forwd 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 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 EXTERN long HEADR; /* length of header */ 224 EXTERN int HEADTYPE; /* type of header */ 225 EXTERN long INITDAT; /* data location */ 226 EXTERN long INITRND; /* data round above text location */ 227 EXTERN long INITTEXT; /* text location */ 228 EXTERN long INITTEXTP; /* text location (physical) */ 229 EXTERN char* INITENTRY; /* entry point */ 230 EXTERN long autosize; 231 EXTERN Biobuf bso; 232 EXTERN long bsssize; 233 EXTERN int cbc; 234 EXTERN uchar* cbp; 235 EXTERN int cout; 236 EXTERN Auto* curauto; 237 EXTERN Auto* curhist; 238 EXTERN Prog* curp; 239 EXTERN Prog* curtext; 240 EXTERN Prog* datap; 241 EXTERN long datsize; 242 EXTERN char debug[128]; 243 EXTERN Prog* etextp; 244 EXTERN Prog* firstp; 245 EXTERN char fnuxi4[4]; 246 EXTERN char fnuxi8[8]; 247 EXTERN char* noname; 248 EXTERN Sym* hash[NHASH]; 249 EXTERN Sym* histfrog[MAXHIST]; 250 EXTERN int histfrogp; 251 EXTERN int histgen; 252 EXTERN char* library[50]; 253 EXTERN char* libraryobj[50]; 254 EXTERN int libraryp; 255 EXTERN int xrefresolv; 256 EXTERN char* hunk; 257 EXTERN char inuxi1[1]; 258 EXTERN char inuxi2[2]; 259 EXTERN char inuxi4[4]; 260 EXTERN Prog* lastp; 261 EXTERN long lcsize; 262 EXTERN char literal[32]; 263 EXTERN int nerrors; 264 EXTERN long nhunk; 265 EXTERN long instoffset; 266 EXTERN Opcross opcross[8]; 267 EXTERN Oprang oprange[ALAST]; 268 EXTERN char* outfile; 269 EXTERN long pc; 270 EXTERN uchar repop[ALAST]; 271 EXTERN long symsize; 272 EXTERN Prog* textp; 273 EXTERN long textsize; 274 EXTERN long thunk; 275 EXTERN int version; 276 EXTERN char xcmp[C_GOK+1][C_GOK+1]; 277 EXTERN Prog zprg; 278 EXTERN int dtype; 279 EXTERN int armv4; 280 EXTERN int vfp; 281 282 EXTERN int doexp, dlm; 283 EXTERN int imports, nimports; 284 EXTERN int exports, nexports; 285 EXTERN char* EXPTAB; 286 EXTERN Prog undefp; 287 288 #define UP (&undefp) 289 290 extern char* anames[]; 291 extern Optab optab[]; 292 293 void addpool(Prog*, Adr*); 294 EXTERN Prog* blitrl; 295 EXTERN Prog* elitrl; 296 297 void initdiv(void); 298 EXTERN Prog* prog_div; 299 EXTERN Prog* prog_divu; 300 EXTERN Prog* prog_mod; 301 EXTERN Prog* prog_modu; 302 303 #pragma varargck type "A" int 304 #pragma varargck type "A" uint 305 #pragma varargck type "C" int 306 #pragma varargck type "D" Adr* 307 #pragma varargck type "N" Adr* 308 #pragma varargck type "P" Prog* 309 #pragma varargck type "S" char* 310 311 #pragma varargck argpos diag 1 312 313 int Aconv(Fmt*); 314 int Cconv(Fmt*); 315 int Dconv(Fmt*); 316 int Nconv(Fmt*); 317 int Pconv(Fmt*); 318 int Sconv(Fmt*); 319 int aclass(Adr*); 320 void addhist(long, int); 321 void addlibpath(char*); 322 void append(Prog*, Prog*); 323 void asmb(void); 324 void asmdyn(void); 325 void asmlc(void); 326 void asmout(Prog*, Optab*); 327 void asmsym(void); 328 long atolwhex(char*); 329 Prog* brloop(Prog*); 330 void buildop(void); 331 void buildrep(int, int); 332 void cflush(void); 333 void ckoff(Sym*, long); 334 int chipfloat(Ieee*); 335 int cmp(int, int); 336 int compound(Prog*); 337 double cputime(void); 338 void datblk(long, long, int); 339 void diag(char*, ...); 340 void divsig(void); 341 void dodata(void); 342 void doprof1(void); 343 void doprof2(void); 344 void dynreloc(Sym*, long, int); 345 long entryvalue(void); 346 void errorexit(void); 347 void exchange(Prog*); 348 void export(void); 349 int fileexists(char*); 350 int find1(long, int); 351 char* findlib(char*); 352 void follow(void); 353 void gethunk(void); 354 void histtoauto(void); 355 double ieeedtod(Ieee*); 356 long ieeedtof(Ieee*); 357 void import(void); 358 int isnop(Prog*); 359 void ldobj(int, long, char*); 360 void loadlib(void); 361 void listinit(void); 362 Sym* lookup(char*, int); 363 void cput(int); 364 void llput(vlong); 365 void llputl(vlong); 366 void lput(long); 367 void lputl(long); 368 void mkfwd(void); 369 void* mysbrk(ulong); 370 void names(void); 371 void nocache(Prog*); 372 void nuxiinit(void); 373 void objfile(char*); 374 int ocmp(const void*, const void*); 375 long opirr(int); 376 Optab* oplook(Prog*); 377 long oprrr(int, int); 378 long opvfprrr(int, int); 379 long olr(long, int, int, int); 380 long olhr(long, int, int, int); 381 long olrr(int, int, int, int); 382 long olhrr(int, int, int, int); 383 long osr(int, int, long, int, int); 384 long oshr(int, long, int, int); 385 long ofsr(int, int, long, int, int, Prog*); 386 long osrr(int, int, int, int); 387 long oshrr(int, int, int, int); 388 long omvl(Prog*, Adr*, int); 389 void patch(void); 390 void prasm(Prog*); 391 void prepend(Prog*, Prog*); 392 Prog* prg(void); 393 int pseudo(Prog*); 394 void putsymb(char*, int, long, int); 395 void readundefs(char*, int); 396 long regoff(Adr*); 397 int relinv(int); 398 long rnd(long, long); 399 void span(void); 400 void strnput(char*, int); 401 void undef(void); 402 void undefsym(Sym*); 403 void wput(long); 404 void wputl(long); 405 void xdefine(char*, int, long); 406 void xfol(Prog*); 407 void zerosig(char*); 408 void noops(void); 409 long immrot(ulong); 410 long immaddr(long); 411 long opbra(int, int); 412