]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/cc/cc.h
cc, ?[acl]: fix gethunk() and move common memory allocator code to cc/compat
[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 struct  Io
147 {
148         Io*     link;
149         char*   p;
150         char    b[BUFSIZ];
151         short   c;
152         short   f;
153 };
154 #define I       ((Io*)0)
155
156 struct  Hist
157 {
158         Hist*   link;
159         char*   name;
160         long    line;
161         long    offset;
162 };
163 #define H       ((Hist*)0)
164 EXTERN Hist*    hist;
165
166 struct  Term
167 {
168         vlong   mult;
169         Node    *node;
170 };
171
172 enum
173 {
174         Axxx,
175         Ael1,
176         Ael2,
177         Asu2,
178         Aarg0,
179         Aarg1,
180         Aarg2,
181         Aaut3,
182         NALIGN,
183 };
184
185 enum
186 {
187         DMARK,
188         DAUTO,
189         DSUE,
190         DLABEL,
191 };
192 enum
193 {
194         OXXX,
195         OADD,
196         OADDR,
197         OAND,
198         OANDAND,
199         OARRAY,
200         OAS,
201         OASI,
202         OASADD,
203         OASAND,
204         OASASHL,
205         OASASHR,
206         OASDIV,
207         OASHL,
208         OASHR,
209         OASLDIV,
210         OASLMOD,
211         OASLMUL,
212         OASLSHR,
213         OASMOD,
214         OASMUL,
215         OASOR,
216         OASSUB,
217         OASXOR,
218         OBIT,
219         OBREAK,
220         OCASE,
221         OCAST,
222         OCOMMA,
223         OCOND,
224         OCONST,
225         OCONTINUE,
226         ODIV,
227         ODOT,
228         ODOTDOT,
229         ODWHILE,
230         OENUM,
231         OEQ,
232         OFOR,
233         OFUNC,
234         OGE,
235         OGOTO,
236         OGT,
237         OHI,
238         OHS,
239         OIF,
240         OIND,
241         OINDREG,
242         OINIT,
243         OLABEL,
244         OLDIV,
245         OLE,
246         OLIST,
247         OLMOD,
248         OLMUL,
249         OLO,
250         OLS,
251         OLSHR,
252         OLT,
253         OMOD,
254         OMUL,
255         ONAME,
256         ONE,
257         ONOT,
258         OOR,
259         OOROR,
260         OPOSTDEC,
261         OPOSTINC,
262         OPREDEC,
263         OPREINC,
264         OPROTO,
265         OREGISTER,
266         ORETURN,
267         OROL,
268         OSET,
269         OSIGN,
270         OSIZE,
271         OSTRING,
272         OLSTRING,
273         OSTRUCT,
274         OSUB,
275         OSWITCH,
276         OUNION,
277         OUSED,
278         OWHILE,
279         OXOR,
280         ONEG,
281         OCOM,
282         OPOS,
283         OELEM,
284
285         OTST,           /* used in some compilers */
286         OINDEX,
287         OFAS,
288         OREGPAIR,
289         OEXREG,
290
291         OEND
292 };
293 enum
294 {
295         TXXX,
296         TCHAR,
297         TUCHAR,
298         TSHORT,
299         TUSHORT,
300         TINT,
301         TUINT,
302         TLONG,
303         TULONG,
304         TVLONG,
305         TUVLONG,
306         TFLOAT,
307         TDOUBLE,
308         TIND,
309         TFUNC,
310         TARRAY,
311         TVOID,
312         TSTRUCT,
313         TUNION,
314         TENUM,
315         TDOT,
316         NTYPE,
317
318         TAUTO   = NTYPE,
319         TEXTERN,
320         TSTATIC,
321         TTYPEDEF,
322         TTYPESTR,
323         TREGISTER,
324         TCONSTNT,
325         TVOLATILE,
326         TUNSIGNED,
327         TSIGNED,
328         TFILE,
329         TOLD,
330         NALLTYPES,
331
332         TRUNE   = sizeof(Rune)==4? TUINT: TUSHORT,
333 };
334 enum
335 {
336         CXXX,
337         CAUTO,
338         CEXTERN,
339         CGLOBL,
340         CSTATIC,
341         CLOCAL,
342         CTYPEDEF,
343         CTYPESTR,
344         CPARAM,
345         CSELEM,
346         CLABEL,
347         CEXREG,
348         NCTYPES,
349 };
350 enum
351 {
352         GXXX            = 0,
353         GCONSTNT        = 1<<0,
354         GVOLATILE       = 1<<1,
355         NGTYPES         = 1<<2,
356
357         GINCOMPLETE     = 1<<2,
358 };
359 enum
360 {
361         BCHAR           = 1L<<TCHAR,
362         BUCHAR          = 1L<<TUCHAR,
363         BSHORT          = 1L<<TSHORT,
364         BUSHORT         = 1L<<TUSHORT,
365         BINT            = 1L<<TINT,
366         BUINT           = 1L<<TUINT,
367         BLONG           = 1L<<TLONG,
368         BULONG          = 1L<<TULONG,
369         BVLONG          = 1L<<TVLONG,
370         BUVLONG         = 1L<<TUVLONG,
371         BFLOAT          = 1L<<TFLOAT,
372         BDOUBLE         = 1L<<TDOUBLE,
373         BIND            = 1L<<TIND,
374         BFUNC           = 1L<<TFUNC,
375         BARRAY          = 1L<<TARRAY,
376         BVOID           = 1L<<TVOID,
377         BSTRUCT         = 1L<<TSTRUCT,
378         BUNION          = 1L<<TUNION,
379         BENUM           = 1L<<TENUM,
380         BFILE           = 1L<<TFILE,
381         BDOT            = 1L<<TDOT,
382         BCONSTNT        = 1L<<TCONSTNT,
383         BVOLATILE       = 1L<<TVOLATILE,
384         BUNSIGNED       = 1L<<TUNSIGNED,
385         BSIGNED         = 1L<<TSIGNED,
386         BAUTO           = 1L<<TAUTO,
387         BEXTERN         = 1L<<TEXTERN,
388         BSTATIC         = 1L<<TSTATIC,
389         BTYPEDEF        = 1L<<TTYPEDEF,
390         BTYPESTR        = 1L<<TTYPESTR,
391         BREGISTER       = 1L<<TREGISTER,
392
393         BINTEGER        = BCHAR|BUCHAR|BSHORT|BUSHORT|BINT|BUINT|
394                                 BLONG|BULONG|BVLONG|BUVLONG,
395         BNUMBER         = BINTEGER|BFLOAT|BDOUBLE,
396
397 /* these can be overloaded with complex types */
398
399         BCLASS          = BAUTO|BEXTERN|BSTATIC|BTYPEDEF|BTYPESTR|BREGISTER,
400         BGARB           = BCONSTNT|BVOLATILE,
401 };
402
403 struct  Funct
404 {
405         Sym*    sym[OEND];
406         Sym*    castto[NTYPE];
407         Sym*    castfr[NTYPE];
408 };
409
410 EXTERN struct
411 {
412         Type*   tenum;          /* type of entire enum */
413         Type*   cenum;          /* type of current enum run */
414         vlong   lastenum;       /* value of current enum */
415         double  floatenum;      /* value of current enum */
416 } en;
417
418 EXTERN  int     autobn;
419 EXTERN  long    autoffset;
420 EXTERN  int     blockno;
421 EXTERN  Decl*   dclstack;
422 EXTERN  char    debug[256];
423 EXTERN  Hist*   ehist;
424 EXTERN  long    firstbit;
425 EXTERN  Sym*    firstarg;
426 EXTERN  Type*   firstargtype;
427 EXTERN  Decl*   firstdcl;
428 EXTERN  int     fperror;
429 EXTERN  Sym*    hash[NHASH];
430 EXTERN  int     hasdoubled;
431 EXTERN  char*   include[20];
432 EXTERN  Io*     iofree;
433 EXTERN  Io*     ionext;
434 EXTERN  Io*     iostack;
435 EXTERN  long    lastbit;
436 EXTERN  char    lastclass;
437 EXTERN  Type*   lastdcl;
438 EXTERN  long    lastfield;
439 EXTERN  Type*   lasttype;
440 EXTERN  long    lineno;
441 EXTERN  long    nearln;
442 EXTERN  int     nerrors;
443 EXTERN  int     newflag;
444 EXTERN  int     ninclude;
445 EXTERN  Node*   nodproto;
446 EXTERN  Node*   nodcast;
447 EXTERN  Biobuf  outbuf;
448 EXTERN  Biobuf  diagbuf;
449 EXTERN  char*   outfile;
450 EXTERN  char*   pathname;
451 EXTERN  int     peekc;
452 EXTERN  long    stkoff;
453 EXTERN  Type*   strf;
454 EXTERN  Type*   strl;
455 EXTERN  char    symb[NSYMB];
456 EXTERN  Sym*    symstring;
457 EXTERN  int     taggen;
458 EXTERN  Type*   tfield;
459 EXTERN  Type*   tufield;
460 EXTERN  int     thechar;
461 EXTERN  char*   thestring;
462 EXTERN  Type*   thisfn;
463 EXTERN  Type*   types[NTYPE];
464 EXTERN  Type*   fntypes[NTYPE];
465 EXTERN  Node*   initlist;
466 EXTERN  Term    term[NTERM];
467 EXTERN  int     nterm;
468 EXTERN  int     packflg;
469 EXTERN  int     fproundflg;
470 EXTERN  int     profileflg;
471 EXTERN  int     ncontin;
472 EXTERN  int     newvlongcode;
473 EXTERN  int     canreach;
474 EXTERN  int     warnreach;
475 EXTERN  Bits    zbits;
476
477 extern  char    *onames[], *tnames[], *gnames[];
478 extern  char    *cnames[], *qnames[], *bnames[];
479 extern  char    tab[NTYPE][NTYPE];
480 extern  char    comrel[], invrel[], logrel[];
481 extern  long    ncast[], tadd[], tand[];
482 extern  long    targ[], tasadd[], tasign[], tcast[];
483 extern  long    tdot[], tfunct[], tindir[], tmul[];
484 extern  long    tnot[], trel[], tsub[];
485
486 extern  char    typeaf[];
487 extern  char    typefd[];
488 extern  char    typei[];
489 extern  char    typesu[];
490 extern  char    typesuv[];
491 extern  char    typeu[];
492 extern  char    typev[];
493 extern  char    typec[];
494 extern  char    typeh[];
495 extern  char    typeil[];
496 extern  char    typeilp[];
497 extern  char    typechl[];
498 extern  char    typechlv[];
499 extern  char    typechlvp[];
500 extern  char    typechlp[];
501 extern  char    typechlpfd[];
502
503 EXTERN  char*   typeswitch;
504 EXTERN  char*   typeword;
505 EXTERN  char*   typecmplx;
506
507 extern  ulong   thash1;
508 extern  ulong   thash2;
509 extern  ulong   thash3;
510 extern  ulong   thash[];
511
512 /*
513  *      parser
514  */
515 int     yyparse(void);
516 int     mpatov(char*, vlong*);
517
518 /*
519  *      lex.c
520  */
521 void    cinit(void);
522 int     compile(char*, char**, int);
523 void    errorexit(void);
524 int     filbuf(void);
525 int     getc(void);
526 long    getr(void);
527 int     getnsc(void);
528 Sym*    lookup(void);
529 void    main(int, char*[]);
530 void    newfile(char*, int);
531 void    newio(void);
532 void    pushio(void);
533 long    escchar(long, int, int);
534 Sym*    slookup(char*);
535 void    syminit(Sym*);
536 void    unget(int);
537 long    yylex(void);
538 int     Lconv(Fmt*);
539 int     Tconv(Fmt*);
540 int     FNconv(Fmt*);
541 int     Oconv(Fmt*);
542 int     Qconv(Fmt*);
543 int     VBconv(Fmt*);
544 void    setinclude(char*);
545
546 /*
547  * mac.c
548  */
549 void    dodefine(char*);
550 void    domacro(void);
551 Sym*    getsym(void);
552 long    getnsn(void);
553 void    linehist(char*, int);
554 void    macdef(void);
555 void    macprag(void);
556 void    macend(void);
557 void    macexpand(Sym*, char*);
558 void    macif(int);
559 void    macinc(void);
560 void    maclin(void);
561 void    macund(void);
562
563 /*
564  * dcl.c
565  */
566 Node*   doinit(Sym*, Type*, long, Node*);
567 Type*   tcopy(Type*);
568 Node*   init1(Sym*, Type*, long, int);
569 Node*   newlist(Node*, Node*);
570 void    adecl(int, Type*, Sym*);
571 int     anyproto(Node*);
572 void    argmark(Node*, int);
573 void    dbgdecl(Sym*);
574 Node*   dcllabel(Sym*, int);
575 Node*   dodecl(void(*)(int, Type*, Sym*), int, Type*, Node*);
576 Sym*    mkstatic(Sym*);
577 void    doenum(Sym*, Node*);
578 void    snap(Type*);
579 Type*   dotag(Sym*, int, int);
580 void    edecl(int, Type*, Sym*);
581 Type*   fnproto(Node*);
582 Type*   fnproto1(Node*);
583 void    markdcl(void);
584 Type*   paramconv(Type*, int);
585 void    pdecl(int, Type*, Sym*);
586 Decl*   push(void);
587 Decl*   push1(Sym*);
588 Node*   revertdcl(void);
589 long    round(long, int);
590 int     rsametype(Type*, Type*, int, int);
591 int     sametype(Type*, Type*);
592 ulong   sign(Sym*);
593 ulong   signature(Type*);
594 void    sualign(Type*);
595 void    tmerge(Type*, Sym*);
596 void    walkparam(Node*, int);
597 void    xdecl(int, Type*, Sym*);
598 Node*   contig(Sym*, Node*, long);
599
600 /*
601  * com.c
602  */
603 void    ccom(Node*);
604 void    complex(Node*);
605 int     tcom(Node*);
606 int     tcoma(Node*, Node*, Type*, int);
607 int     tcomd(Node*);
608 int     tcomo(Node*, int);
609 int     tcomx(Node*);
610 int     tlvalue(Node*);
611 void    constas(Node*, Type*, Type*);
612 Node*   uncomma(Node*);
613 Node*   uncomargs(Node*);
614
615 /*
616  * con.c
617  */
618 void    acom(Node*);
619 void    acom1(vlong, Node*);
620 void    acom2(Node*, Type*);
621 int     acomcmp1(const void*, const void*);
622 int     acomcmp2(const void*, const void*);
623 int     addo(Node*);
624 void    evconst(Node*);
625
626 /*
627  * funct.c
628  */
629 int     isfunct(Node*);
630 void    dclfunct(Type*, Sym*);
631
632 /*
633  * sub.c
634  */
635 void    arith(Node*, int);
636 int     castucom(Node*);
637 int     deadheads(Node*);
638 Type*   dotsearch(Sym*, Type*, Node*, long*);
639 long    dotoffset(Type*, Type*, Node*);
640 Node*   invert(Node*);
641 int     bitno(long);
642 void    makedot(Node*, Type*, long);
643 int     mixedasop(Type*, Type*);
644 Node*   new(int, Node*, Node*);
645 Node*   new1(int, Node*, Node*);
646 int     nilcast(Type*, Type*);
647 int     nocast(Type*, Type*);
648 void    prtree(Node*, char*);
649 void    prtree1(Node*, int, int);
650 void    relcon(Node*, Node*);
651 int     relindex(int);
652 int     simpleg(long);
653 Type*   garbt(Type*, long);
654 int     simplec(long);
655 Type*   simplet(long);
656 int     stcompat(Node*, Type*, Type*, long[]);
657 int     tcompat(Node*, Type*, Type*, long[]);
658 void    tinit(void);
659 Type*   typ(int, Type*);
660 Type*   copytyp(Type*);
661 void    typeext(Type*, Node*);
662 void    typeext1(Type*, Node*);
663 int     side(Node*);
664 int     zpconst(Node*);
665 int     vconst(Node*);
666 int     log2(uvlong);
667 int     vlog(Node*);
668 int     topbit(ulong);
669 void    simplifyshift(Node*);
670 void    rolor(Node*);
671 long    typebitor(long, long);
672 void    diag(Node*, char*, ...);
673 void    warn(Node*, char*, ...);
674 void    yyerror(char*, ...);
675 void    fatal(Node*, char*, ...);
676
677 /*
678  * acid.c
679  */
680 void    acidtype(Type*);
681 void    acidvar(Sym*);
682
683 /*
684  * pickle.c
685  */
686 void    pickletype(Type*);
687
688 /*
689  * bits.c
690  */
691 Bits    bor(Bits, Bits);
692 Bits    band(Bits, Bits);
693 Bits    bnot(Bits);
694 int     bany(Bits*);
695 int     bnum(Bits);
696 Bits    blsh(uint);
697 int     beq(Bits, Bits);
698 int     bset(Bits, uint);
699
700 /*
701  * dpchk.c
702  */
703 void    dpcheck(Node*);
704 void    arginit(void);
705 void    pragvararg(void);
706 void    pragpack(void);
707 void    pragfpround(void);
708 void pragprofile(void);
709 void    pragincomplete(void);
710
711 /*
712  * calls to machine depend part
713  */
714 void    codgen(Node*, Node*);
715 void    gclean(void);
716 void    gextern(Sym*, Node*, long, long);
717 void    ginit(void);
718 long    outstring(char*, long);
719 long    outlstring(Rune*, long);
720 void    sextern(Sym*, Node*, long, long);
721 void    xcom(Node*);
722 long    exreg(Type*);
723 long    align(long, Type*, int);
724 long    maxround(long, long);
725
726 extern  schar   ewidth[];
727
728 /*
729  * com64
730  */
731 int     com64(Node*);
732 void    com64init(void);
733 void    bool64(Node*);
734 double  convvtof(vlong);
735 vlong   convftov(double);
736 double  convftox(double, int);
737 vlong   convvtox(vlong, int);
738
739 /*
740  * machcap
741  */
742 int     machcap(Node*);
743
744 #pragma varargck        argpos  warn    2
745 #pragma varargck        argpos  diag    2
746 #pragma varargck        argpos  yyerror 1
747
748 #pragma varargck        type    "F"     Node*
749 #pragma varargck        type    "L"     long
750 #pragma varargck        type    "Q"     long
751 #pragma varargck        type    "O"     int
752 #pragma varargck        type    "T"     Type*
753 #pragma varargck        type    "|"     int