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