xref: /original-bsd/old/pcc/mip/fort.c (revision 32d7b8ac)
166ea3b60Sralph #ifndef lint
2*32d7b8acSsam static char *sccsid ="@(#)fort.c	4.8 (Berkeley) 10/15/86";
366ea3b60Sralph #endif lint
466ea3b60Sralph 
554414f65Sralph # ifndef FORT
6969a3cbdSsam # define FORT
754414f65Sralph /* this may force larger trees, etc. */
854414f65Sralph # endif
954414f65Sralph 
10fa32d6d5Sralph # include "pass2.h"
11969a3cbdSsam # include "fort.h"
12969a3cbdSsam 
13969a3cbdSsam /*	masks for unpacking longs */
14969a3cbdSsam 
15969a3cbdSsam # ifndef FOP
16969a3cbdSsam # define FOP(x) (int)((x)&0377)
17969a3cbdSsam # endif
18969a3cbdSsam 
19969a3cbdSsam # ifndef VAL
20969a3cbdSsam # define VAL(x) (int)(((x)>>8)&0377)
21969a3cbdSsam # endif
22969a3cbdSsam 
23969a3cbdSsam # ifndef REST
24969a3cbdSsam # define REST(x) (((x)>>16)&0177777)
25969a3cbdSsam # endif
26969a3cbdSsam 
270c57f064Smckusick # ifndef FIXINT
280c57f064Smckusick # if SZINT == SZLONG
290c57f064Smckusick # define FIXINT(x) ((x) == LONG || (x) == ULONG ? (x) - 1 : (x))
300c57f064Smckusick # else
310c57f064Smckusick # if SZINT == SZSHORT
320c57f064Smckusick # define FIXINT(x) ((x) == SHORT || (x) == USHORT ? (x) + 1 : (x))
330c57f064Smckusick # else
340c57f064Smckusick # define FIXINT(x) (x)
350c57f064Smckusick # endif
360c57f064Smckusick # endif
370c57f064Smckusick # endif
380c57f064Smckusick 
39969a3cbdSsam FILE * lrd;  /* for default reading routines */
40969a3cbdSsam 
41*32d7b8acSsam # if !defined(NOLNREAD) && defined(FLEXNAMES)
42969a3cbdSsam char *
lnread()43969a3cbdSsam lnread()
44969a3cbdSsam {
45969a3cbdSsam 	char buf[BUFSIZ];
46969a3cbdSsam 	register char *cp = buf;
47969a3cbdSsam 	register char *limit = &buf[BUFSIZ];
48969a3cbdSsam 
49969a3cbdSsam 	for (;;) {
50969a3cbdSsam 		if (fread(cp, sizeof (long), 1, lrd) !=  1)
51969a3cbdSsam 			cerror("intermediate file read error");
52969a3cbdSsam 		cp += sizeof (long);
53969a3cbdSsam 		if (cp[-1] == 0)
54969a3cbdSsam 			break;
55969a3cbdSsam 		if (cp >= limit)
56969a3cbdSsam 			cerror("lnread overran string buffer");
57969a3cbdSsam 	}
58969a3cbdSsam 	return (tstr(buf));
59969a3cbdSsam }
6083c121bfSsam #endif
61969a3cbdSsam 
62969a3cbdSsam # ifndef NOLREAD
lread()63969a3cbdSsam long lread(){
64969a3cbdSsam 	static long x;
65969a3cbdSsam 	if( fread( (char *) &x, 4, 1, lrd ) <= 0 ) cerror( "intermediate file read error" );
66969a3cbdSsam 	return( x );
67969a3cbdSsam 	}
68969a3cbdSsam # endif
69969a3cbdSsam 
70969a3cbdSsam # ifndef NOLOPEN
lopen(s)71969a3cbdSsam lopen( s ) char *s; {
72969a3cbdSsam 	/* if null, opens the standard input */
73969a3cbdSsam 	if( *s ){
74969a3cbdSsam 		lrd = fopen( s, "r" );
75969a3cbdSsam 		if( lrd == NULL ) cerror( "cannot open intermediate file %s", s );
76969a3cbdSsam 		}
77969a3cbdSsam 	else  lrd = stdin;
78969a3cbdSsam 	}
79969a3cbdSsam # endif
80969a3cbdSsam 
81969a3cbdSsam # ifndef NOLCREAD
lcread(cp,n)82969a3cbdSsam lcread( cp, n ) char *cp; {
83969a3cbdSsam 	if( n > 0 ){
84969a3cbdSsam 		if( fread( cp, 4, n, lrd ) != n ) cerror( "intermediate file read error" );
85969a3cbdSsam 		}
86969a3cbdSsam 	}
87969a3cbdSsam # endif
88969a3cbdSsam 
89969a3cbdSsam # ifndef NOLCCOPY
lccopy(n)90969a3cbdSsam lccopy( n ) register n; {
91969a3cbdSsam 	register i;
92bfd7574eSralph 	static char fbuf[BUFSIZ];
93969a3cbdSsam 	if( n > 0 ){
94bfd7574eSralph 		if( n > BUFSIZ/4 ) cerror( "lccopy asked to copy too much" );
95969a3cbdSsam 		if( fread( fbuf, 4, n, lrd ) != n ) cerror( "intermediate file read error" );
96969a3cbdSsam 		for( i=4*n; fbuf[i-1] == '\0' && i>0; --i ) { /* VOID */ }
97969a3cbdSsam 		if( i ) {
98969a3cbdSsam 			if( fwrite( fbuf, 1, i, stdout ) != i ) cerror( "output file error" );
99969a3cbdSsam 			}
100969a3cbdSsam 		}
101969a3cbdSsam 	}
102969a3cbdSsam # endif
103969a3cbdSsam 
104969a3cbdSsam /*	stack for reading nodes in postfix form */
105969a3cbdSsam 
106969a3cbdSsam # define NSTACKSZ 250
107969a3cbdSsam 
108969a3cbdSsam NODE * fstack[NSTACKSZ];
109969a3cbdSsam NODE ** fsp;  /* points to next free position on the stack */
110969a3cbdSsam 
111969a3cbdSsam unsigned int offsz;
112969a3cbdSsam unsigned int caloff();
mainp2(argc,argv)113969a3cbdSsam mainp2( argc, argv ) char *argv[]; {
114969a3cbdSsam 	int files;
115969a3cbdSsam 	register long x;
116969a3cbdSsam 	register NODE *p;
117969a3cbdSsam 
118969a3cbdSsam 	offsz = caloff();
119969a3cbdSsam 	files = p2init( argc, argv );
120969a3cbdSsam 	tinit();
121969a3cbdSsam 
122969a3cbdSsam 
123969a3cbdSsam 	if( files ){
124969a3cbdSsam 		while( files < argc && argv[files][0] == '-' ) {
125969a3cbdSsam 			++files;
126969a3cbdSsam 			}
127969a3cbdSsam 		if( files > argc ) return( nerrors );
128969a3cbdSsam 		lopen( argv[files] );
129969a3cbdSsam 		}
130969a3cbdSsam 	else lopen( "" );
131969a3cbdSsam 
132969a3cbdSsam 	fsp = fstack;
133969a3cbdSsam 
134969a3cbdSsam 	for(;;){
135969a3cbdSsam 		/* read nodes, and go to work... */
136969a3cbdSsam 		x = lread();
137969a3cbdSsam 
138969a3cbdSsam 	if( xdebug ) fprintf( stderr, "op=%d, val = %d, rest = 0%o\n", FOP(x), VAL(x), (int)REST(x) );
139969a3cbdSsam 		switch( (int)FOP(x) ){  /* switch on opcode */
140969a3cbdSsam 
141969a3cbdSsam 		case 0:
142969a3cbdSsam 			fprintf( stderr, "null opcode ignored\n" );
143969a3cbdSsam 			continue;
144969a3cbdSsam 		case FTEXT:
145969a3cbdSsam 			lccopy( VAL(x) );
146969a3cbdSsam 			printf( "\n" );
147969a3cbdSsam 			continue;
148969a3cbdSsam 
149969a3cbdSsam 		case FLBRAC:
150969a3cbdSsam 			tmpoff = baseoff = lread();
151969a3cbdSsam 			maxtreg = VAL(x);
152969a3cbdSsam 			if( ftnno != REST(x) ){
153969a3cbdSsam 				/* beginning of function */
154969a3cbdSsam 				maxoff = baseoff;
155969a3cbdSsam 				ftnno = REST(x);
156969a3cbdSsam 				maxtemp = 0;
157969a3cbdSsam 				}
158969a3cbdSsam 			else {
159969a3cbdSsam 				if( baseoff > maxoff ) maxoff = baseoff;
160969a3cbdSsam 				/* maxoff at end of ftn is max of autos and temps
161969a3cbdSsam 				   over all blocks in the function */
162969a3cbdSsam 				}
163969a3cbdSsam 			setregs();
164969a3cbdSsam 			continue;
165969a3cbdSsam 
166969a3cbdSsam 		case FRBRAC:
167969a3cbdSsam 			SETOFF( maxoff, ALSTACK );
168969a3cbdSsam 			eobl2();
169969a3cbdSsam 			continue;
170969a3cbdSsam 
171969a3cbdSsam 		case FEOF:
172969a3cbdSsam 			return( nerrors );
173969a3cbdSsam 
174969a3cbdSsam 		case FSWITCH:
175969a3cbdSsam 			uerror( "switch not yet done" );
176969a3cbdSsam 			for( x=VAL(x); x>0; --x ) lread();
177969a3cbdSsam 			continue;
178969a3cbdSsam 
179969a3cbdSsam 		case ICON:
180969a3cbdSsam 			p = talloc();
181969a3cbdSsam 			p->in.op = ICON;
1820c57f064Smckusick 			p->in.type = FIXINT(REST(x));
183969a3cbdSsam 			p->tn.rval = 0;
184969a3cbdSsam 			p->tn.lval = lread();
185969a3cbdSsam 			if( VAL(x) ){
186969a3cbdSsam #ifndef FLEXNAMES
187969a3cbdSsam 				lcread( p->in.name, 2 );
188969a3cbdSsam #else
189969a3cbdSsam 				p->in.name = lnread();
190969a3cbdSsam #endif
191969a3cbdSsam 				}
192969a3cbdSsam #ifndef FLEXNAMES
193969a3cbdSsam 			else p->in.name[0] = '\0';
194969a3cbdSsam #else
195969a3cbdSsam 			else p->in.name = "";
196969a3cbdSsam #endif
197969a3cbdSsam 
198969a3cbdSsam 		bump:
199969a3cbdSsam 			p->in.su = 0;
200969a3cbdSsam 			p->in.rall = NOPREF;
201969a3cbdSsam 			*fsp++ = p;
202969a3cbdSsam 			if( fsp >= &fstack[NSTACKSZ] ) uerror( "expression depth exceeded" );
203969a3cbdSsam 			continue;
204969a3cbdSsam 
205969a3cbdSsam 		case NAME:
206969a3cbdSsam 			p = talloc();
207969a3cbdSsam 			p->in.op = NAME;
2080c57f064Smckusick 			p->in.type = FIXINT(REST(x));
209969a3cbdSsam 			p->tn.rval = 0;
210969a3cbdSsam 			if( VAL(x) ) p->tn.lval = lread();
211969a3cbdSsam 			else p->tn.lval = 0;
212969a3cbdSsam #ifndef FLEXNAMES
213969a3cbdSsam 			lcread( p->in.name, 2 );
214969a3cbdSsam #else
215969a3cbdSsam 			p->in.name = lnread();
216969a3cbdSsam #endif
217969a3cbdSsam 			goto bump;
218969a3cbdSsam 
219969a3cbdSsam 		case OREG:
220969a3cbdSsam 			p = talloc();
221969a3cbdSsam 			p->in.op = OREG;
2220c57f064Smckusick 			p->in.type = FIXINT(REST(x));
223969a3cbdSsam 			p->tn.rval = VAL(x);
2240c57f064Smckusick 			rbusy( p->tn.rval, PTR | p->in.type );
225969a3cbdSsam 			p->tn.lval = lread();
226969a3cbdSsam #ifndef FLEXNAMES
227969a3cbdSsam 			lcread( p->in.name, 2 );
228969a3cbdSsam #else
229969a3cbdSsam 			p->in.name = lnread();
230969a3cbdSsam #endif
231969a3cbdSsam 			goto bump;
232969a3cbdSsam 
233969a3cbdSsam 		case REG:
234969a3cbdSsam 			p = talloc();
235969a3cbdSsam 			p->in.op = REG;
2360c57f064Smckusick 			p->in.type = FIXINT(REST(x));
237969a3cbdSsam 			p->tn.rval = VAL(x);
238969a3cbdSsam 			rbusy( p->tn.rval, p->in.type );
239969a3cbdSsam 			p->tn.lval = 0;
240969a3cbdSsam #ifndef FLEXNAMES
241969a3cbdSsam 			p->in.name[0] = '\0';
242969a3cbdSsam #else
243969a3cbdSsam 			p->in.name = "";
244969a3cbdSsam #endif
245969a3cbdSsam 			goto bump;
246969a3cbdSsam 
247969a3cbdSsam 		case FEXPR:
248969a3cbdSsam 			lineno = REST(x);
249969a3cbdSsam 			if( VAL(x) ) lcread( filename, VAL(x) );
250969a3cbdSsam 			if( fsp == fstack ) continue;  /* filename only */
251969a3cbdSsam 			if( --fsp != fstack ) uerror( "expression poorly formed" );
252969a3cbdSsam 			if( lflag ) lineid( lineno, filename );
253969a3cbdSsam 			tmpoff = baseoff;
254969a3cbdSsam 			p = fstack[0];
255969a3cbdSsam 			if( edebug ) fwalk( p, eprint, 0 );
256969a3cbdSsam # ifdef MYREADER
257969a3cbdSsam 			MYREADER(p);
258969a3cbdSsam # endif
259969a3cbdSsam 
260969a3cbdSsam 			nrecur = 0;
261969a3cbdSsam 			delay( p );
262969a3cbdSsam 			reclaim( p, RNULL, 0 );
263969a3cbdSsam 
264969a3cbdSsam 			allchk();
265969a3cbdSsam 			tcheck();
266969a3cbdSsam 			continue;
267969a3cbdSsam 
268fa32d6d5Sralph 		case FLABEL:
269969a3cbdSsam 			if( VAL(x) ){
270969a3cbdSsam 				tlabel();
271969a3cbdSsam 				}
272969a3cbdSsam 			else {
273969a3cbdSsam 				label( (int) REST(x) );
274969a3cbdSsam 				}
275969a3cbdSsam 			continue;
276969a3cbdSsam 
277969a3cbdSsam 		case GOTO:
278969a3cbdSsam 			if( VAL(x) ) {
279969a3cbdSsam 				cbgen( 0, (int) REST(x), 'I' );  /* unconditional branch */
280969a3cbdSsam 				continue;
281969a3cbdSsam 				}
282969a3cbdSsam 			/* otherwise, treat as unary */
283969a3cbdSsam 			goto def;
284969a3cbdSsam 
285969a3cbdSsam 		case STASG:
286969a3cbdSsam 		case STARG:
287969a3cbdSsam 		case STCALL:
288969a3cbdSsam 		case UNARY STCALL:
289969a3cbdSsam 			    /*
290969a3cbdSsam 			     * size and alignment come from next long words
291969a3cbdSsam 			     */
292969a3cbdSsam 			p = talloc();
293969a3cbdSsam 			p -> stn.stsize = lread();
294969a3cbdSsam 			p -> stn.stalign = lread();
295969a3cbdSsam 			goto defa;
296969a3cbdSsam 		default:
297969a3cbdSsam 		def:
298969a3cbdSsam 			p = talloc();
299969a3cbdSsam 		defa:
300969a3cbdSsam 			p->in.op = FOP(x);
3010c57f064Smckusick 			p->in.type = FIXINT(REST(x));
302969a3cbdSsam 
303969a3cbdSsam 			switch( optype( p->in.op ) ){
304969a3cbdSsam 
305969a3cbdSsam 			case BITYPE:
306969a3cbdSsam 				p->in.right = *--fsp;
307969a3cbdSsam 				p->in.left = *--fsp;
308969a3cbdSsam 				goto bump;
309969a3cbdSsam 
310969a3cbdSsam 			case UTYPE:
311969a3cbdSsam 				p->in.left = *--fsp;
312969a3cbdSsam 				p->tn.rval = 0;
313969a3cbdSsam 				goto bump;
314969a3cbdSsam 
315969a3cbdSsam 			case LTYPE:
316969a3cbdSsam 				uerror( "illegal leaf node: %d", p->in.op );
317969a3cbdSsam 				exit( 1 );
318969a3cbdSsam 				}
319969a3cbdSsam 			}
320969a3cbdSsam 		}
321969a3cbdSsam 	}
322