1: #
2: /*
3: * C compiler-- first pass header
4: */
5:
6: #include <stdio.h>
7:
8: /*
9: * parameters
10: */
11:
12: #define LTYPE long /* change to int if no long consts */
13: #define MAXINT 077777 /* Largest positive short integer */
14: #define MAXUINT 0177777 /* largest unsigned integer */
15: #define NCPS 8 /* # chars per symbol */
16: #define HSHSIZ 400 /* # entries in hash table for names */
17: #define CMSIZ 40 /* size of expression stack */
18: #define SSIZE 20 /* size of other expression stack */
19: #define SWSIZ 230 /* size of switch table */
20: #define NMEMS 128 /* Number of members in a structure */
21: #define NBPW 16 /* bits per word, object machine */
22: #define NBPC 8 /* bits per character, object machine */
23: #define NCPW 2 /* chars per word, object machine */
24: #define LNCPW 2 /* chars per word, compiler's machine */
25: #define STAUTO (-6) /* offset of first auto variable */
26: #define STARG 4 /* offset of first argument */
27:
28:
29: /*
30: * # bytes in primitive types
31: */
32: #define SZCHAR 1
33: #define SZINT 2
34: #define SZPTR 2
35: #define SZFLOAT 4
36: #define SZLONG 4
37: #define SZDOUB 8
38:
39: /*
40: * format of a structure description
41: */
42: struct str {
43: int ssize; /* structure size */
44: struct hshtab **memlist; /* member list */
45: };
46:
47: /*
48: * For fields, strp points here instead.
49: */
50: struct field {
51: int flen; /* field width in bits */
52: int bitoffs; /* shift count */
53: };
54:
55: /*
56: * Structure of tree nodes for operators
57: */
58: struct tnode {
59: int op; /* operator */
60: int type; /* data type */
61: int *subsp; /* subscript list (for arrays) */
62: struct str *strp; /* structure description for structs */
63: struct tnode *tr1; /* left operand */
64: struct tnode *tr2; /* right operand */
65: };
66:
67: /*
68: * Tree node for constants
69: */
70: struct cnode {
71: int op;
72: int type;
73: int *subsp;
74: struct str *strp;
75: int value;
76: };
77:
78: /*
79: * Tree node for long constants
80: */
81: struct lnode {
82: int op;
83: int type;
84: int *subsp;
85: struct str *strp;
86: LTYPE lvalue;
87: };
88:
89: /*
90: * tree node for floating
91: * constants
92: */
93: struct fnode {
94: int op;
95: int type;
96: int *subsp;
97: struct str *strp;
98: char *cstr;
99: };
100:
101: /*
102: * Structure of namelist
103: */
104: /*
105: * Pushed-down entry for block structure
106: */
107: struct phshtab {
108: char hclass;
109: char hflag;
110: int htype;
111: int *hsubsp;
112: struct str *hstrp;
113: int hoffset;
114: struct phshtab *hpdown;
115: char hblklev;
116: };
117:
118: /*
119: * Top-level namelist
120: */
121: struct hshtab {
122: char hclass; /* storage class */
123: char hflag; /* various flags */
124: int htype; /* type */
125: int *hsubsp; /* subscript list */
126: struct str *hstrp; /* structure description */
127: int hoffset; /* post-allocation location */
128: struct phshtab *hpdown; /* Pushed-down name in outer block */
129: char hblklev; /* Block level of definition */
130: char name[NCPS]; /* ASCII name */
131: };
132:
133: /*
134: * Place used to keep dimensions
135: * during declarations
136: */
137: struct tdim {
138: int rank;
139: int dimens[5];
140: };
141:
142: /*
143: * Table for recording switches.
144: */
145: struct swtab {
146: int swlab;
147: int swval;
148: };
149:
150: char cvtab[4][4];
151: char filename[64];
152: int opdope[];
153: char ctab[];
154: char symbuf[NCPS+2];
155: int hshused;
156: struct hshtab hshtab[HSHSIZ];
157: struct tnode **cp;
158: int isn;
159: struct swtab swtab[SWSIZ];
160: struct swtab *swp;
161: int contlab;
162: int brklab;
163: int retlab;
164: int deflab;
165: unsigned autolen; /* make these int if necessary */
166: unsigned maxauto; /* ... will only cause trouble rarely */
167: int peeksym;
168: int peekc;
169: int eof;
170: int line;
171: char *funcbase;
172: char *curbase;
173: char *coremax;
174: char *maxdecl;
175: struct hshtab *defsym;
176: struct hshtab *funcsym;
177: int proflg;
178: struct hshtab *csym;
179: int cval;
180: LTYPE lcval;
181: int nchstr;
182: int nerror;
183: struct hshtab **paraml;
184: struct hshtab **parame;
185: int strflg;
186: int mosflg;
187: int initflg;
188: int inhdr;
189: char sbuf[BUFSIZ];
190: FILE *sbufp;
191: int regvar;
192: int bitoffs;
193: struct tnode funcblk;
194: char cvntab[];
195: char numbuf[64];
196: struct hshtab **memlist;
197: int nmems;
198: struct hshtab structhole;
199: int blklev;
200: int mossym;
201:
202: /*
203: operators
204: */
205: #define EOFC 0
206: #define NULLOP 218
207: #define SEMI 1
208: #define LBRACE 2
209: #define RBRACE 3
210: #define LBRACK 4
211: #define RBRACK 5
212: #define LPARN 6
213: #define RPARN 7
214: #define COLON 8
215: #define COMMA 9
216: #define FSEL 10
217: #define CAST 11
218: #define ETYPE 12
219:
220: #define KEYW 19
221: #define NAME 20
222: #define CON 21
223: #define STRING 22
224: #define FCON 23
225: #define SFCON 24
226: #define LCON 25
227: #define SLCON 26
228:
229: #define SIZEOF 91
230: #define INCBEF 30
231: #define DECBEF 31
232: #define INCAFT 32
233: #define DECAFT 33
234: #define EXCLA 34
235: #define AMPER 35
236: #define STAR 36
237: #define NEG 37
238: #define COMPL 38
239:
240: #define DOT 39
241: #define PLUS 40
242: #define MINUS 41
243: #define TIMES 42
244: #define DIVIDE 43
245: #define MOD 44
246: #define RSHIFT 45
247: #define LSHIFT 46
248: #define AND 47
249: #define OR 48
250: #define EXOR 49
251: #define ARROW 50
252: #define ITOF 51
253: #define FTOI 52
254: #define LOGAND 53
255: #define LOGOR 54
256: #define FTOL 56
257: #define LTOF 57
258: #define ITOL 58
259: #define LTOI 59
260: #define ITOP 13
261: #define PTOI 14
262: #define LTOP 15
263:
264: #define EQUAL 60
265: #define NEQUAL 61
266: #define LESSEQ 62
267: #define LESS 63
268: #define GREATEQ 64
269: #define GREAT 65
270: #define LESSEQP 66
271: #define LESSP 67
272: #define GREATQP 68
273: #define GREATP 69
274:
275: #define ASPLUS 70
276: #define ASMINUS 71
277: #define ASTIMES 72
278: #define ASDIV 73
279: #define ASMOD 74
280: #define ASRSH 75
281: #define ASLSH 76
282: #define ASSAND 77
283: #define ASOR 78
284: #define ASXOR 79
285: #define ASSIGN 80
286:
287: #define QUEST 90
288: #define MAX 93
289: #define MAXP 94
290: #define MIN 95
291: #define MINP 96
292: #define SEQNC 97
293: #define CALL 100
294: #define MCALL 101
295: #define JUMP 102
296: #define CBRANCH 103
297: #define INIT 104
298: #define SETREG 105
299: #define RFORCE 110
300: #define BRANCH 111
301: #define LABEL 112
302: #define NLABEL 113
303: #define RLABEL 114
304: #define STRASG 115
305: #define ITOC 109
306: #define SEOF 200 /* stack EOF marker in expr compilation */
307:
308: /*
309: types
310: */
311: #define INT 0
312: #define CHAR 1
313: #define FLOAT 2
314: #define DOUBLE 3
315: #define STRUCT 4
316: #define LONG 6
317: #define UNSIGN 7
318: #define UNION 8 /* adjusted later to struct */
319:
320: #define ALIGN 01
321: #define TYPE 07
322: #define BIGTYPE 060000
323: #define TYLEN 2
324: #define XTYPE (03<<3)
325: #define PTR 010
326: #define FUNC 020
327: #define ARRAY 030
328:
329: /*
330: storage classes
331: */
332: #define KEYWC 1
333: #define DEFXTRN 20
334: #define TYPEDEF 9
335: #define MOS 10
336: #define AUTO 11
337: #define EXTERN 12
338: #define STATIC 13
339: #define REG 14
340: #define STRTAG 15
341: #define ARG 16
342: #define ARG1 17
343: #define AREG 18
344: #define MOU 21
345: #define ENUMTAG 22
346: #define ENUMCON 24
347:
348: /*
349: keywords
350: */
351: #define GOTO 20
352: #define RETURN 21
353: #define IF 22
354: #define WHILE 23
355: #define ELSE 24
356: #define SWITCH 25
357: #define CASE 26
358: #define BREAK 27
359: #define CONTIN 28
360: #define DO 29
361: #define DEFAULT 30
362: #define FOR 31
363: #define ENUM 32
364:
365: /*
366: characters
367: */
368: #define BSLASH 117
369: #define SHARP 118
370: #define INSERT 119
371: #define PERIOD 120
372: #define SQUOTE 121
373: #define DQUOTE 122
374: #define LETTER 123
375: #define DIGIT 124
376: #define NEWLN 125
377: #define SPACE 126
378: #define UNKN 127
379:
380: /*
381: * Special operators in intermediate code
382: */
383: #define BDATA 200
384: #define WDATA 201
385: #define PROG 202
386: #define DATA 203
387: #define BSS 204
388: #define CSPACE 205
389: #define SSPACE 206
390: #define SYMDEF 207
391: #define SAVE 208
392: #define RETRN 209
393: #define EVEN 210
394: #define PROFIL 212
395: #define SWIT 213
396: #define EXPR 214
397: #define SNAME 215
398: #define RNAME 216
399: #define ANAME 217
400: #define SETSTK 219
401: #define SINIT 220
402:
403: /*
404: Flag bits
405: */
406:
407: #define BINARY 01
408: #define LVALUE 02
409: #define RELAT 04
410: #define ASSGOP 010
411: #define LWORD 020
412: #define RWORD 040
413: #define COMMUTE 0100
414: #define RASSOC 0200
415: #define LEAF 0400
416:
417: /*
418: * Conversion codes
419: */
420: #define ITF 1
421: #define ITL 2
422: #define LTF 3
423: #define ITP 4
424: #define PTI 5
425: #define FTI 6
426: #define LTI 7
427: #define FTL 8
428: #define LTP 9
429: #define ITC 10
430: #define XX 15
431:
432: /*
433: * symbol table flags
434: */
435:
436: #define FMOS 01
437: #define FKEYW 04
438: #define FFIELD 020
439: #define FINIT 040
440: #define FLABL 0100
441:
442: /*
443: * functions
444: */
445: char *sbrk();
446: struct tnode *tree();
447: char *copnum();
448: struct tnode *convert();
449: struct tnode *chkfun();
450: struct tnode *disarray();
451: struct tnode *block();
452: struct cnode *cblock();
453: struct fnode *fblock();
454: char *gblock();
455: struct tnode *pexpr();
456: struct str *strdec();
457: struct hshtab *xprtype();
458: struct tnode *nblock();
Defined variables
cp
defined in line
157; used 51 times
- in /usr/src/cmd/c/c00.c line
614,
627,
644-648(2),
656-660(2),
669-672(2),
686,
803,
817,
825,
861,
870
- in /usr/src/cmd/c/c01.c line
34-37(2),
44,
68,
85,
95,
101-106(2),
120-122(2),
133,
141-144(3),
159,
237-246(4),
331-334(2),
517,
625
- in /usr/src/cmd/c/c02.c line
202-206(3),
212,
666
- in /usr/src/cmd/c/c04.c line
329-331(2),
345-352(7)
csym
defined in line
178; used 13 times
ctab
defined in line
153; used 12 times
curbase
defined in line
172; used 19 times
- in /usr/src/cmd/c/c00.c line
89,
611,
862
- in /usr/src/cmd/c/c01.c line
471-472(2),
642
- in /usr/src/cmd/c/c02.c line
109,
130,
146,
235,
568,
577
- in /usr/src/cmd/c/c03.c line
166,
175,
208,
329-331(2),
392,
473
cval
defined in line
179; used 32 times
- in /usr/src/cmd/c/c00.c line
167,
217,
324,
345,
443,
449,
509-510(2),
518-519(2),
648,
660-668(3)
- in /usr/src/cmd/c/c02.c line
333,
349,
381,
389,
432
- in /usr/src/cmd/c/c03.c line
61,
67-73(4),
85-92(4),
100,
581,
588-590(2)
defsym
defined in line
175; used 15 times
- in /usr/src/cmd/c/c02.c line
37,
45,
506
- in /usr/src/cmd/c/c03.c line
187,
202,
321-322(2),
517,
537,
546,
553,
560-562(2),
582,
673
eof
defined in line
169; used 6 times
funcbase
defined in line
171; used 21 times
- in /usr/src/cmd/c/c00.c line
89,
611,
859-862(2),
868
- in /usr/src/cmd/c/c01.c line
642
- in /usr/src/cmd/c/c02.c line
75-80(2),
130,
144-146(2),
235,
567-568(2),
577
- in /usr/src/cmd/c/c03.c line
166,
175,
208,
329,
392,
473
isn
defined in line
158; used 27 times
- in /usr/src/cmd/c/c00.c line
324
- in /usr/src/cmd/c/c02.c line
104-108(3),
119,
353,
363,
387-390(2),
404-405(2),
426-428(3),
451-453(2),
459,
474,
480-481(2),
515,
562,
615
- in /usr/src/cmd/c/c03.c line
438-444(3)
- in /usr/src/cmd/c/c04.c line
267
line
defined in line
170; used 12 times
peekc
defined in line
168; used 24 times
- in /usr/src/cmd/c/c00.c line
197-199(3),
218-232(6),
258,
268,
280,
305-308(2),
320,
344,
438,
461,
547
- in /usr/src/cmd/c/c02.c line
499
- in /usr/src/cmd/c/c04.c line
284-285(2),
296,
309
peeksym
defined in line
167; used 54 times
- in /usr/src/cmd/c/c00.c line
190-192(3),
265,
685,
734,
801
- in /usr/src/cmd/c/c02.c line
21-26(2),
49-50(3),
61,
70,
88,
121,
175-176(2),
183-187(2),
194,
219,
257-261(2),
278,
326,
383-386(2),
397,
520,
543,
550-556(3),
791
- in /usr/src/cmd/c/c03.c line
104,
185,
237,
244-246(3),
258,
287-293(4),
381-383(2),
422,
544,
580,
598
- in /usr/src/cmd/c/c04.c line
259,
271
sbuf
defined in line
189; used 1 times
swp
defined in line
160; used 10 times
Defined struct's
cnode
defined in line
70; used 6 times
field
defined in line
50; used 2 times
fnode
defined in line
93; used 6 times
hshtab
defined in line
121; used 93 times
- in line 44,
156(2),
175-184(10),
196-198(4),
457(2)
- in /usr/src/cmd/c/c00.c line
107(2),
606(2),
848-853(8)
- in /usr/src/cmd/c/c01.c line
419-421(4)
- in /usr/src/cmd/c/c02.c line
16-17(4),
137(2),
245(2),
285-287(4),
642-647(4),
704-705(4),
754-756(4)
- in /usr/src/cmd/c/c03.c line
19(2),
37(2),
141-148(10),
226(2),
270-276(6),
509-514(6),
681(2)
- in /usr/src/cmd/c/c04.c line
74(2),
257(2)
lnode
defined in line
81; used 2 times
str
defined in line
42; used 20 times
tdim
defined in line
137; used 6 times
tnode
defined in line
58; used 110 times
- in line 63-64(4),
157(2),
193(2),
446-458(14)
- in /usr/src/cmd/c/c00.c line
17(2),
601(2),
608(2),
856(2)
- in /usr/src/cmd/c/c01.c line
21-22(4),
253-255(4),
276-278(4),
301-305(6),
318-323(6),
344(2),
396-402(6),
417(2),
486-488(4),
504-506(4),
635(2)
- in /usr/src/cmd/c/c02.c line
142(2),
243(2),
302(2),
538(2),
586(2),
643-648(4)
- in /usr/src/cmd/c/c04.c line
40(2),
50-52(4),
71-73(4),
168(2),
184-188(4),
246(2),
327(2),
341(2)
Defined macros
AND
defined in line
248; used 4 times
AREG
defined in line
343; used 4 times
ARG
defined in line
341; used 4 times
ARG1
defined in line
342; used 4 times
ARRAY
defined in line
327; used 17 times
- in /usr/src/cmd/c/c00.c line
669
- in /usr/src/cmd/c/c01.c line
58,
327
- in /usr/src/cmd/c/c02.c line
150,
184,
194(2),
512,
658-659(2)
- in /usr/src/cmd/c/c03.c line
305,
334,
595,
631
- in /usr/src/cmd/c/c04.c line
195,
264,
270
ASOR
defined in line
283;
never used
AUTO
defined in line
336; used 13 times
- in /usr/src/cmd/c/c00.c line
33
- in /usr/src/cmd/c/c02.c line
161,
185,
205,
226,
272,
668,
674
- in /usr/src/cmd/c/c03.c line
110,
341,
416,
423,
436
BSS
defined in line
387; used 2 times
CALL
defined in line
293; used 8 times
CASE
defined in line
357; used 1 times
CAST
defined in line
217; used 4 times
CHAR
defined in line
312; used 18 times
- in /usr/src/cmd/c/c00.c line
25,
669
- in /usr/src/cmd/c/c01.c line
60,
172,
198,
209,
227-235(3),
244,
348
- in /usr/src/cmd/c/c02.c line
184
- in /usr/src/cmd/c/c03.c line
251,
633,
646,
691
- in /usr/src/cmd/c/c04.c line
58,
349
CMSIZ
defined in line
17; used 2 times
CON
defined in line
222; used 14 times
DATA
defined in line
386; used 2 times
DIGIT
defined in line
375; used 14 times
DO
defined in line
360; used 1 times
DOT
defined in line
240; used 1 times
ELSE
defined in line
355; used 3 times
ENUM
defined in line
363; used 6 times
EOFC
defined in line
205; used 7 times
EVEN
defined in line
393; used 4 times
EXOR
defined in line
250; used 3 times
EXPR
defined in line
396; used 1 times
EXTERN
defined in line
337; used 18 times
- in /usr/src/cmd/c/c00.c line
34,
633,
639
- in /usr/src/cmd/c/c02.c line
25,
32-34(2),
44,
54,
72,
215,
715,
743
- in /usr/src/cmd/c/c03.c line
330,
342-348(4)
- in /usr/src/cmd/c/c04.c line
89
FCON
defined in line
224; used 6 times
FMOS
defined in line
436; used 4 times
FOR
defined in line
362; used 1 times
FSEL
defined in line
216; used 2 times
FTI
defined in line
425; used 1 times
FTL
defined in line
427; used 1 times
FTOI
defined in line
253; used 2 times
FTOL
defined in line
256; used 1 times
FUNC
defined in line
326; used 9 times
GOTO
defined in line
351; used 1 times
IF
defined in line
353; used 1 times
INIT
defined in line
297; used 2 times
INT
defined in line
311; used 31 times
- in /usr/src/cmd/c/c00.c line
24,
32
- in /usr/src/cmd/c/c01.c line
54,
61-62(2),
89,
136,
157,
172,
198,
206,
224-236(5),
348,
437
- in /usr/src/cmd/c/c03.c line
27,
45,
86,
108-112(2),
120,
196,
449,
639,
690-691(2)
- in /usr/src/cmd/c/c04.c line
61,
350
ITC
defined in line
429;
never used
ITF
defined in line
420; used 2 times
ITL
defined in line
421; used 3 times
ITOC
defined in line
305; used 2 times
ITOF
defined in line
252; used 2 times
ITOL
defined in line
258; used 1 times
ITOP
defined in line
260; used 1 times
ITP
defined in line
423; used 5 times
JUMP
defined in line
295; used 1 times
KEYW
defined in line
220; used 8 times
LCON
defined in line
226; used 3 times
LEAF
defined in line
415;
never used
LESS
defined in line
267; used 2 times
LNCPW
defined in line
24; used 4 times
LONG
defined in line
316; used 5 times
LTF
defined in line
422; used 2 times
LTI
defined in line
426; used 2 times
LTOF
defined in line
257; used 1 times
LTOI
defined in line
259; used 1 times
LTOP
defined in line
262; used 1 times
LTP
defined in line
428; used 4 times
LTYPE
defined in line
12; used 2 times
MAX
defined in line
288; used 3 times
MAXP
defined in line
289; used 1 times
MIN
defined in line
290; used 2 times
MINP
defined in line
291;
never used
MOD
defined in line
245; used 1 times
MOS
defined in line
335; used 10 times
MOU
defined in line
344; used 3 times
NAME
defined in line
221; used 18 times
- in /usr/src/cmd/c/c00.c line
17,
125,
146,
193,
669
- in /usr/src/cmd/c/c01.c line
105,
131,
327,
424,
493
- in /usr/src/cmd/c/c02.c line
26,
50,
643
- in /usr/src/cmd/c/c03.c line
54,
157
- in /usr/src/cmd/c/c04.c line
88,
108,
259
NBPC
defined in line
22; used 4 times
NBPW
defined in line
21; used 2 times
NCPS
defined in line
15; used 9 times
NCPW
defined in line
23; used 1 times
NEG
defined in line
237; used 1 times
NMEMS
defined in line
20; used 4 times
OR
defined in line
249; used 2 times
PLUS
defined in line
241; used 9 times
PROG
defined in line
385; used 2 times
PTI
defined in line
424; used 6 times
PTOI
defined in line
261; used 1 times
PTR
defined in line
325; used 13 times
REG
defined in line
339; used 9 times
RPARN
defined in line
213; used 12 times
SAVE
defined in line
391; used 1 times
SEMI
defined in line
207; used 15 times
SEOF
defined in line
306; used 1 times
SSIZE
defined in line
18; used 3 times
STAR
defined in line
236; used 8 times
STARG
defined in line
26; used 1 times
SWIT
defined in line
395; used 1 times
SWSIZ
defined in line
19; used 2 times
SZINT
defined in line
33; used 2 times
SZPTR
defined in line
34; used 1 times
TYPE
defined in line
321; used 12 times
UNKN
defined in line
378; used 30 times
UNSIGN
defined in line
317; used 18 times
- in /usr/src/cmd/c/c00.c line
30
- in /usr/src/cmd/c/c01.c line
43,
60,
137,
144,
172-173(3),
197-198(3),
348,
513,
526
- in /usr/src/cmd/c/c03.c line
113,
639,
691
- in /usr/src/cmd/c/c04.c line
61
XTYPE
defined in line
324; used 19 times
- in /usr/src/cmd/c/c01.c line
58(2),
93,
99,
309,
327
- in /usr/src/cmd/c/c02.c line
48,
150,
658
- in /usr/src/cmd/c/c03.c line
304-305(2),
311-316(2),
334,
340,
631,
691-692(2)
- in /usr/src/cmd/c/c04.c line
195
XX
defined in line
430; used 4 times
Usage of this include