Commit | Line | Data |
---|---|---|
bb0cfa24 DF |
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) %G% | |
7 | */ | |
8 | ||
9ef81f2b RC |
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)) |