xref: /inferno-os/utils/cc/cc.h (revision c5ccb85009a33a8b8b49b436c4ebfbd86008b21c)
1 #include <lib9.h>
2 #include <bio.h>
3 #include <ctype.h>
4 
5 #ifndef	EXTERN
6 #define EXTERN	extern
7 #endif
8 
9 typedef	struct	Node	Node;
10 typedef	struct	Sym	Sym;
11 typedef	struct	Type	Type;
12 typedef	struct	Funct	Funct;
13 typedef	struct	Decl	Decl;
14 typedef	struct	Io	Io;
15 typedef	struct	Hist	Hist;
16 typedef	struct	Term	Term;
17 typedef	struct	Init	Init;
18 typedef	struct	Bits	Bits;
19 
20 typedef	Rune	TRune;	/* target system type */
21 
22 #define	NHUNK		50000L
23 #define	BUFSIZ		8192
24 #define	NSYMB		1500
25 #define	NHASH		1024
26 #define	STRINGSZ	200
27 #define	HISTSZ		20
28 #define YYMAXDEPTH	1500
29 #define	NTERM		10
30 #define	MAXALIGN	7
31 
32 #define	SIGN(n)		((uvlong)1<<(n-1))
33 #define	MASK(n)		(SIGN(n)|(SIGN(n)-1))
34 
35 #define	BITS	5
36 #define	NVAR	(BITS*sizeof(ulong)*8)
37 struct	Bits
38 {
39 	ulong	b[BITS];
40 };
41 
42 struct	Node
43 {
44 	Node*	left;
45 	Node*	right;
46 	void*	label;
47 	long	pc;
48 	int	reg;
49 	long	xoffset;
50 	double	fconst;		/* fp constant */
51 	vlong	vconst;		/* non fp const */
52 	char*	cstring;	/* character string */
53 	TRune*	rstring;	/* rune string */
54 
55 	Sym*	sym;
56 	Type*	type;
57 	long	lineno;
58 	char	op;
59 
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 	/* adapt size of Rune to target system's size */
341 	TRUNE = sizeof(TRune)==4? TUINT: TUSHORT,
342 };
343 enum
344 {
345 	CXXX,
346 	CAUTO,
347 	CEXTERN,
348 	CGLOBL,
349 	CSTATIC,
350 	CLOCAL,
351 	CTYPEDEF,
352 	CTYPESTR,
353 	CPARAM,
354 	CSELEM,
355 	CLABEL,
356 	CEXREG,
357 	NCTYPES,
358 };
359 enum
360 {
361 	GXXX		= 0,
362 	GCONSTNT	= 1<<0,
363 	GVOLATILE	= 1<<1,
364 	NGTYPES		= 1<<2,
365 
366 	GINCOMPLETE	= 1<<2,
367 };
368 enum
369 {
370 	BCHAR		= 1L<<TCHAR,
371 	BUCHAR		= 1L<<TUCHAR,
372 	BSHORT		= 1L<<TSHORT,
373 	BUSHORT		= 1L<<TUSHORT,
374 	BINT		= 1L<<TINT,
375 	BUINT		= 1L<<TUINT,
376 	BLONG		= 1L<<TLONG,
377 	BULONG		= 1L<<TULONG,
378 	BVLONG		= 1L<<TVLONG,
379 	BUVLONG		= 1L<<TUVLONG,
380 	BFLOAT		= 1L<<TFLOAT,
381 	BDOUBLE		= 1L<<TDOUBLE,
382 	BIND		= 1L<<TIND,
383 	BFUNC		= 1L<<TFUNC,
384 	BARRAY		= 1L<<TARRAY,
385 	BVOID		= 1L<<TVOID,
386 	BSTRUCT		= 1L<<TSTRUCT,
387 	BUNION		= 1L<<TUNION,
388 	BENUM		= 1L<<TENUM,
389 	BFILE		= 1L<<TFILE,
390 	BDOT		= 1L<<TDOT,
391 	BCONSTNT	= 1L<<TCONSTNT,
392 	BVOLATILE	= 1L<<TVOLATILE,
393 	BUNSIGNED	= 1L<<TUNSIGNED,
394 	BSIGNED		= 1L<<TSIGNED,
395 	BAUTO		= 1L<<TAUTO,
396 	BEXTERN		= 1L<<TEXTERN,
397 	BSTATIC		= 1L<<TSTATIC,
398 	BTYPEDEF	= 1L<<TTYPEDEF,
399 	BTYPESTR	= 1L<<TTYPESTR,
400 	BREGISTER	= 1L<<TREGISTER,
401 
402 	BINTEGER	= BCHAR|BUCHAR|BSHORT|BUSHORT|BINT|BUINT|
403 				BLONG|BULONG|BVLONG|BUVLONG,
404 	BNUMBER		= BINTEGER|BFLOAT|BDOUBLE,
405 
406 /* these can be overloaded with complex types */
407 
408 	BCLASS		= BAUTO|BEXTERN|BSTATIC|BTYPEDEF|BTYPESTR|BREGISTER,
409 	BGARB		= BCONSTNT|BVOLATILE,
410 };
411 
412 struct	Funct
413 {
414 	Sym*	sym[OEND];
415 	Sym*	castto[NTYPE];
416 	Sym*	castfr[NTYPE];
417 };
418 
419 EXTERN struct
420 {
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 */
425 } en;
426 
427 EXTERN	int	autobn;
428 EXTERN	long	autoffset;
429 EXTERN	int	blockno;
430 EXTERN	Decl*	dclstack;
431 EXTERN	char	debug[256];
432 EXTERN	Hist*	ehist;
433 EXTERN	long	firstbit;
434 EXTERN	Sym*	firstarg;
435 EXTERN	Type*	firstargtype;
436 EXTERN	Decl*	firstdcl;
437 EXTERN	int	fperror;
438 EXTERN	Sym*	hash[NHASH];
439 EXTERN	int	hasdoubled;
440 EXTERN	char*	hunk;
441 EXTERN	char*	include[20];
442 EXTERN	Io*	iofree;
443 EXTERN	Io*	ionext;
444 EXTERN	Io*	iostack;
445 EXTERN	long	lastbit;
446 EXTERN	char	lastclass;
447 EXTERN	Type*	lastdcl;
448 EXTERN	long	lastfield;
449 EXTERN	Type*	lasttype;
450 EXTERN	long	lineno;
451 EXTERN	long	nearln;
452 EXTERN	int	nerrors;
453 EXTERN	int	newflag;
454 EXTERN	long	nhunk;
455 EXTERN	int	ninclude;
456 EXTERN	Node*	nodproto;
457 EXTERN	Node*	nodcast;
458 EXTERN	Biobuf	outbuf;
459 EXTERN	Biobuf	diagbuf;
460 EXTERN	char*	outfile;
461 EXTERN	char*	pathname;
462 EXTERN	int	peekc;
463 EXTERN	long	stkoff;
464 EXTERN	Type*	strf;
465 EXTERN	Type*	strl;
466 EXTERN	char	symb[NSYMB];
467 EXTERN	Sym*	symstring;
468 EXTERN	int	taggen;
469 EXTERN	Type*	tfield;
470 EXTERN	Type*	tufield;
471 EXTERN	int	thechar;
472 EXTERN	char*	thestring;
473 EXTERN	Type*	thisfn;
474 EXTERN	long	thunk;
475 EXTERN	Type*	types[NTYPE];
476 EXTERN	Type*	fntypes[NTYPE];
477 EXTERN	Node*	initlist;
478 EXTERN	Term	term[NTERM];
479 EXTERN	int	nterm;
480 EXTERN	int	packflg;
481 EXTERN	int	fproundflg;
482 EXTERN	int	profileflg;
483 EXTERN	int	ncontin;
484 EXTERN	int	newvlongcode;
485 EXTERN	int	canreach;
486 EXTERN	int	warnreach;
487 EXTERN	Bits	zbits;
488 
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[];
497 
498 extern	char	typeaf[];
499 extern	char	typefd[];
500 extern	char	typei[];
501 extern	char	typesu[];
502 extern	char	typesuv[];
503 extern	char	typeu[];
504 extern	char	typev[];
505 extern	char	typec[];
506 extern	char	typeh[];
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[];
514 EXTERN	char*	typeswitch;
515 
516 EXTERN	char*	typeword;
517 EXTERN	char*	typecmplx;
518 
519 extern	ulong	thash1;
520 extern	ulong	thash2;
521 extern	ulong	thash3;
522 extern	ulong	thash[];
523 
524 /*
525  *	Inferno.c/Posix.c/Nt.c
526  */
527 int	mywait(int*);
528 int	mycreat(char*, int);
529 int	systemtype(int);
530 int	pathchar(void);
531 int	myaccess(char*);
532 char*	mygetwd(char*, int);
533 int	myexec(char*, char*[]);
534 int	mydup(int, int);
535 int	myfork(void);
536 int	mypipe(int*);
537 void*	mysbrk(ulong);
538 
539 /*
540  *	parser
541  */
542 int	yyparse(void);
543 int	mpatof(char*, double*);
544 int	mpatov(char*, vlong*);
545 
546 /*
547  *	lex.c
548  */
549 void*	allocn(void*, long, long);
550 void*	alloc(long);
551 void	cinit(void);
552 int	compile(char*, char**, int);
553 void	errorexit(void);
554 int	filbuf(void);
555 int	getc(void);
556 long	getr(void);
557 int	getnsc(void);
558 Sym*	lookup(void);
559 void	main(int, char*[]);
560 void	newfile(char*, int);
561 void	newio(void);
562 void	pushio(void);
563 long	escchar(long, int, int);
564 Sym*	slookup(char*);
565 void	syminit(Sym*);
566 void	unget(int);
567 long	yylex(void);
568 int	Lconv(Fmt*);
569 int	Tconv(Fmt*);
570 int	FNconv(Fmt*);
571 int	Oconv(Fmt*);
572 int	Qconv(Fmt*);
573 int	VBconv(Fmt*);
574 void	setinclude(char*);
575 
576 /*
577  * mac.c
578  */
579 void	dodefine(char*);
580 void	domacro(void);
581 Sym*	getsym(void);
582 long	getnsn(void);
583 void	linehist(char*, int);
584 void	macdef(void);
585 void	macprag(void);
586 void	macend(void);
587 void	macexpand(Sym*, char*);
588 void	macif(int);
589 void	macinc(void);
590 void	maclin(void);
591 void	macund(void);
592 
593 /*
594  * dcl.c
595  */
596 Node*	doinit(Sym*, Type*, long, Node*);
597 Type*	tcopy(Type*);
598 Node*	init1(Sym*, Type*, long, int);
599 Node*	newlist(Node*, Node*);
600 void	adecl(int, Type*, Sym*);
601 int	anyproto(Node*);
602 void	argmark(Node*, int);
603 void	dbgdecl(Sym*);
604 Node*	dcllabel(Sym*, int);
605 Node*	dodecl(void(*)(int, Type*, Sym*), int, Type*, Node*);
606 Sym*	mkstatic(Sym*);
607 void	doenum(Sym*, Node*);
608 void	snap(Type*);
609 Type*	dotag(Sym*, int, int);
610 void	edecl(int, Type*, Sym*);
611 Type*	fnproto(Node*);
612 Type*	fnproto1(Node*);
613 void	markdcl(void);
614 Type*	paramconv(Type*, int, int);
615 void	pdecl(int, Type*, Sym*);
616 Decl*	push(void);
617 Decl*	push1(Sym*);
618 Node*	revertdcl(void);
619 #undef round
620 #define	round	ccround
621 #undef log2
622 #define	log2	cclog2
623 long	round(long, int);
624 int	rsametype(Type*, Type*, int, int);
625 int	sametype(Type*, Type*);
626 ulong	sign(Sym*);
627 ulong	signature(Type*);
628 void	sualign(Type*);
629 void	tmerge(Type*, Sym*);
630 void	walkparam(Node*, int);
631 void	xdecl(int, Type*, Sym*);
632 Node*	contig(Sym*, Node*, long);
633 
634 /*
635  * com.c
636  */
637 void	ccom(Node*);
638 void	complex(Node*);
639 int	tcom(Node*);
640 int	tcoma(Node*, Node*, Type*, int);
641 int	tcomd(Node*);
642 int	tcomo(Node*, int);
643 int	tcomx(Node*);
644 int	tlvalue(Node*);
645 void	constas(Node*, Type*, Type*);
646 Node*	uncomma(Node*);
647 Node*	uncomargs(Node*);
648 
649 /*
650  * con.c
651  */
652 void	acom(Node*);
653 void	acom1(vlong, Node*);
654 void	acom2(Node*, Type*);
655 int	acomcmp1(void*, void*);
656 int	acomcmp2(void*, void*);
657 int	addo(Node*);
658 void	evconst(Node*);
659 
660 /*
661  * funct.c
662  */
663 int	isfunct(Node*);
664 void	dclfunct(Type*, Sym*);
665 
666 /*
667  * sub.c
668  */
669 void	arith(Node*, int);
670 int	castucom(Node*);
671 int	deadheads(Node*);
672 Type*	dotsearch(Sym*, Type*, Node*, long*);
673 long	dotoffset(Type*, Type*, Node*);
674 void	gethunk(void);
675 Node*	invert(Node*);
676 int	bitno(long);
677 void	makedot(Node*, Type*, long);
678 int	mixedasop(Type*, Type*);
679 Node*	new(int, Node*, Node*);
680 Node*	new1(int, Node*, Node*);
681 int	nilcast(Type*, Type*);
682 int	nocast(Type*, Type*);
683 void	prtree(Node*, char*);
684 void	prtree1(Node*, int, int);
685 void	relcon(Node*, Node*);
686 int	relindex(int);
687 int	simpleg(long);
688 Type*	garbt(Type*, long);
689 int	simplec(long);
690 Type*	simplet(long);
691 int	stcompat(Node*, Type*, Type*, long[]);
692 int	tcompat(Node*, Type*, Type*, long[]);
693 void	tinit(void);
694 Type*	typ(int, Type*);
695 Type*	copytyp(Type*);
696 void	typeext(Type*, Node*);
697 void	typeext1(Type*, Node*);
698 int	side(Node*);
699 int	vconst(Node*);
700 int	log2(uvlong);
701 int	vlog(Node*);
702 int	topbit(ulong);
703 void	simplifyshift(Node*);
704 long	typebitor(long, long);
705 void	diag(Node*, char*, ...);
706 void	warn(Node*, char*, ...);
707 void	yyerror(char*, ...);
708 void	fatal(Node*, char*, ...);
709 
710 /*
711  * acid.c
712  */
713 void	acidtype(Type*);
714 void	acidvar(Sym*);
715 
716 /*
717  * pickle.c
718  */
719 void	pickletype(Type*);
720 
721 /*
722  * bits.c
723  */
724 Bits	bor(Bits, Bits);
725 Bits	band(Bits, Bits);
726 Bits	bnot(Bits);
727 int	bany(Bits*);
728 int	bnum(Bits);
729 Bits	blsh(uint);
730 int	beq(Bits, Bits);
731 int	bset(Bits, uint);
732 
733 /*
734  * dpchk.c
735  */
736 void	dpcheck(Node*);
737 void	arginit(void);
738 void	pragvararg(void);
739 void	pragpack(void);
740 void	pragfpround(void);
741 void pragprofile(void);
742 void	pragincomplete(void);
743 
744 /*
745  * calls to machine depend part
746  */
747 void	codgen(Node*, Node*);
748 void	gclean(void);
749 void	gextern(Sym*, Node*, long, long);
750 void	ginit(void);
751 long	outstring(char*, long);
752 long	outlstring(TRune*, long);
753 void	xcom(Node*);
754 long	exreg(Type*);
755 long	align(long, Type*, int);
756 long	maxround(long, long);
757 
758 extern	schar	ewidth[];
759 
760 /*
761  * com64
762  */
763 int	com64(Node*);
764 void	com64init(void);
765 void	bool64(Node*);
766 double	convvtof(vlong);
767 vlong	convftov(double);
768 double	convftox(double, int);
769 vlong	convvtox(vlong, int);
770 
771 /*
772  * machcap
773  */
774 int	machcap(Node*);
775 
776 #pragma	varargck	argpos	warn	2
777 #pragma	varargck	argpos	diag	2
778 #pragma	varargck	argpos	yyerror	1
779 
780 #pragma	varargck	type	"F"	Node*
781 #pragma	varargck	type	"L"	long
782 #pragma	varargck	type	"Q"	long
783 #pragma	varargck	type	"O"	int
784 #pragma	varargck	type	"T"	Type*
785 #pragma	varargck	type	"|"	int
786 
787 #undef true
788 #define	true	mytrue
789