Commit | Line | Data |
---|---|---|
81a05aab | 1 | /* @(#)mfile1 4.2 (Berkeley) 83/04/04 */ |
53f86642 KM |
2 | |
3 | # include "macdefs" | |
4 | # include "manifest" | |
5 | ||
6 | /* storage classes */ | |
7 | # define SNULL 0 | |
8 | # define AUTO 1 | |
9 | # define EXTERN 2 | |
10 | # define STATIC 3 | |
11 | # define REGISTER 4 | |
12 | # define EXTDEF 5 | |
13 | # define LABEL 6 | |
14 | # define ULABEL 7 | |
15 | # define MOS 8 | |
16 | # define PARAM 9 | |
17 | # define STNAME 10 | |
18 | # define MOU 11 | |
19 | # define UNAME 12 | |
20 | # define TYPEDEF 13 | |
21 | # define FORTRAN 14 | |
22 | # define ENAME 15 | |
23 | # define MOE 16 | |
24 | # define UFORTRAN 17 | |
25 | # define USTATIC 18 | |
26 | /* field size is ORed in */ | |
27 | # define FIELD 0100 | |
28 | # define FLDSIZ 077 | |
29 | # ifndef BUG1 | |
30 | extern char *scnames(); | |
31 | # endif | |
32 | ||
33 | /* location counters */ | |
34 | # define PROG 0 | |
35 | # define DATA 1 | |
36 | # define ADATA 2 | |
37 | # define STRNG 3 | |
38 | # define ISTRNG 4 | |
39 | # define STAB 5 | |
40 | ||
41 | ||
42 | /* symbol table flags */ | |
43 | # define SMOS 01 | |
44 | # define SHIDDEN 02 | |
45 | # define SHIDES 04 | |
46 | # define SSET 010 | |
47 | # define SREF 020 | |
48 | # define SNONUNIQ 040 | |
49 | # define STAG 0100 | |
50 | ||
51 | # ifndef FIXDEF | |
52 | # define FIXDEF(p) | |
53 | #endif | |
54 | # ifndef FIXARG | |
55 | # define FIXARG(p) | |
56 | # endif | |
57 | # ifndef FIXSTRUCT | |
58 | # define FIXSTRUCT(a,b) | |
59 | # endif | |
60 | ||
61 | /* alignment of initialized quantities */ | |
62 | # ifndef AL_INIT | |
63 | # define AL_INIT ALINT | |
64 | # endif | |
65 | ||
66 | struct symtab { | |
67 | #ifndef FLEXNAMES | |
68 | char sname[NCHNAM]; | |
69 | #else | |
70 | char *sname; | |
71 | #endif | |
72 | TWORD stype; /* type word */ | |
73 | ||
74 | char sclass; /* storage class */ | |
75 | char slevel; /* scope level */ | |
76 | char sflags; /* flags for set, use, hidden, mos, etc. */ | |
77 | int offset; /* offset or value */ | |
78 | short dimoff; /* offset into the dimension table */ | |
79 | short sizoff; /* offset into the size table */ | |
80 | short suse; /* line number of last use of the variable */ | |
81 | }; | |
82 | ||
83 | ||
84 | # ifdef ONEPASS | |
85 | /* NOPREF must be defined for use in first pass tree machine */ | |
86 | # define NOPREF 020000 /* no preference for register assignment */ | |
87 | #else | |
88 | ||
89 | union ndu { | |
90 | struct { | |
91 | int op; | |
92 | TWORD type; | |
93 | int cdim, csiz; | |
94 | }fn; /* front node */ | |
95 | struct { | |
96 | int op; | |
97 | TWORD type; | |
98 | int cdim, csiz; | |
99 | NODE *left; | |
100 | NODE * right; | |
101 | }in; /* interior node */ | |
102 | ||
103 | struct { | |
104 | /* this structure is the same as above, | |
105 | but is used when a value, rather than | |
106 | address, is kept in +left */ | |
107 | int op; | |
108 | TWORD type; | |
109 | int cdim, csiz; | |
110 | CONSZ lval; | |
111 | int rval; | |
112 | }tn; /* terminal node */ | |
113 | ||
114 | struct { | |
115 | /* this structure is used when a floating point constant | |
116 | is being computed */ | |
117 | int op; | |
118 | TWORD type; | |
119 | int cdim, csiz; | |
120 | double dval; | |
121 | }fpn; /* floating point node */ | |
122 | ||
123 | }; | |
124 | # endif | |
125 | ||
126 | struct sw { | |
127 | CONSZ sval; | |
128 | int slab; | |
129 | }; | |
130 | ||
131 | extern struct sw swtab[]; | |
132 | extern struct sw *swp; | |
133 | extern int swx; | |
134 | ||
135 | extern int ftnno; | |
136 | extern int blevel; | |
137 | extern int instruct, stwart; | |
138 | ||
139 | extern int lineno, nerrors; | |
140 | typedef union { | |
141 | int intval; | |
142 | NODE * nodep; | |
143 | } YYSTYPE; | |
144 | extern YYSTYPE yylval; | |
145 | ||
146 | extern CONSZ lastcon; | |
147 | extern double dcon; | |
148 | ||
149 | extern char ftitle[]; | |
150 | extern char ititle[]; | |
151 | extern struct symtab stab[]; | |
152 | extern int curftn; | |
153 | extern int curclass; | |
154 | extern int curdim; | |
155 | extern int dimtab[]; | |
156 | extern int paramstk[]; | |
157 | extern int paramno; | |
158 | extern int autooff, argoff, strucoff; | |
159 | extern int regvar; | |
160 | extern int minrvar; | |
161 | extern int brkflag; | |
162 | extern char yytext[]; | |
163 | ||
164 | extern int strflg; | |
165 | ||
166 | extern OFFSZ inoff; | |
167 | ||
168 | extern int reached; | |
169 | ||
170 | /* tunnel to buildtree for name id's */ | |
171 | ||
172 | extern int idname; | |
173 | ||
174 | extern NODE node[]; | |
175 | extern NODE *lastfree; | |
176 | ||
177 | extern int cflag, hflag, pflag; | |
178 | ||
179 | /* various labels */ | |
180 | extern int brklab; | |
181 | extern int contlab; | |
182 | extern int flostat; | |
183 | extern int retlab; | |
184 | extern int retstat; | |
185 | extern int asavbc[], *psavbc; | |
186 | ||
187 | /* flags used in structures/unions */ | |
188 | ||
189 | # define SEENAME 01 | |
190 | # define INSTRUCT 02 | |
191 | # define INUNION 04 | |
192 | # define FUNNYNAME 010 | |
193 | # define TAGNAME 020 | |
194 | ||
195 | /* flags used in the (elementary) flow analysis ... */ | |
196 | ||
197 | # define FBRK 02 | |
198 | # define FCONT 04 | |
199 | # define FDEF 010 | |
200 | # define FLOOP 020 | |
201 | ||
202 | /* flags used for return status */ | |
203 | ||
204 | # define RETVAL 1 | |
205 | # define NRETVAL 2 | |
206 | ||
207 | /* used to mark a constant with no name field */ | |
208 | ||
209 | # define NONAME 040000 | |
210 | ||
211 | /* mark an offset which is undefined */ | |
212 | ||
213 | # define NOOFFSET (-10201) | |
214 | ||
215 | /* declarations of various functions */ | |
216 | ||
217 | extern NODE | |
218 | *buildtree(), | |
219 | *bdty(), | |
220 | *mkty(), | |
221 | *rstruct(), | |
222 | *dclstruct(), | |
223 | *getstr(), | |
224 | *tymerge(), | |
225 | *stref(), | |
226 | *offcon(), | |
227 | *bcon(), | |
228 | *bpsize(), | |
229 | *convert(), | |
230 | *pconvert(), | |
231 | *oconvert(), | |
232 | *ptmatch(), | |
233 | *tymatch(), | |
234 | *makety(), | |
235 | *block(), | |
236 | *doszof(), | |
237 | *talloc(), | |
238 | *optim(), | |
239 | *strargs(), | |
240 | *clocal(); | |
241 | ||
242 | OFFSZ tsize(), | |
243 | psize(); | |
244 | ||
245 | TWORD types(); | |
246 | ||
247 | ||
248 | double atof(); | |
249 | ||
250 | char *exname(), *exdcon(); | |
251 | ||
252 | # define checkst(x) | |
253 | ||
254 | # ifndef CHARCAST | |
255 | /* to make character constants into character connstants */ | |
256 | /* this is a macro to defend against cross-compilers, etc. */ | |
257 | # define CHARCAST(x) (char)(x) | |
258 | # endif | |
259 | ||
260 | # define BCSZ 100 /* size of the table to save break and continue labels */ | |
261 | # define SYMTSZ 1300 /* size of the symbol table (was 500) */ | |
262 | # define DIMTABSZ 2000 /* size of the dimension/size table (was 800) */ | |
263 | # define PARAMSZ 150 /* size of the parameter stack */ | |
264 | # define SWITSZ 500 /* size of switch table */ | |
265 | /* special interfaces for yacc alone */ | |
266 | /* These serve as abbreviations of 2 or more ops: | |
267 | ASOP =, = ops | |
268 | RELOP LE,LT,GE,GT | |
269 | EQUOP EQ,NE | |
270 | DIVOP DIV,MOD | |
271 | SHIFTOP LS,RS | |
272 | ICOP ICR,DECR | |
273 | UNOP NOT,COMPL | |
274 | STROP DOT,STREF | |
275 | ||
276 | */ | |
277 | # define ASOP 25 | |
278 | # define RELOP 26 | |
279 | # define EQUOP 27 | |
280 | # define DIVOP 28 | |
281 | # define SHIFTOP 29 | |
282 | # define INCOP 30 | |
283 | # define UNOP 31 | |
284 | # define STROP 32 | |
285 | ||
286 | # define LP 50 | |
287 | # define RP 51 | |
288 | # define LC 52 | |
289 | # define RC 53 |