xref: /csrg-svn/usr.bin/pascal/px/utilities.c (revision 10575)
12083Smckusick /* Copyright (c) 1979 Regents of the University of California */
22083Smckusick 
3*10575Smckusick static char sccsid[] = "@(#)utilities.c 1.7 01/22/83";
42083Smckusick 
55679Smckusic #include	<signal.h>
62953Smckusic #include	"whoami.h"
72083Smckusick #include	"vars.h"
8*10575Smckusick #include	"objfmt.h"
92083Smckusick 
102083Smckusick stats()
112083Smckusick {
122083Smckusick 	struct	{
132083Smckusick 		long	usr_time;
142083Smckusick 		long	sys_time;
152083Smckusick 		long	child_usr_time;
162083Smckusick 		long	child_sys_time;
172110Smckusic 	} tbuf;
182083Smckusick 	register double l;
192083Smckusick 	register long count;
202110Smckusic #	ifdef PROFILE
212110Smckusic #	define	proffile	"/vb/grad/mckusick/px/profile/pcnt.out"
222110Smckusic 	struct cntrec {
232110Smckusic 		double	counts[NUMOPS];	/* instruction counts */
242110Smckusic 		long	runs;		/* number of interpreter runs */
252110Smckusic 		long	startdate;	/* date profile started */
262110Smckusic 		long	usrtime;	/* total user time consumed */
272110Smckusic 		long	systime;	/* total system time consumed */
282110Smckusic 		double	stmts;		/* number of pascal stmts executed */
292110Smckusic 	} profdata;
302110Smckusic 	FILE *datafile;
312110Smckusic #	endif PROFILE
322083Smckusick 
332083Smckusick 	if (_nodump)
342083Smckusick 		return(0);
352083Smckusick 	times(&tbuf);
362110Smckusic #	ifdef PROFILE
372083Smckusick 	datafile = fopen(proffile,"r");
382110Smckusic 	if (datafile == NULL)
392110Smckusic 		goto skipprof;
402110Smckusic 	count = fread(&profdata,1,sizeof(profdata),datafile);
412110Smckusic 	if (count != sizeof(profdata))
422110Smckusic 		goto skipprof;
432110Smckusic 	for (count = 0;  count < NUMOPS;  count++)
442110Smckusic 		profdata.counts[count] += _profcnts[count];
452110Smckusic 	profdata.runs += 1;
462110Smckusic 	profdata.stmts += _stcnt;
472110Smckusic 	profdata.usrtime += tbuf.usr_time;
482110Smckusic 	profdata.systime += tbuf.sys_time;
492110Smckusic 	datafile = freopen(proffile,"w",datafile);
502110Smckusic 	if (datafile == NULL)
512110Smckusic 		goto skipprof;
522110Smckusic 	count = fwrite(&profdata,1,sizeof(profdata),datafile);
532110Smckusic 	if (count != sizeof(profdata))
542110Smckusic 		goto skipprof;
552110Smckusic 	fclose(datafile);
562110Smckusic skipprof:
572110Smckusic #	endif PROFILE
582083Smckusick 	l = tbuf.usr_time;
592083Smckusick 	l = l / HZ;
602083Smckusick 	fprintf(stderr,
612083Smckusick 		"\n%1ld statements executed in %04.2f seconds cpu time.\n",
622083Smckusick 		_stcnt,l);
632083Smckusick }
642083Smckusick 
655679Smckusic backtrace(type)
665679Smckusic 	char	*type;
672083Smckusick {
68*10575Smckusick 	register struct dispsave *mydp;
69*10575Smckusick 	register struct blockmark *ap;
702083Smckusick 	register char *cp;
712083Smckusick 	register long i, linum;
72*10575Smckusick 	struct display disp;
732083Smckusick 
742083Smckusick 	if (_lino <= 0) {
752083Smckusick 		fputs("Program was not executed.\n",stderr);
762083Smckusick 		return;
772083Smckusick 	}
782110Smckusic 	disp = _display;
795679Smckusic 	fprintf(stderr, "\n\t%s in \"", type);
802083Smckusick 	mydp = _dp;
812083Smckusick 	linum = _lino;
822083Smckusick 	for (;;) {
832083Smckusick 		ap = mydp->stp;
842083Smckusick 		i = linum - (((ap)->entry)->offset & 0177777);
852083Smckusick 		fprintf(stderr,"%s\"",(ap->entry)->name);
862959Smckusic 		if (_nodump == FALSE)
872953Smckusic 			fprintf(stderr,"+%D near line %D.",i,linum);
882083Smckusick 		fputc('\n',stderr);
892083Smckusick 		*mydp = (ap)->odisp;
902110Smckusic 		if (mydp <= &_display.frame[1]){
912110Smckusic 			_display = disp;
925679Smckusic 			return;
932083Smckusick 		}
942083Smckusick 		mydp = (ap)->dp;
952083Smckusick 		linum = (ap)->lino;
962083Smckusick 		fputs("\tCalled by \"",stderr);
972083Smckusick 	}
982083Smckusick }
992083Smckusick 
1002083Smckusick psexit(code)
1012083Smckusick 
1022953Smckusic 	int	code;
1032083Smckusick {
1042083Smckusick 	if (_pcpcount != 0)
1052083Smckusick 		PMFLUSH(_cntrs, _rtns, _pcpcount);
1062083Smckusick 	if (_mode == PIX) {
1072083Smckusick 		fputs("Execution terminated",stderr);
1082083Smckusick 		if (code)
1092083Smckusick 			fputs(" abnormally",stderr);
1102083Smckusick 		fputc('.',stderr);
1112083Smckusick 		fputc('\n',stderr);
1122083Smckusick 	}
1132083Smckusick 	stats();
1142083Smckusick 	exit(code);
1152083Smckusick }
1165679Smckusic 
1175679Smckusic /*
1185679Smckusic  * Routines to field various types of signals
1195679Smckusic  *
1205679Smckusic  * catch a library error and generate a backtrace
1215679Smckusic  */
1225679Smckusic liberr()
1235679Smckusic {
1245679Smckusic 	backtrace("Error");
1255679Smckusic 	psexit(2);
1265679Smckusic }
1275679Smckusic 
1285679Smckusic /*
1295679Smckusic  * catch an interrupt and generate a backtrace
1305679Smckusic  */
1315679Smckusic intr()
1325679Smckusic {
1335679Smckusic 	signal(SIGINT, intr);
1345679Smckusic 	backtrace("Interrupted");
1355679Smckusic 	psexit(1);
1365679Smckusic }
1375679Smckusic 
1385679Smckusic /*
1395679Smckusic  * catch memory faults
1405679Smckusic  */
1415679Smckusic memsize()
1425679Smckusic {
1435679Smckusic 	signal(SIGSEGV, memsize);
1445679Smckusic 	ERROR("Run time stack overflow\n");
1455679Smckusic }
1465679Smckusic 
1475679Smckusic /*
1485679Smckusic  * catch random system faults
1495679Smckusic  */
1505679Smckusic syserr(signum)
1515679Smckusic 	int signum;
1525679Smckusic {
1535679Smckusic 	signal(signum, syserr);
1545679Smckusic 	ERROR("Panic: Computational error in interpreter\n");
1555679Smckusic }
156