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