1 #include <u.h> 2 #include <libc.h> 3 #include <bio.h> 4 #include "../9c/9.out.h" 5 #include "../8l/elf.h" 6 7 #ifndef EXTERN 8 #define EXTERN extern 9 #endif 10 11 #define LIBNAMELEN 300 12 13 typedef struct Adr Adr; 14 typedef struct Sym Sym; 15 typedef struct Autom Auto; 16 typedef struct Prog Prog; 17 typedef struct Optab Optab; 18 19 #define P ((Prog*)0) 20 #define S ((Sym*)0) 21 #define TNAME (curtext&&curtext->from.sym?curtext->from.sym->name:noname) 22 23 struct Adr 24 { 25 union 26 { 27 vlong u0offset; 28 char u0sval[NSNAME]; 29 Ieee u0ieee; 30 }u0; 31 Sym *sym; 32 Auto *autom; 33 char type; 34 uchar reg; 35 char name; 36 char class; 37 }; 38 39 #define offset u0.u0offset 40 #define sval u0.u0sval 41 #define ieee u0.u0ieee 42 43 struct Prog 44 { 45 Adr from; 46 Adr from3; /* fma and rlwm */ 47 Adr to; 48 Prog *forwd; 49 Prog *cond; 50 Prog *link; 51 vlong pc; 52 long regused; 53 short line; 54 short mark; 55 short optab; /* could be uchar */ 56 short as; 57 char reg; 58 }; 59 struct Sym 60 { 61 char *name; 62 short type; 63 short version; 64 short become; 65 short frame; 66 uchar subtype; 67 ushort file; 68 vlong value; 69 long sig; 70 Sym *link; 71 }; 72 struct Autom 73 { 74 Sym *sym; 75 Auto *link; 76 vlong aoffset; 77 short type; 78 }; 79 struct Optab 80 { 81 short as; 82 char a1; 83 char a2; 84 char a3; 85 char a4; 86 char type; 87 char size; 88 char param; 89 }; 90 struct 91 { 92 Optab* start; 93 Optab* stop; 94 } oprange[ALAST]; 95 96 enum 97 { 98 FPCHIP = 1, 99 BIG = 32768-8, 100 STRINGSZ = 200, 101 MAXIO = (16*1024), 102 MAXHIST = 20, /* limit of path elements for history symbols */ 103 DATBLK = 1024, 104 NHASH = 10007, 105 NHUNK = 100000, 106 MINSIZ = 64, 107 NENT = 100, 108 NSCHED = 20, 109 110 /* mark flags */ 111 LABEL = 1<<0, 112 LEAF = 1<<1, 113 FLOAT = 1<<2, 114 BRANCH = 1<<3, 115 LOAD = 1<<4, 116 FCMP = 1<<5, 117 SYNC = 1<<6, 118 LIST = 1<<7, 119 FOLL = 1<<8, 120 NOSCHED = 1<<9, 121 122 STEXT = 1, 123 SDATA, 124 SBSS, 125 SDATA1, 126 SXREF, 127 SLEAF, 128 SFILE, 129 SCONST, 130 SUNDEF, 131 132 SIMPORT, 133 SEXPORT, 134 135 C_NONE = 0, 136 C_REG, 137 C_FREG, 138 C_CREG, 139 C_SPR, /* special processor register */ 140 C_ZCON, 141 C_SCON, /* 16 bit signed */ 142 C_UCON, /* low 16 bits 0 */ 143 C_ADDCON, /* -0x8000 <= v < 0 */ 144 C_ANDCON, /* 0 < v <= 0xFFFF */ 145 C_LCON, /* other 32 */ 146 C_DCON, /* other 64 (could subdivide further) */ 147 C_SACON, 148 C_SECON, 149 C_LACON, 150 C_LECON, 151 C_SBRA, 152 C_LBRA, 153 C_SAUTO, 154 C_LAUTO, 155 C_SEXT, 156 C_LEXT, 157 C_ZOREG, 158 C_SOREG, 159 C_LOREG, 160 C_FPSCR, 161 C_MSR, 162 C_XER, 163 C_LR, 164 C_CTR, 165 C_ANY, 166 C_GOK, 167 C_ADDR, 168 169 C_NCLASS, 170 171 Roffset = 22, /* no. bits for offset in relocation address */ 172 Rindex = 10 /* no. bits for index in relocation address */ 173 }; 174 175 EXTERN union 176 { 177 struct 178 { 179 uchar obuf[MAXIO]; /* output buffer */ 180 uchar ibuf[MAXIO]; /* input buffer */ 181 } u; 182 char dbuf[1]; 183 } buf; 184 185 #define cbuf u.obuf 186 #define xbuf u.ibuf 187 188 EXTERN long HEADR; /* length of header */ 189 EXTERN int HEADTYPE; /* type of header */ 190 EXTERN vlong INITDAT; /* data location */ 191 EXTERN long INITRND; /* data round above text location */ 192 EXTERN vlong INITTEXT; /* text location */ 193 EXTERN long INITTEXTP; /* text location (physical) */ 194 EXTERN char* INITENTRY; /* entry point */ 195 EXTERN long autosize; 196 EXTERN Biobuf bso; 197 EXTERN long bsssize; 198 EXTERN int cbc; 199 EXTERN uchar* cbp; 200 EXTERN int cout; 201 EXTERN Auto* curauto; 202 EXTERN Auto* curhist; 203 EXTERN Prog* curp; 204 EXTERN Prog* curtext; 205 EXTERN Prog* datap; 206 EXTERN Prog* prog_movsw; 207 EXTERN Prog* prog_movdw; 208 EXTERN Prog* prog_movws; 209 EXTERN Prog* prog_movwd; 210 EXTERN vlong datsize; 211 EXTERN char debug[128]; 212 EXTERN Prog* firstp; 213 EXTERN uchar fnuxi8[8]; 214 EXTERN uchar fnuxi4[4]; 215 EXTERN Sym* hash[NHASH]; 216 EXTERN Sym* histfrog[MAXHIST]; 217 EXTERN int histfrogp; 218 EXTERN int histgen; 219 EXTERN char* library[50]; 220 EXTERN char* libraryobj[50]; 221 EXTERN int libraryp; 222 EXTERN int xrefresolv; 223 EXTERN char* hunk; 224 EXTERN uchar inuxi1[1]; 225 EXTERN uchar inuxi2[2]; 226 EXTERN uchar inuxi4[4]; 227 EXTERN uchar inuxi8[8]; 228 EXTERN Prog* lastp; 229 EXTERN long lcsize; 230 EXTERN char literal[32]; 231 EXTERN int nerrors; 232 EXTERN long nhunk; 233 EXTERN char* noname; 234 EXTERN vlong instoffset; 235 EXTERN char* outfile; 236 EXTERN vlong pc; 237 EXTERN int r0iszero; 238 EXTERN long symsize; 239 EXTERN long staticgen; 240 EXTERN Prog* textp; 241 EXTERN vlong textsize; 242 EXTERN long tothunk; 243 EXTERN char xcmp[C_NCLASS][C_NCLASS]; 244 EXTERN int version; 245 EXTERN Prog zprg; 246 EXTERN int dtype; 247 248 EXTERN int doexp, dlm; 249 EXTERN int imports, nimports; 250 EXTERN int exports, nexports, allexport; 251 EXTERN char* EXPTAB; 252 EXTERN Prog undefp; 253 254 #define UP (&undefp) 255 256 extern Optab optab[]; 257 extern char* anames[]; 258 extern char* cnames[]; 259 260 int Aconv(Fmt*); 261 int Dconv(Fmt*); 262 int Nconv(Fmt*); 263 int Pconv(Fmt*); 264 int Sconv(Fmt*); 265 int Rconv(Fmt*); 266 int aclass(Adr*); 267 void addhist(long, int); 268 void histtoauto(void); 269 void addlibpath(char*); 270 void addnop(Prog*); 271 void append(Prog*, Prog*); 272 void asmb(void); 273 void asmdyn(void); 274 void asmlc(void); 275 int asmout(Prog*, Optab*, int); 276 void asmsym(void); 277 vlong atolwhex(char*); 278 Prog* brloop(Prog*); 279 void buildop(void); 280 void cflush(void); 281 void ckoff(Sym*, vlong); 282 int cmp(int, int); 283 void cput(long); 284 int compound(Prog*); 285 double cputime(void); 286 void datblk(long, long); 287 void diag(char*, ...); 288 void dodata(void); 289 void doprof1(void); 290 void doprof2(void); 291 void dynreloc(Sym*, long, int, int, int); 292 vlong entryvalue(void); 293 void errorexit(void); 294 void exchange(Prog*); 295 void export(void); 296 int fileexists(char*); 297 int find1(long, int); 298 char* findlib(char*); 299 void follow(void); 300 void gethunk(void); 301 double ieeedtod(Ieee*); 302 long ieeedtof(Ieee*); 303 void import(void); 304 int isint32(vlong); 305 int isuint32(uvlong); 306 int isnop(Prog*); 307 void ldobj(int, long, char*); 308 void loadlib(void); 309 void listinit(void); 310 void initmuldiv(void); 311 Sym* lookup(char*, int); 312 void llput(vlong); 313 void llputl(vlong); 314 void lput(long); 315 void lputl(long); 316 void mkfwd(void); 317 void* mysbrk(ulong); 318 void names(void); 319 void nocache(Prog*); 320 void noops(void); 321 void nopout(Prog*); 322 void nuxiinit(void); 323 void objfile(char*); 324 int ocmp(void*, void*); 325 long opcode(int); 326 Optab* oplook(Prog*); 327 void patch(void); 328 void prasm(Prog*); 329 void prepend(Prog*, Prog*); 330 Prog* prg(void); 331 int pseudo(Prog*); 332 void putsymb(char*, int, vlong, int); 333 void readundefs(char*, int); 334 long regoff(Adr*); 335 int relinv(int); 336 vlong rnd(vlong, long); 337 void sched(Prog*, Prog*); 338 void span(void); 339 void strnput(char*, int); 340 void undef(void); 341 void undefsym(Sym*); 342 vlong vregoff(Adr*); 343 void wput(long); 344 void wputl(long); 345 void xdefine(char*, int, vlong); 346 void xfol(Prog*); 347 void zerosig(char*); 348 349 #pragma varargck type "D" Adr* 350 #pragma varargck type "N" Adr* 351 #pragma varargck type "P" Prog* 352 #pragma varargck type "R" int 353 #pragma varargck type "A" int 354 #pragma varargck type "S" char* 355 #pragma varargck argpos diag 1 356