Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 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