1 #include <lib9.h> 2 #include <bio.h> 3 #include <ctype.h> 4 5 #ifndef EXTERN 6 #define EXTERN extern 7 #endif 8 9 typedef struct Node Node; 10 typedef struct Sym Sym; 11 typedef struct Type Type; 12 typedef struct Funct Funct; 13 typedef struct Decl Decl; 14 typedef struct Io Io; 15 typedef struct Hist Hist; 16 typedef struct Term Term; 17 typedef struct Init Init; 18 typedef struct Bits Bits; 19 20 #define NHUNK 50000L 21 #define BUFSIZ 8192 22 #define NSYMB 500 23 #define NHASH 1024 24 #define STRINGSZ 200 25 #define HISTSZ 20 26 #define YYMAXDEPTH 500 27 #define NTERM 10 28 #define MAXALIGN 7 29 30 #define SIGN(n) ((vlong)1<<(n-1)) 31 #define MASK(n) (SIGN(n)|(SIGN(n)-1)) 32 33 #define BITS 5 34 #define NVAR (BITS*sizeof(ulong)*8) 35 struct Bits 36 { 37 ulong b[BITS]; 38 }; 39 40 struct Node 41 { 42 Node* left; 43 Node* right; 44 void* label; 45 long pc; 46 int reg; 47 long xoffset; 48 double fconst; /* fp constant */ 49 vlong vconst; /* non fp const */ 50 char* cstring; /* character string */ 51 ushort* rstring; /* rune string */ 52 53 Sym* sym; 54 Type* type; 55 long lineno; 56 char op; 57 58 char oldop; 59 char xcast; 60 char class; 61 char etype; 62 char complex; 63 char addable; 64 char scale; 65 char garb; 66 }; 67 #define Z ((Node*)0) 68 69 struct Sym 70 { 71 Sym* link; 72 Type* type; 73 Type* suetag; 74 Type* tenum; 75 char* macro; 76 long varlineno; 77 long offset; 78 vlong vconst; 79 double fconst; 80 Node* label; 81 ushort lexical; 82 char *name; 83 ushort block; 84 ushort sueblock; 85 char class; 86 char sym; 87 char aused; 88 char sig; 89 }; 90 #define S ((Sym*)0) 91 92 enum{ 93 SIGNONE = 0, 94 SIGDONE = 1, 95 SIGINTERN = 2, 96 97 SIGNINTERN = 1729*325*1729, 98 }; 99 100 struct Decl 101 { 102 Decl* link; 103 Sym* sym; 104 Type* type; 105 long varlineno; 106 long offset; 107 short val; 108 ushort block; 109 char class; 110 char aused; 111 }; 112 #define D ((Decl*)0) 113 114 struct Type 115 { 116 Sym* sym; 117 Sym* tag; 118 Funct* funct; 119 Type* link; 120 Type* down; 121 long width; 122 long offset; 123 long lineno; 124 schar shift; 125 char nbits; 126 char etype; 127 char garb; 128 }; 129 130 #define T ((Type*)0) 131 #define NODECL ((void(*)(int, Type*, Sym*))0) 132 133 struct Init /* general purpose initialization */ 134 { 135 int code; 136 ulong value; 137 char* s; 138 }; 139 140 EXTERN struct 141 { 142 char* p; 143 int c; 144 } fi; 145 146 struct Io 147 { 148 Io* link; 149 char* p; 150 char b[BUFSIZ]; 151 short c; 152 short f; 153 }; 154 #define I ((Io*)0) 155 156 struct Hist 157 { 158 Hist* link; 159 char* name; 160 long line; 161 long offset; 162 }; 163 #define H ((Hist*)0) 164 EXTERN Hist* hist; 165 166 struct Term 167 { 168 vlong mult; 169 Node *node; 170 }; 171 172 enum 173 { 174 Axxx, 175 Ael1, 176 Ael2, 177 Asu2, 178 Aarg0, 179 Aarg1, 180 Aarg2, 181 Aaut3, 182 NALIGN, 183 }; 184 185 enum /* also in ../{8a,0a}.h */ 186 { 187 Plan9 = 1<<0, 188 Unix = 1<<1, 189 Windows = 1<<2, 190 }; 191 192 enum 193 { 194 DMARK, 195 DAUTO, 196 DSUE, 197 DLABEL, 198 }; 199 enum 200 { 201 OXXX, 202 OADD, 203 OADDR, 204 OAND, 205 OANDAND, 206 OARRAY, 207 OAS, 208 OASI, 209 OASADD, 210 OASAND, 211 OASASHL, 212 OASASHR, 213 OASDIV, 214 OASHL, 215 OASHR, 216 OASLDIV, 217 OASLMOD, 218 OASLMUL, 219 OASLSHR, 220 OASMOD, 221 OASMUL, 222 OASOR, 223 OASSUB, 224 OASXOR, 225 OBIT, 226 OBREAK, 227 OCASE, 228 OCAST, 229 OCOMMA, 230 OCOND, 231 OCONST, 232 OCONTINUE, 233 ODIV, 234 ODOT, 235 ODOTDOT, 236 ODWHILE, 237 OENUM, 238 OEQ, 239 OFOR, 240 OFUNC, 241 OGE, 242 OGOTO, 243 OGT, 244 OHI, 245 OHS, 246 OIF, 247 OIND, 248 OINDREG, 249 OINIT, 250 OLABEL, 251 OLDIV, 252 OLE, 253 OLIST, 254 OLMOD, 255 OLMUL, 256 OLO, 257 OLS, 258 OLSHR, 259 OLT, 260 OMOD, 261 OMUL, 262 ONAME, 263 ONE, 264 ONOT, 265 OOR, 266 OOROR, 267 OPOSTDEC, 268 OPOSTINC, 269 OPREDEC, 270 OPREINC, 271 OPROTO, 272 OREGISTER, 273 ORETURN, 274 OSET, 275 OSIGN, 276 OSIZE, 277 OSTRING, 278 OLSTRING, 279 OSTRUCT, 280 OSUB, 281 OSWITCH, 282 OUNION, 283 OUSED, 284 OWHILE, 285 OXOR, 286 ONEG, 287 OCOM, 288 OPOS, 289 OELEM, 290 291 OTST, /* used in some compilers */ 292 OINDEX, 293 OFAS, 294 OREGPAIR, 295 296 OEND 297 }; 298 enum 299 { 300 TXXX, 301 TCHAR, 302 TUCHAR, 303 TSHORT, 304 TUSHORT, 305 TINT, 306 TUINT, 307 TLONG, 308 TULONG, 309 TVLONG, 310 TUVLONG, 311 TFLOAT, 312 TDOUBLE, 313 TIND, 314 TFUNC, 315 TARRAY, 316 TVOID, 317 TSTRUCT, 318 TUNION, 319 TENUM, 320 TDOT, 321 NTYPE, 322 323 TAUTO = NTYPE, 324 TEXTERN, 325 TSTATIC, 326 TTYPEDEF, 327 TTYPESTR, 328 TREGISTER, 329 TCONSTNT, 330 TVOLATILE, 331 TUNSIGNED, 332 TSIGNED, 333 TFILE, 334 TOLD, 335 NALLTYPES, 336 }; 337 enum 338 { 339 CXXX, 340 CAUTO, 341 CEXTERN, 342 CGLOBL, 343 CSTATIC, 344 CLOCAL, 345 CTYPEDEF, 346 CTYPESTR, 347 CPARAM, 348 CSELEM, 349 CLABEL, 350 CEXREG, 351 NCTYPES, 352 }; 353 enum 354 { 355 GXXX = 0, 356 GCONSTNT = 1<<0, 357 GVOLATILE = 1<<1, 358 NGTYPES = 1<<2, 359 360 GINCOMPLETE = 1<<2, 361 }; 362 enum 363 { 364 BCHAR = 1L<<TCHAR, 365 BUCHAR = 1L<<TUCHAR, 366 BSHORT = 1L<<TSHORT, 367 BUSHORT = 1L<<TUSHORT, 368 BINT = 1L<<TINT, 369 BUINT = 1L<<TUINT, 370 BLONG = 1L<<TLONG, 371 BULONG = 1L<<TULONG, 372 BVLONG = 1L<<TVLONG, 373 BUVLONG = 1L<<TUVLONG, 374 BFLOAT = 1L<<TFLOAT, 375 BDOUBLE = 1L<<TDOUBLE, 376 BIND = 1L<<TIND, 377 BFUNC = 1L<<TFUNC, 378 BARRAY = 1L<<TARRAY, 379 BVOID = 1L<<TVOID, 380 BSTRUCT = 1L<<TSTRUCT, 381 BUNION = 1L<<TUNION, 382 BENUM = 1L<<TENUM, 383 BFILE = 1L<<TFILE, 384 BDOT = 1L<<TDOT, 385 BCONSTNT = 1L<<TCONSTNT, 386 BVOLATILE = 1L<<TVOLATILE, 387 BUNSIGNED = 1L<<TUNSIGNED, 388 BSIGNED = 1L<<TSIGNED, 389 BAUTO = 1L<<TAUTO, 390 BEXTERN = 1L<<TEXTERN, 391 BSTATIC = 1L<<TSTATIC, 392 BTYPEDEF = 1L<<TTYPEDEF, 393 BTYPESTR = 1L<<TTYPESTR, 394 BREGISTER = 1L<<TREGISTER, 395 396 BINTEGER = BCHAR|BUCHAR|BSHORT|BUSHORT|BINT|BUINT| 397 BLONG|BULONG|BVLONG|BUVLONG, 398 BNUMBER = BINTEGER|BFLOAT|BDOUBLE, 399 400 /* these can be overloaded with complex types */ 401 402 BCLASS = BAUTO|BEXTERN|BSTATIC|BTYPEDEF|BTYPESTR|BREGISTER, 403 BGARB = BCONSTNT|BVOLATILE, 404 }; 405 406 struct Funct 407 { 408 Sym* sym[OEND]; 409 Sym* castto[NTYPE]; 410 Sym* castfr[NTYPE]; 411 }; 412 413 EXTERN struct 414 { 415 Type* tenum; /* type of entire enum */ 416 Type* cenum; /* type of current enum run */ 417 vlong lastenum; /* value of current enum */ 418 double floatenum; /* value of current enum */ 419 } en; 420 421 EXTERN int autobn; 422 EXTERN long autoffset; 423 EXTERN int blockno; 424 EXTERN Decl* dclstack; 425 EXTERN char debug[256]; 426 EXTERN Hist* ehist; 427 EXTERN long firstbit; 428 EXTERN Sym* firstarg; 429 EXTERN Type* firstargtype; 430 EXTERN Decl* firstdcl; 431 EXTERN int fperror; 432 EXTERN Sym* hash[NHASH]; 433 EXTERN int hasdoubled; 434 EXTERN char* hunk; 435 EXTERN char* include[20]; 436 EXTERN Io* iofree; 437 EXTERN Io* ionext; 438 EXTERN Io* iostack; 439 EXTERN long lastbit; 440 EXTERN char lastclass; 441 EXTERN Type* lastdcl; 442 EXTERN long lastfield; 443 EXTERN Type* lasttype; 444 EXTERN long lineno; 445 EXTERN long nearln; 446 EXTERN int nerrors; 447 EXTERN int newflag; 448 EXTERN long nhunk; 449 EXTERN int ninclude; 450 EXTERN Node* nodproto; 451 EXTERN Node* nodcast; 452 EXTERN Biobuf outbuf; 453 EXTERN Biobuf diagbuf; 454 EXTERN char* outfile; 455 EXTERN char* pathname; 456 EXTERN int peekc; 457 EXTERN long stkoff; 458 EXTERN Type* strf; 459 EXTERN Type* strl; 460 EXTERN char symb[NSYMB]; 461 EXTERN Sym* symstring; 462 EXTERN int taggen; 463 EXTERN Type* tfield; 464 EXTERN Type* tufield; 465 EXTERN int thechar; 466 EXTERN char* thestring; 467 EXTERN Type* thisfn; 468 EXTERN long thunk; 469 EXTERN Type* types[NTYPE]; 470 EXTERN Type* fntypes[NTYPE]; 471 EXTERN Node* initlist; 472 EXTERN Term term[NTERM]; 473 EXTERN int nterm; 474 EXTERN int packflg; 475 EXTERN int fproundflg; 476 EXTERN int profileflg; 477 EXTERN int ncontin; 478 EXTERN int canreach; 479 EXTERN int warnreach; 480 EXTERN Bits zbits; 481 482 extern char *onames[], *tnames[], *gnames[]; 483 extern char *cnames[], *qnames[], *bnames[]; 484 extern char tab[NTYPE][NTYPE]; 485 extern char comrel[], invrel[], logrel[]; 486 extern long ncast[], tadd[], tand[]; 487 extern long targ[], tasadd[], tasign[], tcast[]; 488 extern long tdot[], tfunct[], tindir[], tmul[]; 489 extern long tnot[], trel[], tsub[]; 490 491 extern char typeaf[]; 492 extern char typefd[]; 493 extern char typei[]; 494 extern char typesu[]; 495 extern char typesuv[]; 496 extern char typeu[]; 497 extern char typev[]; 498 extern char typec[]; 499 extern char typeh[]; 500 extern char typeil[]; 501 extern char typeilp[]; 502 extern char typechl[]; 503 extern char typechlv[]; 504 extern char typechlvp[]; 505 extern char typechlp[]; 506 extern char typechlpfd[]; 507 508 EXTERN char* typeword; 509 EXTERN char* typecmplx; 510 511 extern ulong thash1; 512 extern ulong thash2; 513 extern ulong thash3; 514 extern ulong thash[]; 515 516 /* 517 * Inferno.c/Posix.c/Nt.c 518 */ 519 int mywait(int*); 520 int mycreat(char*, int); 521 int systemtype(int); 522 int pathchar(void); 523 int myaccess(char*); 524 char* mygetwd(char*, int); 525 int myexec(char*, char*[]); 526 int mydup(int, int); 527 int myfork(void); 528 int mypipe(int*); 529 void* mysbrk(ulong); 530 531 /* 532 * parser 533 */ 534 int yyparse(void); 535 int mpatof(char*, double*); 536 int mpatov(char*, vlong*); 537 538 /* 539 * lex.c 540 */ 541 void* allocn(void*, long, long); 542 void* alloc(long); 543 void cinit(void); 544 int compile(char*, char**, int); 545 void errorexit(void); 546 int filbuf(void); 547 int getc(void); 548 long getr(void); 549 int getnsc(void); 550 Sym* lookup(void); 551 void main(int, char*[]); 552 void newfile(char*, int); 553 void newio(void); 554 void pushio(void); 555 long escchar(long, int, int); 556 Sym* slookup(char*); 557 void syminit(Sym*); 558 void unget(int); 559 long yylex(void); 560 int Lconv(Fmt*); 561 int Tconv(Fmt*); 562 int FNconv(Fmt*); 563 int Oconv(Fmt*); 564 int Qconv(Fmt*); 565 int VBconv(Fmt*); 566 void setinclude(char*); 567 568 /* 569 * mac.c 570 */ 571 void dodefine(char*); 572 void domacro(void); 573 Sym* getsym(void); 574 long getnsn(void); 575 void linehist(char*, int); 576 void macdef(void); 577 void macprag(void); 578 void macend(void); 579 void macexpand(Sym*, char*); 580 void macif(int); 581 void macinc(void); 582 void maclin(void); 583 void macund(void); 584 585 /* 586 * dcl.c 587 */ 588 Node* doinit(Sym*, Type*, long, Node*); 589 Type* tcopy(Type*); 590 Node* init1(Sym*, Type*, long, int); 591 Node* newlist(Node*, Node*); 592 void adecl(int, Type*, Sym*); 593 int anyproto(Node*); 594 void argmark(Node*, int); 595 void dbgdecl(Sym*); 596 Node* dcllabel(Sym*, int); 597 Node* dodecl(void(*)(int, Type*, Sym*), int, Type*, Node*); 598 Sym* mkstatic(Sym*); 599 void doenum(Sym*, Node*); 600 void snap(Type*); 601 Type* dotag(Sym*, int, int); 602 void edecl(int, Type*, Sym*); 603 Type* fnproto(Node*); 604 Type* fnproto1(Node*); 605 void markdcl(void); 606 Type* paramconv(Type*, int, int); 607 void pdecl(int, Type*, Sym*); 608 Decl* push(void); 609 Decl* push1(Sym*); 610 Node* revertdcl(void); 611 #undef round 612 #define round ccround 613 #undef log2 614 #define log2 cclog2 615 long round(long, int); 616 int rsametype(Type*, Type*, int, int); 617 int sametype(Type*, Type*); 618 ulong sign(Sym*); 619 ulong signature(Type*); 620 void suallign(Type*); 621 void tmerge(Type*, Sym*); 622 void walkparam(Node*, int); 623 void xdecl(int, Type*, Sym*); 624 Node* contig(Sym*, Node*, long); 625 626 /* 627 * com.c 628 */ 629 void ccom(Node*); 630 void complex(Node*); 631 int tcom(Node*); 632 int tcoma(Node*, Node*, Type*, int); 633 int tcomd(Node*); 634 int tcomo(Node*, int); 635 int tcomx(Node*); 636 int tlvalue(Node*); 637 void constas(Node*, Type*, Type*); 638 639 /* 640 * con.c 641 */ 642 void acom(Node*); 643 void acom1(vlong, Node*); 644 void acom2(Node*, Type*); 645 int acomcmp1(const void*, const void*); 646 int acomcmp2(const void*, const void*); 647 int addo(Node*); 648 void evconst(Node*); 649 650 /* 651 * funct.c 652 */ 653 int isfunct(Node*); 654 void dclfunct(Type*, Sym*); 655 656 /* 657 * sub.c 658 */ 659 void arith(Node*, int); 660 int deadheads(Node*); 661 Type* dotsearch(Sym*, Type*, Node*, long*); 662 long dotoffset(Type*, Type*, Node*); 663 void gethunk(void); 664 Node* invert(Node*); 665 int bitno(long); 666 void makedot(Node*, Type*, long); 667 int mixedasop(Type*, Type*); 668 Node* new(int, Node*, Node*); 669 Node* new1(int, Node*, Node*); 670 int nilcast(Type*, Type*); 671 int nocast(Type*, Type*); 672 void prtree(Node*, char*); 673 void prtree1(Node*, int, int); 674 void relcon(Node*, Node*); 675 int relindex(int); 676 int simpleg(long); 677 Type* garbt(Type*, long); 678 int simplec(long); 679 Type* simplet(long); 680 int stcompat(Node*, Type*, Type*, long[]); 681 int tcompat(Node*, Type*, Type*, long[]); 682 void tinit(void); 683 Type* typ(int, Type*); 684 Type* copytyp(Type*); 685 void typeext(Type*, Node*); 686 void typeext1(Type*, Node*); 687 int side(Node*); 688 int vconst(Node*); 689 int log2(uvlong); 690 int vlog(Node*); 691 int topbit(ulong); 692 void simplifyshift(Node*); 693 long typebitor(long, long); 694 void diag(Node*, char*, ...); 695 void warn(Node*, char*, ...); 696 void yyerror(char*, ...); 697 void fatal(Node*, char*, ...); 698 699 /* 700 * acid.c 701 */ 702 void acidtype(Type*); 703 void acidvar(Sym*); 704 705 /* 706 * pickle.c 707 */ 708 void pickletype(Type*); 709 710 /* 711 * bits.c 712 */ 713 Bits bor(Bits, Bits); 714 Bits band(Bits, Bits); 715 Bits bnot(Bits); 716 int bany(Bits*); 717 int bnum(Bits); 718 Bits blsh(uint); 719 int beq(Bits, Bits); 720 int bset(Bits, uint); 721 722 /* 723 * dpchk.c 724 */ 725 void dpcheck(Node*); 726 void arginit(void); 727 void pragvararg(void); 728 void pragpack(void); 729 void pragfpround(void); 730 void pragprofile(void); 731 void pragincomplete(void); 732 733 /* 734 * calls to machine depend part 735 */ 736 void codgen(Node*, Node*); 737 void gclean(void); 738 void gextern(Sym*, Node*, long, long); 739 void ginit(void); 740 long outstring(char*, long); 741 long outlstring(ushort*, long); 742 void sextern(Sym*, Node*, long, long); 743 void xcom(Node*); 744 long exreg(Type*); 745 long align(long, Type*, int); 746 long maxround(long, long); 747 748 extern schar ewidth[]; 749 750 /* 751 * com64 752 */ 753 int com64(Node*); 754 void com64init(void); 755 void bool64(Node*); 756 double convvtof(vlong); 757 vlong convftov(double); 758 double convftox(double, int); 759 vlong convvtox(vlong, int); 760 761 /* 762 * machcap 763 */ 764 int machcap(Node*); 765 766 #pragma varargck argpos warn 2 767 #pragma varargck argpos diag 2 768 #pragma varargck argpos yyerror 1 769 770 #pragma varargck type "F" Node* 771 #pragma varargck type "L" long 772 #pragma varargck type "Q" long 773 #pragma varargck type "O" int 774 #pragma varargck type "T" Type* 775 #pragma varargck type "|" int 776