]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/cc/cc.h
cc: include $builtin as keywoard in pickle() (from charles forsyth)
[plan9front.git] / sys / src / cmd / cc / cc.h
1 #include <u.h>
2 #include <libc.h>
3 #include <bio.h>
4 #include <ctype.h>
5
6 #pragma lib     "../cc/cc.a$O"
7
8 #ifndef EXTERN
9 #define EXTERN  extern
10 #endif
11
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;
17 typedef struct  Io      Io;
18 typedef struct  Hist    Hist;
19 typedef struct  Term    Term;
20 typedef struct  Init    Init;
21 typedef struct  Bits    Bits;
22
23 #define NHUNK           50000L
24 #define BUFSIZ          8192
25 #define NSYMB           1500
26 #define NHASH           1024
27 #define STRINGSZ        200
28 #define HISTSZ          20
29 #define YYMAXDEPTH      1500
30 #define NTERM           10
31 #define MAXALIGN        7
32
33 #define SIGN(n)         (1ULL<<(n-1))
34 #define MASK(n)         (SIGN(n)|(SIGN(n)-1))
35
36 #define BITS    5
37 #define NVAR    (BITS*sizeof(ulong)*8)
38 struct  Bits
39 {
40         ulong   b[BITS];
41 };
42
43 struct  Node
44 {
45         Node*   left;
46         Node*   right;
47         void*   label;
48         long    pc;
49         int     reg;
50         long    xoffset;
51         double  fconst;         /* fp constant */
52         vlong   vconst;         /* non fp const */
53         char*   cstring;        /* character string */
54         Rune*   rstring;        /* rune string */
55
56         Sym*    sym;
57         Type*   type;
58         long    lineno;
59         char    op;
60         char    oldop;
61         char xcast;
62         char    class;
63         char    etype;
64         char    complex;
65         char    addable;
66         char    scale;
67         char    garb;
68 };
69 #define Z       ((Node*)0)
70
71 struct  Sym
72 {
73         Sym*    link;
74         Type*   type;
75         Type*   suetag;
76         Type*   tenum;
77         char*   macro;
78         long    varlineno;
79         long    offset;
80         vlong   vconst;
81         double  fconst;
82         Node*   label;
83         ushort  lexical;
84         char    *name;
85         ushort  block;
86         ushort  sueblock;
87         char    class;
88         char    sym;
89         char    aused;
90         char    sig;
91 };
92 #define S       ((Sym*)0)
93
94 enum{
95         SIGNONE = 0,
96         SIGDONE = 1,
97         SIGINTERN = 2,
98
99         SIGNINTERN = 1729*325*1729,
100 };
101
102 struct  Decl
103 {
104         Decl*   link;
105         Sym*    sym;
106         Type*   type;
107         long    varlineno;
108         long    offset;
109         short   val;
110         ushort  block;
111         char    class;
112         char    aused;
113 };
114 #define D       ((Decl*)0)
115
116 struct  Type
117 {
118         Sym*    sym;
119         Sym*    tag;
120         Funct*  funct;
121         Type*   link;
122         Type*   down;
123         long    width;
124         long    offset;
125         long    lineno;
126         schar   shift;
127         char    nbits;
128         char    etype;
129         char    garb;
130 };
131
132 #define T       ((Type*)0)
133 #define NODECL  ((void(*)(int, Type*, Sym*))0)
134
135 struct  Init                    /* general purpose initialization */
136 {
137         int     code;
138         ulong   value;
139         char*   s;
140 };
141
142 EXTERN struct
143 {
144         char*   p;
145         int     c;
146 } fi;
147
148 struct  Io
149 {
150         Io*     link;
151         char*   p;
152         char    b[BUFSIZ];
153         short   c;
154         short   f;
155 };
156 #define I       ((Io*)0)
157
158 struct  Hist
159 {
160         Hist*   link;
161         char*   name;
162         long    line;
163         long    offset;
164 };
165 #define H       ((Hist*)0)
166 EXTERN Hist*    hist;
167
168 struct  Term
169 {
170         vlong   mult;
171         Node    *node;
172 };
173
174 enum
175 {
176         Axxx,
177         Ael1,
178         Ael2,
179         Asu2,
180         Aarg0,
181         Aarg1,
182         Aarg2,
183         Aaut3,
184         NALIGN,
185 };
186
187 enum                            /* also in ../{8a,0a}.h */
188 {
189         Plan9   = 1<<0,
190         Unix    = 1<<1,
191         Windows = 1<<2,
192 };
193
194 enum
195 {
196         DMARK,
197         DAUTO,
198         DSUE,
199         DLABEL,
200 };
201 enum
202 {
203         OXXX,
204         OADD,
205         OADDR,
206         OAND,
207         OANDAND,
208         OARRAY,
209         OAS,
210         OASI,
211         OASADD,
212         OASAND,
213         OASASHL,
214         OASASHR,
215         OASDIV,
216         OASHL,
217         OASHR,
218         OASLDIV,
219         OASLMOD,
220         OASLMUL,
221         OASLSHR,
222         OASMOD,
223         OASMUL,
224         OASOR,
225         OASSUB,
226         OASXOR,
227         OBIT,
228         OBREAK,
229         OCASE,
230         OCAST,
231         OCOMMA,
232         OCOND,
233         OCONST,
234         OCONTINUE,
235         ODIV,
236         ODOT,
237         ODOTDOT,
238         ODWHILE,
239         OENUM,
240         OEQ,
241         OFOR,
242         OFUNC,
243         OGE,
244         OGOTO,
245         OGT,
246         OHI,
247         OHS,
248         OIF,
249         OIND,
250         OINDREG,
251         OINIT,
252         OLABEL,
253         OLDIV,
254         OLE,
255         OLIST,
256         OLMOD,
257         OLMUL,
258         OLO,
259         OLS,
260         OLSHR,
261         OLT,
262         OMOD,
263         OMUL,
264         ONAME,
265         ONE,
266         ONOT,
267         OOR,
268         OOROR,
269         OPOSTDEC,
270         OPOSTINC,
271         OPREDEC,
272         OPREINC,
273         OPROTO,
274         OREGISTER,
275         ORETURN,
276         OSET,
277         OSIGN,
278         OSIZE,
279         OSTRING,
280         OLSTRING,
281         OSTRUCT,
282         OSUB,
283         OSWITCH,
284         OUNION,
285         OUSED,
286         OWHILE,
287         OXOR,
288         ONEG,
289         OCOM,
290         OPOS,
291         OELEM,
292
293         OTST,           /* used in some compilers */
294         OINDEX,
295         OFAS,
296         OREGPAIR,
297         OEXREG,
298
299         OEND
300 };
301 enum
302 {
303         TXXX,
304         TCHAR,
305         TUCHAR,
306         TSHORT,
307         TUSHORT,
308         TINT,
309         TUINT,
310         TLONG,
311         TULONG,
312         TVLONG,
313         TUVLONG,
314         TFLOAT,
315         TDOUBLE,
316         TIND,
317         TFUNC,
318         TARRAY,
319         TVOID,
320         TSTRUCT,
321         TUNION,
322         TENUM,
323         TDOT,
324         NTYPE,
325
326         TAUTO   = NTYPE,
327         TEXTERN,
328         TSTATIC,
329         TTYPEDEF,
330         TTYPESTR,
331         TREGISTER,
332         TCONSTNT,
333         TVOLATILE,
334         TUNSIGNED,
335         TSIGNED,
336         TFILE,
337         TOLD,
338         NALLTYPES,
339
340         TRUNE   = sizeof(Rune)==4? TUINT: TUSHORT,
341 };
342 enum
343 {
344         CXXX,
345         CAUTO,
346         CEXTERN,
347         CGLOBL,
348         CSTATIC,
349         CLOCAL,
350         CTYPEDEF,
351         CTYPESTR,
352         CPARAM,
353         CSELEM,
354         CLABEL,
355         CEXREG,
356         NCTYPES,
357 };
358 enum
359 {
360         GXXX            = 0,
361         GCONSTNT        = 1<<0,
362         GVOLATILE       = 1<<1,
363         NGTYPES         = 1<<2,
364
365         GINCOMPLETE     = 1<<2,
366 };
367 enum
368 {
369         BCHAR           = 1L<<TCHAR,
370         BUCHAR          = 1L<<TUCHAR,
371         BSHORT          = 1L<<TSHORT,
372         BUSHORT         = 1L<<TUSHORT,
373         BINT            = 1L<<TINT,
374         BUINT           = 1L<<TUINT,
375         BLONG           = 1L<<TLONG,
376         BULONG          = 1L<<TULONG,
377         BVLONG          = 1L<<TVLONG,
378         BUVLONG         = 1L<<TUVLONG,
379         BFLOAT          = 1L<<TFLOAT,
380         BDOUBLE         = 1L<<TDOUBLE,
381         BIND            = 1L<<TIND,
382         BFUNC           = 1L<<TFUNC,
383         BARRAY          = 1L<<TARRAY,
384         BVOID           = 1L<<TVOID,
385         BSTRUCT         = 1L<<TSTRUCT,
386         BUNION          = 1L<<TUNION,
387         BENUM           = 1L<<TENUM,
388         BFILE           = 1L<<TFILE,
389         BDOT            = 1L<<TDOT,
390         BCONSTNT        = 1L<<TCONSTNT,
391         BVOLATILE       = 1L<<TVOLATILE,
392         BUNSIGNED       = 1L<<TUNSIGNED,
393         BSIGNED         = 1L<<TSIGNED,
394         BAUTO           = 1L<<TAUTO,
395         BEXTERN         = 1L<<TEXTERN,
396         BSTATIC         = 1L<<TSTATIC,
397         BTYPEDEF        = 1L<<TTYPEDEF,
398         BTYPESTR        = 1L<<TTYPESTR,
399         BREGISTER       = 1L<<TREGISTER,
400
401         BINTEGER        = BCHAR|BUCHAR|BSHORT|BUSHORT|BINT|BUINT|
402                                 BLONG|BULONG|BVLONG|BUVLONG,
403         BNUMBER         = BINTEGER|BFLOAT|BDOUBLE,
404
405 /* these can be overloaded with complex types */
406
407         BCLASS          = BAUTO|BEXTERN|BSTATIC|BTYPEDEF|BTYPESTR|BREGISTER,
408         BGARB           = BCONSTNT|BVOLATILE,
409 };
410
411 struct  Funct
412 {
413         Sym*    sym[OEND];
414         Sym*    castto[NTYPE];
415         Sym*    castfr[NTYPE];
416 };
417
418 EXTERN struct
419 {
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 */
424 } en;
425
426 EXTERN  int     autobn;
427 EXTERN  long    autoffset;
428 EXTERN  int     blockno;
429 EXTERN  Decl*   dclstack;
430 EXTERN  char    debug[256];
431 EXTERN  Hist*   ehist;
432 EXTERN  long    firstbit;
433 EXTERN  Sym*    firstarg;
434 EXTERN  Type*   firstargtype;
435 EXTERN  Decl*   firstdcl;
436 EXTERN  int     fperror;
437 EXTERN  Sym*    hash[NHASH];
438 EXTERN  int     hasdoubled;
439 EXTERN  char*   hunk;
440 EXTERN  char*   include[20];
441 EXTERN  Io*     iofree;
442 EXTERN  Io*     ionext;
443 EXTERN  Io*     iostack;
444 EXTERN  long    lastbit;
445 EXTERN  char    lastclass;
446 EXTERN  Type*   lastdcl;
447 EXTERN  long    lastfield;
448 EXTERN  Type*   lasttype;
449 EXTERN  long    lineno;
450 EXTERN  long    nearln;
451 EXTERN  int     nerrors;
452 EXTERN  int     newflag;
453 EXTERN  long    nhunk;
454 EXTERN  int     ninclude;
455 EXTERN  Node*   nodproto;
456 EXTERN  Node*   nodcast;
457 EXTERN  Biobuf  outbuf;
458 EXTERN  Biobuf  diagbuf;
459 EXTERN  char*   outfile;
460 EXTERN  char*   pathname;
461 EXTERN  int     peekc;
462 EXTERN  long    stkoff;
463 EXTERN  Type*   strf;
464 EXTERN  Type*   strl;
465 EXTERN  char    symb[NSYMB];
466 EXTERN  Sym*    symstring;
467 EXTERN  int     taggen;
468 EXTERN  Type*   tfield;
469 EXTERN  Type*   tufield;
470 EXTERN  int     thechar;
471 EXTERN  char*   thestring;
472 EXTERN  Type*   thisfn;
473 EXTERN  long    thunk;
474 EXTERN  Type*   types[NTYPE];
475 EXTERN  Type*   fntypes[NTYPE];
476 EXTERN  Node*   initlist;
477 EXTERN  Term    term[NTERM];
478 EXTERN  int     nterm;
479 EXTERN  int     packflg;
480 EXTERN  int     fproundflg;
481 EXTERN  int     profileflg;
482 EXTERN  int     ncontin;
483 EXTERN  int     newvlongcode;
484 EXTERN  int     canreach;
485 EXTERN  int     warnreach;
486 EXTERN  Bits    zbits;
487
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[];
496
497 extern  char    typeaf[];
498 extern  char    typefd[];
499 extern  char    typei[];
500 extern  char    typesu[];
501 extern  char    typesuv[];
502 extern  char    typeu[];
503 extern  char    typev[];
504 extern  char    typec[];
505 extern  char    typeh[];
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[];
513
514 EXTERN  char*   typeswitch;
515 EXTERN  char*   typeword;
516 EXTERN  char*   typecmplx;
517
518 extern  ulong   thash1;
519 extern  ulong   thash2;
520 extern  ulong   thash3;
521 extern  ulong   thash[];
522
523 /*
524  *      compat.c/unix.c/windows.c
525  */
526 int     mywait(int*);
527 int     mycreat(char*, int);
528 int     systemtype(int);
529 int     pathchar(void);
530 int     myaccess(char*);
531 char*   mygetwd(char*, int);
532 int     myexec(char*, char*[]);
533 int     mydup(int, int);
534 int     myfork(void);
535 int     mypipe(int*);
536 void*   mysbrk(ulong);
537
538 /*
539  *      parser
540  */
541 int     yyparse(void);
542 int     mpatov(char*, vlong*);
543
544 /*
545  *      lex.c
546  */
547 void*   allocn(void*, long, long);
548 void*   alloc(long);
549 void    cinit(void);
550 int     compile(char*, char**, int);
551 void    errorexit(void);
552 int     filbuf(void);
553 int     getc(void);
554 long    getr(void);
555 int     getnsc(void);
556 Sym*    lookup(void);
557 void    main(int, char*[]);
558 void    newfile(char*, int);
559 void    newio(void);
560 void    pushio(void);
561 long    escchar(long, int, int);
562 Sym*    slookup(char*);
563 void    syminit(Sym*);
564 void    unget(int);
565 long    yylex(void);
566 int     Lconv(Fmt*);
567 int     Tconv(Fmt*);
568 int     FNconv(Fmt*);
569 int     Oconv(Fmt*);
570 int     Qconv(Fmt*);
571 int     VBconv(Fmt*);
572 void    setinclude(char*);
573
574 /*
575  * mac.c
576  */
577 void    dodefine(char*);
578 void    domacro(void);
579 Sym*    getsym(void);
580 long    getnsn(void);
581 void    linehist(char*, int);
582 void    macdef(void);
583 void    macprag(void);
584 void    macend(void);
585 void    macexpand(Sym*, char*);
586 void    macif(int);
587 void    macinc(void);
588 void    maclin(void);
589 void    macund(void);
590
591 /*
592  * dcl.c
593  */
594 Node*   doinit(Sym*, Type*, long, Node*);
595 Type*   tcopy(Type*);
596 Node*   init1(Sym*, Type*, long, int);
597 Node*   newlist(Node*, Node*);
598 void    adecl(int, Type*, Sym*);
599 int     anyproto(Node*);
600 void    argmark(Node*, int);
601 void    dbgdecl(Sym*);
602 Node*   dcllabel(Sym*, int);
603 Node*   dodecl(void(*)(int, Type*, Sym*), int, Type*, Node*);
604 Sym*    mkstatic(Sym*);
605 void    doenum(Sym*, Node*);
606 void    snap(Type*);
607 Type*   dotag(Sym*, int, int);
608 void    edecl(int, Type*, Sym*);
609 Type*   fnproto(Node*);
610 Type*   fnproto1(Node*);
611 void    markdcl(void);
612 Type*   paramconv(Type*, int);
613 void    pdecl(int, Type*, Sym*);
614 Decl*   push(void);
615 Decl*   push1(Sym*);
616 Node*   revertdcl(void);
617 long    round(long, int);
618 int     rsametype(Type*, Type*, int, int);
619 int     sametype(Type*, Type*);
620 ulong   sign(Sym*);
621 ulong   signature(Type*);
622 void    sualign(Type*);
623 void    tmerge(Type*, Sym*);
624 void    walkparam(Node*, int);
625 void    xdecl(int, Type*, Sym*);
626 Node*   contig(Sym*, Node*, long);
627
628 /*
629  * com.c
630  */
631 void    ccom(Node*);
632 void    complex(Node*);
633 int     tcom(Node*);
634 int     tcoma(Node*, Node*, Type*, int);
635 int     tcomd(Node*);
636 int     tcomo(Node*, int);
637 int     tcomx(Node*);
638 int     tlvalue(Node*);
639 void    constas(Node*, Type*, Type*);
640 Node*   uncomma(Node*);
641 Node*   uncomargs(Node*);
642
643 /*
644  * con.c
645  */
646 void    acom(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*);
651 int     addo(Node*);
652 void    evconst(Node*);
653
654 /*
655  * funct.c
656  */
657 int     isfunct(Node*);
658 void    dclfunct(Type*, Sym*);
659
660 /*
661  * sub.c
662  */
663 void    arith(Node*, int);
664 int     deadheads(Node*);
665 Type*   dotsearch(Sym*, Type*, Node*, long*);
666 long    dotoffset(Type*, Type*, Node*);
667 void    gethunk(void);
668 Node*   invert(Node*);
669 int     bitno(long);
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*);
679 int     relindex(int);
680 int     simpleg(long);
681 Type*   garbt(Type*, long);
682 int     simplec(long);
683 Type*   simplet(long);
684 int     stcompat(Node*, Type*, Type*, long[]);
685 int     tcompat(Node*, Type*, Type*, long[]);
686 void    tinit(void);
687 Type*   typ(int, Type*);
688 Type*   copytyp(Type*);
689 void    typeext(Type*, Node*);
690 void    typeext1(Type*, Node*);
691 int     side(Node*);
692 int     vconst(Node*);
693 int     log2(uvlong);
694 int     vlog(Node*);
695 int     topbit(ulong);
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*, ...);
702
703 /*
704  * acid.c
705  */
706 void    acidtype(Type*);
707 void    acidvar(Sym*);
708
709 /*
710  * pickle.c
711  */
712 void    pickletype(Type*);
713
714 /*
715  * bits.c
716  */
717 Bits    bor(Bits, Bits);
718 Bits    band(Bits, Bits);
719 Bits    bnot(Bits);
720 int     bany(Bits*);
721 int     bnum(Bits);
722 Bits    blsh(uint);
723 int     beq(Bits, Bits);
724 int     bset(Bits, uint);
725
726 /*
727  * dpchk.c
728  */
729 void    dpcheck(Node*);
730 void    arginit(void);
731 void    pragvararg(void);
732 void    pragpack(void);
733 void    pragfpround(void);
734 void pragprofile(void);
735 void    pragincomplete(void);
736
737 /*
738  * calls to machine depend part
739  */
740 void    codgen(Node*, Node*);
741 void    gclean(void);
742 void    gextern(Sym*, Node*, long, long);
743 void    ginit(void);
744 long    outstring(char*, long);
745 long    outlstring(Rune*, long);
746 void    sextern(Sym*, Node*, long, long);
747 void    xcom(Node*);
748 long    exreg(Type*);
749 long    align(long, Type*, int);
750 long    maxround(long, long);
751
752 extern  schar   ewidth[];
753
754 /*
755  * com64
756  */
757 int     com64(Node*);
758 void    com64init(void);
759 void    bool64(Node*);
760 double  convvtof(vlong);
761 vlong   convftov(double);
762 double  convftox(double, int);
763 vlong   convvtox(vlong, int);
764
765 /*
766  * machcap
767  */
768 int     machcap(Node*);
769
770 #pragma varargck        argpos  warn    2
771 #pragma varargck        argpos  diag    2
772 #pragma varargck        argpos  yyerror 1
773
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