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