|
|
1.1 ! root 1: /* @(#) manifest.h: 1.4 3/26/84 */ ! 2: ! 3: ! 4: # include <stdio.h> ! 5: ! 6: /* macro definitions for common cases of type collapsing */ ! 7: # ifdef NOSHORT ! 8: # define SZSHORT SZINT ! 9: # define ALSHORT ALINT ! 10: # endif ! 11: ! 12: # ifdef NOLONG ! 13: # define SZLONG SZINT ! 14: # define ALLONG ALINT ! 15: # endif ! 16: ! 17: # ifdef NOFLOAT ! 18: # define SZFLOAT SZLONG ! 19: # define SZDOUBLE SZLONG ! 20: # define ALFLOAT ALLONG ! 21: # define ALDOUBLE ALLONG ! 22: # endif ! 23: ! 24: # ifdef ONEFLOAT ! 25: # define SZFLOAT SZDOUBLE ! 26: # define ALFLOAT ALDOUBLE ! 27: # endif ! 28: ! 29: /* define default assembly language comment starter */ ! 30: ! 31: # ifndef COMMENTSTR ! 32: # define COMMENTSTR "#" ! 33: #endif ! 34: ! 35: /* manifest constant file for the lex/yacc interface */ ! 36: ! 37: # define ERROR 1 ! 38: # define NAME 2 ! 39: # define STRING 3 ! 40: # define ICON 4 ! 41: # define FCON 5 ! 42: # define PLUS 6 ! 43: # define MINUS 8 ! 44: # define MUL 11 ! 45: # define STAR (UNARY MUL) ! 46: # define AND 14 ! 47: # define OR 17 ! 48: # define ER 19 ! 49: # define QUEST 21 ! 50: # define COLON 22 ! 51: # define ANDAND 23 ! 52: # define OROR 24 ! 53: ! 54: /* special interfaces for yacc alone */ ! 55: /* These serve as abbreviations of 2 or more ops: ! 56: ASOP =, = ops ! 57: RELOP LE,LT,GE,GT ! 58: EQUOP EQ,NE ! 59: DIVOP DIV,MOD ! 60: SHIFTOP LS,RS ! 61: ICOP INCR,DECR ! 62: UNOP NOT,COMPL ! 63: STROP DOT,STREF ! 64: ! 65: */ ! 66: # define ASOP 25 ! 67: # define RELOP 26 ! 68: # define EQUOP 27 ! 69: # define DIVOP 28 ! 70: # define SHIFTOP 29 ! 71: # define INCOP 30 ! 72: # define UNOP 31 ! 73: # define STROP 32 ! 74: ! 75: /* reserved words, etc */ ! 76: # define TYPE 33 ! 77: # define CLASS 34 ! 78: # define STRUCT 35 ! 79: # define RETURN 36 ! 80: # define GOTO 37 ! 81: # define IF 38 ! 82: # define ELSE 39 ! 83: # define SWITCH 40 ! 84: # define BREAK 41 ! 85: # define CONTINUE 42 ! 86: # define WHILE 43 ! 87: # define DO 44 ! 88: # define FOR 45 ! 89: # define DEFAULT 46 ! 90: # define CASE 47 ! 91: # define SIZEOF 48 ! 92: # define ENUM 49 ! 93: ! 94: /* little symbols, etc. */ ! 95: /* namely, ! 96: ! 97: LP ( ! 98: RP ) ! 99: ! 100: LC { ! 101: RC } ! 102: ! 103: LB [ ! 104: RB ] ! 105: ! 106: CM , ! 107: SM ; ! 108: ! 109: */ ! 110: ! 111: # define LP 50 ! 112: # define RP 51 ! 113: # define LC 52 ! 114: # define RC 53 ! 115: # define LB 54 ! 116: # define RB 55 ! 117: # define CM 56 ! 118: # define SM 57 ! 119: # define ASSIGN 58 ! 120: /* ASM returned only by yylex, and totally eaten by yyparse */ ! 121: # define ASM 59 ! 122: ! 123: /* END OF YACC */ ! 124: ! 125: /* left over tree building operators */ ! 126: # define COMOP 59 ! 127: # define DIV 60 ! 128: # define MOD 62 ! 129: # define LS 64 ! 130: # define RS 66 ! 131: # define DOT 68 ! 132: # define STREF 69 ! 133: # define CALL 70 ! 134: # define FORTCALL 73 ! 135: # define NOT 76 ! 136: # define COMPL 77 ! 137: # define INCR 78 ! 138: # define DECR 79 ! 139: # define EQ 80 ! 140: # define NE 81 ! 141: # define LE 82 ! 142: # define LT 83 ! 143: # define GE 84 ! 144: # define GT 85 ! 145: # define ULE 86 ! 146: # define ULT 87 ! 147: # define UGE 88 ! 148: # define UGT 89 ! 149: # define SETBIT 90 ! 150: # define TESTBIT 91 ! 151: # define RESETBIT 92 ! 152: # define ARS 93 ! 153: # define REG 94 ! 154: # define TEMP 95 ! 155: # define CCODES 96 ! 156: # define FREE 97 ! 157: # define STASG 98 ! 158: # define STARG 99 ! 159: # define STCALL 100 ! 160: ! 161: /* some conversion operators */ ! 162: # define FLD 103 ! 163: # define CONV 104 ! 164: # define PMUL 105 ! 165: # define PDIV 106 ! 166: ! 167: /* special node operators, used for special contexts */ ! 168: /* # define FORCE 107 */ ! 169: # define GENLAB 108 ! 170: # define CBRANCH 109 ! 171: # define GENBR 110 ! 172: # define CMP 111 ! 173: # define GENUBR 112 ! 174: # define INIT 113 ! 175: # define CAST 114 ! 176: # define FUNARG 115 ! 177: # define VAUTO 116 ! 178: # define VPARAM 117 ! 179: # define RNODE 118 ! 180: # define SNODE 119 ! 181: # define QNODE 120 ! 182: /* a whole bunch of ops, done with unary; I don't need to tackle prec */ ! 183: # define UOP0 121 ! 184: # define UOP1 122 ! 185: # define UOP2 123 ! 186: # define UOP3 124 ! 187: # define UOP4 125 ! 188: # define UOP5 126 ! 189: # define UOP6 127 ! 190: # define UOP7 128 ! 191: # define UOP8 129 ! 192: # define UOP9 130 ! 193: /* op used in second pass */ ! 194: #define LABELPT 131 ! 195: # define MANY 132 ! 196: #define PROLOG 133 ! 197: #define EPILOG 134 ! 198: #define SWCASE 135 ! 199: #define SWDEF 136 ! 200: #define SWEND 137 ! 201: #define SWBEG 138 ! 202: ! 203: /* node types */ ! 204: # define LTYPE 02 ! 205: # define UTYPE 04 ! 206: # define BITYPE 010 ! 207: ! 208: /* DSIZE is the size of the dope array */ ! 209: # define DSIZE MANY+1 ! 210: ! 211: /* type names, used in symbol table building */ ! 212: # define TNULL 0 ! 213: # define FARG 1 ! 214: # define CHAR 2 ! 215: # define SHORT 3 ! 216: # define INT 4 ! 217: # define LONG 5 ! 218: # define FLOAT 6 ! 219: # define DOUBLE 7 ! 220: # define STRTY 8 ! 221: # define UNIONTY 9 ! 222: # define ENUMTY 10 ! 223: # define MOETY 11 ! 224: # define UCHAR 12 ! 225: # define USHORT 13 ! 226: # define UNSIGNED 14 ! 227: # define ULONG 15 ! 228: # define VOID 16 ! 229: # define UNDEF 17 ! 230: ! 231: # define ASG 1+ ! 232: # define UNARY 2+ ! 233: # define NOASG (-1)+ ! 234: # define NOUNARY (-2)+ ! 235: ! 236: /* various flags */ ! 237: # define NOLAB (-1) ! 238: ! 239: /* type modifiers */ ! 240: ! 241: # define PTR 040 ! 242: # define FTN 0100 ! 243: # define ARY 0140 ! 244: ! 245: /* type packing constants */ ! 246: ! 247: # define MTMASK 03 ! 248: # define BTMASK 037 ! 249: # define BTSHIFT 5 ! 250: # define TSHIFT 2 ! 251: # define TMASK (MTMASK<<BTSHIFT) ! 252: # define TMASK1 (MTMASK<<(BTSHIFT+TSHIFT)) ! 253: # define TMASK2 (TMASK||MTMASK) ! 254: ! 255: /* macros */ ! 256: ! 257: # ifndef BITMASK ! 258: /* beware 1's complement */ ! 259: # define BITMASK(n) (((n)==SZLONG)?-1L:((1L<<(n))-1)) ! 260: # endif ! 261: # define ONEBIT(n) (1L<<(n)) ! 262: # define MODTYPE(x,y) x = (x&(~BTMASK))|y /* set basic type of x to y */ ! 263: # define BTYPE(x) (x&BTMASK) /* basic type of x */ ! 264: # define ISUNSIGNED(x) ((x)<=ULONG&&(x)>=UCHAR) ! 265: # define UNSIGNABLE(x) ((x)<=LONG&&(x)>=CHAR) ! 266: # define ENUNSIGN(x) ((x)+(UNSIGNED-INT)) ! 267: # define DEUNSIGN(x) ((x)+(INT-UNSIGNED)) ! 268: # define ISPTR(x) ((x&TMASK)==PTR) ! 269: # define ISFTN(x) ((x&TMASK)==FTN) /* is x a function type */ ! 270: # define ISARY(x) ((x&TMASK)==ARY) /* is x an array type */ ! 271: # define INCREF(x) (((x&~BTMASK)<<TSHIFT)|PTR|(x&BTMASK)) ! 272: # define DECREF(x) (((x>>TSHIFT)&~BTMASK)|(x&BTMASK)) ! 273: # define SETOFF(x,y) if( (x)%(y) != 0 ) x = ( ((x)/(y) + 1) * (y)) ! 274: /* advance x to a multiple of y */ ! 275: # define NOFIT(x,y,z) ( ((x)%(z) + (y)) > (z) ) ! 276: /* can y bits be added to x without overflowing z */ ! 277: /* pack and unpack field descriptors (size and offset) */ ! 278: # define PKFIELD(s,o) (((o)<<6)|(s)) ! 279: # define UPKFSZ(v) ((v)&077) ! 280: # define UPKFOFF(v) ((v)>>6) ! 281: ! 282: /* operator information */ ! 283: ! 284: # define TYFLG 016 ! 285: # define ASGFLG 01 ! 286: # define LOGFLG 020 ! 287: ! 288: # define SIMPFLG 040 ! 289: # define COMMFLG 0100 ! 290: # define DIVFLG 0200 ! 291: # define FLOFLG 0400 ! 292: # define LTYFLG 01000 ! 293: # define CALLFLG 02000 ! 294: # define MULFLG 04000 ! 295: # define SHFFLG 010000 ! 296: # define ASGOPFLG 020000 ! 297: ! 298: # define SPFLG 040000 ! 299: ! 300: #define optype(o) (dope[o]&TYFLG) ! 301: #define asgop(o) (dope[o]&ASGFLG) ! 302: #define asgbinop(o) (dope[o]&ASGOPFLG) ! 303: #define logop(o) (dope[o]&LOGFLG) ! 304: #define callop(o) (dope[o]&CALLFLG) ! 305: ! 306: /* table sizes */ ! 307: ! 308: #ifdef M32B ! 309: # define BCSZ 125 /* size of the table to save break and continue labels */ ! 310: #else ! 311: # define BCSZ 100 /* size of the table to save break and continue labels */ ! 312: #endif ! 313: # define MAXNEST BCSZ /* maximum nesting depth (for scopestack) */ ! 314: # ifndef SYMTSZ ! 315: # define SYMTSZ 6000 /* size of the symbol table (was 2000) */ ! 316: # endif ! 317: # define DIMTABSZ 300 /* size of the dimension/size table (dynamic) */ ! 318: # define PARAMSZ 650 /* size of the parameter stack */ ! 319: # define ARGSZ 50 /* size of the argument stack */ ! 320: # ifndef TREESZ ! 321: # ifndef FORT ! 322: # define TREESZ 1500 /* space for building parse tree */ ! 323: # else ! 324: # define TREESZ 1500 ! 325: # endif ! 326: # endif ! 327: # define SWITSZ 4000 /* size of switch table */ ! 328: ! 329: char *hash(); ! 330: char *savestr(); ! 331: char *tstr(); ! 332: extern int tstrused; ! 333: extern char *tstrbuf[]; ! 334: extern char **curtstr; ! 335: #define freestr() ( curtstr = tstrbuf, tstrused = 0 ) ! 336: ! 337: # define NCHNAM 8 /* number of characters in a truncated name */ ! 338: ! 339: /* common defined variables */ ! 340: ! 341: extern int nerrors; /* number of errors seen so far */ ! 342: ! 343: typedef union ndu NODE; ! 344: typedef unsigned int TWORD; ! 345: typedef long CONSZ; /* size in which constants are converted */ ! 346: ! 347: /* default is byte addressing */ ! 348: /* BITOOR(x) converts bit width x into address offset */ ! 349: # ifndef BITOOR ! 350: # define BITOOR(x) ((x)/SZCHAR) ! 351: # endif ! 352: ! 353: #if defined(TMPSRET) && !defined(AUXREG) ! 354: #define AUXREG (NRGS - 1) ! 355: #endif ! 356: ! 357: # define NIL (NODE *)0 ! 358: ! 359: extern int dope[]; /* a vector containing operator information */ ! 360: extern char *opst[]; /* a vector containing names for ops */ ! 361: ! 362: # define NCOSTS (NRGS+4) ! 363: ! 364: /* in one-pass operation, define the tree nodes */ ! 365: ! 366: union ndu { ! 367: ! 368: struct { ! 369: int op; ! 370: int goal; ! 371: TWORD type; ! 372: int cst[NCOSTS]; ! 373: char * name; ! 374: char pad[NCHNAM-sizeof(char *)]; /* padding hack! */ ! 375: NODE *left; ! 376: NODE *right; ! 377: }in; /* interior node */ ! 378: struct { ! 379: int op; ! 380: int goal; ! 381: TWORD type; ! 382: int cst[NCOSTS]; ! 383: char * name; ! 384: char pad[NCHNAM-sizeof(char *)]; /* padding hack! */ ! 385: NODE *left; ! 386: NODE *right; ! 387: int lineno; ! 388: }ln; /* line number? */ ! 389: ! 390: struct { ! 391: int op; ! 392: int goal; ! 393: TWORD type; ! 394: int cst[NCOSTS]; ! 395: char * name; ! 396: char pad[NCHNAM-sizeof(char *)]; /* padding hack! */ ! 397: CONSZ lval; ! 398: int rval; ! 399: }tn; /* terminal node */ ! 400: ! 401: struct { ! 402: int op; ! 403: int goal; ! 404: TWORD type; ! 405: int cst[NCOSTS]; ! 406: int label; /* for use with branching */ ! 407: int lop; /* the opcode being branched on */ ! 408: }bn; /* branch node */ ! 409: ! 410: struct { ! 411: int op; ! 412: int goal; ! 413: TWORD type; ! 414: int cst[NCOSTS]; ! 415: int stsize; /* sizes of structure objects */ ! 416: short stalign; /* alignment of structure objects */ ! 417: short argsize; /* size of argument list for call */ ! 418: }stn; /* structure node */ ! 419: ! 420: struct { ! 421: int op; ! 422: int goal; ! 423: TWORD type; ! 424: int cdim; ! 425: int csiz; ! 426: }fn; /* front node */ ! 427: ! 428: struct { ! 429: /* this structure is used when a floating point constant ! 430: is being computed */ ! 431: int op; ! 432: int goal; ! 433: TWORD type; ! 434: int cdim; ! 435: int csiz; ! 436: double dval; ! 437: }fpn; /* floating point node */ ! 438: ! 439: };
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.