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