xref: /csrg-svn/usr.bin/f77/pass1.vax/main.c (revision 47955)
1*47955Sbostic /*-
2*47955Sbostic  * Copyright (c) 1980 The Regents of the University of California.
3*47955Sbostic  * All rights reserved.
4*47955Sbostic  *
5*47955Sbostic  * %sccs.include.proprietary.c%
622844Smckusick  */
722844Smckusick 
822844Smckusick #ifndef lint
922844Smckusick char copyright[] =
10*47955Sbostic "@(#) Copyright (c) 1980 The Regents of the University of California.\n\
1122844Smckusick  All rights reserved.\n";
1233254Sbostic #endif /* not lint */
1322844Smckusick 
1422844Smckusick #ifndef lint
15*47955Sbostic static char sccsid[] = "@(#)main.c	5.4 (Berkeley) 04/12/91";
1633254Sbostic #endif /* not lint */
1722844Smckusick 
1822844Smckusick /*
1922844Smckusick  * main.c
2022844Smckusick  *
2122844Smckusick  * Main routine for the f77 compiler, pass 1, 4.2 BSD.
2222844Smckusick  *
2322844Smckusick  * University of Utah CS Dept modification history:
2422844Smckusick  *
2522844Smckusick  * $Log:	main.c,v $
2624482Sdonn  * Revision 5.2  85/08/10  04:57:16  donn
2724482Sdonn  * Jerry Berkman's changes to ifdef 66 code and add -r8/double flag..
2824482Sdonn  *
2924482Sdonn  * Revision 5.1  85/08/10  03:48:26  donn
3024482Sdonn  * 4.3 alpha
3124482Sdonn  *
3222844Smckusick  * Revision 3.2  85/01/14  04:21:31  donn
3322844Smckusick  * Added changes to implement Jerry's '-q' option.
3422844Smckusick  *
3522844Smckusick  * Revision 3.1  84/10/29  05:47:03  donn
3622844Smckusick  * Added Jerry Berkman's change to line buffer stderr.
3722844Smckusick  *
3822844Smckusick  */
3922844Smckusick 
4033254Sbostic char *xxxvers = "\n@(#) FORTRAN 77 PASS 1, VERSION 2.10,  16 AUGUST 1980\n";
4122844Smckusick 
4222844Smckusick #include "defs.h"
4322844Smckusick #include <signal.h>
4422844Smckusick 
4522844Smckusick #ifdef SDB
4622844Smckusick #	include <a.out.h>
4722844Smckusick #	ifndef N_SO
4822844Smckusick #		include <stab.h>
4922844Smckusick #	endif
5022844Smckusick #endif
5122844Smckusick 
5222844Smckusick 
5322844Smckusick LOCAL char *textname = "";
5422844Smckusick LOCAL char *asmname = "";
5522844Smckusick LOCAL char *initname = "";
5622844Smckusick 
5722844Smckusick 
5822844Smckusick extern intexit();
5922844Smckusick 
6022844Smckusick flag namesflag = YES;
6122844Smckusick 
6222844Smckusick 
6322844Smckusick 
main(argc,argv)6422844Smckusick main(argc, argv)
6522844Smckusick int argc;
6622844Smckusick char **argv;
6722844Smckusick {
6822844Smckusick char *s;
6922844Smckusick int k, retcode, *ip;
7022844Smckusick FILEP opf();
7122844Smckusick int flovflo();
7222844Smckusick 
7322844Smckusick #define DONE(c)	{ retcode = c; goto finis; }
7422844Smckusick 
7522844Smckusick signal(SIGFPE, flovflo);  /* catch overflows */
7622844Smckusick signal(SIGINT, intexit);
7722844Smckusick 
7822844Smckusick #if HERE == PDP11
7922844Smckusick 	ldfps(01200);	/* trap on overflow */
8022844Smckusick #endif
8122844Smckusick 
8222844Smckusick 
8322844Smckusick setlinebuf(diagfile);
8422844Smckusick 
8522844Smckusick --argc;
8622844Smckusick ++argv;
8722844Smckusick 
8822844Smckusick while(argc>0 && argv[0][0]=='-')
8922844Smckusick 	{
9022844Smckusick 	for(s = argv[0]+1 ; *s ; ++s) switch(*s)
9122844Smckusick 		{
9222844Smckusick 		case 'w':
9322844Smckusick 			if(s[1]=='6' && s[2]=='6')
9422844Smckusick 				{
9522844Smckusick 				ftn66flag = YES;
9622844Smckusick 				s += 2;
9722844Smckusick 				}
9822844Smckusick 			else
9922844Smckusick 				nowarnflag = YES;
10022844Smckusick 			break;
10122844Smckusick 
10222844Smckusick 		case 'U':
10322844Smckusick 			shiftcase = NO;
10422844Smckusick 			break;
10522844Smckusick 
10622844Smckusick 		case 'u':
10722844Smckusick 			undeftype = YES;
10822844Smckusick 			break;
10922844Smckusick 
11022844Smckusick 		case 'O':
11122844Smckusick 			optimflag = YES;
11222844Smckusick 			break;
11322844Smckusick 
11422844Smckusick 		case 'd':
11522844Smckusick 			debugflag[0] = YES;
11622844Smckusick 
11722844Smckusick 			while (*s == 'd' || *s == ',')
11822844Smckusick 				{
11922844Smckusick 				k = 0;
12022844Smckusick 				while( isdigit(*++s) )
12122844Smckusick 					k = 10*k + (*s - '0');
12222844Smckusick 				if(k < 0 || k >= MAXDEBUGFLAG)
12322844Smckusick 					fatali("bad debug number %d",k);
12422844Smckusick 				debugflag[k] = YES;
12522844Smckusick 				}
12622844Smckusick 			break;
12722844Smckusick 
12822844Smckusick 		case 'p':
12922844Smckusick 			profileflag = YES;
13022844Smckusick 			break;
13122844Smckusick 
13224482Sdonn 		case '8':
13324482Sdonn 			dblflag = YES;
13424482Sdonn 			break;
13524482Sdonn 
13622844Smckusick 		case 'C':
13722844Smckusick 			checksubs = YES;
13822844Smckusick 			break;
13922844Smckusick 
14024482Sdonn #ifdef ONLY66
14122844Smckusick 		case '6':
14222844Smckusick 			no66flag = YES;
14322844Smckusick 			noextflag = YES;
14422844Smckusick 			break;
14524482Sdonn #endif
14622844Smckusick 
14722844Smckusick 		case '1':
14822844Smckusick 			onetripflag = YES;
14922844Smckusick 			break;
15022844Smckusick 
15122844Smckusick #ifdef SDB
15222844Smckusick 		case 'g':
15322844Smckusick 			sdbflag = YES;
15422844Smckusick 			break;
15522844Smckusick #endif
15622844Smckusick 
15722844Smckusick 		case 'q':
15822844Smckusick 			namesflag = NO;
15922844Smckusick 			break;
16022844Smckusick 
16122844Smckusick 		case 'N':
16222844Smckusick 			switch(*++s)
16322844Smckusick 				{
16422844Smckusick 				case 'q':
16522844Smckusick 					ip = &maxequiv; goto getnum;
16622844Smckusick 				case 'x':
16722844Smckusick 					ip = &maxext; goto getnum;
16822844Smckusick 				case 's':
16922844Smckusick 					ip = &maxstno; goto getnum;
17022844Smckusick 				case 'c':
17122844Smckusick 					ip = &maxctl; goto getnum;
17222844Smckusick 				case 'n':
17322844Smckusick 					ip = &maxhash; goto getnum;
17422844Smckusick 
17522844Smckusick 				default:
17622844Smckusick 					fatali("invalid flag -N%c", *s);
17722844Smckusick 				}
17822844Smckusick 		getnum:
17922844Smckusick 			k = 0;
18022844Smckusick 			while( isdigit(*++s) )
18122844Smckusick 				k = 10*k + (*s - '0');
18222844Smckusick 			if(k <= 0)
18322844Smckusick 				fatal("Table size too small");
18422844Smckusick 			*ip = k;
18522844Smckusick 			break;
18622844Smckusick 
18722844Smckusick 		case 'i':
18822844Smckusick 			if(*++s == '2')
18922844Smckusick 				tyint = TYSHORT;
19022844Smckusick 			else if(*s == '4')
19122844Smckusick 				{
19222844Smckusick 				shortsubs = NO;
19322844Smckusick 				tyint = TYLONG;
19422844Smckusick 				}
19522844Smckusick 			else if(*s == 's')
19622844Smckusick 				shortsubs = YES;
19722844Smckusick 			else
19822844Smckusick 				fatali("invalid flag -i%c\n", *s);
19922844Smckusick 			tylogical = tyint;
20022844Smckusick 			break;
20122844Smckusick 
20222844Smckusick 		default:
20322844Smckusick 			fatali("invalid flag %c\n", *s);
20422844Smckusick 		}
20522844Smckusick 	--argc;
20622844Smckusick 	++argv;
20722844Smckusick 	}
20822844Smckusick 
20922844Smckusick if(argc != 4)
21022844Smckusick 	fatali("arg count %d", argc);
21122844Smckusick textname = argv[3];
21222844Smckusick initname = argv[2];
21322844Smckusick asmname = argv[1];
21422844Smckusick asmfile  = opf(argv[1]);
21522844Smckusick initfile = opf(argv[2]);
21622844Smckusick textfile = opf(argv[3]);
21722844Smckusick 
21822844Smckusick initkey();
21922844Smckusick if(inilex( copys(argv[0]) ))
22022844Smckusick 	DONE(1);
22122844Smckusick if(namesflag == YES)
22222844Smckusick 	fprintf(diagfile, "%s:\n", argv[0]);
22322844Smckusick 
22422844Smckusick #ifdef SDB
22522844Smckusick filenamestab(argv[0]);
22622844Smckusick #endif
22722844Smckusick 
22822844Smckusick fileinit();
22922844Smckusick procinit();
23022844Smckusick if(k = yyparse())
23122844Smckusick 	{
23222844Smckusick 	fprintf(diagfile, "Bad parse, return code %d\n", k);
23322844Smckusick 	DONE(1);
23422844Smckusick 	}
23522844Smckusick if(nerr > 0)
23622844Smckusick 	DONE(1);
23722844Smckusick if(parstate != OUTSIDE)
23822844Smckusick 	{
23922844Smckusick 	warn("missing END statement");
24022844Smckusick 	endproc();
24122844Smckusick 	}
24222844Smckusick doext();
24322844Smckusick preven(ALIDOUBLE);
24422844Smckusick prtail();
24522844Smckusick #if FAMILY==PCC
24622844Smckusick 	puteof();
24722844Smckusick #endif
24822844Smckusick 
24922844Smckusick if(nerr > 0)
25022844Smckusick 	DONE(1);
25122844Smckusick DONE(0);
25222844Smckusick 
25322844Smckusick 
25422844Smckusick finis:
25522844Smckusick 	done(retcode);
25622844Smckusick }
25722844Smckusick 
25822844Smckusick 
25922844Smckusick 
done(k)26022844Smckusick done(k)
26122844Smckusick int k;
26222844Smckusick {
26322844Smckusick   static char *ioerror = "i/o error on intermediate file %s\n";
26422844Smckusick 
26522844Smckusick   if (textfile != NULL && textfile != stdout)
26622844Smckusick     {
26722844Smckusick       if (ferror(textfile))
26822844Smckusick 	{
26922844Smckusick 	  fprintf(diagfile, ioerror, textname);
27022844Smckusick 	  k = 3;
27122844Smckusick 	}
27222844Smckusick       fclose(textfile);
27322844Smckusick     }
27422844Smckusick 
27522844Smckusick   if (asmfile != NULL && asmfile != stdout)
27622844Smckusick     {
27722844Smckusick       if (ferror(asmfile))
27822844Smckusick 	{
27922844Smckusick 	  fprintf(diagfile, ioerror, asmname);
28022844Smckusick 	  k = 3;
28122844Smckusick 	}
28222844Smckusick       fclose(asmfile);
28322844Smckusick     }
28422844Smckusick 
28522844Smckusick   if (initfile != NULL && initfile != stdout)
28622844Smckusick     {
28722844Smckusick       if (ferror(initfile))
28822844Smckusick 	{
28922844Smckusick 	  fprintf(diagfile, ioerror, initname);
29022844Smckusick 	  k = 3;
29122844Smckusick 	}
29222844Smckusick       fclose(initfile);
29322844Smckusick     }
29422844Smckusick 
29522844Smckusick   rmtmpfiles();
29622844Smckusick 
29722844Smckusick   exit(k);
29822844Smckusick }
29922844Smckusick 
30022844Smckusick 
opf(fn)30122844Smckusick LOCAL FILEP opf(fn)
30222844Smckusick char *fn;
30322844Smckusick {
30422844Smckusick FILEP fp;
30522844Smckusick if( fp = fopen(fn, "w") )
30622844Smckusick 	return(fp);
30722844Smckusick 
30822844Smckusick fatalstr("cannot open intermediate file %s", fn);
30922844Smckusick /* NOTREACHED */
31022844Smckusick }
31122844Smckusick 
31222844Smckusick 
31322844Smckusick 
clf(p)31422844Smckusick clf(p)
31522844Smckusick FILEP *p;
31622844Smckusick {
31722844Smckusick if(p!=NULL && *p!=NULL && *p!=stdout)
31822844Smckusick 	{
31922844Smckusick 	if(ferror(*p))
32022844Smckusick 		fatal("writing error");
32122844Smckusick 	fclose(*p);
32222844Smckusick 	}
32322844Smckusick *p = NULL;
32422844Smckusick }
32522844Smckusick 
32622844Smckusick 
32722844Smckusick 
32822844Smckusick 
flovflo()32922844Smckusick flovflo()
33022844Smckusick {
33122844Smckusick err("floating exception during constant evaluation");
33222844Smckusick #if HERE == VAX
33322844Smckusick 	fatal("vax cannot recover from floating exception");
33422844Smckusick 	rmtmpfiles();
33522844Smckusick 	/* vax returns a reserved operand that generates
33622844Smckusick 	   an illegal operand fault on next instruction,
33722844Smckusick 	   which if ignored causes an infinite loop.
33822844Smckusick 	*/
33922844Smckusick #endif
34022844Smckusick signal(SIGFPE, flovflo);
34122844Smckusick }
34222844Smckusick 
34322844Smckusick 
34422844Smckusick 
rmtmpfiles()34522844Smckusick rmtmpfiles()
34622844Smckusick {
34722844Smckusick   close(vdatafile);
34822844Smckusick   unlink(vdatafname);
34922844Smckusick   close(vchkfile);
35022844Smckusick   unlink(vchkfname);
35122844Smckusick   close(cdatafile);
35222844Smckusick   unlink(cdatafname);
35322844Smckusick   close(cchkfile);
35422844Smckusick   unlink(cchkfname);
35522844Smckusick }
35622844Smckusick 
35722844Smckusick 
35822844Smckusick 
intexit()35922844Smckusick intexit()
36022844Smckusick {
36122844Smckusick   done(1);
36222844Smckusick }
363