|
|
1.1 ! root 1: /*ident "@(#)ctrans:src/typ2.c 1.7" */ ! 2: /************************************************************************** ! 3: ! 4: C++ source for cfront, the C++ compiler front-end ! 5: written in the computer science research center of Bell Labs ! 6: ! 7: Copyright (c) 1984 AT&T, Inc. All Rights Reserved ! 8: THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T, INC. ! 9: ! 10: typ2.c: ! 11: ! 12: ***************************************************************************/ ! 13: ! 14: #include "cfront.h" ! 15: #include "size.h" ! 16: ! 17: extern int chars_in_largest; ! 18: int largest_int; ! 19: ! 20: void typ_init() ! 21: { ! 22: chars_in_largest = strlen(LARGEST_INT); ! 23: largest_int = int(str_to_long(LARGEST_INT)); ! 24: ! 25: defa_type = new basetype(INT,0); // note defa_type!=int_type ! 26: int_type = new basetype(INT,0); // but they both represent `int' ! 27: ! 28: PERM(int_type); int_type->defined = DEFINED ; ! 29: PERM(defa_type); defa_type->defined = DEFINED ; ! 30: ! 31: moe_type = new basetype(INT,0); ! 32: PERM(moe_type); moe_type->defined = DEFINED ; ! 33: moe_type->b_const = 1; ! 34: moe_type->check(0); ! 35: ! 36: uint_type = new basetype(INT,0); ! 37: PERM(uint_type); uint_type->defined = DEFINED ; ! 38: uint_type->type_adj(UNSIGNED); ! 39: uint_type->check(0); ! 40: ! 41: long_type = new basetype(LONG,0); ! 42: PERM(long_type); long_type->defined = DEFINED ; ! 43: long_type->check(0); ! 44: ! 45: ulong_type = new basetype(LONG,0); ! 46: PERM(ulong_type); ulong_type->defined = DEFINED ; ! 47: ulong_type->type_adj(UNSIGNED); ! 48: ulong_type->check(0); ! 49: ! 50: short_type = new basetype(SHORT,0); ! 51: PERM(short_type); short_type->defined = DEFINED ; ! 52: short_type->check(0); ! 53: ! 54: ushort_type = new basetype(SHORT,0); ! 55: PERM(ushort_type); ushort_type->defined = DEFINED ; ! 56: ushort_type->type_adj(UNSIGNED); ! 57: ushort_type->check(0); ! 58: ! 59: float_type = new basetype(FLOAT,0); ! 60: PERM(float_type); float_type->defined = DEFINED ; ! 61: ! 62: double_type = new basetype(DOUBLE,0); ! 63: PERM(double_type); double_type->defined = DEFINED ; ! 64: ! 65: ldouble_type = new basetype(LDOUBLE,0); ! 66: PERM(ldouble_type); ldouble_type->defined = DEFINED ; ! 67: ! 68: zero_type = new basetype(ZTYPE,0); ! 69: PERM(zero_type); zero_type->defined = DEFINED ; ! 70: zero->tp = zero_type; ! 71: ! 72: void_type = new basetype(VOID,0); ! 73: PERM(void_type); void_type->defined = DEFINED ; ! 74: ! 75: char_type = new basetype(CHAR,0); ! 76: PERM(char_type); char_type->defined = DEFINED ; ! 77: ! 78: uchar_type = new basetype(CHAR,0); ! 79: PERM(uchar_type); uchar_type->defined = DEFINED ; ! 80: uchar_type->type_adj(UNSIGNED); ! 81: uchar_type->check(0); ! 82: ! 83: Pchar_type = char_type->addrof(); ! 84: PERM(Pchar_type); Pchar_type->defined = DEFINED ; ! 85: ! 86: Pint_type = int_type->addrof(); ! 87: PERM(Pint_type); Pint_type->defined = DEFINED ; ! 88: ! 89: Pvoid_type = void_type->addrof(); ! 90: PERM(Pvoid_type); Pvoid_type->defined = DEFINED ; ! 91: ! 92: Pfctvec_type = new fct(int_type,0,0); // must be last, see basetype::normalize() ! 93: Pfctvec_type = Pfctvec_type->addrof(); ! 94: Pfctvec_type = Pfctvec_type->addrof(); ! 95: PERM(Pfctvec_type); Pfctvec_type->defined = DEFINED ; ! 96: ! 97: gtbl = new table(GTBLSIZE,0,0); ! 98: gtbl->t_name = new name("global"); ! 99: ptbl = new table(CTBLSIZE,0,0); ! 100: ptbl->t_name = new name("ptbl"); ! 101: } ! 102: ! 103: bit enum_promote; ! 104: ! 105: Pbase basetype::arit_conv(Pbase t) ! 106: /* ! 107: perform the "usual arithmetic conversions" C ref Manual 6.6 ! 108: on "this" op "t" ! 109: "this" and "t" are integral or floating ! 110: "t" may be 0 ! 111: */ ! 112: { ! 113: this = (Pbase)skiptypedefs(); ! 114: // error('d', "arit_conv: this: %k %d %t %d", base, base, this, this ); ! 115: ! 116: bit l; ! 117: bit u; ! 118: bit f; ! 119: bit l1 = (base == LONG); ! 120: bit u1 = b_unsigned; ! 121: bit f1 = (base==FLOAT || base==DOUBLE || base==LDOUBLE); ! 122: if (t) { ! 123: t = (Pbase)t->skiptypedefs(); ! 124: // error('d', "arit_conv: t: %k %d %t %d", t->base, t->base, t, t ); ! 125: ! 126: bit l2 = (t->base == LONG); ! 127: bit u2 = t->b_unsigned; ! 128: bit f2 = (t->base==FLOAT || t->base==DOUBLE || base==LDOUBLE); ! 129: l = l1 || l2; ! 130: u = u1 || u2; ! 131: f = f1 || f2; ! 132: } ! 133: else { ! 134: l = l1; ! 135: u = u1; ! 136: f = f1; ! 137: } ! 138: ! 139: if (f) { ! 140: if (base==LDOUBLE || (t && t->base==LDOUBLE)) return ldouble_type; ! 141: if (base==DOUBLE || (t && t->base==DOUBLE)) return double_type; ! 142: return float_type; ! 143: } ! 144: if (l & u) return ulong_type; ! 145: if (l & !u) return long_type; ! 146: if (u) { ! 147: if (base==INT || (t && t->base==INT)) return uint_type; ! 148: if (SZ_SHORT==SZ_INT) // ANSIism ! 149: if (base==SHORT || (t && t->base==SHORT)) return uint_type; ! 150: return int_type; ! 151: } ! 152: ! 153: if (t && t->base == EOBJ && base == EOBJ) enum_promote = 1; ! 154: return int_type; ! 155: } ! 156: ! 157: bit vec_const = 0; ! 158: bit fct_const = 0; ! 159: ! 160: bit type::tconst() ! 161: /* ! 162: is this type a constant ! 163: */ ! 164: { ! 165: Ptype t = this; ! 166: vec_const = 0; ! 167: fct_const = 0; ! 168: //error('d',"tconst %t",t); ! 169: xxx: ! 170: switch (t->base) { ! 171: case TYPE: ! 172: if (Pbase(t)->b_const) return 1; ! 173: t = Pbase(t)->b_name->tp; ! 174: goto xxx; ! 175: case VEC: ! 176: vec_const = 1; ! 177: return 1; ! 178: case PTR: ! 179: case RPTR: ! 180: return Pptr(t)->b_const; ! 181: case FCT: ! 182: case OVERLOAD: ! 183: fct_const = 1; ! 184: return 1; ! 185: default: ! 186: return Pbase(t)->b_const; ! 187: } ! 188: } ! 189: ! 190: TOK type::set_const(bit mode) ! 191: /* ! 192: make someting a constant or variable, return old status ! 193: */ ! 194: { ! 195: Ptype t = this; ! 196: int m; ! 197: xxx: ! 198: switch (t->base) { ! 199: case TYPE: ! 200: m = Pbase(t)->b_const; ! 201: Pbase(t)->b_const = mode; ! 202: t = Pbase(t)->b_name->tp; ! 203: goto xxx; ! 204: case ANY: ! 205: case RPTR: ! 206: case VEC: ! 207: return t->base; // constant by definition ! 208: case PTR: ! 209: m = Pptr(t)->b_const; ! 210: Pptr(t)->b_const = mode; ! 211: return m; ! 212: default: ! 213: m = Pbase(t)->b_const; ! 214: Pbase(t)->b_const = mode; ! 215: return m; ! 216: } ! 217: } ! 218: ! 219: Pptr type::is_ref() ! 220: { ! 221: Ptype t = skiptypedefs(); ! 222: ! 223: switch (t->base) { ! 224: case RPTR: return Pptr(t); ! 225: default: return 0; ! 226: } ! 227: } ! 228: ! 229: Pclass Mptr; ! 230: ! 231: Pptr type::is_ptr() ! 232: { ! 233: Ptype t = skiptypedefs(); ! 234: ! 235: switch (t->base) { ! 236: case PTR: ! 237: case VEC: Mptr = Pptr(t)->memof; ! 238: return Pptr(t); ! 239: default: return 0; ! 240: } ! 241: } ! 242: ! 243: Pptr type::is_ptr_or_ref() ! 244: { ! 245: Ptype t = skiptypedefs(); ! 246: ! 247: switch (t->base) { ! 248: case PTR: ! 249: case RPTR: ! 250: case VEC: Mptr = Pptr(t)->memof; ! 251: return Pptr(t); ! 252: default: return 0; ! 253: } ! 254: } ! 255: ! 256: int type::align() ! 257: { ! 258: Ptype t = skiptypedefs(); ! 259: ! 260: /*fprintf(stderr,"align %d %d\n",t,t->base);*/ ! 261: switch (t->base) { ! 262: case COBJ: return t->bname_type()->align(); ! 263: case VEC: return Pvec(t)->typ->align(); ! 264: case ANY: return 1; ! 265: case CHAR: return AL_CHAR; ! 266: case SHORT: return AL_SHORT; ! 267: case INT: return AL_INT; ! 268: case LONG: return AL_LONG; ! 269: case FLOAT: return AL_FLOAT; ! 270: case DOUBLE: return AL_DOUBLE; ! 271: case LDOUBLE: return AL_LDOUBLE; ! 272: case PTR: ! 273: case RPTR: return AL_WPTR; ! 274: case CLASS: return Pclass(t)->obj_align; ! 275: case ENUM: ! 276: case EOBJ: return AL_INT; ! 277: case VOID: error("illegal use of void"); return AL_INT; ! 278: default: error('i',"(%d,%k)->type::align",t,t->base); ! 279: } ! 280: } ! 281: ! 282: bit fake_sizeof; ! 283: ! 284: int type::tsizeof(int ptmc) ! 285: /* ! 286: the sizeof type operator ! 287: return the size in bytes of the types representation ! 288: */ ! 289: { ! 290: Ptype t = skiptypedefs(); ! 291: ! 292: //error('d',"zx %t %d",t,t->base); ! 293: if (t == 0) error('i',"typ.tsizeof(t==0)"); ! 294: switch (t->base) { ! 295: case COBJ: ! 296: t = t->bname_type(); ! 297: if (t == 0) return 0; // ``fake'' generated classes: _Sdd ! 298: return t->tsizeof(ptmc); ! 299: ! 300: case ANY: return 1; ! 301: case VOID: return 0; ! 302: case ZTYPE: return SZ_WPTR; /* assume pointer */ ! 303: case CHAR: return SZ_CHAR; ! 304: case SHORT: return SZ_SHORT; ! 305: case INT: return SZ_INT; ! 306: case LONG: return SZ_LONG; ! 307: case FLOAT: return SZ_FLOAT; ! 308: case DOUBLE: return SZ_DOUBLE; ! 309: case LDOUBLE: return SZ_LDOUBLE; ! 310: ! 311: case VEC: ! 312: { Pvec v = Pvec(t); ! 313: if (v->size == 0) { ! 314: if (fake_sizeof == 0) error('w',"sizeof array with undeclared dimension"); ! 315: return SZ_WPTR; // vector argument has sizeof ptr ! 316: } ! 317: return v->size * v->typ->tsizeof(); ! 318: } ! 319: case RPTR: ! 320: case PTR: ! 321: { ! 322: int k = (Pptr(t)->memof && !ptmc)?sizeof(short)+sizeof(short):0; ! 323: t = Pptr(t)->typ->skiptypedefs(); ! 324: ! 325: switch (t->base) { ! 326: default: return SZ_WPTR; ! 327: case CHAR: return SZ_BPTR; ! 328: case FCT: return SZ_WPTR+k; ! 329: } ! 330: } ! 331: case FIELD: ! 332: error("sizeof(field)"); ! 333: return Pbase(t)->b_bits/BI_IN_BYTE+1; ! 334: case FCT: ! 335: error("sizeof(function)"); ! 336: return 0; ! 337: ! 338: case CLASS: ! 339: { ! 340: Pclass cl = Pclass(t); ! 341: if ((cl->defined&(DEFINED|SIMPLIFIED)) == 0) { ! 342: error("%tU, size not known",cl); ! 343: return SZ_INT; ! 344: } ! 345: if (cl->c_body == 1) // detect first allocation or sizeof ! 346: cl->dcl_print(0); ! 347: return cl->obj_size; ! 348: } ! 349: ! 350: case EOBJ: ! 351: case ENUM: return SZ_INT; ! 352: ! 353: default: return 0; // deref can be called for any type ! 354: //error('i',"sizeof(%d)",t->base); ! 355: } ! 356: } ! 357: ! 358: bit type::vec_type() ! 359: { ! 360: Ptype t = skiptypedefs(); ! 361: ! 362: switch (t->base) { ! 363: case ANY: ! 364: case VEC: ! 365: case PTR: ! 366: case RPTR: return 1; ! 367: default: return 0; ! 368: } ! 369: } ! 370: ! 371: int ref_initializer; ! 372: ! 373: Ptype type::deref() ! 374: /* index==1: *p ! 375: index==0: p[expr] ! 376: */ ! 377: { ! 378: //error('d',"%t -> deref() refd %d",this,ref_initializer); ! 379: Ptype t = skiptypedefs(); ! 380: ! 381: switch (t->base) { ! 382: case PTR: ! 383: case RPTR: ! 384: case VEC: ! 385: { ! 386: t = Pvec(t)->typ; ! 387: Ptype tt = t->skiptypedefs(); ! 388: if (tt == Pvoid_type) error("void* dereferenced"); ! 389: if (ref_initializer == 0) { ! 390: if (tt->base == COBJ) { ! 391: tt = tt->bname_type(); ! 392: if (tt && Pclass(tt)->defined&(DEFINED|SIMPLIFIED)) ! 393: (void) t->tsizeof(); ! 394: } ! 395: } ! 396: // no break ! 397: } ! 398: case ANY: ! 399: return t; ! 400: default: ! 401: error("nonP dereferenced"); ! 402: return any_type; ! 403: } ! 404: } ! 405: ! 406: Pfct type::memptr() ! 407: // is ``this'' a pointer to member function ! 408: { ! 409: Ptype t = skiptypedefs(); ! 410: if (t->base != PTR || Pptr(t)->memof==0) return 0; ! 411: ! 412: t = Pptr(t)->typ->skiptypedefs(); ! 413: return (t->base == FCT) ? Pfct(t) : 0; ! 414: } ! 415: ! 416: Ptype type::skiptypedefs() ! 417: // starting from ``this'', return first non-typedef ! 418: { ! 419: register Ptype t = this; ! 420: if(t==0) return t; ! 421: while (t->base == TYPE) { ! 422: t = t->bname_type(); ! 423: } ! 424: return t; ! 425: } ! 426: ! 427: Ptype type::skiptypedefs(bit &isconst) ! 428: // starting from ``this'', return first non-typedef ! 429: { ! 430: register Ptype t = this; ! 431: if(t==0) return t; ! 432: while (t->base == TYPE) { ! 433: t = t->bname_type(); ! 434: isconst |= Pbase(t)->b_const; ! 435: } ! 436: return t; ! 437: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.