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; 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 maxinclude; 455 EXTERN int nerrors; 456 EXTERN int newflag; 457 EXTERN long nhunk; 458 EXTERN int ninclude; 459 EXTERN Node* nodproto; 460 EXTERN Node* nodcast; 461 EXTERN Biobuf outbuf; 462 EXTERN Biobuf diagbuf; 463 EXTERN char* outfile; 464 EXTERN char* pathname; 465 EXTERN int peekc; 466 EXTERN long stkoff; 467 EXTERN Type* strf; 468 EXTERN Type* strl; 469 EXTERN char symb[NSYMB]; 470 EXTERN Sym* symstring; 471 EXTERN int taggen; 472 EXTERN Type* tfield; 473 EXTERN Type* tufield; 474 EXTERN int thechar; 475 EXTERN char* thestring; 476 EXTERN Type* thisfn; 477 EXTERN long thunk; 478 EXTERN Type* types[NTYPE]; 479 EXTERN Type* fntypes[NTYPE]; 480 EXTERN Node* initlist; 481 EXTERN Term term[NTERM]; 482 EXTERN int nterm; 483 EXTERN int packflg; 484 EXTERN int fproundflg; 485 EXTERN int profileflg; 486 EXTERN int ncontin; 487 EXTERN int newvlongcode; 488 EXTERN int canreach; 489 EXTERN int warnreach; 490 EXTERN Bits zbits; 491 492 extern char *onames[], *tnames[], *gnames[]; 493 extern char *cnames[], *qnames[], *bnames[]; 494 extern char tab[NTYPE][NTYPE]; 495 extern char comrel[], invrel[], logrel[]; 496 extern long ncast[], tadd[], tand[]; 497 extern long targ[], tasadd[], tasign[], tcast[]; 498 extern long tdot[], tfunct[], tindir[], tmul[]; 499 extern long tnot[], trel[], tsub[]; 500 501 extern char typeaf[]; 502 extern char typefd[]; 503 extern char typei[]; 504 extern char typesu[]; 505 extern char typesuv[]; 506 extern char typeu[]; 507 extern char typev[]; 508 extern char typec[]; 509 extern char typeh[]; 510 extern char typeil[]; 511 extern char typeilp[]; 512 extern char typechl[]; 513 extern char typechlv[]; 514 extern char typechlvp[]; 515 extern char typechlp[]; 516 extern char typechlpfd[]; 517 518 EXTERN char* typeswitch; 519 EXTERN char* typeword; 520 EXTERN char* typecmplx; 521 522 extern ulong thash1; 523 extern ulong thash2; 524 extern ulong thash3; 525 extern ulong thash[]; 526 527 /* 528 * compat.c/unix.c/windows.c 529 */ 530 int mywait(int*); 531 int mycreat(char*, int); 532 int systemtype(int); 533 int pathchar(void); 534 int myaccess(char*); 535 char* mygetwd(char*, int); 536 int myexec(char*, char*[]); 537 int mydup(int, int); 538 int myfork(void); 539 int mypipe(int*); 540 void* mysbrk(ulong); 541 542 /* 543 * parser 544 */ 545 int yyparse(void); 546 int mpatov(char*, vlong*); 547 548 /* 549 * lex.c 550 */ 551 void* allocn(void*, long, long); 552 void* alloc(long); 553 void cinit(void); 554 int compile(char*, char**, int); 555 void errorexit(void); 556 int filbuf(void); 557 int getc(void); 558 long getr(void); 559 int getnsc(void); 560 Sym* lookup(void); 561 void main(int, char*[]); 562 void newfile(char*, int); 563 void newio(void); 564 void pushio(void); 565 long escchar(long, int, int); 566 Sym* slookup(char*); 567 void syminit(Sym*); 568 void unget(int); 569 long yylex(void); 570 int Lconv(Fmt*); 571 int Tconv(Fmt*); 572 int FNconv(Fmt*); 573 int Oconv(Fmt*); 574 int Qconv(Fmt*); 575 int VBconv(Fmt*); 576 void setinclude(char*); 577 578 /* 579 * mac.c 580 */ 581 void dodefine(char*); 582 void domacro(void); 583 Sym* getsym(void); 584 long getnsn(void); 585 void linehist(char*, int); 586 void macdef(void); 587 void macprag(void); 588 void macend(void); 589 void macexpand(Sym*, char*); 590 void macif(int); 591 void macinc(void); 592 void maclin(void); 593 void macund(void); 594 595 /* 596 * dcl.c 597 */ 598 Node* doinit(Sym*, Type*, long, Node*); 599 Type* tcopy(Type*); 600 Node* init1(Sym*, Type*, long, int); 601 Node* newlist(Node*, Node*); 602 void adecl(int, Type*, Sym*); 603 int anyproto(Node*); 604 void argmark(Node*, int); 605 void dbgdecl(Sym*); 606 Node* dcllabel(Sym*, int); 607 Node* dodecl(void(*)(int, Type*, Sym*), int, Type*, Node*); 608 Sym* mkstatic(Sym*); 609 void doenum(Sym*, Node*); 610 void snap(Type*); 611 Type* dotag(Sym*, int, int); 612 void edecl(int, Type*, Sym*); 613 Type* fnproto(Node*); 614 Type* fnproto1(Node*); 615 void markdcl(void); 616 Type* paramconv(Type*, int); 617 void pdecl(int, Type*, Sym*); 618 Decl* push(void); 619 Decl* push1(Sym*); 620 Node* revertdcl(void); 621 long round(long, int); 622 int rsametype(Type*, Type*, int, int); 623 int sametype(Type*, Type*); 624 ulong sign(Sym*); 625 ulong signature(Type*); 626 void sualign(Type*); 627 void tmerge(Type*, Sym*); 628 void walkparam(Node*, int); 629 void xdecl(int, Type*, Sym*); 630 Node* contig(Sym*, Node*, long); 631 632 /* 633 * com.c 634 */ 635 void ccom(Node*); 636 void complex(Node*); 637 int tcom(Node*); 638 int tcoma(Node*, Node*, Type*, int); 639 int tcomd(Node*); 640 int tcomo(Node*, int); 641 int tcomx(Node*); 642 int tlvalue(Node*); 643 void constas(Node*, Type*, Type*); 644 Node* uncomma(Node*); 645 Node* uncomargs(Node*); 646 647 /* 648 * con.c 649 */ 650 void acom(Node*); 651 void acom1(vlong, Node*); 652 void acom2(Node*, Type*); 653 int acomcmp1(const void*, const void*); 654 int acomcmp2(const void*, const void*); 655 int addo(Node*); 656 void evconst(Node*); 657 658 /* 659 * funct.c 660 */ 661 int isfunct(Node*); 662 void dclfunct(Type*, Sym*); 663 664 /* 665 * sub.c 666 */ 667 void arith(Node*, int); 668 int deadheads(Node*); 669 Type* dotsearch(Sym*, Type*, Node*, long*); 670 long dotoffset(Type*, Type*, Node*); 671 void gethunk(void); 672 Node* invert(Node*); 673 int bitno(long); 674 void makedot(Node*, Type*, long); 675 int mixedasop(Type*, Type*); 676 Node* new(int, Node*, Node*); 677 Node* new1(int, Node*, Node*); 678 int nilcast(Type*, Type*); 679 int nocast(Type*, Type*); 680 void prtree(Node*, char*); 681 void prtree1(Node*, int, int); 682 void relcon(Node*, Node*); 683 int relindex(int); 684 int simpleg(long); 685 Type* garbt(Type*, long); 686 int simplec(long); 687 Type* simplet(long); 688 int stcompat(Node*, Type*, Type*, long[]); 689 int tcompat(Node*, Type*, Type*, long[]); 690 void tinit(void); 691 Type* typ(int, Type*); 692 Type* copytyp(Type*); 693 void typeext(Type*, Node*); 694 void typeext1(Type*, Node*); 695 int side(Node*); 696 int vconst(Node*); 697 int log2(uvlong); 698 int vlog(Node*); 699 int topbit(ulong); 700 void simplifyshift(Node*); 701 long typebitor(long, long); 702 void diag(Node*, char*, ...); 703 void warn(Node*, char*, ...); 704 void yyerror(char*, ...); 705 void fatal(Node*, char*, ...); 706 707 /* 708 * acid.c 709 */ 710 void acidtype(Type*); 711 void acidvar(Sym*); 712 713 /* 714 * pickle.c 715 */ 716 void pickletype(Type*); 717 718 /* 719 * bits.c 720 */ 721 Bits bor(Bits, Bits); 722 Bits band(Bits, Bits); 723 Bits bnot(Bits); 724 int bany(Bits*); 725 int bnum(Bits); 726 Bits blsh(uint); 727 int beq(Bits, Bits); 728 int bset(Bits, uint); 729 730 /* 731 * dpchk.c 732 */ 733 void dpcheck(Node*); 734 void arginit(void); 735 void pragvararg(void); 736 void pragpack(void); 737 void pragfpround(void); 738 void pragprofile(void); 739 void pragincomplete(void); 740 741 /* 742 * calls to machine depend part 743 */ 744 void codgen(Node*, Node*); 745 void gclean(void); 746 void gextern(Sym*, Node*, long, long); 747 void ginit(void); 748 long outstring(char*, long); 749 long outlstring(TRune*, long); 750 void xcom(Node*); 751 long exreg(Type*); 752 long align(long, Type*, int); 753 long maxround(long, long); 754 755 extern schar ewidth[]; 756 757 /* 758 * com64 759 */ 760 int com64(Node*); 761 void com64init(void); 762 void bool64(Node*); 763 double convvtof(vlong); 764 vlong convftov(double); 765 double convftox(double, int); 766 vlong convvtox(vlong, int); 767 768 /* 769 * machcap 770 */ 771 int machcap(Node*); 772 773 #pragma varargck argpos warn 2 774 #pragma varargck argpos diag 2 775 #pragma varargck argpos yyerror 1 776 777 #pragma varargck type "F" Node* 778 #pragma varargck type "L" long 779 #pragma varargck type "Q" long 780 #pragma varargck type "O" int 781 #pragma varargck type "T" Type* 782 #pragma varargck type "|" int 783