xref: /original-bsd/old/pcc/pcc.h (revision 48b5d12e)
1 /*
2  * Copyright (c) 1983 Regents of the University of California.
3  * All rights reserved.  The Berkeley software License Agreement
4  * specifies the terms and conditions for redistribution.
5  *
6  *	@(#)pcc.h	5.1 (Berkeley) 05/30/85
7  */
8 
9 /*
10  * This file contains definitions for all the constants and structures
11  *	needed to use the intermediate code files generated and read by
12  *	the Portable C Compiler and related compilers.
13  *
14  * Rules for changing this code:
15  *   1)	All op values must be integer constants -- this permits us to run
16  *	a 'sed' script on this file to create %term declarations for yacc.
17  *   2)	Because the PCC uses fancy ASG and UNARY macros, assignment
18  *	operators must have values 1 greater than corresponding normal
19  *	operators, and unary operators must have values 2 greater ditto.
20  *   3) Ops used only by f1 must have values >= 150 (PCCF_FORTOPS).
21  *   4)	Other language-dependent ops must have values >= 200.
22  */
23 
24 # ifndef	PCC_TOKENS
25 
26 # define	PCC_TOKENS	0
27 
28 # define	PCC_ERROR	1	/* an error node */
29 # define	PCC_FREE	2	/* an unused node */
30 
31 /*
32  * Constants.
33  */
34 # define	PCC_STRING	3	/* a string constant */
35 # define	PCC_ICON	4	/* an integer constant */
36 # define	PCC_FCON	5	/* a floating point constant */
37 # define	PCC_DCON	6	/* a double precision f.p. constant */
38 
39 /*
40  * Leaf types.
41  */
42 # define	PCC_NAME	7	/* an identifier */
43 # define	PCC_REG		8	/* a register */
44 # define	PCC_OREG	9	/* register and offset */
45 # define	PCC_CCODES	10	/* condition codes */
46 # define	PCC_FLD		11	/* a bit field */
47 
48 /*
49  * Arithmetic operators.
50  */
51 # define	PCC_PLUS	12	/* + */
52 # define	PCC_PLUSEQ	13	/* += */
53 # define	PCC_UPLUS	14	/* unary + (for completeness) */
54 # define	PCC_MINUS	15	/* - */
55 # define	PCC_MINUSEQ	16	/* -= */
56 # define	PCC_UMINUS	17	/* unary - */
57 # define	PCC_MUL		18	/* * */
58 # define	PCC_MULEQ	19	/* *= */
59 /* Reserve a slot for 'unary *', which is PCC jargon for PCC_DEREF (yech) */
60 # define	PCC_DIV		21	/* / */
61 # define	PCC_DIVEQ	22	/* /= */
62 # define	PCC_MOD		23	/* % */
63 # define	PCC_MODEQ	24	/* %= */
64 # define	PCC_INCR	25	/* ++ */
65 # define	PCC_DECR	26	/* -- */
66 # define	PCC_ASSIGN	27	/* = (these last 3 are stretching it) */
67 
68 /*
69  * Bit operators.
70  */
71 # define	PCC_AND		28	/* & */
72 # define	PCC_ANDEQ	29	/* &= */
73 /* Reserve a slot for 'unary &', jargon for PCC_ADDROF */
74 # define	PCC_OR		31	/* | */
75 # define	PCC_OREQ	32	/* |= */
76 # define	PCC_ER		33	/* ^ */
77 # define	PCC_EREQ	34	/* ^= */
78 # define	PCC_LS		35	/* << */
79 # define	PCC_LSEQ	36	/* <<= */
80 # define	PCC_RS		37	/* >> */
81 # define	PCC_RSEQ	38	/* >>= */
82 # define	PCC_COMPL	39	/* ~ */
83 
84 /*
85  * Booleans.
86  */
87 # define	PCC_EQ		40	/* == */
88 # define	PCC_NE		41	/* != */
89 # define	PCC_LE		42	/* <= */
90 # define	PCC_LT		43	/* < */
91 # define	PCC_GE		44	/* >= */
92 # define	PCC_GT		45	/* > */
93 # define	PCC_ULE		46	/* unsigned <= */
94 # define	PCC_ULT		47	/* unsigned < */
95 # define	PCC_UGE		48	/* unsigned >= */
96 # define	PCC_UGT		49	/* unsigned > */
97 # define	PCC_QUEST	50	/* ? (for conditional expressions) */
98 # define	PCC_COLON	51	/* : (for conditional expressions) */
99 # define	PCC_ANDAND	52	/* && */
100 # define	PCC_OROR	53	/* || */
101 # define	PCC_NOT		54	/* ! */
102 
103 /*
104  * Function calls.
105  */
106 # define	PCC_CALL	55	/* call by value */
107 /* no ASG */
108 # define	PCC_UCALL	57	/* call with no arguments */
109 # define	PCC_FORTCALL	58	/* call by reference? */
110 /* no ASG */
111 # define	PCC_UFORTCALL	60	/* ??? */
112 # ifdef INLINE
113 # define	PCC_INLINE	61	/* inline function */
114 /* no ASG */
115 # define	PCC_UINLINE	63	/* inline with no arguments */
116 # endif INLINE
117 
118 /*
119  * Referencing and dereferencing.
120  */
121 # define	PCC_DEREF	20	/* * */
122 # define	PCC_ADDROF	30	/* & */
123 
124 /*
125  * Special structure operators.
126  */
127 # define	PCC_DOT		64	/* . */
128 # define	PCC_STREF	65	/* -> */
129 # define	PCC_STASG	66	/* structure assignment */
130 # define	PCC_STARG	67	/* an argument of type structure */
131 # define	PCC_STCALL	68	/* a function of type structure */
132 /* no ASG */
133 # define	PCC_USTCALL	70	/* unary structure function */
134 
135 /*
136  * Conversions.
137  */
138 # define	PCC_SCONV	71	/* scalar conversion */
139 # define	PCC_PCONV	72	/* pointer conversion */
140 # define	PCC_PMCONV	73	/* pointer multiply conversion */
141 # define	PCC_PVCONV	74	/* pointer divide conversion */
142 # define	PCC_CAST	75	/* redundant? */
143 
144 /*
145  * Bracket types.
146  */
147 # define	PCC_LB		76	/* [ */
148 # define	PCC_RB		77	/* ] */
149 
150 /*
151  * Comma nodes.
152  */
153 # define	PCC_COMOP	78	/* , (in expressions) */
154 # define	PCC_CM		79	/* , (in argument lists) */
155 
156 /*
157  * Miscellaneous.
158  */
159 # define	PCC_FORCE	80	/* result of last expression goes in r0 */
160 # define	PCC_GOTO	81	/* unconditional goto */
161 # define	PCC_CBRANCH	82	/* goto label if !test */
162 # define	PCC_RETURN	83	/* return from function */
163 # define	PCC_INIT	84	/* initialized data */
164 # define	PCC_TYPE	85	/* a type */
165 # define	PCC_CLASS	86	/* a storage class */
166 
167 # define	PCC_MAXOP	86	/* highest numbered PCC op */
168 
169 /*
170  * Special codes for interfacing to /lib/f1.
171  */
172 # define	PCCF_FORTOPS	150
173 # define	PCCF_FTEXT	150	/* pass literal assembler text */
174 # define	PCCF_FEXPR	151	/* a statement */
175 # define	PCCF_FSWITCH	152	/* not implemented */
176 # define	PCCF_FLBRAC	153	/* beginning of subroutine */
177 # define	PCCF_FRBRAC	154	/* end of subroutine */
178 # define	PCCF_FEOF	155	/* end of file */
179 # define	PCCF_FARIF	156	/* not implemented */
180 # define	PCCF_FLABEL	157	/* an f77 label */
181 
182 # endif	PCC_TOKENS
183 
184 
185 /*
186  * Types, as encoded in intermediate file cookies.
187  */
188 # define	PCCT_UNDEF	0
189 # define	PCCT_FARG	1	/* function argument */
190 # define	PCCT_CHAR	2
191 # define	PCCT_SHORT	3
192 # define	PCCT_INT	4
193 # define	PCCT_LONG	5
194 # define	PCCT_FLOAT	6
195 # define	PCCT_DOUBLE	7
196 # define	PCCT_STRTY	8
197 # define	PCCT_UNIONTY	9
198 # define	PCCT_ENUMTY	10
199 # define	PCCT_MOETY	11	/* member of enum */
200 # define	PCCT_UCHAR	12
201 # define	PCCT_USHORT	13
202 # define	PCCT_UNSIGNED	14
203 # define	PCCT_ULONG	15
204 
205 /*
206  * Type modifiers.
207  */
208 # define	PCCTM_PTR	020
209 # define	PCCTM_FTN	040
210 # define	PCCTM_ARY	060
211 # define	PCCTM_BASETYPE	017
212 # define	PCCTM_TYPESHIFT	2
213 
214 
215 /*
216  * Useful macros.  'PCCOM' macros apply to ops.
217  */
218 # define	PCCOM_ASG	1+
219 # define	PCCOM_UNARY	2+
220 # define	PCCOM_NOASG	(-1)+
221 # define	PCCOM_NOUNARY	(-2)+
222 
223 # define	PCCM_TRIPLE(op, var, type)	\
224 	((op) | ((var) << 8) | (long) (type) << 16)
225 # define	PCCM_TEXT(s)			\
226 	PCCM_TRIPLE(PCCF_FTEXT, (strlen(s) + 3) / 4, 0)
227 # define	PCCM_ADDTYPE(t, m)		\
228 	((((t) &~ PCCTM_BASETYPE) << PCCTM_TYPESHIFT) | \
229 	(m) | ((t) & PCCTM_BASETYPE))
230