1File: INTERF.C Page 1 1 /* 2 Copyright 1982 3 Alcyon Corporation 4 8716 Production Ave. 5 San Diego, Ca. 92121 6 */ 7 8 #include "cgen.h" 9 int bol; 10 int onepass; 11 12 /* outexpr - output expression*/ 13 outexpr(tp) /* returns - none*/ 14 struct tnode *tp; /* pointer to tree node*/ 15 { 16 if( dflag ) 17 outline(); 18 if( exprok(tp) ) 19 scodegen(canon(tp),FOREFF,0); 20 } 21 22 outifgoto(tp,dir,lab) 23 struct tnode *tp; 24 int dir; 25 int lab; 26 { 27 if( dflag ) 28 outline(); 29 if( exprok(tp) ) 30 condbr(canon(tp),dir,lab,0); 31 } 32 33 outcforreg(tp) 34 struct tnode *tp; 35 { 36 if( dflag ) 37 outline(); 38 if( exprok(tp) ) 39 outmovr(scodegen(canon(tp),FORREG,0),0,tp); 40 } 41 42 outinit(tp) /* returns - none*/ 43 struct tnode *tp; 44 { 45 register int typeout; 46 47 if( dflag ) 48 outline(); 49 if( exprok(tp) ) { 50 typeout = tp->t_type; 51 tp = canon(tp); 52 if( tp->t_op == ADDR ) 53 tp = tp->t_left; 54 if( tp->t_op == CINT || tp->t_op == SYMBOL ) { 55 if( tp->t_op != CINT ) 56 printf(".dc.l "); 57 else { 58 printf(".dc"); 59 outtype(typeout); 1File: INTERF.C Page 2 60 putchar(' '); 61 } 62 outaexpr(tp,NOTIMMED); /* [vlh] 4.0 not immed... */ 63 } 64 else 65 error("invalid initialization"); 66 putchar('\n'); 67 } 68 } 69 70 /* snalloc - code generator symbol node allocation*/ 71 /* This might be coalesced into parser snalloc.*/ 72 char *snalloc(type,sc,offset,dp,ssp) /* returns ptr to node alloced*/ 73 int type; /* type of symbol*/ 74 int sc; /* storage class*/ 75 int offset; /* offset from Local Environment Ptr*/ 76 int dp; /*for compatability with parser*/ 77 int ssp; /*for compatability with parser*/ 78 { 79 register struct symnode *sp; 80 81 sp = talloc(sizeof(*sp)); 82 sp->t_op = SYMBOL; 83 sp->t_type = type; 84 sp->t_su = dp; 85 sp->t_ssp = ssp; 86 sp->t_sc = sc; 87 switch( sc ) { 88 89 case STATIC: 90 sp->t_offset = 0; 91 sp->t_reg = 0; 92 sp->t_label = offset; 93 break; 94 95 case REGISTER: 96 sp->t_offset = 0; 97 sp->t_reg = offset; 98 sp->t_label = 0; 99 break; 100 101 case AUTO: 102 sp->t_sc = REGOFF; 103 sp->t_offset = offset; 104 sp->t_reg = LEP; 105 sp->t_label = 0; 106 break; 107 108 default: 109 sp->t_offset = offset; 110 sp->t_reg = 0; 111 sp->t_label = 0; 112 break; 113 } 114 return(sp); 115 } 116 117 exprok(tp) 118 struct tnode *tp; 1File: INTERF.C Page 3 119 { 120 if( tp < exprarea || tp > &exprarea[EXPSIZE] ) 121 return(0); 122 if( leafop(tp->t_op) ) 123 return(1); 124 if( binop(tp->t_op) && !exprok(tp->t_right) ) 125 return(0); 126 return( exprok(tp->t_left) ); 127 } 128 129 outline() 130 { 131 if( onepass && !bol ) 132 putchar('\n'); 133 printf("*line %d\n",lineno); 134 }