1: /* 2: * Copyright (c) 1983 Regents of the University of California. 3: * All rights reserved. The Berkeley software License Agreement 4: * specifies the terms and conditions for redistribution. 5: * 6: * @(#)pcc.h 5.1 (Berkeley) 5/30/85 7: */ 8: 9: /* 10: * This file contains definitions for all the constants and structures 11: * needed to use the intermediate code files generated and read by 12: * the Portable C Compiler and related compilers. 13: * 14: * Rules for changing this code: 15: * 1) All op values must be integer constants -- this permits us to run 16: * a 'sed' script on this file to create %term declarations for yacc. 17: * 2) Because the PCC uses fancy ASG and UNARY macros, assignment 18: * operators must have values 1 greater than corresponding normal 19: * operators, and unary operators must have values 2 greater ditto. 20: * 3) Ops used only by f1 must have values >= 150 (PCCF_FORTOPS). 21: * 4) Other language-dependent ops must have values >= 200. 22: */ 23: 24: # ifndef PCC_TOKENS 25: 26: # define PCC_TOKENS 0 27: 28: # define PCC_ERROR 1 /* an error node */ 29: # define PCC_FREE 2 /* an unused node */ 30: 31: /* 32: * Constants. 33: */ 34: # define PCC_STRING 3 /* a string constant */ 35: # define PCC_ICON 4 /* an integer constant */ 36: # define PCC_FCON 5 /* a floating point constant */ 37: # define PCC_DCON 6 /* a double precision f.p. constant */ 38: 39: /* 40: * Leaf types. 41: */ 42: # define PCC_NAME 7 /* an identifier */ 43: # define PCC_REG 8 /* a register */ 44: # define PCC_OREG 9 /* register and offset */ 45: # define PCC_CCODES 10 /* condition codes */ 46: # define PCC_FLD 11 /* a bit field */ 47: 48: /* 49: * Arithmetic operators. 50: */ 51: # define PCC_PLUS 12 /* + */ 52: # define PCC_PLUSEQ 13 /* += */ 53: # define PCC_UPLUS 14 /* unary + (for completeness) */ 54: # define PCC_MINUS 15 /* - */ 55: # define PCC_MINUSEQ 16 /* -= */ 56: # define PCC_UMINUS 17 /* unary - */ 57: # define PCC_MUL 18 /* * */ 58: # define PCC_MULEQ 19 /* *= */ 59: /* Reserve a slot for 'unary *', which is PCC jargon for PCC_DEREF (yech) */ 60: # define PCC_DIV 21 /* / */ 61: # define PCC_DIVEQ 22 /* /= */ 62: # define PCC_MOD 23 /* % */ 63: # define PCC_MODEQ 24 /* %= */ 64: # define PCC_INCR 25 /* ++ */ 65: # define PCC_DECR 26 /* -- */ 66: # define PCC_ASSIGN 27 /* = (these last 3 are stretching it) */ 67: 68: /* 69: * Bit operators. 70: */ 71: # define PCC_AND 28 /* & */ 72: # define PCC_ANDEQ 29 /* &= */ 73: /* Reserve a slot for 'unary &', jargon for PCC_ADDROF */ 74: # define PCC_OR 31 /* | */ 75: # define PCC_OREQ 32 /* |= */ 76: # define PCC_ER 33 /* ^ */ 77: # define PCC_EREQ 34 /* ^= */ 78: # define PCC_LS 35 /* << */ 79: # define PCC_LSEQ 36 /* <<= */ 80: # define PCC_RS 37 /* >> */ 81: # define PCC_RSEQ 38 /* >>= */ 82: # define PCC_COMPL 39 /* ~ */ 83: 84: /* 85: * Booleans. 86: */ 87: # define PCC_EQ 40 /* == */ 88: # define PCC_NE 41 /* != */ 89: # define PCC_LE 42 /* <= */ 90: # define PCC_LT 43 /* < */ 91: # define PCC_GE 44 /* >= */ 92: # define PCC_GT 45 /* > */ 93: # define PCC_ULE 46 /* unsigned <= */ 94: # define PCC_ULT 47 /* unsigned < */ 95: # define PCC_UGE 48 /* unsigned >= */ 96: # define PCC_UGT 49 /* unsigned > */ 97: # define PCC_QUEST 50 /* ? (for conditional expressions) */ 98: # define PCC_COLON 51 /* : (for conditional expressions) */ 99: # define PCC_ANDAND 52 /* && */ 100: # define PCC_OROR 53 /* || */ 101: # define PCC_NOT 54 /* ! */ 102: 103: /* 104: * Function calls. 105: */ 106: # define PCC_CALL 55 /* call by value */ 107: /* no ASG */ 108: # define PCC_UCALL 57 /* call with no arguments */ 109: # define PCC_FORTCALL 58 /* call by reference? */ 110: /* no ASG */ 111: # define PCC_UFORTCALL 60 /* ??? */ 112: # ifdef INLINE 113: # define PCC_INLINE 61 /* inline function */ 114: /* no ASG */ 115: # define PCC_UINLINE 63 /* inline with no arguments */ 116: # endif INLINE 117: 118: /* 119: * Referencing and dereferencing. 120: */ 121: # define PCC_DEREF 20 /* * */ 122: # define PCC_ADDROF 30 /* & */ 123: 124: /* 125: * Special structure operators. 126: */ 127: # define PCC_DOT 64 /* . */ 128: # define PCC_STREF 65 /* -> */ 129: # define PCC_STASG 66 /* structure assignment */ 130: # define PCC_STARG 67 /* an argument of type structure */ 131: # define PCC_STCALL 68 /* a function of type structure */ 132: /* no ASG */ 133: # define PCC_USTCALL 70 /* unary structure function */ 134: 135: /* 136: * Conversions. 137: */ 138: # define PCC_SCONV 71 /* scalar conversion */ 139: # define PCC_PCONV 72 /* pointer conversion */ 140: # define PCC_PMCONV 73 /* pointer multiply conversion */ 141: # define PCC_PVCONV 74 /* pointer divide conversion */ 142: # define PCC_CAST 75 /* redundant? */ 143: 144: /* 145: * Bracket types. 146: */ 147: # define PCC_LB 76 /* [ */ 148: # define PCC_RB 77 /* ] */ 149: 150: /* 151: * Comma nodes. 152: */ 153: # define PCC_COMOP 78 /* , (in expressions) */ 154: # define PCC_CM 79 /* , (in argument lists) */ 155: 156: /* 157: * Miscellaneous. 158: */ 159: # define PCC_FORCE 80 /* result of last expression goes in r0 */ 160: # define PCC_GOTO 81 /* unconditional goto */ 161: # define PCC_CBRANCH 82 /* goto label if !test */ 162: # define PCC_RETURN 83 /* return from function */ 163: # define PCC_INIT 84 /* initialized data */ 164: # define PCC_TYPE 85 /* a type */ 165: # define PCC_CLASS 86 /* a storage class */ 166: 167: # define PCC_MAXOP 86 /* highest numbered PCC op */ 168: 169: /* 170: * Special codes for interfacing to /lib/f1. 171: */ 172: # define PCCF_FORTOPS 150 173: # define PCCF_FTEXT 150 /* pass literal assembler text */ 174: # define PCCF_FEXPR 151 /* a statement */ 175: # define PCCF_FSWITCH 152 /* not implemented */ 176: # define PCCF_FLBRAC 153 /* beginning of subroutine */ 177: # define PCCF_FRBRAC 154 /* end of subroutine */ 178: # define PCCF_FEOF 155 /* end of file */ 179: # define PCCF_FARIF 156 /* not implemented */ 180: # define PCCF_FLABEL 157 /* an f77 label */ 181: 182: # endif PCC_TOKENS 183: 184: 185: /* 186: * Types, as encoded in intermediate file cookies. 187: */ 188: # define PCCT_UNDEF 0 189: # define PCCT_FARG 1 /* function argument */ 190: # define PCCT_CHAR 2 191: # define PCCT_SHORT 3 192: # define PCCT_INT 4 193: # define PCCT_LONG 5 194: # define PCCT_FLOAT 6 195: # define PCCT_DOUBLE 7 196: # define PCCT_STRTY 8 197: # define PCCT_UNIONTY 9 198: # define PCCT_ENUMTY 10 199: # define PCCT_MOETY 11 /* member of enum */ 200: # define PCCT_UCHAR 12 201: # define PCCT_USHORT 13 202: # define PCCT_UNSIGNED 14 203: # define PCCT_ULONG 15 204: 205: /* 206: * Type modifiers. 207: */ 208: # define PCCTM_PTR 020 209: # define PCCTM_FTN 040 210: # define PCCTM_ARY 060 211: # define PCCTM_BASETYPE 017 212: # define PCCTM_TYPESHIFT 2 213: 214: 215: /* 216: * Useful macros. 'PCCOM' macros apply to ops. 217: */ 218: # define PCCOM_ASG 1+ 219: # define PCCOM_UNARY 2+ 220: # define PCCOM_NOASG (-1)+ 221: # define PCCOM_NOUNARY (-2)+ 222: 223: # define PCCM_TRIPLE(op, var, type) \ 224: ((op) | ((var) << 8) | (long) (type) << 16) 225: # define PCCM_TEXT(s) \ 226: PCCM_TRIPLE(PCCF_FTEXT, (strlen(s) + 3) / 4, 0) 227: # define PCCM_ADDTYPE(t, m) \ 228: ((((t) &~ PCCTM_BASETYPE) << PCCTM_TYPESHIFT) | \ 229: (m) | ((t) & PCCTM_BASETYPE))