github.com/xushiwei/go@v0.0.0-20130601165731-2b9d83f45bc9/src/cmd/cc/cc.h (about) 1 // Inferno utils/cc/cc.h 2 // http://code.google.com/p/inferno-os/source/browse/utils/cc/cc.h 3 // 4 // Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved. 5 // Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net) 6 // Portions Copyright © 1997-1999 Vita Nuova Limited 7 // Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com) 8 // Portions Copyright © 2004,2006 Bruce Ellis 9 // Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net) 10 // Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others 11 // Portions Copyright © 2009 The Go Authors. All rights reserved. 12 // 13 // Permission is hereby granted, free of charge, to any person obtaining a copy 14 // of this software and associated documentation files (the "Software"), to deal 15 // in the Software without restriction, including without limitation the rights 16 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 17 // copies of the Software, and to permit persons to whom the Software is 18 // furnished to do so, subject to the following conditions: 19 // 20 // The above copyright notice and this permission notice shall be included in 21 // all copies or substantial portions of the Software. 22 // 23 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 24 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 25 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 26 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 27 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 28 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 29 // THE SOFTWARE. 30 31 #include <libc.h> 32 #include <bio.h> 33 34 #ifndef EXTERN 35 #define EXTERN extern 36 #endif 37 38 #undef getc 39 #undef ungetc 40 #undef BUFSIZ 41 42 #define getc ccgetc 43 #define ungetc ccungetc 44 45 typedef struct Node Node; 46 typedef struct Sym Sym; 47 typedef struct Type Type; 48 typedef struct Funct Funct; 49 typedef struct Decl Decl; 50 typedef struct Io Io; 51 typedef struct Hist Hist; 52 typedef struct Term Term; 53 typedef struct Init Init; 54 typedef struct Bits Bits; 55 typedef struct Dynimp Dynimp; 56 typedef struct Dynexp Dynexp; 57 58 #define BUFSIZ 8192 59 #define NSYMB 500 60 #define NHASH 1024 61 #define STRINGSZ 200 62 #define HISTSZ 20 63 #define YYMAXDEPTH 500 64 #define NTERM 10 65 #define MAXALIGN 7 66 67 #define SIGN(n) ((uvlong)1<<(n-1)) 68 #define MASK(n) (SIGN(n)|(SIGN(n)-1)) 69 70 #define BITS 5 71 #define NVAR (BITS*sizeof(uint32)*8) 72 struct Bits 73 { 74 uint32 b[BITS]; 75 }; 76 77 struct Node 78 { 79 Node* left; 80 Node* right; 81 void* label; 82 int32 pc; 83 int reg; 84 int32 xoffset; 85 double fconst; /* fp constant */ 86 vlong vconst; /* non fp const */ 87 char* cstring; /* character string */ 88 ushort* rstring; /* rune string */ 89 90 Sym* sym; 91 Type* type; 92 int32 lineno; 93 uchar op; 94 uchar oldop; 95 uchar xcast; 96 uchar class; 97 uchar etype; 98 uchar complex; 99 uchar addable; 100 uchar scale; 101 uchar garb; 102 }; 103 #define Z ((Node*)0) 104 105 struct Sym 106 { 107 Sym* link; 108 Type* type; 109 Type* suetag; 110 Type* tenum; 111 char* macro; 112 int32 varlineno; 113 int32 offset; 114 vlong vconst; 115 double fconst; 116 Node* label; 117 ushort lexical; 118 char *name; 119 ushort block; 120 ushort sueblock; 121 uchar class; 122 uchar sym; 123 uchar aused; 124 uchar sig; 125 uchar dataflag; 126 }; 127 #define S ((Sym*)0) 128 129 enum{ 130 SIGNONE = 0, 131 SIGDONE = 1, 132 SIGINTERN = 2, 133 134 SIGNINTERN = 1729*325*1729, 135 }; 136 137 struct Decl 138 { 139 Decl* link; 140 Sym* sym; 141 Type* type; 142 int32 varlineno; 143 int32 offset; 144 short val; 145 ushort block; 146 uchar class; 147 uchar aused; 148 }; 149 #define D ((Decl*)0) 150 151 struct Type 152 { 153 Sym* sym; 154 Sym* tag; 155 Funct* funct; 156 Type* link; 157 Type* down; 158 int32 width; 159 int32 offset; 160 int32 lineno; 161 uchar shift; 162 uchar nbits; 163 uchar etype; 164 uchar garb; 165 uchar align; 166 }; 167 168 #define T ((Type*)0) 169 #define NODECL ((void(*)(int, Type*, Sym*))0) 170 171 struct Init /* general purpose initialization */ 172 { 173 int code; 174 uint32 value; 175 char* s; 176 }; 177 178 EXTERN struct 179 { 180 char* p; 181 int c; 182 } fi; 183 184 struct Io 185 { 186 Io* link; 187 char* p; 188 char b[BUFSIZ]; 189 short c; 190 short f; 191 }; 192 #define I ((Io*)0) 193 194 struct Hist 195 { 196 Hist* link; 197 char* name; 198 int32 line; 199 int32 offset; 200 }; 201 #define H ((Hist*)0) 202 EXTERN Hist* hist; 203 204 struct Term 205 { 206 vlong mult; 207 Node *node; 208 }; 209 210 enum 211 { 212 Axxx, 213 Ael1, 214 Ael2, 215 Asu2, 216 Aarg0, 217 Aarg1, 218 Aarg2, 219 Aaut3, 220 NALIGN, 221 }; 222 223 enum 224 { 225 DMARK, 226 DAUTO, 227 DSUE, 228 DLABEL, 229 }; 230 enum 231 { 232 OXXX, 233 OADD, 234 OADDR, 235 OAND, 236 OANDAND, 237 OARRAY, 238 OAS, 239 OASI, 240 OASADD, 241 OASAND, 242 OASASHL, 243 OASASHR, 244 OASDIV, 245 OASHL, 246 OASHR, 247 OASLDIV, 248 OASLMOD, 249 OASLMUL, 250 OASLSHR, 251 OASMOD, 252 OASMUL, 253 OASOR, 254 OASSUB, 255 OASXOR, 256 OBIT, 257 OBREAK, 258 OCASE, 259 OCAST, 260 OCOMMA, 261 OCOND, 262 OCONST, 263 OCONTINUE, 264 ODIV, 265 ODOT, 266 ODOTDOT, 267 ODWHILE, 268 OENUM, 269 OEQ, 270 OEXREG, 271 OFOR, 272 OFUNC, 273 OGE, 274 OGOTO, 275 OGT, 276 OHI, 277 OHS, 278 OIF, 279 OIND, 280 OINDREG, 281 OINIT, 282 OLABEL, 283 OLDIV, 284 OLE, 285 OLIST, 286 OLMOD, 287 OLMUL, 288 OLO, 289 OLS, 290 OLSHR, 291 OLT, 292 OMOD, 293 OMUL, 294 ONAME, 295 ONE, 296 ONOT, 297 OOR, 298 OOROR, 299 OPOSTDEC, 300 OPOSTINC, 301 OPREDEC, 302 OPREINC, 303 OPREFETCH, 304 OPROTO, 305 OREGISTER, 306 ORETURN, 307 OSET, 308 OSIGN, 309 OSIZE, 310 OSTRING, 311 OLSTRING, 312 OSTRUCT, 313 OSUB, 314 OSWITCH, 315 OUNION, 316 OUSED, 317 OWHILE, 318 OXOR, 319 ONEG, 320 OCOM, 321 OPOS, 322 OELEM, 323 324 OTST, /* used in some compilers */ 325 OINDEX, 326 OFAS, 327 OREGPAIR, 328 OROTL, 329 330 OEND 331 }; 332 enum 333 { 334 TXXX, 335 TCHAR, 336 TUCHAR, 337 TSHORT, 338 TUSHORT, 339 TINT, 340 TUINT, 341 TLONG, 342 TULONG, 343 TVLONG, 344 TUVLONG, 345 TFLOAT, 346 TDOUBLE, 347 TIND, 348 TFUNC, 349 TARRAY, 350 TVOID, 351 TSTRUCT, 352 TUNION, 353 TENUM, 354 NTYPE, 355 356 TAUTO = NTYPE, 357 TEXTERN, 358 TSTATIC, 359 TTYPEDEF, 360 TTYPESTR, 361 TREGISTER, 362 TCONSTNT, 363 TVOLATILE, 364 TUNSIGNED, 365 TSIGNED, 366 TDOT, 367 TFILE, 368 TOLD, 369 NALLTYPES, 370 }; 371 enum 372 { 373 CXXX, 374 CAUTO, 375 CEXTERN, 376 CGLOBL, 377 CSTATIC, 378 CLOCAL, 379 CTYPEDEF, 380 CTYPESTR, 381 CPARAM, 382 CSELEM, 383 CLABEL, 384 CEXREG, 385 NCTYPES, 386 }; 387 enum 388 { 389 GXXX = 0, 390 GCONSTNT = 1<<0, 391 GVOLATILE = 1<<1, 392 NGTYPES = 1<<2, 393 394 GINCOMPLETE = 1<<2, 395 }; 396 enum 397 { 398 BCHAR = 1L<<TCHAR, 399 BUCHAR = 1L<<TUCHAR, 400 BSHORT = 1L<<TSHORT, 401 BUSHORT = 1L<<TUSHORT, 402 BINT = 1L<<TINT, 403 BUINT = 1L<<TUINT, 404 BLONG = 1L<<TLONG, 405 BULONG = 1L<<TULONG, 406 BVLONG = 1L<<TVLONG, 407 BUVLONG = 1L<<TUVLONG, 408 BFLOAT = 1L<<TFLOAT, 409 BDOUBLE = 1L<<TDOUBLE, 410 BIND = 1L<<TIND, 411 BFUNC = 1L<<TFUNC, 412 BARRAY = 1L<<TARRAY, 413 BVOID = 1L<<TVOID, 414 BSTRUCT = 1L<<TSTRUCT, 415 BUNION = 1L<<TUNION, 416 BENUM = 1L<<TENUM, 417 BFILE = 1L<<TFILE, 418 BDOT = 1L<<TDOT, 419 BCONSTNT = 1L<<TCONSTNT, 420 BVOLATILE = 1L<<TVOLATILE, 421 BUNSIGNED = 1L<<TUNSIGNED, 422 BSIGNED = 1L<<TSIGNED, 423 BAUTO = 1L<<TAUTO, 424 BEXTERN = 1L<<TEXTERN, 425 BSTATIC = 1L<<TSTATIC, 426 BTYPEDEF = 1L<<TTYPEDEF, 427 BTYPESTR = 1L<<TTYPESTR, 428 BREGISTER = 1L<<TREGISTER, 429 430 BINTEGER = BCHAR|BUCHAR|BSHORT|BUSHORT|BINT|BUINT| 431 BLONG|BULONG|BVLONG|BUVLONG, 432 BNUMBER = BINTEGER|BFLOAT|BDOUBLE, 433 434 /* these can be overloaded with complex types */ 435 436 BCLASS = BAUTO|BEXTERN|BSTATIC|BTYPEDEF|BTYPESTR|BREGISTER, 437 BGARB = BCONSTNT|BVOLATILE, 438 }; 439 440 struct Funct 441 { 442 Sym* sym[OEND]; 443 Sym* castto[NTYPE]; 444 Sym* castfr[NTYPE]; 445 }; 446 447 EXTERN struct 448 { 449 Type* tenum; /* type of entire enum */ 450 Type* cenum; /* type of current enum run */ 451 vlong lastenum; /* value of current enum */ 452 double floatenum; /* value of current enum */ 453 } en; 454 455 EXTERN int autobn; 456 EXTERN int32 autoffset; 457 EXTERN int blockno; 458 EXTERN Decl* dclstack; 459 EXTERN int debug[256]; 460 EXTERN Hist* ehist; 461 EXTERN int32 firstbit; 462 EXTERN Sym* firstarg; 463 EXTERN Type* firstargtype; 464 EXTERN Decl* firstdcl; 465 EXTERN int fperror; 466 EXTERN Sym* hash[NHASH]; 467 EXTERN char* hunk; 468 EXTERN char** include; 469 EXTERN Io* iofree; 470 EXTERN Io* ionext; 471 EXTERN Io* iostack; 472 EXTERN int32 lastbit; 473 EXTERN char lastclass; 474 EXTERN Type* lastdcl; 475 EXTERN int32 lastfield; 476 EXTERN Type* lasttype; 477 EXTERN int32 lineno; 478 EXTERN int32 nearln; 479 EXTERN int nerrors; 480 EXTERN int newflag; 481 EXTERN int32 nhunk; 482 EXTERN int ninclude; 483 EXTERN Node* nodproto; 484 EXTERN Node* nodcast; 485 EXTERN int32 nsymb; 486 EXTERN Biobuf outbuf; 487 EXTERN Biobuf diagbuf; 488 EXTERN char* outfile; 489 EXTERN char* pathname; 490 EXTERN int peekc; 491 EXTERN int32 stkoff; 492 EXTERN Type* strf; 493 EXTERN Type* strl; 494 EXTERN char* symb; 495 EXTERN Sym* symstring; 496 EXTERN int taggen; 497 EXTERN Type* tfield; 498 EXTERN Type* tufield; 499 EXTERN int thechar; 500 EXTERN char* thestring; 501 EXTERN Type* thisfn; 502 EXTERN int32 thunk; 503 EXTERN Type* types[NALLTYPES]; 504 EXTERN Type* fntypes[NALLTYPES]; 505 EXTERN Node* initlist; 506 EXTERN Term term[NTERM]; 507 EXTERN int nterm; 508 EXTERN int packflg; 509 EXTERN int fproundflg; 510 EXTERN int textflag; 511 EXTERN int dataflag; 512 EXTERN int flag_largemodel; 513 EXTERN int ncontin; 514 EXTERN int canreach; 515 EXTERN int warnreach; 516 EXTERN Bits zbits; 517 EXTERN Fmt pragcgobuf; 518 519 extern char *onames[], *tnames[], *gnames[]; 520 extern char *cnames[], *qnames[], *bnames[]; 521 extern uchar tab[NTYPE][NTYPE]; 522 extern uchar comrel[], invrel[], logrel[]; 523 extern int32 ncast[], tadd[], tand[]; 524 extern int32 targ[], tasadd[], tasign[], tcast[]; 525 extern int32 tdot[], tfunct[], tindir[], tmul[]; 526 extern int32 tnot[], trel[], tsub[]; 527 528 extern uchar typeaf[]; 529 extern uchar typefd[]; 530 extern uchar typei[]; 531 extern uchar typesu[]; 532 extern uchar typesuv[]; 533 extern uchar typeu[]; 534 extern uchar typev[]; 535 extern uchar typec[]; 536 extern uchar typeh[]; 537 extern uchar typeil[]; 538 extern uchar typeilp[]; 539 extern uchar typechl[]; 540 extern uchar typechlv[]; 541 extern uchar typechlvp[]; 542 extern uchar typechlp[]; 543 extern uchar typechlpfd[]; 544 545 EXTERN uchar* typeword; 546 EXTERN uchar* typecmplx; 547 548 extern uint32 thash1; 549 extern uint32 thash2; 550 extern uint32 thash3; 551 extern uint32 thash[]; 552 553 /* 554 * compat.c/unix.c/windows.c 555 */ 556 int systemtype(int); 557 int pathchar(void); 558 559 /* 560 * parser 561 */ 562 int yyparse(void); 563 int mpatov(char*, vlong*); 564 565 /* 566 * lex.c 567 */ 568 void* allocn(void*, int32, int32); 569 void* alloc(int32); 570 void ensuresymb(int32); 571 void cinit(void); 572 int compile(char*, char**, int); 573 void errorexit(void); 574 int filbuf(void); 575 int getc(void); 576 int32 getr(void); 577 int getnsc(void); 578 Sym* lookup(void); 579 void main(int, char*[]); 580 void newfile(char*, int); 581 void newio(void); 582 void pushio(void); 583 int32 escchar(int32, int, int); 584 Sym* slookup(char*); 585 void syminit(Sym*); 586 void unget(int); 587 int32 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 int32 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*, int32, Node*); 617 Type* tcopy(Type*); 618 Node* init1(Sym*, Type*, int32, 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*); 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 int32 xround(int32, int); 640 int rsametype(Type*, Type*, int, int); 641 int sametype(Type*, Type*); 642 uint32 sign(Sym*); 643 uint32 signature(Type*); 644 void sualign(Type*); 645 void tmerge(Type*, Sym*); 646 void walkparam(Node*, int); 647 void xdecl(int, Type*, Sym*); 648 Node* contig(Sym*, Node*, int32); 649 650 /* 651 * com.c 652 */ 653 void ccom(Node*); 654 void complex(Node*); 655 int tcom(Node*); 656 int tcoma(Node*, Node*, Type*, int); 657 int tcomd(Node*); 658 int tcomo(Node*, int); 659 int tcomx(Node*); 660 int tlvalue(Node*); 661 void constas(Node*, Type*, Type*); 662 663 /* 664 * con.c 665 */ 666 void acom(Node*); 667 void acom1(vlong, Node*); 668 void acom2(Node*, Type*); 669 int acomcmp1(const void*, const void*); 670 int acomcmp2(const void*, const void*); 671 int addo(Node*); 672 void evconst(Node*); 673 674 /* 675 * funct.c 676 */ 677 int isfunct(Node*); 678 void dclfunct(Type*, Sym*); 679 680 /* 681 * sub.c 682 */ 683 void arith(Node*, int); 684 int deadheads(Node*); 685 Type* dotsearch(Sym*, Type*, Node*, int32*); 686 int32 dotoffset(Type*, Type*, Node*); 687 void gethunk(void); 688 Node* invert(Node*); 689 int bitno(int32); 690 void makedot(Node*, Type*, int32); 691 int mixedasop(Type*, Type*); 692 Node* new(int, Node*, Node*); 693 Node* new1(int, Node*, Node*); 694 int nilcast(Type*, Type*); 695 int nocast(Type*, Type*); 696 void prtree(Node*, char*); 697 void prtree1(Node*, int, int); 698 void relcon(Node*, Node*); 699 int relindex(int); 700 int simpleg(int32); 701 Type* garbt(Type*, int32); 702 int simplec(int32); 703 Type* simplet(int32); 704 int stcompat(Node*, Type*, Type*, int32[]); 705 int tcompat(Node*, Type*, Type*, int32[]); 706 void tinit(void); 707 Type* typ(int, Type*); 708 Type* copytyp(Type*); 709 void typeext(Type*, Node*); 710 void typeext1(Type*, Node*); 711 int side(Node*); 712 int vconst(Node*); 713 int xlog2(uvlong); 714 int vlog(Node*); 715 int topbit(uint32); 716 void simplifyshift(Node*); 717 int32 typebitor(int32, int32); 718 void diag(Node*, char*, ...); 719 void warn(Node*, char*, ...); 720 void yyerror(char*, ...); 721 void fatal(Node*, char*, ...); 722 723 /* 724 * acid.c 725 */ 726 void acidtype(Type*); 727 void acidvar(Sym*); 728 729 /* 730 * godefs.c 731 */ 732 int Uconv(Fmt*); 733 void godeftype(Type*); 734 void godefvar(Sym*); 735 736 /* 737 * bits.c 738 */ 739 Bits bor(Bits, Bits); 740 Bits band(Bits, Bits); 741 Bits bnot(Bits); 742 int bany(Bits*); 743 int bnum(Bits); 744 Bits blsh(uint); 745 int beq(Bits, Bits); 746 int bset(Bits, uint); 747 748 /* 749 * dpchk.c 750 */ 751 void dpcheck(Node*); 752 void arginit(void); 753 void pragvararg(void); 754 void pragpack(void); 755 void pragfpround(void); 756 void pragdataflag(void); 757 void pragtextflag(void); 758 void pragincomplete(void); 759 void pragcgo(char*); 760 761 /* 762 * calls to machine depend part 763 */ 764 void codgen(Node*, Node*); 765 void gclean(void); 766 void gextern(Sym*, Node*, int32, int32); 767 void ginit(void); 768 int32 outstring(char*, int32); 769 int32 outlstring(ushort*, int32); 770 void sextern(Sym*, Node*, int32, int32); 771 void xcom(Node*); 772 int32 exreg(Type*); 773 int32 align(int32, Type*, int, int32*); 774 int32 maxround(int32, int32); 775 776 extern schar ewidth[]; 777 778 /* 779 * com64 780 */ 781 int com64(Node*); 782 void com64init(void); 783 void bool64(Node*); 784 double convvtof(vlong); 785 vlong convftov(double); 786 double convftox(double, int); 787 vlong convvtox(vlong, int); 788 789 /* 790 * machcap 791 */ 792 int machcap(Node*); 793 794 #pragma varargck argpos warn 2 795 #pragma varargck argpos diag 2 796 #pragma varargck argpos yyerror 1 797 798 #pragma varargck type "F" Node* 799 #pragma varargck type "L" int32 800 #pragma varargck type "Q" int32 801 #pragma varargck type "O" int 802 #pragma varargck type "O" uint 803 #pragma varargck type "S" ushort* 804 #pragma varargck type "T" Type* 805 #pragma varargck type "U" char* 806 #pragma varargck type "|" int 807 808 enum 809 { 810 Plan9 = 1<<0, 811 Unix = 1<<1, 812 Windows = 1<<2, 813 }; 814 int pathchar(void); 815 int systemtype(int); 816 void* alloc(int32 n); 817 void* allocn(void*, int32, int32);