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