1File: INIT.C Page 1 1 /* 2 Copyright 1982 3 Alcyon Corporation 4 8716 Production Ave. 5 San Diego, Ca. 92121 6 */ 7 8 /* 9 C68 Parser - include file 10 */ 11 #include "icode.h" 12 13 /*symbol attribute fields*/ 14 #define SRESWORD 001 /*is symbol a reserved word?*/ 15 #define SGLOBAL 002 /*is symbol global?*/ 16 #define STYPEDEF 004 /*typedef declaration?*/ 17 #define SDEFINED 010 /*symbol defined?*/ 18 19 /*reserved words*/ 20 #define R_AUTO 1 21 #define R_BREAK 2 22 #define R_CASE 3 23 #define R_CHAR 4 24 #define R_CONTINUE 5 25 #define R_DO 6 26 #define R_DEFAULT 7 27 #define R_DOUBLE 8 28 #define R_GOTO 9 29 #define R_ELSE 10 30 #define R_EXTERNAL 11 31 #define R_FLOAT 12 32 #define R_FOR 13 33 #define R_IF 14 34 #define R_INT 15 35 #define R_LONG 16 36 #define R_REGISTER 17 37 #define R_RETURN 18 38 #define R_SHORT 19 39 #define R_SIZEOF 20 40 #define R_STATIC 21 41 #define R_STRUCT 22 42 #define R_SWITCH 23 43 #define R_TYPEDEF 24 44 #define R_UNION 25 45 #define R_UNSIGNED 26 46 #define R_WHILE 27 47 48 /* 49 * mixed-mode conversions, entries in 2-d array indexed by: 50 * (int,unsn,long,doub,ptr) 51 */ 52 #define INT_CHAR 1 53 #define UNSN_CHAR 1 54 #define LONG_CHAR 1 55 #define DOUB_CHAR 1 56 #define PTR_CHAR 1 57 #define INT_UNSN 0 /*no conversion is generated*/ 58 #define INT_LONG 2 59 #define INT_DOUB 3 1File: INIT.C Page 2 60 #define INT_PTR 4 61 #define UNSN_INT 0 /*no conversion is generated*/ 62 #define UNSN_LONG 6 63 #define UNSN_DOUB 7 64 #define UNSN_PTR 8 65 #define LONG_INT 9 66 #define LONG_UNSN 10 67 #define LONG_DOUB 11 68 #define LONG_PTR 12 69 #define DOUB_INT 13 70 #define DOUB_UNSN 14 71 #define DOUB_LONG 15 72 #define PTR_INT 16 73 #define PTR_UNSN 17 74 #define PTR_LONG 18 75 #define PTR_PTR 19 76 #define BADCONV 20 77 78 /* miscellaneous constants */ 79 #define OPSSIZE 40 /*operator stack size*/ 80 #define OPDSIZE 80 /*operand stack size*/ 81 #define HSIZE 517 /*hash table size, 3.4 made prime */ 82 #define SYMSIZE 1024 /*size to alloc for symbol structures*/ 83 #define SWSIZE 256 /*max no. of cases in a switch*/ 84 #define DSIZE 1000 /*dimension table size*/ 85 #define BITSPWORD 16 /*bits per word*/ 86 #define AREGLO 010 /*A reg flag*/ 87 #define HICREG 2 /*highest reg # used for code generation*/ 88 #define BITSPCHAR 8 /*bits per char*/ 89 #define CHRSPWORD 2 /*chars per word*/ 90 #define STRSIZE 300 /*max string length*/ 91 #define NFARGS 40 /*max no. of args to function*/ 92 #define NFRSTR 20 /*max no. of forward ref struct proto*/ 93 94 /*symbol table node*/ 95 struct symbol { 96 char s_attrib; /* defined, resword, global, typedef */ 97 char s_sc; /* auto, static, external, register */ 98 int s_type; /* 4bits specified, 2 bit fields for ptr... */ 99 int s_dp; /* index into dimension table */ 100 int s_ssp; /* dimension table/function arg table */ 101 int s_offset; /* offset inside of structure */ 102 char s_symbol[SSIZE]; /* symbol identifier, to SSIZE chars */ 103 struct symbol *s_struc; /* if struct, ptr to parent (sys III) */ 104 struct symbol *s_next; /* next symbol table entry */ 105 }; 106 107 /*expression tree operator node*/ 108 struct tnode { 109 int t_op; 110 int t_type; 111 int t_dp; 112 int t_ssp; 113 struct tnode *t_left; 114 struct tnode *t_right; 115 }; 116 117 /*expression tree node for symbol - only keeps location*/ 118 struct symnode { 1File: INIT.C Page 3 119 int t_op; 120 int t_type; /*data type of symbol*/ 121 int t_dp; /*dimension pointer of symbol*/ 122 int t_ssp; /*structure size index to dtab*/ 123 int t_sc; /*storage class of symbol*/ 124 int t_offset; /*offset of symbol*/ 125 int t_label; 126 }; 127 128 /*expressioon tree node for external symbol - need to keep name*/ 129 struct extnode { 130 int t_op; 131 int t_type; 132 int t_dp; 133 int t_ssp; 134 int t_sc; 135 int t_offset; 136 int t_reg; 137 int t_symbol[SSIZE]; /*symbol name*/ 138 }; 139 140 /*expression tree node for integer constant*/ 141 struct conode { 142 int t_op; 143 int t_type; 144 int t_dp; 145 int t_ssp; 146 int t_value; /*constant value*/ 147 }; 148 149 struct lconode { 150 int t_op; 151 int t_type; 152 int t_dp; 153 int t_ssp; 154 long t_lvalue; /*constant value*/ 155 }; 156 157 struct swtch { 158 int sw_label; 159 int sw_value; 160 } swtab[SWSIZE]=0; 161 162 /*operator and operand stack used by expr*/ 163 struct ops { /*operator stack*/ 164 int o_op; /*operator*/ 165 int o_pri; /*priority*/ 166 } opstack[OPSSIZE]=0, *opp=0; 167 168 char *opdstack[OPDSIZE]=0; /*operand stack*/ 169 char **opdp=0; /*operand stack pointer*/ 170 char *opap=0; /*ptr to next available loc in exprarea*/ 171 struct tnode *frp=0; /*pointer to function return info node*/ 172 int cswp=0; /*current low switch table index*/ 173 int clabel=0; /*continue label*/ 174 int blabel=0; /*break label*/ 175 int rlabel=0; /*return label*/ 176 int dlabel=0; /*default label*/ 177 int lineno=0; /*current line number of input*/ 1File: INIT.C Page 4 178 int errcnt=0; /*count of errors*/ 179 int inclflag=0; /*in include file, don't incr line #'s*/ 180 int inclline=0; /*[vlh]line# in incl file for err rpting*/ 181 char inclfile[13]=0; /*[vlh]include filename for err rpting*/ 182 int equalstop=0; /*stop lex at '=', used for external init*/ 183 int commastop=0; /*stop parse @ comma(used for const expr)*/ 184 int colonstop=0; /*stop parse @ colon(used for case value)*/ 185 int instruct=0; /*set when in structure declaration*/ 186 int smember=0; /*set when seen . or ->*/ 187 int infunc=0; /*set when in function body*/ 188 int tdflag=0; /*declaration is a typedef proto*/ 189 char *tdp=0; /*points to typedef prototype*/ 190 int localsize=0; /*length of local variables*/ 191 int naregs=0; /*keeps track of ptr registers alloc'd*/ 192 int ndregs=0; /*keep track of data registers alloc'd*/ 193 int loadreg=0; /*need to load registers...*/ 194 int boffset=0; /*current bit offset in structure*/ 195 int eflag=0; /*[vlh] 3.4 IEEE floats */ 196 int fflag=0; /*[vlh] 3.4 FFP floats */ 197 int xflag=0; /*translate int's to long's*/ 198 int wflag=0; /*[vlh] don't generate warning mesgs*/ 199 int reducep=0; /*[vlh] if(procid); reduction*/ 200 int peektok=0; /*peeked at token*/ 201 202 /*dimension table*/ 203 long dtab[DSIZE]=0; /* [vlh] 3.4 int => long */ 204 int cdp=0; /*next entry in dtab to alloc*/ 205 206 /*lexical analyzer values*/ 207 int cvalue=0; /*current token value if keyword or CINT*/ 208 int cstrsize=0; /*current string size*/ 209 long clvalue=0; /*current token value if long constant*/ 210 struct symbol *csp=0; /*current token symbol ptr if SYMBOL*/ 211 char cstr[STRSIZE]=0; /*current token value if CSTRING*/ 212 struct symbol *dsp=0; /*declarator symbol pointer*/ 213 214 /* -1 -> not instruct, 0 -> unnamed struct */ 215 struct symbol *strucptr[10]=0; /*[vlh] ptrs to struc symbols*/ 216 217 /*function argument table, used to collect function parameters*/ 218 struct farg { 219 struct symbol *f_sp; 220 int f_offset; 221 } fargtab[NFARGS]=0; 222 223 /*forward referenced structure prototype names*/ 224 struct symbol *frstab[NFRSTR]=0; 225 int frstp=0; 226 227 /*output buffers for intermediate code and strings*/ 228 struct io_buf obuf=0, sbuf=0, ibuf=0, *obp=0; 229 230 #define stypedef(sp) (sp->s_attrib&STYPEDEF) 231 #define walign(add) ((add+1)&(~1)) 232 #define array(type) ((type&SUPTYP)==ARRAY) 233 #define function(type) ((type&SUPTYP)==FUNCTION) 234 #define pointer(type) ((type&SUPTYP)==POINTER) 235 #define notarray(type) ((type&SUPTYP)!=ARRAY) 236 #define notfunction(type) ((type&SUPTYP)!=FUNCTION) 1File: INIT.C Page 5 237 #define notpointer(type) ((type&SUPTYP)!=POINTER) 238 #define btype(type) (type&TYPE) 239 #define suptype(type) (type&SUPTYP) 240 #define alltype(type) (type&(SUPTYP|TYPE)) 241 #define asgop(op) ((opinfo[op]&OPASSIGN)!=0) 242 #define relop(op) ((opinfo[op]&OPREL)!=0) 243 #define lintegral(op) ((opinfo[op]&OPLWORD)!=0) 244 #define rintegral(op) ((opinfo[op]&OPRWORD)!=0) 245 #define rasop(op) ((opinfo[op]&OPRAS)!=0) 246 #define binop(op) ((opinfo[op]&OPBIN)!=0) 247 #define unaryop(op) ((opinfo[op]&OPBIN)==0) 248 #define leaf(op) ((opinfo[op]&OPTERM)!=0) 249 #define lvalop(op) ((opinfo[op]&OPLVAL)!=0) 250 #define oppriority(op) (opinfo[op]&OPPRI) 251 #define makeiop(op) (op|(0254<<8)) 252 /* checks for symbol with structure element storage class */ 253 #define isstel(tp) (tp->t_op==SYMBOL && (sesc(tp))) 254 #define sesc(t) (t->t_sc==STELCL||t->t_sc==UNELCL||t->t_sc==BFIELDCL) 255 /* peek at next token, if not read token put back, else delete */ 256 /* 1 if matched, 0 otherwise */ 257 #define peek(tok) ( (peektok=gettok()) == tok ) 258 259 #define outcommon(sym,size) printf("\t.comm _%.8s,%ld\n",sym,size) 260 #define outgoto(lab) if( lab > 0 ) printf("\tbra L%d\n",lab) 261 /* change to text segment */ 262 #define outtext() printf("\t.text\n") 263 /* change segment to bss */ 264 #define outbss() printf("\t.bss\n") 265 /* output global symbol references */ 266 #define outextdef(sym) printf("\t.globl _%.8s\n",sym) 267 /* outputs reserved memory [vlh] 3.4 %d => %ld */ 268 #define outresmem(size) printf("\t.ds.b %ld\n",size) 269 /* output padding for word alignments */ 270 #define outpad() printf("\t.even\n") 271 /* output long constant to assembler */ 272 #define outlcon(val) printf("\t.dc.l %d\n",val) 273 /* output label constant */ 274 #define outclab(lab) printf("\t.dc.l L%d\n",lab) 275 /* output a label */ 276 #define outlab(lab) printf("\tL%d:",lab) 277 /* output function label */ 278 #define outflab(sym) printf("\t_%.8s:\n\t~~%.8s:\n",sym,sym) 279 /* output data label */ 280 #define outdlab(sym) printf("\t_%.8s:\n",sym) 281 282 /*functions returning pointers*/ 283 char *expr(); 284 char *talloc(); 285 char *tnalloc(); 286 char *enalloc(); 287 char *snalloc(); 288 char *cnalloc(); 289 char *lcnalloc(); 290 char *fpcnalloc(); 291 char *popopd(); 292 char *cvopgen(); 293 char *arrayref(); 294 char *funcref(); 295 char *install(); 1File: INIT.C Page 6 296 char *lookup(); 297 char *balpar(); 298 char *sbrk(); 299 300 long initlist(); 301 long dsize(); 302 long psize(); 303 long dodecl(); 304 long dlist(); 305 long getdec(); 306 long gethex(); 307 long getoct(); 308 long getfp(); 309 long toieee(); 310 long toffp(); 311 312 int inittype=0; 313 int strassign=0; 314 int begseq=0; 315 316 #define EXPSIZE 1024 317 int exprarea[EXPSIZE]=0; 318 319 int opdontop=0; 320 int pbchar=0; 321 322 struct symbol *symbols=0; 323 struct symbol *symtab[HSIZE]=0;