1 #include <u.h> 2 #include <libc.h> 3 #include <bio.h> 4 #include "../6c/6.out.h" 5 6 #define P ((Prog*)0) 7 #define S ((Sym*)0) 8 #define TNAME (curtext?curtext->from.sym->name:noname) 9 #define CPUT(c)\ 10 { *cbp++ = c;\ 11 if(--cbc <= 0)\ 12 cflush(); } 13 14 typedef struct Adr Adr; 15 typedef struct Prog Prog; 16 typedef struct Sym Sym; 17 typedef struct Auto Auto; 18 typedef struct Optab Optab; 19 20 struct Adr 21 { 22 union 23 { 24 long offset; 25 char scon[8]; 26 Prog *cond; /* not used, but should be D_BRANCH */ 27 Ieee ieee; 28 }; 29 union 30 { 31 Auto* autom; 32 Sym* sym; 33 }; 34 short type; 35 char index; 36 char scale; 37 }; 38 39 struct Prog 40 { 41 Adr from; 42 Adr to; 43 Prog *forwd; 44 Prog* link; 45 Prog* cond; /* work on this */ 46 long pc; 47 long line; 48 uchar mark; /* work on these */ 49 uchar back; 50 uchar as; 51 52 char width; /* fake for DATA */ 53 uchar type; 54 uchar offset; 55 }; 56 struct Auto 57 { 58 Sym* sym; 59 Auto* link; 60 long offset; 61 short type; 62 }; 63 struct Sym 64 { 65 char *name; 66 short type; 67 short version; 68 short become; 69 short frame; 70 long value; 71 Sym* link; 72 }; 73 struct Optab 74 { 75 uchar as; 76 uchar* ytab; 77 ushort op[3]; 78 }; 79 80 enum 81 { 82 STEXT = 1, 83 SDATA, 84 SBSS, 85 SDATA1, 86 SXREF, 87 SLEAF, 88 SFILE, 89 90 NHASH = 10007, 91 NHUNK = 100000, 92 MINSIZ = 4, 93 STRINGSZ = 200, 94 MAXIO = 8192, 95 MAXHIST = 20, /* limit of path elements for history symbols */ 96 MINLC = 4, 97 98 /* mark flags */ 99 LABEL = 1<<0, 100 LEAF = 1<<1, 101 ACTIVE1 = 1<<2, 102 ACTIVE2 = 1<<3, 103 BRANCH = 1<<4, 104 LOAD = 1<<5, 105 COMPARE = 1<<6, 106 MFROM = 1<<7, 107 LIST = 1<<8, 108 FOLL = 1<<9, 109 110 Yxxx = 0, 111 Ynone, 112 Yr, 113 Ym, 114 Yi5, 115 Yi32, 116 Ybr, 117 Ycol, 118 Yri5, 119 Ynri5, 120 Ymax, 121 122 Zxxx = 0, 123 Zpseudo, 124 Zbr, 125 Zrxr, 126 Zrrx, 127 Zirx, 128 Zrrr, 129 Zirr, 130 Zir, 131 Zmbr, 132 Zrm, 133 Zmr, 134 Zim, 135 Zlong, 136 Znone, 137 Zmax, 138 139 Anooffset = 1<<0, 140 Abigoffset = 1<<1, 141 Aindex = 1<<2, 142 Abase = 1<<3, 143 }; 144 union 145 { 146 struct 147 { 148 char cbuf[MAXIO]; /* output buffer */ 149 uchar xbuf[MAXIO]; /* input buffer */ 150 }; 151 char dbuf[1]; 152 } buf; 153 154 long HEADR; 155 long HEADTYPE; 156 long INITDAT; 157 long INITRND; 158 long INITTEXT; 159 char* INITENTRY; /* entry point */ 160 long autosize; 161 Biobuf bso; 162 long bsssize; 163 long casepc; 164 int cbc; 165 char* cbp; 166 char* pcstr; 167 int cout; 168 Auto* curauto; 169 Auto* curhist; 170 Prog* curp; 171 Prog* curtext; 172 Prog* datap; 173 Prog* edatap; 174 long datsize; 175 char debug[128]; 176 char literal[32]; 177 Prog* etextp; 178 Prog* firstp; 179 char fnuxi8[8]; 180 char fnuxi4[4]; 181 Sym* hash[NHASH]; 182 Sym* histfrog[MAXHIST]; 183 int histfrogp; 184 int histgen; 185 char* library[50]; 186 int libraryp; 187 char* hunk; 188 char inuxi1[1]; 189 char inuxi2[2]; 190 char inuxi4[4]; 191 char ycover[Ymax*Ymax]; 192 ulong* andptr; 193 ulong and[4]; 194 Prog* lastp; 195 long lcsize; 196 int maxop; 197 int nerrors; 198 long nhunk; 199 long nsymbol; 200 char* noname; 201 char* outfile; 202 long pc; 203 int printcol; 204 Sym* symlist; 205 Sym* symSB; 206 long symsize; 207 Prog* textp; 208 long textsize; 209 long thunk; 210 int version; 211 Prog zprg; 212 213 extern Optab optab[]; 214 extern char* anames[]; 215 216 int Aconv(void*, Fconv*); 217 int Dconv(void*, Fconv*); 218 int Pconv(void*, Fconv*); 219 int Rconv(void*, Fconv*); 220 int Sconv(void*, Fconv*); 221 int Xconv(void*, Fconv*); 222 void addhist(long, int); 223 Prog* appendp(Prog*); 224 void asmb(void); 225 void asmins(Prog*); 226 void asmlc(void); 227 void asmsym(void); 228 int atoi(char*); 229 long atolwhex(char*); 230 Prog* brchain(Prog*); 231 Prog* brloop(Prog*); 232 void cflush(void); 233 Prog* copyp(Prog*); 234 double cputime(void); 235 void datblk(long, long); 236 void diag(char*, ...); 237 void dodata(void); 238 void doinit(void); 239 void doprof1(void); 240 void doprof2(void); 241 void noops(void); 242 long entryvalue(void); 243 void errorexit(void); 244 int find1(long, int); 245 int find2(long, int); 246 void follow(void); 247 void gethunk(void); 248 void histtoauto(void); 249 double ieeedtod(Ieee*); 250 long ieeedtof(Ieee*); 251 void ldobj(int, long, char*); 252 void loadlib(int, int); 253 void listinit(void); 254 Sym* lookup(char*, int); 255 void lput(long); 256 void lputl(long); 257 void main(int, char*[]); 258 void mkfwd(void); 259 void nuxiinit(void); 260 void objfile(char*); 261 int opsize(Prog*); 262 void patch(void); 263 Prog* prg(void); 264 int relinv(int); 265 long reuse(Prog*, Sym*); 266 long rnd(long, long); 267 void s8put(char*); 268 void span(void); 269 void undef(void); 270 void xdefine(char*, int, long); 271 void xfol(Prog*); 272 int zaddr(uchar*, Adr*, Sym*[]); 273