1*24401Smckusick /* common.c 4.2 85/08/22 */ 218385Sralph 318385Sralph #ifdef PASS1COMMON 418385Sralph #include "pass1.h" 518385Sralph #else 618385Sralph #ifdef PASS2COMMON 718385Sralph #include "pass2.h" 818385Sralph #endif 918385Sralph #endif 1018385Sralph 1118385Sralph #ifdef FORT 1218385Sralph #undef BUFSTDERR 1318385Sralph #endif 1418385Sralph #ifndef ONEPASS 1518385Sralph #undef BUFSTDERR 1618385Sralph #endif 1718385Sralph # ifndef EXIT 1818385Sralph # define EXIT exit 1918385Sralph # endif 2018385Sralph 2118385Sralph int nerrors = 0; /* number of errors */ 2218385Sralph 2318385Sralph extern unsigned int offsz; 2418385Sralph 2518385Sralph unsigned caloff(){ 2618385Sralph register i; 2718385Sralph unsigned int temp; 2818385Sralph unsigned int off; 2918385Sralph temp = 1; 3018385Sralph i = 0; 3118385Sralph do { 3218385Sralph temp <<= 1; 3318385Sralph ++i; 3418385Sralph } while( temp != 0 ); 3518385Sralph off = 1 << (i-1); 3618385Sralph return (off); 3718385Sralph } 3818385Sralph 3918385Sralph NODE *lastfree; /* pointer to last free node; (for allocator) */ 4018385Sralph 4118385Sralph /* VARARGS1 */ 4218385Sralph uerror( s, a ) char *s; { /* nonfatal error message */ 4318385Sralph /* the routine where is different for pass 1 and pass 2; 4418385Sralph /* it tells where the error took place */ 4518385Sralph 4618385Sralph ++nerrors; 4718385Sralph where('u'); 4818385Sralph fprintf( stderr, s, a ); 4918385Sralph fprintf( stderr, "\n" ); 5018385Sralph #ifdef BUFSTDERR 5118385Sralph fflush(stderr); 5218385Sralph #endif 5318385Sralph if( nerrors > 30 ) cerror( "too many errors"); 5418385Sralph } 5518385Sralph 5618385Sralph /* VARARGS1 */ 5718385Sralph cerror( s, a, b, c ) char *s; { /* compiler error: die */ 5818385Sralph where('c'); 5918385Sralph if( nerrors && nerrors <= 30 ){ /* give the compiler the benefit of the doubt */ 6018385Sralph fprintf( stderr, "cannot recover from earlier errors: goodbye!\n" ); 6118385Sralph } 6218385Sralph else { 6318385Sralph fprintf( stderr, "compiler error: " ); 6418385Sralph fprintf( stderr, s, a, b, c ); 6518385Sralph fprintf( stderr, "\n" ); 6618385Sralph } 6718385Sralph #ifdef BUFSTDERR 6818385Sralph fflush(stderr); 6918385Sralph #endif 7018385Sralph EXIT(1); 7118385Sralph } 7218385Sralph 7318385Sralph int Wflag = 0; /* Non-zero means do not print warnings */ 7418385Sralph 7518385Sralph /* VARARGS1 */ 7618385Sralph werror( s, a, b ) char *s; { /* warning */ 7718385Sralph if(Wflag) return; 7818385Sralph where('w'); 7918385Sralph fprintf( stderr, "warning: " ); 8018385Sralph fprintf( stderr, s, a, b ); 8118385Sralph fprintf( stderr, "\n" ); 8218385Sralph #ifdef BUFSTDERR 8318385Sralph fflush(stderr); 8418385Sralph #endif 8518385Sralph } 8618385Sralph 8718385Sralph tinit(){ /* initialize expression tree search */ 8818385Sralph 89*24401Smckusick register NODE *p; 9018385Sralph 9118385Sralph for( p=node; p<= &node[TREESZ-1]; ++p ) p->in.op = FREE; 9218385Sralph lastfree = node; 9318385Sralph 9418385Sralph } 9518385Sralph 9618385Sralph # define TNEXT(p) (p== &node[TREESZ-1]?node:p+1) 9718385Sralph 9818385Sralph NODE * 9918385Sralph talloc(){ 100*24401Smckusick register NODE *p, *q; 10118385Sralph 10218385Sralph q = lastfree; 10318385Sralph for( p = TNEXT(q); p!=q; p= TNEXT(p)) 10418385Sralph if( p->in.op ==FREE ) return(lastfree=p); 10518385Sralph 10618385Sralph cerror( "out of tree space; simplify expression"); 10718385Sralph /* NOTREACHED */ 10818385Sralph } 10918385Sralph 11018385Sralph tcheck(){ /* ensure that all nodes have been freed */ 11118385Sralph 112*24401Smckusick register NODE *p; 11318385Sralph 11418385Sralph if( !nerrors ) 11518385Sralph for( p=node; p<= &node[TREESZ-1]; ++p ) 11618385Sralph if( p->in.op != FREE ) cerror( "wasted space: %o", p ); 11718385Sralph tinit(); 11818385Sralph #ifdef FLEXNAMES 11918385Sralph freetstr(); 12018385Sralph #endif 12118385Sralph } 12218385Sralph tfree( p ) NODE *p; { 12318385Sralph /* free the tree p */ 12418385Sralph extern tfree1(); 12518385Sralph 12618385Sralph if( p->in.op != FREE ) walkf( p, tfree1 ); 12718385Sralph 12818385Sralph } 12918385Sralph 13018385Sralph tfree1(p) NODE *p; { 13118385Sralph if( p == 0 ) cerror( "freeing blank tree!"); 13218385Sralph else p->in.op = FREE; 13318385Sralph } 13418385Sralph 13518385Sralph fwalk( t, f, down ) register NODE *t; int (*f)(); { 13618385Sralph 13718385Sralph int down1, down2; 13818385Sralph 13918385Sralph more: 14018385Sralph down1 = down2 = 0; 14118385Sralph 14218385Sralph (*f)( t, down, &down1, &down2 ); 14318385Sralph 14418385Sralph switch( optype( t->in.op ) ){ 14518385Sralph 14618385Sralph case BITYPE: 14718385Sralph fwalk( t->in.left, f, down1 ); 14818385Sralph t = t->in.right; 14918385Sralph down = down2; 15018385Sralph goto more; 15118385Sralph 15218385Sralph case UTYPE: 15318385Sralph t = t->in.left; 15418385Sralph down = down1; 15518385Sralph goto more; 15618385Sralph 15718385Sralph } 15818385Sralph } 15918385Sralph 160*24401Smckusick #ifndef vax 16118385Sralph walkf( t, f ) register NODE *t; int (*f)(); { 16218385Sralph register opty; 16318385Sralph 16418385Sralph opty = optype(t->in.op); 16518385Sralph 16618385Sralph if( opty != LTYPE ) walkf( t->in.left, f ); 16718385Sralph if( opty == BITYPE ) walkf( t->in.right, f ); 16818385Sralph (*f)( t ); 16918385Sralph } 170*24401Smckusick #else 171*24401Smckusick #define NR 100 17218385Sralph 173*24401Smckusick /* 174*24401Smckusick * Deliberately avoids recursion -- use this version on machines with 175*24401Smckusick * expensive procedure calls. 176*24401Smckusick */ 177*24401Smckusick walkf(t, f) 178*24401Smckusick register NODE *t; 179*24401Smckusick register int (*f)(); 180*24401Smckusick { 181*24401Smckusick register int i = 1; 182*24401Smckusick register int opty = optype(t->in.op); 183*24401Smckusick static NODE *at[NR]; 184*24401Smckusick static int ao[NR]; 18518385Sralph 186*24401Smckusick #define PUSH(dir, state) \ 187*24401Smckusick (ao[i] = state, at[i++] = t, t = t->in.dir, opty = optype(t->in.op)) 188*24401Smckusick #define POP() \ 189*24401Smckusick (opty = ao[--i], t = at[i]) 19018385Sralph 191*24401Smckusick do { 192*24401Smckusick switch (opty) { 193*24401Smckusick case LTYPE: (*f)(t); POP(); break; 194*24401Smckusick case UTYPE: PUSH(left, LTYPE); break; 195*24401Smckusick case BITYPE: PUSH(left, BITYPE+1); break; 196*24401Smckusick case BITYPE+1: PUSH(right, LTYPE); break; 197*24401Smckusick default: 198*24401Smckusick cerror("bad op type in walkf"); 199*24401Smckusick } 200*24401Smckusick if (i >= NR) { 201*24401Smckusick walkf(t, f); 202*24401Smckusick POP(); 203*24401Smckusick } 204*24401Smckusick } while (i > 0); 205*24401Smckusick } 206*24401Smckusick #undef NR 207*24401Smckusick #undef PUSH 208*24401Smckusick #undef POP 209*24401Smckusick #endif 210*24401Smckusick 211*24401Smckusick 212*24401Smckusick 21318385Sralph int dope[ DSIZE ]; 21418385Sralph char *opst[DSIZE]; 21518385Sralph 21618385Sralph struct dopest { int dopeop; char opst[8]; int dopeval; } indope[] = { 21718385Sralph 21818385Sralph NAME, "NAME", LTYPE, 21918385Sralph STRING, "STRING", LTYPE, 22018385Sralph REG, "REG", LTYPE, 22118385Sralph OREG, "OREG", LTYPE, 22218385Sralph ICON, "ICON", LTYPE, 22318385Sralph FCON, "FCON", LTYPE, 22418385Sralph DCON, "DCON", LTYPE, 22518385Sralph CCODES, "CCODES", LTYPE, 22618385Sralph UNARY MINUS, "U-", UTYPE, 22718385Sralph UNARY MUL, "U*", UTYPE, 22818385Sralph UNARY AND, "U&", UTYPE, 22918385Sralph UNARY CALL, "UCALL", UTYPE|CALLFLG, 23018385Sralph UNARY FORTCALL, "UFCALL", UTYPE|CALLFLG, 23118385Sralph NOT, "!", UTYPE|LOGFLG, 23218385Sralph COMPL, "~", UTYPE, 23318385Sralph FORCE, "FORCE", UTYPE, 23418385Sralph INIT, "INIT", UTYPE, 23518385Sralph SCONV, "SCONV", UTYPE, 23618385Sralph PCONV, "PCONV", UTYPE, 23718385Sralph PLUS, "+", BITYPE|FLOFLG|SIMPFLG|COMMFLG, 23818385Sralph ASG PLUS, "+=", BITYPE|ASGFLG|ASGOPFLG|FLOFLG|SIMPFLG|COMMFLG, 23918385Sralph MINUS, "-", BITYPE|FLOFLG|SIMPFLG, 24018385Sralph ASG MINUS, "-=", BITYPE|FLOFLG|SIMPFLG|ASGFLG|ASGOPFLG, 24118385Sralph MUL, "*", BITYPE|FLOFLG|MULFLG, 24218385Sralph ASG MUL, "*=", BITYPE|FLOFLG|MULFLG|ASGFLG|ASGOPFLG, 24318385Sralph AND, "&", BITYPE|SIMPFLG|COMMFLG, 24418385Sralph ASG AND, "&=", BITYPE|SIMPFLG|COMMFLG|ASGFLG|ASGOPFLG, 24518385Sralph QUEST, "?", BITYPE, 24618385Sralph COLON, ":", BITYPE, 24718385Sralph ANDAND, "&&", BITYPE|LOGFLG, 24818385Sralph OROR, "||", BITYPE|LOGFLG, 24918385Sralph CM, ",", BITYPE, 25018385Sralph COMOP, ",OP", BITYPE, 25118385Sralph ASSIGN, "=", BITYPE|ASGFLG, 25218385Sralph DIV, "/", BITYPE|FLOFLG|MULFLG|DIVFLG, 25318385Sralph ASG DIV, "/=", BITYPE|FLOFLG|MULFLG|DIVFLG|ASGFLG|ASGOPFLG, 25418385Sralph MOD, "%", BITYPE|DIVFLG, 25518385Sralph ASG MOD, "%=", BITYPE|DIVFLG|ASGFLG|ASGOPFLG, 25618385Sralph LS, "<<", BITYPE|SHFFLG, 25718385Sralph ASG LS, "<<=", BITYPE|SHFFLG|ASGFLG|ASGOPFLG, 25818385Sralph RS, ">>", BITYPE|SHFFLG, 25918385Sralph ASG RS, ">>=", BITYPE|SHFFLG|ASGFLG|ASGOPFLG, 26018385Sralph OR, "|", BITYPE|COMMFLG|SIMPFLG, 26118385Sralph ASG OR, "|=", BITYPE|COMMFLG|SIMPFLG|ASGFLG|ASGOPFLG, 26218385Sralph ER, "^", BITYPE|COMMFLG|SIMPFLG, 26318385Sralph ASG ER, "^=", BITYPE|COMMFLG|SIMPFLG|ASGFLG|ASGOPFLG, 26418385Sralph INCR, "++", BITYPE|ASGFLG, 26518385Sralph DECR, "--", BITYPE|ASGFLG, 26618385Sralph STREF, "->", BITYPE, 26718385Sralph CALL, "CALL", BITYPE|CALLFLG, 26818385Sralph FORTCALL, "FCALL", BITYPE|CALLFLG, 26918385Sralph EQ, "==", BITYPE|LOGFLG, 27018385Sralph NE, "!=", BITYPE|LOGFLG, 27118385Sralph LE, "<=", BITYPE|LOGFLG, 27218385Sralph LT, "<", BITYPE|LOGFLG, 27318385Sralph GE, ">", BITYPE|LOGFLG, 27418385Sralph GT, ">", BITYPE|LOGFLG, 27518385Sralph UGT, "UGT", BITYPE|LOGFLG, 27618385Sralph UGE, "UGE", BITYPE|LOGFLG, 27718385Sralph ULT, "ULT", BITYPE|LOGFLG, 27818385Sralph ULE, "ULE", BITYPE|LOGFLG, 27918385Sralph #ifdef ARS 28018385Sralph ARS, "A>>", BITYPE, 28118385Sralph #endif 28218385Sralph TYPE, "TYPE", LTYPE, 28318385Sralph LB, "[", BITYPE, 28418385Sralph CBRANCH, "CBRANCH", BITYPE, 28518385Sralph FLD, "FLD", UTYPE, 28618385Sralph PMCONV, "PMCONV", BITYPE, 28718385Sralph PVCONV, "PVCONV", BITYPE, 28818385Sralph RETURN, "RETURN", BITYPE|ASGFLG|ASGOPFLG, 28918385Sralph CAST, "CAST", BITYPE|ASGFLG|ASGOPFLG, 29018385Sralph GOTO, "GOTO", UTYPE, 29118385Sralph STASG, "STASG", BITYPE|ASGFLG, 29218385Sralph STARG, "STARG", UTYPE, 29318385Sralph STCALL, "STCALL", BITYPE|CALLFLG, 29418385Sralph UNARY STCALL, "USTCALL", UTYPE|CALLFLG, 29518385Sralph 29618385Sralph -1, "", 0 29718385Sralph }; 29818385Sralph 29918385Sralph mkdope(){ 30018385Sralph register struct dopest *q; 30118385Sralph 30218385Sralph for( q = indope; q->dopeop >= 0; ++q ){ 30318385Sralph dope[q->dopeop] = q->dopeval; 30418385Sralph opst[q->dopeop] = q->opst; 30518385Sralph } 30618385Sralph } 30718385Sralph # ifndef BUG4 30818385Sralph tprint( t ) TWORD t; { /* output a nice description of the type of t */ 30918385Sralph 31018385Sralph static char * tnames[] = { 31118385Sralph "undef", 31218385Sralph "farg", 31318385Sralph "char", 31418385Sralph "short", 31518385Sralph "int", 31618385Sralph "long", 31718385Sralph "float", 31818385Sralph "double", 31918385Sralph "strty", 32018385Sralph "unionty", 32118385Sralph "enumty", 32218385Sralph "moety", 32318385Sralph "uchar", 32418385Sralph "ushort", 32518385Sralph "unsigned", 32618385Sralph "ulong", 32718385Sralph "?", "?" 32818385Sralph }; 32918385Sralph 33018385Sralph for(;; t = DECREF(t) ){ 33118385Sralph 33218385Sralph if( ISPTR(t) ) printf( "PTR " ); 33318385Sralph else if( ISFTN(t) ) printf( "FTN " ); 33418385Sralph else if( ISARY(t) ) printf( "ARY " ); 33518385Sralph else { 33618385Sralph printf( "%s", tnames[t] ); 33718385Sralph return; 33818385Sralph } 33918385Sralph } 34018385Sralph } 34118385Sralph # endif 34218385Sralph 34318385Sralph #ifdef FLEXNAMES 34418385Sralph #define NTSTRBUF 40 34518385Sralph #define TSTRSZ 2048 34618385Sralph char itstrbuf[TSTRSZ]; 34718385Sralph char *tstrbuf[NTSTRBUF] = { itstrbuf }; 34818385Sralph char **curtstr = tstrbuf; 34918385Sralph int tstrused; 35018385Sralph 35118385Sralph char * 35218385Sralph tstr(cp) 35318385Sralph register char *cp; 35418385Sralph { 35518385Sralph register int i = strlen(cp); 35618385Sralph register char *dp; 35718385Sralph 35818385Sralph if (tstrused + i >= TSTRSZ) { 35918385Sralph if (++curtstr >= &tstrbuf[NTSTRBUF]) 36018385Sralph cerror("out of temporary string space"); 36118385Sralph tstrused = 0; 36218385Sralph if (*curtstr == 0) { 36318385Sralph dp = (char *)malloc(TSTRSZ); 36418385Sralph if (dp == 0) 36518385Sralph cerror("out of memory (tstr)"); 36618385Sralph *curtstr = dp; 36718385Sralph } 36818385Sralph } 36918385Sralph strcpy(dp = *curtstr+tstrused, cp); 37018385Sralph tstrused += i + 1; 37118385Sralph return (dp); 37218385Sralph } 37318385Sralph #endif 374