6 #pragma lib "../cc/cc.a$O"
8 #include "../cc/compat.h"
10 typedef struct Node Node;
11 typedef struct Sym Sym;
12 typedef struct Type Type;
13 typedef struct Funct Funct;
14 typedef struct Decl Decl;
16 typedef struct Hist Hist;
17 typedef struct Term Term;
18 typedef struct Init Init;
19 typedef struct Bits Bits;
27 #define YYMAXDEPTH 1500
31 #define SIGN(n) (1ULL<<(n-1))
32 #define MASK(n) (SIGN(n)|(SIGN(n)-1))
35 #define NVAR (BITS*sizeof(ulong)*8)
49 double fconst; /* fp constant */
50 vlong vconst; /* non fp const */
51 char* cstring; /* character string */
52 Rune* rstring; /* rune string */
97 SIGNINTERN = 1729*325*1729,
131 #define NODECL ((void(*)(int, Type*, Sym*))0)
133 struct Init /* general purpose initialization */
285 OTST, /* used in some compilers */
332 TRUNE = sizeof(Rune)==4? TUINT: TUSHORT,
364 BUSHORT = 1L<<TUSHORT,
370 BUVLONG = 1L<<TUVLONG,
372 BDOUBLE = 1L<<TDOUBLE,
377 BSTRUCT = 1L<<TSTRUCT,
382 BCONSTNT = 1L<<TCONSTNT,
383 BVOLATILE = 1L<<TVOLATILE,
384 BUNSIGNED = 1L<<TUNSIGNED,
385 BSIGNED = 1L<<TSIGNED,
387 BEXTERN = 1L<<TEXTERN,
388 BSTATIC = 1L<<TSTATIC,
389 BTYPEDEF = 1L<<TTYPEDEF,
390 BTYPESTR = 1L<<TTYPESTR,
391 BREGISTER = 1L<<TREGISTER,
393 BINTEGER = BCHAR|BUCHAR|BSHORT|BUSHORT|BINT|BUINT|
394 BLONG|BULONG|BVLONG|BUVLONG,
395 BNUMBER = BINTEGER|BFLOAT|BDOUBLE,
397 /* these can be overloaded with complex types */
399 BCLASS = BAUTO|BEXTERN|BSTATIC|BTYPEDEF|BTYPESTR|BREGISTER,
400 BGARB = BCONSTNT|BVOLATILE,
412 Type* tenum; /* type of entire enum */
413 Type* cenum; /* type of current enum run */
414 vlong lastenum; /* value of current enum */
415 double floatenum; /* value of current enum */
419 EXTERN long autoffset;
421 EXTERN Decl* dclstack;
422 EXTERN char debug[256];
424 EXTERN long firstbit;
425 EXTERN Sym* firstarg;
426 EXTERN Type* firstargtype;
427 EXTERN Decl* firstdcl;
429 EXTERN Sym* hash[NHASH];
430 EXTERN int hasdoubled;
431 EXTERN char* include[20];
436 EXTERN char lastclass;
437 EXTERN Type* lastdcl;
438 EXTERN long lastfield;
439 EXTERN Type* lasttype;
445 EXTERN Node* nodproto;
446 EXTERN Node* nodcast;
447 EXTERN Biobuf outbuf;
448 EXTERN Biobuf diagbuf;
449 EXTERN char* outfile;
450 EXTERN char* pathname;
455 EXTERN char symb[NSYMB];
456 EXTERN Sym* symstring;
459 EXTERN Type* tufield;
461 EXTERN char* thestring;
463 EXTERN Type* types[NTYPE];
464 EXTERN Type* fntypes[NTYPE];
465 EXTERN Node* initlist;
466 EXTERN Term term[NTERM];
469 EXTERN int fproundflg;
470 EXTERN int profileflg;
472 EXTERN int newvlongcode;
474 EXTERN int warnreach;
477 extern char *onames[], *tnames[], *gnames[];
478 extern char *cnames[], *qnames[], *bnames[];
479 extern char tab[NTYPE][NTYPE];
480 extern char comrel[], invrel[], logrel[];
481 extern long ncast[], tadd[], tand[];
482 extern long targ[], tasadd[], tasign[], tcast[];
483 extern long tdot[], tfunct[], tindir[], tmul[];
484 extern long tnot[], trel[], tsub[];
486 extern char typeaf[];
487 extern char typefd[];
489 extern char typesu[];
490 extern char typesuv[];
495 extern char typeil[];
496 extern char typeilp[];
497 extern char typechl[];
498 extern char typechlv[];
499 extern char typechlvp[];
500 extern char typechlp[];
501 extern char typechlpfd[];
503 EXTERN char* typeswitch;
504 EXTERN char* typeword;
505 EXTERN char* typecmplx;
510 extern ulong thash[];
516 int mpatov(char*, vlong*);
522 int compile(char*, char**, int);
523 void errorexit(void);
529 void main(int, char*[]);
530 void newfile(char*, int);
533 long escchar(long, int, int);
544 void setinclude(char*);
549 void dodefine(char*);
553 void linehist(char*, int);
557 void macexpand(Sym*, char*);
566 Node* doinit(Sym*, Type*, long, Node*);
568 Node* init1(Sym*, Type*, long, int);
569 Node* newlist(Node*, Node*);
570 void adecl(int, Type*, Sym*);
572 void argmark(Node*, int);
574 Node* dcllabel(Sym*, int);
575 Node* dodecl(void(*)(int, Type*, Sym*), int, Type*, Node*);
577 void doenum(Sym*, Node*);
579 Type* dotag(Sym*, int, int);
580 void edecl(int, Type*, Sym*);
581 Type* fnproto(Node*);
582 Type* fnproto1(Node*);
584 Type* paramconv(Type*, int);
585 void pdecl(int, Type*, Sym*);
588 Node* revertdcl(void);
589 long round(long, int);
590 int rsametype(Type*, Type*, int, int);
591 int sametype(Type*, Type*);
593 ulong signature(Type*);
595 void tmerge(Type*, Sym*);
596 void walkparam(Node*, int);
597 void xdecl(int, Type*, Sym*);
598 Node* contig(Sym*, Node*, long);
606 int tcoma(Node*, Node*, Type*, int);
608 int tcomo(Node*, int);
611 void constas(Node*, Type*, Type*);
612 Node* uncomma(Node*);
613 Node* uncomargs(Node*);
619 void acom1(vlong, Node*);
620 void acom2(Node*, Type*);
621 int acomcmp1(const void*, const void*);
622 int acomcmp2(const void*, const void*);
630 void dclfunct(Type*, Sym*);
635 void arith(Node*, int);
637 int deadheads(Node*);
638 Type* dotsearch(Sym*, Type*, Node*, long*);
639 long dotoffset(Type*, Type*, Node*);
642 void makedot(Node*, Type*, long);
643 int mixedasop(Type*, Type*);
644 Node* new(int, Node*, Node*);
645 Node* new1(int, Node*, Node*);
646 int nilcast(Type*, Type*);
647 int nocast(Type*, Type*);
648 void prtree(Node*, char*);
649 void prtree1(Node*, int, int);
650 void relcon(Node*, Node*);
653 Type* garbt(Type*, long);
656 int stcompat(Node*, Type*, Type*, long[]);
657 int tcompat(Node*, Type*, Type*, long[]);
659 Type* typ(int, Type*);
660 Type* copytyp(Type*);
661 void typeext(Type*, Node*);
662 void typeext1(Type*, Node*);
669 void simplifyshift(Node*);
671 long typebitor(long, long);
672 void diag(Node*, char*, ...);
673 void warn(Node*, char*, ...);
674 void yyerror(char*, ...);
675 void fatal(Node*, char*, ...);
680 void acidtype(Type*);
686 void pickletype(Type*);
691 Bits bor(Bits, Bits);
692 Bits band(Bits, Bits);
698 int bset(Bits, uint);
705 void pragvararg(void);
707 void pragfpround(void);
708 void pragprofile(void);
709 void pragincomplete(void);
712 * calls to machine depend part
714 void codgen(Node*, Node*);
716 void gextern(Sym*, Node*, long, long);
718 long outstring(char*, long);
719 long outlstring(Rune*, long);
720 void sextern(Sym*, Node*, long, long);
723 long align(long, Type*, int);
724 long maxround(long, long);
726 extern schar ewidth[];
732 void com64init(void);
734 double convvtof(vlong);
735 vlong convftov(double);
736 double convftox(double, int);
737 vlong convvtox(vlong, int);
744 #pragma varargck argpos warn 2
745 #pragma varargck argpos diag 2
746 #pragma varargck argpos yyerror 1
748 #pragma varargck type "F" Node*
749 #pragma varargck type "L" long
750 #pragma varargck type "Q" long
751 #pragma varargck type "O" int
752 #pragma varargck type "T" Type*
753 #pragma varargck type "|" int