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);
665 int deadheads(Node*);
666 Type* dotsearch(Sym*, Type*, Node*, long*);
667 long dotoffset(Type*, Type*, Node*);
671 void makedot(Node*, Type*, long);
672 int mixedasop(Type*, Type*);
673 Node* new(int, Node*, Node*);
674 Node* new1(int, Node*, Node*);
675 int nilcast(Type*, Type*);
676 int nocast(Type*, Type*);
677 void prtree(Node*, char*);
678 void prtree1(Node*, int, int);
679 void relcon(Node*, Node*);
682 Type* garbt(Type*, long);
685 int stcompat(Node*, Type*, Type*, long[]);
686 int tcompat(Node*, Type*, Type*, long[]);
688 Type* typ(int, Type*);
689 Type* copytyp(Type*);
690 void typeext(Type*, Node*);
691 void typeext1(Type*, Node*);
697 void simplifyshift(Node*);
699 long typebitor(long, long);
700 void diag(Node*, char*, ...);
701 void warn(Node*, char*, ...);
702 void yyerror(char*, ...);
703 void fatal(Node*, char*, ...);
708 void acidtype(Type*);
714 void pickletype(Type*);
719 Bits bor(Bits, Bits);
720 Bits band(Bits, Bits);
726 int bset(Bits, uint);
733 void pragvararg(void);
735 void pragfpround(void);
736 void pragprofile(void);
737 void pragincomplete(void);
740 * calls to machine depend part
742 void codgen(Node*, Node*);
744 void gextern(Sym*, Node*, long, long);
746 long outstring(char*, long);
747 long outlstring(Rune*, long);
748 void sextern(Sym*, Node*, long, long);
751 long align(long, Type*, int);
752 long maxround(long, long);
754 extern schar ewidth[];
760 void com64init(void);
762 double convvtof(vlong);
763 vlong convftov(double);
764 double convftox(double, int);
765 vlong convvtox(vlong, int);
772 #pragma varargck argpos warn 2
773 #pragma varargck argpos diag 2
774 #pragma varargck argpos yyerror 1
776 #pragma varargck type "F" Node*
777 #pragma varargck type "L" long
778 #pragma varargck type "Q" long
779 #pragma varargck type "O" int
780 #pragma varargck type "T" Type*
781 #pragma varargck type "|" int