|
|
1.1 ! root 1: /* ! 2: * h/cc1.h ! 3: * Definitions, macros, structures and types ! 4: * used by the portable code generator (cc1). ! 5: */ ! 6: ! 7: #include <stdio.h> ! 8: #include <setjmp.h> ! 9: #ifdef vax ! 10: #include "INC$LIB:mch.h" ! 11: #include "INC$LIB:host.h" ! 12: #include "INC$LIB:cc1mch.h" ! 13: #include "INC$LIB:ops.h" ! 14: #include "INC$LIB:var.h" ! 15: #include "INC$LIB:varmch.h" ! 16: #include "INC$LIB:opcode.h" ! 17: #include "INC$LIB:stream.h" ! 18: #else ! 19: #include "mch.h" ! 20: #include "host.h" ! 21: #include "cc1mch.h" ! 22: #include "ops.h" ! 23: #include "var.h" ! 24: #include "varmch.h" ! 25: #include "opcode.h" ! 26: #include "stream.h" ! 27: #endif ! 28: ! 29: /* ! 30: * Table sizes, etc. ! 31: */ ! 32: #if _I386 ! 33: #define NSTORE 100 /* # of entries in storelist */ ! 34: #else ! 35: #define NSTORE 20 /* # of entries in storelist */ ! 36: #endif ! 37: #define NNSW 16 /* Nested switches */ ! 38: #define NTNODE 350 /* Tree nodes */ ! 39: #define NSHASH 64 /* Symbol hash buckets */ ! 40: #define SHMASK 077 /* Mask for above */ ! 41: ! 42: /* ! 43: * This structure is used to ! 44: * buffer the case constants and the ! 45: * case labels. ! 46: */ ! 47: typedef struct cases { ! 48: ival_t c_val; /* Value */ ! 49: int c_lab; /* Label */ ! 50: } CASES; ! 51: ! 52: /* ! 53: * Code patterns. ! 54: * There is an array of these for ! 55: * most of the operators. ! 56: * The 'pat' table holds a pointer ! 57: * to the first one and the number ! 58: * of entries. ! 59: */ ! 60: typedef struct pat { ! 61: INDEX p_flag; /* Some flags */ ! 62: INDEX p_ntype; /* Node type */ ! 63: REGNAME p_ntemp; /* Temp. spec. */ ! 64: REGNAME p_ltemp; /* Left. spec. */ ! 65: REGNAME p_rtemp; /* Right spec. */ ! 66: REGNAME p_result; /* Result spec. */ ! 67: INDEX p_lflag; /* Flags for left subtree */ ! 68: INDEX p_ltype; /* Types for left subtree */ ! 69: INDEX p_rflag; /* Flags for right subtree */ ! 70: INDEX p_rtype; /* Types for right subtree */ ! 71: char *p_macro; /* The macro */ ! 72: #if !TINY ! 73: int p_fname; /* Pattern file name */ ! 74: int p_fline; /* Pattern file line */ ! 75: #endif ! 76: } PAT; ! 77: ! 78: /* ! 79: * Pattern index. ! 80: * The 'pat' table (one of these) ! 81: * is indexed by operator number to ! 82: * get the patterns for the op. ! 83: */ ! 84: typedef struct patx { ! 85: PAT *px_pp; /* Pointer to patterns */ ! 86: int px_npat; /* # of patterns */ ! 87: } PATX; ! 88: ! 89: /* Flags */ ! 90: #define PEFFECT ((PATFLAG)0x0001) /* Effect */ ! 91: #define PLVALUE ((PATFLAG)0x0002) /* Lvalue load */ ! 92: #define PRVALUE ((PATFLAG)0x0004) /* Rvalue load */ ! 93: #define PFNARG ((PATFLAG)0x0008) /* Function argument */ ! 94: #define PEQ ((PATFLAG)0x0010) /* Conditionals */ ! 95: #define PNE ((PATFLAG)0x0020) ! 96: #define PGT ((PATFLAG)0x0040) ! 97: #define PGE ((PATFLAG)0x0080) ! 98: #define PLE ((PATFLAG)0x0100) ! 99: #define PLT ((PATFLAG)0x0200) ! 100: #define PUGT ((PATFLAG)0x0400) ! 101: #define PUGE ((PATFLAG)0x0800) ! 102: #define PULE ((PATFLAG)0x1000) ! 103: #define PULT ((PATFLAG)0x2000) ! 104: ! 105: #define P_SLT ((PATFLAG)0x4000) /* Share left temp */ ! 106: #define P_SRT ((PATFLAG)(unsigned)0x8000) /* Share right temp */ ! 107: #define P_SHR (P_SLT|P_SRT) /* Any share */ ! 108: ! 109: /* ! 110: * Macros. ! 111: */ ! 112: #define M_ORG 200 /* Origin of non opcodes */ ! 113: ! 114: #define M_END 200 /* End of macro */ ! 115: #define M_OP0 201 /* Op 0 */ ! 116: #define M_OP1 202 /* Op 1 */ ! 117: #define M_OP2 203 /* Op 2 */ ! 118: #define M_AL 204 /* Address, left */ ! 119: #define M_AR 205 /* Address, right */ ! 120: #define M_RL 206 /* Register, left */ ! 121: #define M_RR 207 /* Register, right */ ! 122: #define M_R 208 /* Temp. register */ ! 123: #define M_HI 209 /* Hi prefix */ ! 124: #define M_LO 210 /* Lo prefix */ ! 125: #define M_EMASK 211 /* Field extract mask */ ! 126: #define M_LAB 212 /* Label */ ! 127: #define M_LAB0 213 /* Generate label 0 */ ! 128: #define M_LAB1 214 /* Generate label 1 */ ! 129: #define M_NSE 215 /* No side effects prefix */ ! 130: #define M_IFR 216 /* If relational */ ! 131: #define M_IFV 217 /* If value */ ! 132: #define M_CMASK 218 /* Field clear mask */ ! 133: #define M_SIZE 219 /* Size */ ! 134: #define M_BITL 220 /* Extract bit # left side */ ! 135: #define M_BITR 221 /* Extract bit # right side */ ! 136: #define M_ENDIF 222 /* End if */ ! 137: #define M_DLAB0 223 /* Define label 0 */ ! 138: #define M_DLAB1 224 /* Define label 1 */ ! 139: #define M_ICON 225 /* Ival_t constant */ ! 140: #define M_REGNO 226 /* Register */ ! 141: #define M_AN 227 /* Address form of node */ ! 142: #define M_TOS 228 /* Top of stack address */ ! 143: #define M_STAR 229 /* Indirection on address */ ! 144: #define M_GID 230 /* Global name for calling routines */ ! 145: #define M_IFE 231 /* If effect */ ! 146: #define M_REL0 232 /* Rel. 0 */ ! 147: #define M_REL1 233 /* Rel. 1 */ ! 148: #define M_LREL0 234 /* Long rel. 0 */ ! 149: #define M_LREL1 235 /* Long rel. 1 */ ! 150: #define M_LREL2 236 /* Long rel. 2 */ ! 151: #define M_CALL 237 /* Call opcode */ ! 152: #define M_LCON 238 /* Lval_t constant */ ! 153: #define M_TN 239 /* Type of node op */ ! 154: #define M_TR 240 /* Type of right */ ! 155: #define M_TL 241 /* Type of left */ ! 156: #define M_SSIZE 242 /* Stack size */ ! 157: #define M_JMP1 243 /* One byte jump */ ! 158: #define M_JMP2 244 /* Two byte jump */ ! 159: #define M_JMPB 245 /* One byte jump back relative */ ! 160: ! 161: /* ! 162: * Symbol structure. ! 163: */ ! 164: typedef struct sym { ! 165: struct sym *s_fp; /* Hash link */ ! 166: char s_id[]; /* Name */ ! 167: } SYM; ! 168: ! 169: /* ! 170: * This is the tree node structure. All ! 171: * nodes are the same size; this makes it much easier ! 172: * for the modify phases to make a node of one type into a ! 173: * node of any other type. Note the use of fully qualified ! 174: * references into the structure; this makes the structure ! 175: * compile correctly under either Bell or UCB structure ! 176: * member rules. Noce names for the members is provided ! 177: * by the block of #define's at the end of the declaration. ! 178: */ ! 179: typedef struct tree { ! 180: int t_op; /* Operation */ ! 181: TYPE t_type; /* Type */ ! 182: COST t_cost; /* Cost of evaluation */ ! 183: PAT *t_patp; /* Pattern */ ! 184: int t_size; /* Size */ ! 185: FLAG t_flag; /* Flags */ ! 186: REGNAME t_treg; /* Temp reg */ ! 187: REGNAME t_rreg; /* Result reg */ ! 188: PREGSET t_used; /* Used */ ! 189: union { ! 190: struct { ! 191: struct tree *t_xlp; ! 192: union { ! 193: struct tree *t_xrp; ! 194: struct { ! 195: char t_xfw; ! 196: char t_xfb; ! 197: } t_1; ! 198: } t_2; ! 199: } t_3; ! 200: ival_t t_xival; ! 201: lval_t t_xlval; ! 202: dval_t t_xdval; ! 203: struct { ! 204: sizeof_t t_xoffs; ! 205: int t_xseg; ! 206: union { ! 207: int t_xlab; ! 208: SYM *t_xsp; ! 209: } t_4; ! 210: } t_5; ! 211: int t_xreg; ! 212: } t_6; ! 213: } TREE; ! 214: ! 215: #define t_lp t_6.t_3.t_xlp /* Left tree */ ! 216: #define t_rp t_6.t_3.t_2.t_xrp /* Right tree */ ! 217: #define t_width t_6.t_3.t_2.t_1.t_xfw /* Width of field in bits */ ! 218: #define t_base t_6.t_3.t_2.t_1.t_xfb /* Base bit */ ! 219: #define t_ival t_6.t_xival /* ICON value */ ! 220: #define t_lval t_6.t_xlval /* LCON value */ ! 221: #define t_dval t_6.t_xdval /* DCON value */ ! 222: #define t_offs t_6.t_5.t_xoffs /* Offset from label */ ! 223: #define t_seg t_6.t_5.t_xseg /* Segment of label */ ! 224: #define t_label t_6.t_5.t_4.t_xlab /* Local label */ ! 225: #define t_sp t_6.t_5.t_4.t_xsp /* Global symbol */ ! 226: #define t_reg t_6.t_xreg /* REG register number */ ! 227: ! 228: /* ! 229: * Register table. ! 230: */ ! 231: typedef struct reg { ! 232: KIND r_lvalue; /* Kinds in lvalue sense */ ! 233: KIND r_rvalue; /* Kinds in rvalue sense */ ! 234: int r_goal; /* Goal for TREG loading */ ! 235: REGNAME r_enpair; /* Enclosing pair name */ ! 236: REGNAME r_hihalf; /* Hi half */ ! 237: REGNAME r_lohalf; /* Lo half */ ! 238: PREGSET r_phys; /* Physical regs */ ! 239: } REGDESC; ! 240: ! 241: /* ! 242: * Per type info. ! 243: */ ! 244: typedef struct pertype { ! 245: REGNAME p_frreg; /* Function return reg */ ! 246: char p_frcxt; /* Return context */ ! 247: char p_size; /* Size of temp, function arg */ ! 248: char p_incr; /* Real size */ ! 249: TYPESET p_type; /* Match type bits */ ! 250: KIND p_kind; /* Kind of register needed */ ! 251: KIND p_pair; /* Kind for a pair */ ! 252: } PERTYPE; ! 253: ! 254: /* ! 255: * Contexts. ! 256: * Used to indicate the context of a computation. ! 257: * Passed to all (modify, selection, output) phases of ! 258: * the code generator. ! 259: */ ! 260: #define MEFFECT 0 /* Effect only */ ! 261: #define MLVALUE 1 /* Left value context */ ! 262: #define MRVALUE 2 /* Right value context */ ! 263: #define MFNARG 3 /* Function argument */ ! 264: #define MLADDR 4 /* Address, left side */ ! 265: #define MRADDR 5 /* Address, right side */ ! 266: #define MRETURN 6 /* Return value of function */ ! 267: #define MSWITCH 7 /* Switch value */ ! 268: #define MINIT 8 /* Initialisor */ ! 269: #define MFLOW 9 /* Flow of control */ ! 270: #define MPASSED 10 /* For modify3.c tables */ ! 271: #define MJUNK 11 /* Ditto */ ! 272: #define MHARD 12 /* Ditto */ ! 273: #define MEQ 13 /* == */ ! 274: #define MNE 14 /* != */ ! 275: #define MGT 15 /* > signed */ ! 276: #define MGE 16 /* >= signed */ ! 277: #define MLE 17 /* <= signed */ ! 278: #define MLT 18 /* < signed */ ! 279: #define MUGT 19 /* > unsigned */ ! 280: #define MUGE 20 /* >= unsigned */ ! 281: #define MULE 21 /* <= unsigned */ ! 282: #define MULT 22 /* < unsigned */ ! 283: ! 284: /* ! 285: * Macros. ! 286: */ ! 287: #define isleaf(x) ((x) < MIOBASE) ! 288: #define isbool(x) (x==ANDAND || x==OROR || x==NOT || (x>=EQ && x<=ULT)) ! 289: #define snap(tp) snaptree((tp), 0) ! 290: #define isrelop(x) ((x)>=EQ && (x)<=ULT) ! 291: #define isurelop(x) ((x)>=UGT && (x)<=ULT) ! 292: #define isncon(x) ((x)<LID) ! 293: #define iscon(x) ((x)<LID || (x)==ADDR) ! 294: #define isconvert(op) ((op)==CONVERT || (op)==CAST) ! 295: #define isrealreg(r) ((r) < NRREG) ! 296: #define binit() (curbusy = regbusy) ! 297: #define islvadr(pflag) ((pflag&(T_ADR|T_LV))==(T_ADR|T_LV)) ! 298: #define isrvadr(pflag) ((pflag&(T_ADR|T_LV))==T_ADR) ! 299: #define isadr(flag) ((flag&T_ADR) != 0) ! 300: #define isofs(flag) ((flag&T_OFS) != 0) ! 301: #define isind(flag) ((flag&T_INDIR) != 0) ! 302: #define ishlvadr(pflag) ((pflag&(T_ADR|T_LV|T_INDIR))==(T_ADR|T_LV)) ! 303: #define isflow(op) (op==NOT || op==ANDAND || op==OROR) ! 304: ! 305: /* ! 306: * These bit packing macros are used ! 307: * to pack the subgoal table used by the ! 308: * leaf insert routines. ! 309: */ ! 310: #define ndown(l,r) (((l)<<5) | (r)) ! 311: #define getri(n) ((n)&037) ! 312: #define getli(n) (((n)>>5)&037) ! 313: ! 314: /* ! 315: * Functions and variables. ! 316: */ ! 317: /* Arrays. */ ! 318: #if !YATC ! 319: extern char file[]; ! 320: extern FLAG flagcache[]; ! 321: extern char fliprel[]; ! 322: extern char *gidcache[]; ! 323: extern SYM *hash1[]; ! 324: extern char id[]; ! 325: extern ival_t ivalcache[]; ! 326: extern int ldtab[]; ! 327: extern lval_t lvalcache[]; ! 328: extern char macros[]; ! 329: extern char module[]; ! 330: #if !TINY ! 331: extern char *namecache[]; ! 332: #endif ! 333: extern unsigned char optab[][3]; ! 334: extern char otherel[]; ! 335: extern PATFLAG patcache[]; ! 336: extern PATX patx[]; ! 337: extern PERTYPE pertype[]; ! 338: extern REGDESC reg[]; ! 339: extern TREE *storelist[]; ! 340: extern TYPESET typecache[]; ! 341: extern char wtype[]; ! 342: ! 343: /* Functions. */ ! 344: extern TREE *alocnode(); ! 345: extern int amd(); ! 346: extern TREE *basenode(); ! 347: extern lval_t constcvt(); ! 348: extern TREE *copynode(); ! 349: extern TREE *findoffs(); ! 350: extern TREE *fold1(); ! 351: extern TREE *foldaddr(); ! 352: extern SYM *gidpool(); ! 353: extern lval_t grabnval(); ! 354: extern TREE *gvalnode(); ! 355: extern TREE *ivalnode(); ! 356: extern TREE *leafnode(); ! 357: extern TREE *leftnode(); ! 358: extern TREE *lvalnode(); ! 359: extern TREE *makenode(); ! 360: extern TREE *modargs(); ! 361: extern TREE *modcall(); ! 362: extern TREE *modefld(); ! 363: extern TREE *modfold(); ! 364: extern TREE *modify(); ! 365: extern TREE *modleaf(); ! 366: extern TREE *modlfld(); ! 367: extern TREE *modmul(); ! 368: extern TREE *modoper(); ! 369: extern TREE *modsasg(); ! 370: extern TREE *modtree(); ! 371: extern TREE *modtruth(); ! 372: extern TREE *modxfun(); ! 373: extern TREE *ripout(); ! 374: extern int snapf(); ! 375: extern TREE *talloc(); ! 376: extern TREE *tempnode(); ! 377: extern TREE *treeget(); ! 378: extern TREE *treeget1(); ! 379: ! 380: /* Variables. */ ! 381: #if !TINY ! 382: extern int mflag; ! 383: extern int oflag; ! 384: extern int sflag; ! 385: #endif ! 386: extern CASES *cases; ! 387: extern PREGSET curbusy; ! 388: extern ival_t curtemp; ! 389: extern PREGSET curxreg; ! 390: extern int labgen; ! 391: extern int line; ! 392: extern ival_t maxauto; ! 393: extern PREGSET maxbusy; ! 394: extern ival_t maxtemp; ! 395: extern int nstorelist; ! 396: extern FILE *ofp; ! 397: #endif ! 398: #if OVERLAID ! 399: extern jmp_buf death; ! 400: #endif ! 401: extern FILE *ifp; ! 402: extern int nerr; ! 403: extern int oldseg; ! 404: extern char *passname; ! 405: ! 406: /* end of h/cc1.h */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.