xref: /csrg-svn/usr.bin/f77/pass1.vax/main.c (revision 22844)
1*22844Smckusick /*
2*22844Smckusick  * Copyright (c) 1980 Regents of the University of California.
3*22844Smckusick  * All rights reserved.  The Berkeley software License Agreement
4*22844Smckusick  * specifies the terms and conditions for redistribution.
5*22844Smckusick  */
6*22844Smckusick 
7*22844Smckusick #ifndef lint
8*22844Smckusick char copyright[] =
9*22844Smckusick "@(#) Copyright (c) 1980 Regents of the University of California.\n\
10*22844Smckusick  All rights reserved.\n";
11*22844Smckusick #endif not lint
12*22844Smckusick 
13*22844Smckusick #ifndef lint
14*22844Smckusick static char sccsid[] = "@(#)main.c	5.1 (Berkeley) 06/07/85";
15*22844Smckusick #endif not lint
16*22844Smckusick 
17*22844Smckusick /*
18*22844Smckusick  * main.c
19*22844Smckusick  *
20*22844Smckusick  * Main routine for the f77 compiler, pass 1, 4.2 BSD.
21*22844Smckusick  *
22*22844Smckusick  * University of Utah CS Dept modification history:
23*22844Smckusick  *
24*22844Smckusick  * $Log:	main.c,v $
25*22844Smckusick  * Revision 3.2  85/01/14  04:21:31  donn
26*22844Smckusick  * Added changes to implement Jerry's '-q' option.
27*22844Smckusick  *
28*22844Smckusick  * Revision 3.1  84/10/29  05:47:03  donn
29*22844Smckusick  * Added Jerry Berkman's change to line buffer stderr.
30*22844Smckusick  *
31*22844Smckusick  */
32*22844Smckusick 
33*22844Smckusick char *xxxvers[] = "\n@(#) FORTRAN 77 PASS 1, VERSION 2.10,  16 AUGUST 1980\n";
34*22844Smckusick 
35*22844Smckusick #include "defs.h"
36*22844Smckusick #include <signal.h>
37*22844Smckusick 
38*22844Smckusick #ifdef SDB
39*22844Smckusick #	include <a.out.h>
40*22844Smckusick #	ifndef N_SO
41*22844Smckusick #		include <stab.h>
42*22844Smckusick #	endif
43*22844Smckusick #endif
44*22844Smckusick 
45*22844Smckusick 
46*22844Smckusick LOCAL char *textname = "";
47*22844Smckusick LOCAL char *asmname = "";
48*22844Smckusick LOCAL char *initname = "";
49*22844Smckusick 
50*22844Smckusick 
51*22844Smckusick extern intexit();
52*22844Smckusick 
53*22844Smckusick flag namesflag = YES;
54*22844Smckusick 
55*22844Smckusick 
56*22844Smckusick 
57*22844Smckusick main(argc, argv)
58*22844Smckusick int argc;
59*22844Smckusick char **argv;
60*22844Smckusick {
61*22844Smckusick char *s;
62*22844Smckusick int k, retcode, *ip;
63*22844Smckusick FILEP opf();
64*22844Smckusick int flovflo();
65*22844Smckusick 
66*22844Smckusick #define DONE(c)	{ retcode = c; goto finis; }
67*22844Smckusick 
68*22844Smckusick signal(SIGFPE, flovflo);  /* catch overflows */
69*22844Smckusick signal(SIGINT, intexit);
70*22844Smckusick 
71*22844Smckusick #if HERE == PDP11
72*22844Smckusick 	ldfps(01200);	/* trap on overflow */
73*22844Smckusick #endif
74*22844Smckusick 
75*22844Smckusick 
76*22844Smckusick setlinebuf(diagfile);
77*22844Smckusick 
78*22844Smckusick --argc;
79*22844Smckusick ++argv;
80*22844Smckusick 
81*22844Smckusick while(argc>0 && argv[0][0]=='-')
82*22844Smckusick 	{
83*22844Smckusick 	for(s = argv[0]+1 ; *s ; ++s) switch(*s)
84*22844Smckusick 		{
85*22844Smckusick 		case 'w':
86*22844Smckusick 			if(s[1]=='6' && s[2]=='6')
87*22844Smckusick 				{
88*22844Smckusick 				ftn66flag = YES;
89*22844Smckusick 				s += 2;
90*22844Smckusick 				}
91*22844Smckusick 			else
92*22844Smckusick 				nowarnflag = YES;
93*22844Smckusick 			break;
94*22844Smckusick 
95*22844Smckusick 		case 'U':
96*22844Smckusick 			shiftcase = NO;
97*22844Smckusick 			break;
98*22844Smckusick 
99*22844Smckusick 		case 'u':
100*22844Smckusick 			undeftype = YES;
101*22844Smckusick 			break;
102*22844Smckusick 
103*22844Smckusick 		case 'O':
104*22844Smckusick 			optimflag = YES;
105*22844Smckusick 			break;
106*22844Smckusick 
107*22844Smckusick 		case 'd':
108*22844Smckusick 			debugflag[0] = YES;
109*22844Smckusick 
110*22844Smckusick 			while (*s == 'd' || *s == ',')
111*22844Smckusick 				{
112*22844Smckusick 				k = 0;
113*22844Smckusick 				while( isdigit(*++s) )
114*22844Smckusick 					k = 10*k + (*s - '0');
115*22844Smckusick 				if(k < 0 || k >= MAXDEBUGFLAG)
116*22844Smckusick 					fatali("bad debug number %d",k);
117*22844Smckusick 				debugflag[k] = YES;
118*22844Smckusick 				}
119*22844Smckusick 			break;
120*22844Smckusick 
121*22844Smckusick 		case 'p':
122*22844Smckusick 			profileflag = YES;
123*22844Smckusick 			break;
124*22844Smckusick 
125*22844Smckusick 		case 'C':
126*22844Smckusick 			checksubs = YES;
127*22844Smckusick 			break;
128*22844Smckusick 
129*22844Smckusick 		case '6':
130*22844Smckusick 			no66flag = YES;
131*22844Smckusick 			noextflag = YES;
132*22844Smckusick 			break;
133*22844Smckusick 
134*22844Smckusick 		case '1':
135*22844Smckusick 			onetripflag = YES;
136*22844Smckusick 			break;
137*22844Smckusick 
138*22844Smckusick #ifdef SDB
139*22844Smckusick 		case 'g':
140*22844Smckusick 			sdbflag = YES;
141*22844Smckusick 			break;
142*22844Smckusick #endif
143*22844Smckusick 
144*22844Smckusick 		case 'q':
145*22844Smckusick 			namesflag = NO;
146*22844Smckusick 			break;
147*22844Smckusick 
148*22844Smckusick 		case 'N':
149*22844Smckusick 			switch(*++s)
150*22844Smckusick 				{
151*22844Smckusick 				case 'q':
152*22844Smckusick 					ip = &maxequiv; goto getnum;
153*22844Smckusick 				case 'x':
154*22844Smckusick 					ip = &maxext; goto getnum;
155*22844Smckusick 				case 's':
156*22844Smckusick 					ip = &maxstno; goto getnum;
157*22844Smckusick 				case 'c':
158*22844Smckusick 					ip = &maxctl; goto getnum;
159*22844Smckusick 				case 'n':
160*22844Smckusick 					ip = &maxhash; goto getnum;
161*22844Smckusick 
162*22844Smckusick 				default:
163*22844Smckusick 					fatali("invalid flag -N%c", *s);
164*22844Smckusick 				}
165*22844Smckusick 		getnum:
166*22844Smckusick 			k = 0;
167*22844Smckusick 			while( isdigit(*++s) )
168*22844Smckusick 				k = 10*k + (*s - '0');
169*22844Smckusick 			if(k <= 0)
170*22844Smckusick 				fatal("Table size too small");
171*22844Smckusick 			*ip = k;
172*22844Smckusick 			break;
173*22844Smckusick 
174*22844Smckusick 		case 'i':
175*22844Smckusick 			if(*++s == '2')
176*22844Smckusick 				tyint = TYSHORT;
177*22844Smckusick 			else if(*s == '4')
178*22844Smckusick 				{
179*22844Smckusick 				shortsubs = NO;
180*22844Smckusick 				tyint = TYLONG;
181*22844Smckusick 				}
182*22844Smckusick 			else if(*s == 's')
183*22844Smckusick 				shortsubs = YES;
184*22844Smckusick 			else
185*22844Smckusick 				fatali("invalid flag -i%c\n", *s);
186*22844Smckusick 			tylogical = tyint;
187*22844Smckusick 			break;
188*22844Smckusick 
189*22844Smckusick 		default:
190*22844Smckusick 			fatali("invalid flag %c\n", *s);
191*22844Smckusick 		}
192*22844Smckusick 	--argc;
193*22844Smckusick 	++argv;
194*22844Smckusick 	}
195*22844Smckusick 
196*22844Smckusick if(argc != 4)
197*22844Smckusick 	fatali("arg count %d", argc);
198*22844Smckusick textname = argv[3];
199*22844Smckusick initname = argv[2];
200*22844Smckusick asmname = argv[1];
201*22844Smckusick asmfile  = opf(argv[1]);
202*22844Smckusick initfile = opf(argv[2]);
203*22844Smckusick textfile = opf(argv[3]);
204*22844Smckusick 
205*22844Smckusick initkey();
206*22844Smckusick if(inilex( copys(argv[0]) ))
207*22844Smckusick 	DONE(1);
208*22844Smckusick if(namesflag == YES)
209*22844Smckusick 	fprintf(diagfile, "%s:\n", argv[0]);
210*22844Smckusick 
211*22844Smckusick #ifdef SDB
212*22844Smckusick filenamestab(argv[0]);
213*22844Smckusick #endif
214*22844Smckusick 
215*22844Smckusick fileinit();
216*22844Smckusick procinit();
217*22844Smckusick if(k = yyparse())
218*22844Smckusick 	{
219*22844Smckusick 	fprintf(diagfile, "Bad parse, return code %d\n", k);
220*22844Smckusick 	DONE(1);
221*22844Smckusick 	}
222*22844Smckusick if(nerr > 0)
223*22844Smckusick 	DONE(1);
224*22844Smckusick if(parstate != OUTSIDE)
225*22844Smckusick 	{
226*22844Smckusick 	warn("missing END statement");
227*22844Smckusick 	endproc();
228*22844Smckusick 	}
229*22844Smckusick doext();
230*22844Smckusick preven(ALIDOUBLE);
231*22844Smckusick prtail();
232*22844Smckusick #if FAMILY==PCC
233*22844Smckusick 	puteof();
234*22844Smckusick #endif
235*22844Smckusick 
236*22844Smckusick if(nerr > 0)
237*22844Smckusick 	DONE(1);
238*22844Smckusick DONE(0);
239*22844Smckusick 
240*22844Smckusick 
241*22844Smckusick finis:
242*22844Smckusick 	done(retcode);
243*22844Smckusick }
244*22844Smckusick 
245*22844Smckusick 
246*22844Smckusick 
247*22844Smckusick done(k)
248*22844Smckusick int k;
249*22844Smckusick {
250*22844Smckusick   static char *ioerror = "i/o error on intermediate file %s\n";
251*22844Smckusick 
252*22844Smckusick   if (textfile != NULL && textfile != stdout)
253*22844Smckusick     {
254*22844Smckusick       if (ferror(textfile))
255*22844Smckusick 	{
256*22844Smckusick 	  fprintf(diagfile, ioerror, textname);
257*22844Smckusick 	  k = 3;
258*22844Smckusick 	}
259*22844Smckusick       fclose(textfile);
260*22844Smckusick     }
261*22844Smckusick 
262*22844Smckusick   if (asmfile != NULL && asmfile != stdout)
263*22844Smckusick     {
264*22844Smckusick       if (ferror(asmfile))
265*22844Smckusick 	{
266*22844Smckusick 	  fprintf(diagfile, ioerror, asmname);
267*22844Smckusick 	  k = 3;
268*22844Smckusick 	}
269*22844Smckusick       fclose(asmfile);
270*22844Smckusick     }
271*22844Smckusick 
272*22844Smckusick   if (initfile != NULL && initfile != stdout)
273*22844Smckusick     {
274*22844Smckusick       if (ferror(initfile))
275*22844Smckusick 	{
276*22844Smckusick 	  fprintf(diagfile, ioerror, initname);
277*22844Smckusick 	  k = 3;
278*22844Smckusick 	}
279*22844Smckusick       fclose(initfile);
280*22844Smckusick     }
281*22844Smckusick 
282*22844Smckusick   rmtmpfiles();
283*22844Smckusick 
284*22844Smckusick   exit(k);
285*22844Smckusick }
286*22844Smckusick 
287*22844Smckusick 
288*22844Smckusick LOCAL FILEP opf(fn)
289*22844Smckusick char *fn;
290*22844Smckusick {
291*22844Smckusick FILEP fp;
292*22844Smckusick if( fp = fopen(fn, "w") )
293*22844Smckusick 	return(fp);
294*22844Smckusick 
295*22844Smckusick fatalstr("cannot open intermediate file %s", fn);
296*22844Smckusick /* NOTREACHED */
297*22844Smckusick }
298*22844Smckusick 
299*22844Smckusick 
300*22844Smckusick 
301*22844Smckusick clf(p)
302*22844Smckusick FILEP *p;
303*22844Smckusick {
304*22844Smckusick if(p!=NULL && *p!=NULL && *p!=stdout)
305*22844Smckusick 	{
306*22844Smckusick 	if(ferror(*p))
307*22844Smckusick 		fatal("writing error");
308*22844Smckusick 	fclose(*p);
309*22844Smckusick 	}
310*22844Smckusick *p = NULL;
311*22844Smckusick }
312*22844Smckusick 
313*22844Smckusick 
314*22844Smckusick 
315*22844Smckusick 
316*22844Smckusick flovflo()
317*22844Smckusick {
318*22844Smckusick err("floating exception during constant evaluation");
319*22844Smckusick #if HERE == VAX
320*22844Smckusick 	fatal("vax cannot recover from floating exception");
321*22844Smckusick 	rmtmpfiles();
322*22844Smckusick 	/* vax returns a reserved operand that generates
323*22844Smckusick 	   an illegal operand fault on next instruction,
324*22844Smckusick 	   which if ignored causes an infinite loop.
325*22844Smckusick 	*/
326*22844Smckusick #endif
327*22844Smckusick signal(SIGFPE, flovflo);
328*22844Smckusick }
329*22844Smckusick 
330*22844Smckusick 
331*22844Smckusick 
332*22844Smckusick rmtmpfiles()
333*22844Smckusick {
334*22844Smckusick   close(vdatafile);
335*22844Smckusick   unlink(vdatafname);
336*22844Smckusick   close(vchkfile);
337*22844Smckusick   unlink(vchkfname);
338*22844Smckusick   close(cdatafile);
339*22844Smckusick   unlink(cdatafname);
340*22844Smckusick   close(cchkfile);
341*22844Smckusick   unlink(cchkfname);
342*22844Smckusick }
343*22844Smckusick 
344*22844Smckusick 
345*22844Smckusick 
346*22844Smckusick intexit()
347*22844Smckusick {
348*22844Smckusick   done(1);
349*22844Smckusick }
350