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