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 */
146 #define GETC() ((--fi.c < 0)? filbuf(): (*fi.p++ & 0xff))
287 OTST, /* used in some compilers */
334 TRUNE = sizeof(Rune)==4? TUINT: TUSHORT,
366 BUSHORT = 1L<<TUSHORT,
372 BUVLONG = 1L<<TUVLONG,
374 BDOUBLE = 1L<<TDOUBLE,
379 BSTRUCT = 1L<<TSTRUCT,
384 BCONSTNT = 1L<<TCONSTNT,
385 BVOLATILE = 1L<<TVOLATILE,
386 BUNSIGNED = 1L<<TUNSIGNED,
387 BSIGNED = 1L<<TSIGNED,
389 BEXTERN = 1L<<TEXTERN,
390 BSTATIC = 1L<<TSTATIC,
391 BTYPEDEF = 1L<<TTYPEDEF,
392 BTYPESTR = 1L<<TTYPESTR,
393 BREGISTER = 1L<<TREGISTER,
395 BINTEGER = BCHAR|BUCHAR|BSHORT|BUSHORT|BINT|BUINT|
396 BLONG|BULONG|BVLONG|BUVLONG,
397 BNUMBER = BINTEGER|BFLOAT|BDOUBLE,
399 /* these can be overloaded with complex types */
401 BCLASS = BAUTO|BEXTERN|BSTATIC|BTYPEDEF|BTYPESTR|BREGISTER,
402 BGARB = BCONSTNT|BVOLATILE,
414 Type* tenum; /* type of entire enum */
415 Type* cenum; /* type of current enum run */
416 vlong lastenum; /* value of current enum */
417 double floatenum; /* value of current enum */
421 EXTERN long autoffset;
423 EXTERN Decl* dclstack;
424 EXTERN char debug[256];
426 EXTERN long firstbit;
427 EXTERN Sym* firstarg;
428 EXTERN Type* firstargtype;
429 EXTERN Decl* firstdcl;
431 EXTERN Sym* hash[NHASH];
432 EXTERN int hasdoubled;
433 EXTERN char* include[20];
438 EXTERN char lastclass;
439 EXTERN Type* lastdcl;
440 EXTERN long lastfield;
441 EXTERN Type* lasttype;
447 EXTERN Node* nodproto;
448 EXTERN Node* nodcast;
449 EXTERN Biobuf outbuf;
450 EXTERN Biobuf diagbuf;
451 EXTERN char* outfile;
452 EXTERN char* pathname;
457 EXTERN char symb[NSYMB];
458 EXTERN Sym* symstring;
461 EXTERN Type* tufield;
463 EXTERN char* thestring;
465 EXTERN Type* types[NTYPE];
466 EXTERN Type* fntypes[NTYPE];
467 EXTERN Node* initlist;
468 EXTERN Term term[NTERM];
471 EXTERN int fproundflg;
472 EXTERN int profileflg;
474 EXTERN int newvlongcode;
476 EXTERN int warnreach;
479 extern char *onames[], *tnames[], *gnames[];
480 extern char *cnames[], *qnames[], *bnames[];
481 extern char tab[NTYPE][NTYPE];
482 extern char comrel[], invrel[], logrel[];
483 extern long ncast[], tadd[], tand[];
484 extern long targ[], tasadd[], tasign[], tcast[];
485 extern long tdot[], tfunct[], tindir[], tmul[];
486 extern long tnot[], trel[], tsub[];
488 extern char typeaf[];
489 extern char typefd[];
491 extern char typesu[];
492 extern char typesuv[];
497 extern char typeil[];
498 extern char typeilp[];
499 extern char typechl[];
500 extern char typechlv[];
501 extern char typechlvp[];
502 extern char typechlp[];
503 extern char typechlpfd[];
505 EXTERN char* typeswitch;
506 EXTERN char* typeword;
507 EXTERN char* typecmplx;
512 extern ulong thash[];
518 int mpatov(char*, vlong*);
524 int compile(char*, char**, int);
525 void errorexit(void);
531 void main(int, char*[]);
532 void newfile(char*, int);
535 long escchar(long, int, int);
546 void setinclude(char*);
551 void dodefine(char*);
555 void linehist(char*, int);
559 void macexpand(Sym*, char*, int);
568 Node* doinit(Sym*, Type*, long, Node*);
570 Node* init1(Sym*, Type*, long, int);
571 Node* newlist(Node*, Node*);
572 void adecl(int, Type*, Sym*);
574 void argmark(Node*, int);
576 Node* dcllabel(Sym*, int);
577 Node* dodecl(void(*)(int, Type*, Sym*), int, Type*, Node*);
579 void doenum(Sym*, Node*);
581 Type* dotag(Sym*, int, int);
582 void edecl(int, Type*, Sym*);
583 Type* fnproto(Node*);
584 Type* fnproto1(Node*);
586 Type* paramconv(Type*, int);
587 void pdecl(int, Type*, Sym*);
590 Node* revertdcl(void);
591 long round(long, int);
592 int rsametype(Type*, Type*, int, int);
593 int sametype(Type*, Type*);
595 ulong signature(Type*);
597 void tmerge(Type*, Sym*);
598 void walkparam(Node*, int);
599 void xdecl(int, Type*, Sym*);
600 Node* contig(Sym*, Node*, long);
608 int tcoma(Node*, Node*, Type*, int);
610 int tcomo(Node*, int);
613 void constas(Node*, Type*, Type*);
614 Node* uncomma(Node*);
615 Node* uncomargs(Node*);
621 void acom1(vlong, Node*);
622 void acom2(Node*, Type*);
623 int acomcmp1(const void*, const void*);
624 int acomcmp2(const void*, const void*);
632 void dclfunct(Type*, Sym*);
637 void arith(Node*, int);
639 int deadheads(Node*);
640 Type* dotsearch(Sym*, Type*, Node*, long*);
641 long dotoffset(Type*, Type*, Node*);
644 void makedot(Node*, Type*, long);
645 int mixedasop(Type*, Type*);
646 Node* new(int, Node*, Node*);
647 Node* new1(int, Node*, Node*);
648 int nilcast(Type*, Type*);
649 int nocast(Type*, Type*);
650 void prtree(Node*, char*);
651 void prtree1(Node*, int, int);
652 void relcon(Node*, Node*);
655 Type* garbt(Type*, long);
658 int stcompat(Node*, Type*, Type*, long[]);
659 int tcompat(Node*, Type*, Type*, long[]);
661 Type* typ(int, Type*);
662 Type* copytyp(Type*);
663 void typeext(Type*, Node*);
664 void typeext1(Type*, Node*);
671 void simplifyshift(Node*);
673 long typebitor(long, long);
674 void diag(Node*, char*, ...);
675 void warn(Node*, char*, ...);
676 void yyerror(char*, ...);
677 void fatal(Node*, char*, ...);
682 void acidtype(Type*);
688 void pickletype(Type*);
693 Bits bor(Bits, Bits);
694 Bits band(Bits, Bits);
700 int bset(Bits, uint);
707 void pragvararg(void);
709 void pragfpround(void);
710 void pragprofile(void);
711 void pragincomplete(void);
714 * calls to machine depend part
716 void codgen(Node*, Node*);
718 void gextern(Sym*, Node*, long, long);
720 long outstring(char*, long);
721 long outlstring(Rune*, long);
722 void sextern(Sym*, Node*, long, long);
725 long align(long, Type*, int);
726 long maxround(long, long);
728 extern schar ewidth[];
734 void com64init(void);
736 double convvtof(vlong);
737 vlong convftov(double);
738 double convftox(double, int);
739 vlong convvtox(vlong, int);
746 #pragma varargck argpos warn 2
747 #pragma varargck argpos diag 2
748 #pragma varargck argpos yyerror 1
750 #pragma varargck type "F" Node*
751 #pragma varargck type "L" long
752 #pragma varargck type "Q" long
753 #pragma varargck type "O" int
754 #pragma varargck type "T" Type*
755 #pragma varargck type "|" int