6 #pragma lib "../cc/cc.a$O"
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;
18 typedef struct Hist Hist;
19 typedef struct Term Term;
20 typedef struct Init Init;
21 typedef struct Bits Bits;
29 #define YYMAXDEPTH 1500
33 #define SIGN(n) (1ULL<<(n-1))
34 #define MASK(n) (SIGN(n)|(SIGN(n)-1))
37 #define NVAR (BITS*sizeof(ulong)*8)
51 double fconst; /* fp constant */
52 vlong vconst; /* non fp const */
53 char* cstring; /* character string */
54 Rune* rstring; /* rune string */
99 SIGNINTERN = 1729*325*1729,
133 #define NODECL ((void(*)(int, Type*, Sym*))0)
135 struct Init /* general purpose initialization */
187 enum /* also in ../{8a,0a}.h */
293 OTST, /* used in some compilers */
340 TRUNE = sizeof(Rune)==4? TUINT: TUSHORT,
372 BUSHORT = 1L<<TUSHORT,
378 BUVLONG = 1L<<TUVLONG,
380 BDOUBLE = 1L<<TDOUBLE,
385 BSTRUCT = 1L<<TSTRUCT,
390 BCONSTNT = 1L<<TCONSTNT,
391 BVOLATILE = 1L<<TVOLATILE,
392 BUNSIGNED = 1L<<TUNSIGNED,
393 BSIGNED = 1L<<TSIGNED,
395 BEXTERN = 1L<<TEXTERN,
396 BSTATIC = 1L<<TSTATIC,
397 BTYPEDEF = 1L<<TTYPEDEF,
398 BTYPESTR = 1L<<TTYPESTR,
399 BREGISTER = 1L<<TREGISTER,
401 BINTEGER = BCHAR|BUCHAR|BSHORT|BUSHORT|BINT|BUINT|
402 BLONG|BULONG|BVLONG|BUVLONG,
403 BNUMBER = BINTEGER|BFLOAT|BDOUBLE,
405 /* these can be overloaded with complex types */
407 BCLASS = BAUTO|BEXTERN|BSTATIC|BTYPEDEF|BTYPESTR|BREGISTER,
408 BGARB = BCONSTNT|BVOLATILE,
420 Type* tenum; /* type of entire enum */
421 Type* cenum; /* type of current enum run */
422 vlong lastenum; /* value of current enum */
423 double floatenum; /* value of current enum */
427 EXTERN long autoffset;
429 EXTERN Decl* dclstack;
430 EXTERN char debug[256];
432 EXTERN long firstbit;
433 EXTERN Sym* firstarg;
434 EXTERN Type* firstargtype;
435 EXTERN Decl* firstdcl;
437 EXTERN Sym* hash[NHASH];
438 EXTERN int hasdoubled;
440 EXTERN char* include[20];
445 EXTERN char lastclass;
446 EXTERN Type* lastdcl;
447 EXTERN long lastfield;
448 EXTERN Type* lasttype;
455 EXTERN Node* nodproto;
456 EXTERN Node* nodcast;
457 EXTERN Biobuf outbuf;
458 EXTERN Biobuf diagbuf;
459 EXTERN char* outfile;
460 EXTERN char* pathname;
465 EXTERN char symb[NSYMB];
466 EXTERN Sym* symstring;
469 EXTERN Type* tufield;
471 EXTERN char* thestring;
474 EXTERN Type* types[NTYPE];
475 EXTERN Type* fntypes[NTYPE];
476 EXTERN Node* initlist;
477 EXTERN Term term[NTERM];
480 EXTERN int fproundflg;
481 EXTERN int profileflg;
483 EXTERN int newvlongcode;
485 EXTERN int warnreach;
488 extern char *onames[], *tnames[], *gnames[];
489 extern char *cnames[], *qnames[], *bnames[];
490 extern char tab[NTYPE][NTYPE];
491 extern char comrel[], invrel[], logrel[];
492 extern long ncast[], tadd[], tand[];
493 extern long targ[], tasadd[], tasign[], tcast[];
494 extern long tdot[], tfunct[], tindir[], tmul[];
495 extern long tnot[], trel[], tsub[];
497 extern char typeaf[];
498 extern char typefd[];
500 extern char typesu[];
501 extern char typesuv[];
506 extern char typeil[];
507 extern char typeilp[];
508 extern char typechl[];
509 extern char typechlv[];
510 extern char typechlvp[];
511 extern char typechlp[];
512 extern char typechlpfd[];
514 EXTERN char* typeswitch;
515 EXTERN char* typeword;
516 EXTERN char* typecmplx;
521 extern ulong thash[];
524 * compat.c/unix.c/windows.c
527 int mycreat(char*, int);
531 char* mygetwd(char*, int);
532 int myexec(char*, char*[]);
542 int mpatov(char*, vlong*);
547 void* allocn(void*, long, long);
550 int compile(char*, char**, int);
551 void errorexit(void);
557 void main(int, char*[]);
558 void newfile(char*, int);
561 long escchar(long, int, int);
572 void setinclude(char*);
577 void dodefine(char*);
581 void linehist(char*, int);
585 void macexpand(Sym*, char*);
594 Node* doinit(Sym*, Type*, long, Node*);
596 Node* init1(Sym*, Type*, long, int);
597 Node* newlist(Node*, Node*);
598 void adecl(int, Type*, Sym*);
600 void argmark(Node*, int);
602 Node* dcllabel(Sym*, int);
603 Node* dodecl(void(*)(int, Type*, Sym*), int, Type*, Node*);
605 void doenum(Sym*, Node*);
607 Type* dotag(Sym*, int, int);
608 void edecl(int, Type*, Sym*);
609 Type* fnproto(Node*);
610 Type* fnproto1(Node*);
612 Type* paramconv(Type*, int);
613 void pdecl(int, Type*, Sym*);
616 Node* revertdcl(void);
617 long round(long, int);
618 int rsametype(Type*, Type*, int, int);
619 int sametype(Type*, Type*);
621 ulong signature(Type*);
623 void tmerge(Type*, Sym*);
624 void walkparam(Node*, int);
625 void xdecl(int, Type*, Sym*);
626 Node* contig(Sym*, Node*, long);
634 int tcoma(Node*, Node*, Type*, int);
636 int tcomo(Node*, int);
639 void constas(Node*, Type*, Type*);
640 Node* uncomma(Node*);
641 Node* uncomargs(Node*);
647 void acom1(vlong, Node*);
648 void acom2(Node*, Type*);
649 int acomcmp1(const void*, const void*);
650 int acomcmp2(const void*, const void*);
658 void dclfunct(Type*, Sym*);
663 void arith(Node*, int);
664 int deadheads(Node*);
665 Type* dotsearch(Sym*, Type*, Node*, long*);
666 long dotoffset(Type*, Type*, Node*);
670 void makedot(Node*, Type*, long);
671 int mixedasop(Type*, Type*);
672 Node* new(int, Node*, Node*);
673 Node* new1(int, Node*, Node*);
674 int nilcast(Type*, Type*);
675 int nocast(Type*, Type*);
676 void prtree(Node*, char*);
677 void prtree1(Node*, int, int);
678 void relcon(Node*, Node*);
681 Type* garbt(Type*, long);
684 int stcompat(Node*, Type*, Type*, long[]);
685 int tcompat(Node*, Type*, Type*, long[]);
687 Type* typ(int, Type*);
688 Type* copytyp(Type*);
689 void typeext(Type*, Node*);
690 void typeext1(Type*, Node*);
696 void simplifyshift(Node*);
697 long typebitor(long, long);
698 void diag(Node*, char*, ...);
699 void warn(Node*, char*, ...);
700 void yyerror(char*, ...);
701 void fatal(Node*, char*, ...);
706 void acidtype(Type*);
712 void pickletype(Type*);
717 Bits bor(Bits, Bits);
718 Bits band(Bits, Bits);
724 int bset(Bits, uint);
731 void pragvararg(void);
733 void pragfpround(void);
734 void pragprofile(void);
735 void pragincomplete(void);
738 * calls to machine depend part
740 void codgen(Node*, Node*);
742 void gextern(Sym*, Node*, long, long);
744 long outstring(char*, long);
745 long outlstring(Rune*, long);
746 void sextern(Sym*, Node*, long, long);
749 long align(long, Type*, int);
750 long maxround(long, long);
752 extern schar ewidth[];
758 void com64init(void);
760 double convvtof(vlong);
761 vlong convftov(double);
762 double convftox(double, int);
763 vlong convvtox(vlong, int);
770 #pragma varargck argpos warn 2
771 #pragma varargck argpos diag 2
772 #pragma varargck argpos yyerror 1
774 #pragma varargck type "F" Node*
775 #pragma varargck type "L" long
776 #pragma varargck type "Q" long
777 #pragma varargck type "O" int
778 #pragma varargck type "T" Type*
779 #pragma varargck type "|" int