Commit | Line | Data |
---|---|---|
94a5ad6d KB |
1 | /* |
2 | * Copyright (c) 1980 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 | ||
7 | #ifndef lint | |
8 | static char *sccsid = "@(#)init.c 5.1 (Berkeley) 85/06/07"; | |
9 | #endif | |
10 | ||
11 | /* | |
12 | * init.c | |
13 | * | |
14 | * Initializations for f77 compiler, pass 1. | |
15 | * | |
16 | * University of Utah CS Dept modification history: | |
17 | * | |
18 | * $Header: init.c,v 2.1 84/07/19 12:03:26 donn Exp $ | |
19 | * $Log: init.c,v $ | |
20 | * Revision 2.1 84/07/19 12:03:26 donn | |
21 | * Changed comment headers for UofU. | |
22 | * | |
23 | * Revision 1.3 84/02/28 21:07:53 donn | |
24 | * Added Berkeley changes for call argument temporaries fix. | |
25 | * | |
26 | * Fixed incorrect check of 'cdatafile' when 'cchkfile' is opened. -- Donn | |
27 | */ | |
28 | ||
29 | #include "defs.h" | |
30 | #include "io.h" | |
31 | #include <sys/file.h> | |
32 | ||
33 | ||
34 | FILEP infile = { stdin }; | |
35 | FILEP diagfile = { stderr }; | |
36 | ||
37 | FILEP textfile; | |
38 | FILEP asmfile; | |
39 | FILEP initfile; | |
40 | long int headoffset; | |
41 | ||
42 | char token[1321]; | |
43 | int toklen; | |
44 | int lineno; | |
45 | char *infname; | |
46 | int needkwd; | |
47 | struct Labelblock *thislabel = NULL; | |
48 | flag nowarnflag = NO; | |
49 | flag ftn66flag = NO; | |
50 | flag no66flag = NO; | |
51 | flag noextflag = NO; | |
52 | flag profileflag = NO; | |
53 | flag optimflag = NO; | |
54 | flag shiftcase = YES; | |
55 | flag undeftype = NO; | |
56 | flag shortsubs = YES; | |
57 | flag onetripflag = NO; | |
58 | flag checksubs = NO; | |
59 | flag debugflag [MAXDEBUGFLAG] = { NO }; | |
60 | flag equivdcl = NO; | |
61 | int nerr; | |
62 | int nwarn; | |
63 | int ndata; | |
64 | ||
65 | flag saveall; | |
66 | flag substars; | |
67 | int parstate = OUTSIDE; | |
68 | flag headerdone = NO; | |
69 | int blklevel; | |
70 | int impltype[26]; | |
71 | int implleng[26]; | |
72 | int implstg[26]; | |
73 | ||
74 | int tyint = TYLONG ; | |
75 | int tylogical = TYLONG; | |
76 | ftnint typesize[NTYPES] | |
77 | = { 1, SZADDR, SZSHORT, SZLONG, SZLONG, 2*SZLONG, | |
78 | 2*SZLONG, 4*SZLONG, SZLONG, 1, 1, 1}; | |
79 | int typealign[NTYPES] | |
80 | = { 1, ALIADDR, ALISHORT, ALILONG, ALILONG, ALIDOUBLE, | |
81 | ALILONG, ALIDOUBLE, ALILONG, 1, 1, 1}; | |
82 | int procno; | |
83 | int lwmno; | |
84 | int proctype = TYUNKNOWN; | |
85 | char *procname; | |
86 | int rtvlabel[NTYPES]; | |
87 | int fudgelabel; | |
88 | Addrp typeaddr; | |
89 | Addrp retslot; | |
90 | int cxslot = -1; | |
91 | int chslot = -1; | |
92 | int chlgslot = -1; | |
93 | int procclass = CLUNKNOWN; | |
94 | int nentry; | |
95 | flag multitype; | |
96 | ftnint procleng; | |
97 | int lastlabno = 10; | |
98 | int lastvarno; | |
99 | int lastargslot; | |
100 | int argloc; | |
101 | ftnint autoleng; | |
102 | ftnint bssleng = 0; | |
103 | int retlabel; | |
104 | int ret0label; | |
105 | int lowbss = 0; | |
106 | int highbss = 0; | |
107 | int bsslabel; | |
108 | flag anyinits = NO; | |
109 | flag anylocals = NO; | |
110 | ||
111 | int maxctl = MAXCTL; | |
112 | struct Ctlframe *ctls; | |
113 | struct Ctlframe *ctlstack; | |
114 | struct Ctlframe *lastctl; | |
115 | ||
116 | Namep regnamep[MAXREGVAR]; | |
117 | int highregvar; | |
118 | int nregvar; | |
119 | ||
120 | int maxext = MAXEXT; | |
121 | struct Extsym *extsymtab; | |
122 | struct Extsym *nextext; | |
123 | struct Extsym *lastext; | |
124 | ||
125 | int maxequiv = MAXEQUIV; | |
126 | struct Equivblock *eqvclass; | |
127 | ||
128 | int maxhash = MAXHASH; | |
129 | struct Hashentry *hashtab; | |
130 | struct Hashentry *lasthash; | |
131 | ||
132 | int maxstno = MAXSTNO; | |
133 | struct Labelblock *labeltab; | |
134 | struct Labelblock *labtabend; | |
135 | struct Labelblock *highlabtab; | |
136 | ||
137 | int maxdim = MAXDIM; | |
138 | struct Rplblock *rpllist = NULL; | |
139 | struct Chain *curdtp = NULL; | |
140 | flag toomanyinit; | |
141 | ftnint curdtelt; | |
142 | chainp templist = NULL; | |
143 | chainp argtemplist = CHNULL; | |
144 | chainp activearglist = CHNULL; | |
145 | chainp holdtemps = NULL; | |
146 | int dorange = 0; | |
147 | struct Entrypoint *entries = NULL; | |
148 | ||
149 | chainp chains = NULL; | |
150 | ||
151 | flag inioctl; | |
152 | Addrp ioblkp; | |
153 | int iostmt; | |
154 | int nioctl; | |
155 | int nequiv = 0; | |
156 | int eqvstart = 0; | |
157 | int nintnames = 0; | |
158 | ||
159 | #ifdef SDB | |
160 | int dbglabel = 0; | |
161 | flag sdbflag = NO; | |
162 | #endif | |
163 | ||
164 | struct Literal litpool[MAXLITERALS]; | |
165 | int nliterals; | |
166 | ||
167 | int cdatafile; | |
168 | int cchkfile; | |
169 | int vdatafile; | |
170 | int vchkfile; | |
171 | ||
172 | char cdatafname[44] = ""; | |
173 | char cchkfname[44] = ""; | |
174 | char vdatafname[44] = ""; | |
175 | char vchkfname[44] = ""; | |
176 | ||
177 | long cdatahwm = 0; | |
178 | long vdatahwm = 0; | |
179 | ||
180 | ioblock *iodata = NULL; | |
181 | ||
182 | ||
183 | ||
184 | fileinit() | |
185 | { | |
186 | int pid; | |
187 | ||
188 | pid = getpid(); | |
b49eb539 KM |
189 | sprintf(cdatafname, "/tmp/fortcd.%d", pid); |
190 | sprintf(cchkfname, "/tmp/fortcc.%d", pid); | |
191 | sprintf(vdatafname, "/tmp/fortvd.%d", pid); | |
192 | sprintf(vchkfname, "/tmp/fortvc.%d", pid); | |
94a5ad6d KB |
193 | |
194 | cdatafile = open(cdatafname, O_CREAT | O_RDWR, 0600); | |
195 | if (cdatafile < 0) | |
196 | fatalstr("cannot open tmp file %s", cdatafname); | |
197 | ||
198 | cchkfile = open(cchkfname, O_CREAT | O_RDWR, 0600); | |
199 | if (cchkfile < 0) | |
200 | fatalstr("cannot open tmp file %s", cchkfname); | |
201 | ||
202 | pruse(initfile, USEINIT); | |
203 | ||
204 | procno = 0; | |
205 | lwmno = 0; | |
206 | lastlabno = 10; | |
207 | lastvarno = 0; | |
208 | nliterals = 0; | |
209 | nerr = 0; | |
210 | ndata = 0; | |
211 | ||
212 | ctls = ALLOCN(maxctl, Ctlframe); | |
213 | extsymtab = ALLOCN(maxext, Extsym); | |
214 | eqvclass = ALLOCN(maxequiv, Equivblock); | |
215 | hashtab = ALLOCN(maxhash, Hashentry); | |
216 | labeltab = ALLOCN(maxstno, Labelblock); | |
217 | ||
218 | ctlstack = ctls - 1; | |
219 | lastctl = ctls + maxctl; | |
220 | nextext = extsymtab; | |
221 | lastext = extsymtab + maxext; | |
222 | lasthash = hashtab + maxhash; | |
223 | labtabend = labeltab + maxstno; | |
224 | highlabtab = labeltab; | |
225 | } | |
226 | ||
227 | ||
228 | ||
229 | ||
230 | ||
231 | procinit() | |
232 | { | |
233 | register Namep p; | |
234 | register struct Dimblock *q; | |
235 | register struct Hashentry *hp; | |
236 | register struct Labelblock *lp; | |
237 | struct Chain *cp; | |
238 | int i; | |
239 | ||
240 | vdatafile = open(vdatafname, O_CREAT | O_RDWR, 0600); | |
241 | if (vdatafile < 0) | |
242 | fatalstr("cannot open tmp file %s", vdatafname); | |
243 | ||
244 | vchkfile = open(vchkfname, O_CREAT | O_RDWR, 0600); | |
245 | if (vchkfile < 0) | |
246 | fatalstr("cannot open tmp file %s", vchkfname); | |
247 | ||
248 | pruse(asmfile, USECONST); | |
249 | #if FAMILY == PCC | |
250 | p2pass(USETEXT); | |
251 | #endif | |
252 | parstate = OUTSIDE; | |
253 | headerdone = NO; | |
254 | blklevel = 1; | |
255 | saveall = NO; | |
256 | substars = NO; | |
257 | nwarn = 0; | |
258 | thislabel = NULL; | |
259 | needkwd = 0; | |
260 | ||
261 | ++procno; | |
262 | proctype = TYUNKNOWN; | |
263 | procname = "MAIN "; | |
264 | procclass = CLUNKNOWN; | |
265 | nentry = 0; | |
266 | multitype = NO; | |
267 | typeaddr = NULL; | |
268 | retslot = NULL; | |
269 | cxslot = -1; | |
270 | chslot = -1; | |
271 | chlgslot = -1; | |
272 | procleng = 0; | |
273 | blklevel = 1; | |
274 | lastargslot = 0; | |
275 | #if TARGET==PDP11 | |
276 | autoleng = 6; | |
277 | #else | |
278 | #if TARGET==TAHOE | |
279 | autoleng = 52; | |
280 | #else | |
281 | autoleng = 0; | |
282 | #endif | |
283 | #endif | |
284 | for(lp = labeltab ; lp < labtabend ; ++lp) | |
285 | lp->stateno = 0; | |
286 | ||
287 | for(hp = hashtab ; hp < lasthash ; ++hp) | |
288 | if(p = hp->varp) | |
289 | { | |
290 | frexpr(p->vleng); | |
291 | if(q = p->vdim) | |
292 | { | |
293 | for(i = 0 ; i < q->ndim ; ++i) | |
294 | { | |
295 | frexpr(q->dims[i].dimsize); | |
296 | frexpr(q->dims[i].dimexpr); | |
297 | } | |
298 | frexpr(q->nelt); | |
299 | frexpr(q->baseoffset); | |
300 | frexpr(q->basexpr); | |
301 | free( (charptr) q); | |
302 | } | |
303 | if(p->vclass == CLNAMELIST) | |
304 | frchain( &(p->varxptr.namelist) ); | |
305 | free( (charptr) p); | |
306 | hp->varp = NULL; | |
307 | } | |
308 | nintnames = 0; | |
309 | highlabtab = labeltab; | |
310 | ||
311 | ctlstack = ctls - 1; | |
312 | for(cp = templist ; cp ; cp = cp->nextp) | |
313 | free( (charptr) (cp->datap) ); | |
314 | frchain(&templist); | |
315 | for (cp = argtemplist; cp; cp = cp->nextp) | |
316 | free((char *) (cp->datap)); | |
317 | frchain(&argtemplist); | |
318 | holdtemps = NULL; | |
319 | dorange = 0; | |
320 | nregvar = 0; | |
321 | highregvar = 0; | |
322 | entries = NULL; | |
323 | rpllist = NULL; | |
324 | inioctl = NO; | |
325 | ioblkp = NULL; | |
326 | eqvstart += nequiv; | |
327 | nequiv = 0; | |
328 | ||
329 | for(i = 0 ; i<NTYPES ; ++i) | |
330 | rtvlabel[i] = 0; | |
331 | fudgelabel = 0; | |
332 | ||
333 | if(undeftype) | |
334 | setimpl(TYUNKNOWN, (ftnint) 0, 'a', 'z'); | |
335 | else | |
336 | { | |
337 | setimpl(TYREAL, (ftnint) 0, 'a', 'z'); | |
338 | setimpl(tyint, (ftnint) 0, 'i', 'n'); | |
339 | } | |
340 | setimpl(-STGBSS, (ftnint) 0, 'a', 'z'); /* set class */ | |
341 | setlog(); | |
342 | setopt(); | |
343 | ||
344 | bsslabel = ++lastvarno; | |
345 | anylocals = NO; | |
346 | anyinits = NO; | |
347 | } | |
348 | ||
349 | ||
350 | ||
351 | ||
352 | setimpl(type, length, c1, c2) | |
353 | int type; | |
354 | ftnint length; | |
355 | int c1, c2; | |
356 | { | |
357 | int i; | |
358 | char buff[100]; | |
359 | ||
360 | if(c1==0 || c2==0) | |
361 | return; | |
362 | ||
363 | if(c1 > c2) | |
364 | { | |
365 | sprintf(buff, "characters out of order in implicit:%c-%c", c1, c2); | |
366 | err(buff); | |
367 | } | |
368 | else | |
369 | if(type < 0) | |
370 | for(i = c1 ; i<=c2 ; ++i) | |
371 | implstg[i-'a'] = - type; | |
372 | else | |
373 | { | |
374 | type = lengtype(type, (int) length); | |
375 | if((type != TYCHAR) && (tyint !=TYSHORT)) | |
376 | length = 0; | |
377 | for(i = c1 ; i<=c2 ; ++i) | |
378 | { | |
379 | impltype[i-'a'] = type; | |
380 | implleng[i-'a'] = length; | |
381 | } | |
382 | } | |
383 | } |