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