xref: /plan9-contrib/sys/src/cmd/cc/cc.h (revision e94a8e9b44de11e62dfd4566245554f8bf8e0295)
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[20];
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	nerrors;
455 EXTERN	int	newflag;
456 EXTERN	long	nhunk;
457 EXTERN	int	ninclude;
458 EXTERN	Node*	nodproto;
459 EXTERN	Node*	nodcast;
460 EXTERN	Biobuf	outbuf;
461 EXTERN	Biobuf	diagbuf;
462 EXTERN	char*	outfile;
463 EXTERN	char*	pathname;
464 EXTERN	int	peekc;
465 EXTERN	long	stkoff;
466 EXTERN	Type*	strf;
467 EXTERN	Type*	strl;
468 EXTERN	char	symb[NSYMB];
469 EXTERN	Sym*	symstring;
470 EXTERN	int	taggen;
471 EXTERN	Type*	tfield;
472 EXTERN	Type*	tufield;
473 EXTERN	int	thechar;
474 EXTERN	char*	thestring;
475 EXTERN	Type*	thisfn;
476 EXTERN	long	thunk;
477 EXTERN	Type*	types[NTYPE];
478 EXTERN	Type*	fntypes[NTYPE];
479 EXTERN	Node*	initlist;
480 EXTERN	Term	term[NTERM];
481 EXTERN	int	nterm;
482 EXTERN	int	packflg;
483 EXTERN	int	fproundflg;
484 EXTERN	int	profileflg;
485 EXTERN	int	ncontin;
486 EXTERN	int	newvlongcode;
487 EXTERN	int	canreach;
488 EXTERN	int	warnreach;
489 EXTERN	Bits	zbits;
490 
491 extern	char	*onames[], *tnames[], *gnames[];
492 extern	char	*cnames[], *qnames[], *bnames[];
493 extern	char	tab[NTYPE][NTYPE];
494 extern	char	comrel[], invrel[], logrel[];
495 extern	long	ncast[], tadd[], tand[];
496 extern	long	targ[], tasadd[], tasign[], tcast[];
497 extern	long	tdot[], tfunct[], tindir[], tmul[];
498 extern	long	tnot[], trel[], tsub[];
499 
500 extern	char	typeaf[];
501 extern	char	typefd[];
502 extern	char	typei[];
503 extern	char	typesu[];
504 extern	char	typesuv[];
505 extern	char	typeu[];
506 extern	char	typev[];
507 extern	char	typec[];
508 extern	char	typeh[];
509 extern	char	typeil[];
510 extern	char	typeilp[];
511 extern	char	typechl[];
512 extern	char	typechlv[];
513 extern	char	typechlvp[];
514 extern	char	typechlp[];
515 extern	char	typechlpfd[];
516 
517 EXTERN	char*	typeswitch;
518 EXTERN	char*	typeword;
519 EXTERN	char*	typecmplx;
520 
521 extern	ulong	thash1;
522 extern	ulong	thash2;
523 extern	ulong	thash3;
524 extern	ulong	thash[];
525 
526 /*
527  *	compat.c/unix.c/windows.c
528  */
529 int	mywait(int*);
530 int	mycreat(char*, int);
531 int	systemtype(int);
532 int	pathchar(void);
533 int	myaccess(char*);
534 char*	mygetwd(char*, int);
535 int	myexec(char*, char*[]);
536 int	mydup(int, int);
537 int	myfork(void);
538 int	mypipe(int*);
539 void*	mysbrk(ulong);
540 
541 /*
542  *	parser
543  */
544 int	yyparse(void);
545 int	mpatov(char*, vlong*);
546 
547 /*
548  *	lex.c
549  */
550 void*	allocn(void*, long, long);
551 void*	alloc(long);
552 void	cinit(void);
553 int	compile(char*, char**, int);
554 void	errorexit(void);
555 int	filbuf(void);
556 int	getc(void);
557 long	getr(void);
558 int	getnsc(void);
559 Sym*	lookup(void);
560 void	main(int, char*[]);
561 void	newfile(char*, int);
562 void	newio(void);
563 void	pushio(void);
564 long	escchar(long, int, int);
565 Sym*	slookup(char*);
566 void	syminit(Sym*);
567 void	unget(int);
568 long	yylex(void);
569 int	Lconv(Fmt*);
570 int	Tconv(Fmt*);
571 int	FNconv(Fmt*);
572 int	Oconv(Fmt*);
573 int	Qconv(Fmt*);
574 int	VBconv(Fmt*);
575 void	setinclude(char*);
576 
577 /*
578  * mac.c
579  */
580 void	dodefine(char*);
581 void	domacro(void);
582 Sym*	getsym(void);
583 long	getnsn(void);
584 void	linehist(char*, int);
585 void	macdef(void);
586 void	macprag(void);
587 void	macend(void);
588 void	macexpand(Sym*, char*);
589 void	macif(int);
590 void	macinc(void);
591 void	maclin(void);
592 void	macund(void);
593 
594 /*
595  * dcl.c
596  */
597 Node*	doinit(Sym*, Type*, long, Node*);
598 Type*	tcopy(Type*);
599 Node*	init1(Sym*, Type*, long, int);
600 Node*	newlist(Node*, Node*);
601 void	adecl(int, Type*, Sym*);
602 int	anyproto(Node*);
603 void	argmark(Node*, int);
604 void	dbgdecl(Sym*);
605 Node*	dcllabel(Sym*, int);
606 Node*	dodecl(void(*)(int, Type*, Sym*), int, Type*, Node*);
607 Sym*	mkstatic(Sym*);
608 void	doenum(Sym*, Node*);
609 void	snap(Type*);
610 Type*	dotag(Sym*, int, int);
611 void	edecl(int, Type*, Sym*);
612 Type*	fnproto(Node*);
613 Type*	fnproto1(Node*);
614 void	markdcl(void);
615 Type*	paramconv(Type*, int);
616 void	pdecl(int, Type*, Sym*);
617 Decl*	push(void);
618 Decl*	push1(Sym*);
619 Node*	revertdcl(void);
620 long	round(long, int);
621 int	rsametype(Type*, Type*, int, int);
622 int	sametype(Type*, Type*);
623 ulong	sign(Sym*);
624 ulong	signature(Type*);
625 void	sualign(Type*);
626 void	tmerge(Type*, Sym*);
627 void	walkparam(Node*, int);
628 void	xdecl(int, Type*, Sym*);
629 Node*	contig(Sym*, Node*, long);
630 
631 /*
632  * com.c
633  */
634 void	ccom(Node*);
635 void	complex(Node*);
636 int	tcom(Node*);
637 int	tcoma(Node*, Node*, Type*, int);
638 int	tcomd(Node*);
639 int	tcomo(Node*, int);
640 int	tcomx(Node*);
641 int	tlvalue(Node*);
642 void	constas(Node*, Type*, Type*);
643 Node*	uncomma(Node*);
644 Node*	uncomargs(Node*);
645 
646 /*
647  * con.c
648  */
649 void	acom(Node*);
650 void	acom1(vlong, Node*);
651 void	acom2(Node*, Type*);
652 int	acomcmp1(const void*, const void*);
653 int	acomcmp2(const void*, const void*);
654 int	addo(Node*);
655 void	evconst(Node*);
656 
657 /*
658  * funct.c
659  */
660 int	isfunct(Node*);
661 void	dclfunct(Type*, Sym*);
662 
663 /*
664  * sub.c
665  */
666 void	arith(Node*, int);
667 int	deadheads(Node*);
668 Type*	dotsearch(Sym*, Type*, Node*, long*);
669 long	dotoffset(Type*, Type*, Node*);
670 void	gethunk(void);
671 Node*	invert(Node*);
672 int	bitno(long);
673 void	makedot(Node*, Type*, long);
674 int	mixedasop(Type*, Type*);
675 Node*	new(int, Node*, Node*);
676 Node*	new1(int, Node*, Node*);
677 int	nilcast(Type*, Type*);
678 int	nocast(Type*, Type*);
679 void	prtree(Node*, char*);
680 void	prtree1(Node*, int, int);
681 void	relcon(Node*, Node*);
682 int	relindex(int);
683 int	simpleg(long);
684 Type*	garbt(Type*, long);
685 int	simplec(long);
686 Type*	simplet(long);
687 int	stcompat(Node*, Type*, Type*, long[]);
688 int	tcompat(Node*, Type*, Type*, long[]);
689 void	tinit(void);
690 Type*	typ(int, Type*);
691 Type*	copytyp(Type*);
692 void	typeext(Type*, Node*);
693 void	typeext1(Type*, Node*);
694 int	side(Node*);
695 int	vconst(Node*);
696 int	log2(uvlong);
697 int	vlog(Node*);
698 int	topbit(ulong);
699 void	simplifyshift(Node*);
700 long	typebitor(long, long);
701 void	diag(Node*, char*, ...);
702 void	warn(Node*, char*, ...);
703 void	yyerror(char*, ...);
704 void	fatal(Node*, char*, ...);
705 
706 /*
707  * acid.c
708  */
709 void	acidtype(Type*);
710 void	acidvar(Sym*);
711 
712 /*
713  * pickle.c
714  */
715 void	pickletype(Type*);
716 
717 /*
718  * bits.c
719  */
720 Bits	bor(Bits, Bits);
721 Bits	band(Bits, Bits);
722 Bits	bnot(Bits);
723 int	bany(Bits*);
724 int	bnum(Bits);
725 Bits	blsh(uint);
726 int	beq(Bits, Bits);
727 int	bset(Bits, uint);
728 
729 /*
730  * dpchk.c
731  */
732 void	dpcheck(Node*);
733 void	arginit(void);
734 void	pragvararg(void);
735 void	pragpack(void);
736 void	pragfpround(void);
737 void pragprofile(void);
738 void	pragincomplete(void);
739 
740 /*
741  * calls to machine depend part
742  */
743 void	codgen(Node*, Node*);
744 void	gclean(void);
745 void	gextern(Sym*, Node*, long, long);
746 void	ginit(void);
747 long	outstring(char*, long);
748 long	outlstring(TRune*, long);
749 void	xcom(Node*);
750 long	exreg(Type*);
751 long	align(long, Type*, int);
752 long	maxround(long, long);
753 
754 extern	schar	ewidth[];
755 
756 /*
757  * com64
758  */
759 int	com64(Node*);
760 void	com64init(void);
761 void	bool64(Node*);
762 double	convvtof(vlong);
763 vlong	convftov(double);
764 double	convftox(double, int);
765 vlong	convvtox(vlong, int);
766 
767 /*
768  * machcap
769  */
770 int	machcap(Node*);
771 
772 #pragma	varargck	argpos	warn	2
773 #pragma	varargck	argpos	diag	2
774 #pragma	varargck	argpos	yyerror	1
775 
776 #pragma	varargck	type	"F"	Node*
777 #pragma	varargck	type	"L"	long
778 #pragma	varargck	type	"Q"	long
779 #pragma	varargck	type	"O"	int
780 #pragma	varargck	type	"T"	Type*
781 #pragma	varargck	type	"|"	int
782