Annotation of researchv10no/cmd/cfront/ooptcfront/typ2.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.