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