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