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 */
294 OTST, /* used in some compilers */
341 TRUNE = sizeof(Rune)==4? TUINT: TUSHORT,
373 BUSHORT = 1L<<TUSHORT,
379 BUVLONG = 1L<<TUVLONG,
381 BDOUBLE = 1L<<TDOUBLE,
386 BSTRUCT = 1L<<TSTRUCT,
391 BCONSTNT = 1L<<TCONSTNT,
392 BVOLATILE = 1L<<TVOLATILE,
393 BUNSIGNED = 1L<<TUNSIGNED,
394 BSIGNED = 1L<<TSIGNED,
396 BEXTERN = 1L<<TEXTERN,
397 BSTATIC = 1L<<TSTATIC,
398 BTYPEDEF = 1L<<TTYPEDEF,
399 BTYPESTR = 1L<<TTYPESTR,
400 BREGISTER = 1L<<TREGISTER,
402 BINTEGER = BCHAR|BUCHAR|BSHORT|BUSHORT|BINT|BUINT|
403 BLONG|BULONG|BVLONG|BUVLONG,
404 BNUMBER = BINTEGER|BFLOAT|BDOUBLE,
406 /* these can be overloaded with complex types */
408 BCLASS = BAUTO|BEXTERN|BSTATIC|BTYPEDEF|BTYPESTR|BREGISTER,
409 BGARB = BCONSTNT|BVOLATILE,
421 Type* tenum; /* type of entire enum */
422 Type* cenum; /* type of current enum run */
423 vlong lastenum; /* value of current enum */
424 double floatenum; /* value of current enum */
428 EXTERN long autoffset;
430 EXTERN Decl* dclstack;
431 EXTERN char debug[256];
433 EXTERN long firstbit;
434 EXTERN Sym* firstarg;
435 EXTERN Type* firstargtype;
436 EXTERN Decl* firstdcl;
438 EXTERN Sym* hash[NHASH];
439 EXTERN int hasdoubled;
441 EXTERN char* include[20];
446 EXTERN char lastclass;
447 EXTERN Type* lastdcl;
448 EXTERN long lastfield;
449 EXTERN Type* lasttype;
456 EXTERN Node* nodproto;
457 EXTERN Node* nodcast;
458 EXTERN Biobuf outbuf;
459 EXTERN Biobuf diagbuf;
460 EXTERN char* outfile;
461 EXTERN char* pathname;
466 EXTERN char symb[NSYMB];
467 EXTERN Sym* symstring;
470 EXTERN Type* tufield;
472 EXTERN char* thestring;
475 EXTERN Type* types[NTYPE];
476 EXTERN Type* fntypes[NTYPE];
477 EXTERN Node* initlist;
478 EXTERN Term term[NTERM];
481 EXTERN int fproundflg;
482 EXTERN int profileflg;
484 EXTERN int newvlongcode;
486 EXTERN int warnreach;
489 extern char *onames[], *tnames[], *gnames[];
490 extern char *cnames[], *qnames[], *bnames[];
491 extern char tab[NTYPE][NTYPE];
492 extern char comrel[], invrel[], logrel[];
493 extern long ncast[], tadd[], tand[];
494 extern long targ[], tasadd[], tasign[], tcast[];
495 extern long tdot[], tfunct[], tindir[], tmul[];
496 extern long tnot[], trel[], tsub[];
498 extern char typeaf[];
499 extern char typefd[];
501 extern char typesu[];
502 extern char typesuv[];
507 extern char typeil[];
508 extern char typeilp[];
509 extern char typechl[];
510 extern char typechlv[];
511 extern char typechlvp[];
512 extern char typechlp[];
513 extern char typechlpfd[];
515 EXTERN char* typeswitch;
516 EXTERN char* typeword;
517 EXTERN char* typecmplx;
522 extern ulong thash[];
525 * compat.c/unix.c/windows.c
528 int mycreat(char*, int);
532 char* mygetwd(char*, int);
533 int myexec(char*, char*[]);
543 int mpatov(char*, vlong*);
548 void* allocn(void*, long, long);
551 int compile(char*, char**, int);
552 void errorexit(void);
558 void main(int, char*[]);
559 void newfile(char*, int);
562 long escchar(long, int, int);
573 void setinclude(char*);
578 void dodefine(char*);
582 void linehist(char*, int);
586 void macexpand(Sym*, char*);
595 Node* doinit(Sym*, Type*, long, Node*);
597 Node* init1(Sym*, Type*, long, int);
598 Node* newlist(Node*, Node*);
599 void adecl(int, Type*, Sym*);
601 void argmark(Node*, int);
603 Node* dcllabel(Sym*, int);
604 Node* dodecl(void(*)(int, Type*, Sym*), int, Type*, Node*);
606 void doenum(Sym*, Node*);
608 Type* dotag(Sym*, int, int);
609 void edecl(int, Type*, Sym*);
610 Type* fnproto(Node*);
611 Type* fnproto1(Node*);
613 Type* paramconv(Type*, int);
614 void pdecl(int, Type*, Sym*);
617 Node* revertdcl(void);
618 long round(long, int);
619 int rsametype(Type*, Type*, int, int);
620 int sametype(Type*, Type*);
622 ulong signature(Type*);
624 void tmerge(Type*, Sym*);
625 void walkparam(Node*, int);
626 void xdecl(int, Type*, Sym*);
627 Node* contig(Sym*, Node*, long);
635 int tcoma(Node*, Node*, Type*, int);
637 int tcomo(Node*, int);
640 void constas(Node*, Type*, Type*);
641 Node* uncomma(Node*);
642 Node* uncomargs(Node*);
648 void acom1(vlong, Node*);
649 void acom2(Node*, Type*);
650 int acomcmp1(const void*, const void*);
651 int acomcmp2(const void*, const void*);
659 void dclfunct(Type*, Sym*);
664 void arith(Node*, int);
666 int deadheads(Node*);
667 Type* dotsearch(Sym*, Type*, Node*, long*);
668 long dotoffset(Type*, Type*, Node*);
672 void makedot(Node*, Type*, long);
673 int mixedasop(Type*, Type*);
674 Node* new(int, Node*, Node*);
675 Node* new1(int, Node*, Node*);
676 int nilcast(Type*, Type*);
677 int nocast(Type*, Type*);
678 void prtree(Node*, char*);
679 void prtree1(Node*, int, int);
680 void relcon(Node*, Node*);
683 Type* garbt(Type*, long);
686 int stcompat(Node*, Type*, Type*, long[]);
687 int tcompat(Node*, Type*, Type*, long[]);
689 Type* typ(int, Type*);
690 Type* copytyp(Type*);
691 void typeext(Type*, Node*);
692 void typeext1(Type*, Node*);
698 void simplifyshift(Node*);
700 long typebitor(long, long);
701 void diag(Node*, char*, ...);
702 void warn(Node*, char*, ...);
703 void yyerror(char*, ...);
704 void fatal(Node*, char*, ...);
709 void acidtype(Type*);
715 void pickletype(Type*);
720 Bits bor(Bits, Bits);
721 Bits band(Bits, Bits);
727 int bset(Bits, uint);
734 void pragvararg(void);
736 void pragfpround(void);
737 void pragprofile(void);
738 void pragincomplete(void);
741 * calls to machine depend part
743 void codgen(Node*, Node*);
745 void gextern(Sym*, Node*, long, long);
747 long outstring(char*, long);
748 long outlstring(Rune*, long);
749 void sextern(Sym*, Node*, long, long);
752 long align(long, Type*, int);
753 long maxround(long, long);
755 extern schar ewidth[];
761 void com64init(void);
763 double convvtof(vlong);
764 vlong convftov(double);
765 double convftox(double, int);
766 vlong convvtox(vlong, int);
773 #pragma varargck argpos warn 2
774 #pragma varargck argpos diag 2
775 #pragma varargck argpos yyerror 1
777 #pragma varargck type "F" Node*
778 #pragma varargck type "L" long
779 #pragma varargck type "Q" long
780 #pragma varargck type "O" int
781 #pragma varargck type "T" Type*
782 #pragma varargck type "|" int