Annotation of coherent/b/bin/c/n0/ddecl.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * n0/ddecl.c
                      3:  * The routines in this file deal with the declaration of names.
                      4:  * The declaration stuff is done here; the parsing is done elsewhere.
                      5:  */
                      6: 
                      7: #ifdef   vax
                      8: #include "INC$LIB:cc0.h"
                      9: #else
                     10: #include "cc0.h"
                     11: #endif
                     12: 
                     13: /*
                     14:  * This array maps function and parameter types
                     15:  * into their defined interface types.
                     16:  * fixtype() below knows about this table;
                     17:  * if it changes, fixtype() might change too.
                     18:  */
                     19: static char xtype[] = {
                     20:        T_NONE,                         /* T_NONE               */
                     21:        T_INT,          T_UINT,         /* T_CHAR    T_UCHAR    */
                     22:        T_INT,          T_UINT,         /* T_SHORT   T_USHORT   */
                     23:        T_INT,          T_UINT,         /* T_INT     T_UINT     */
                     24:        T_PTR,                          /* T_PTR                */
                     25:        T_LONG,         T_ULONG,        /* T_LONG    T_ULONG    */
                     26:        T_DOUBLE,       T_DOUBLE,       /* T_FLOAT   T_DOUBLE   */
                     27:        T_VOID,                         /* T_VOID               */
                     28:        T_STRUCT,       T_FSTRUCT,      /* T_STRUCT  T_FSTRUCT  */
                     29:        T_UNION,        T_FUNION,       /* T_UNION   T_FUNION   */
                     30:        T_INT,          T_INT           /* T_ENUM    T_FENUM    */
                     31: };
                     32: 
                     33: /*
                     34:  * Declare a variable 'sp' with class 'c', type 't' and structure info 'ip'.
                     35:  * Many checks are made here for redeclarations and funny things.
                     36:  * For objects of class 'C_MOE', 'x1' is the enumeration value.
                     37:  * For objects of class 'C_MOS' and 'C_MOU',
                     38:  * 'x1' is the field width in bits and 'x2' is the long offset in bits.
                     39:  * 'ronlyf' passes both 'readonly' and 'alien' modifiers.
                     40:  */
                     41: SYM *
                     42: declare(sp, c, t, ndp, ip, ronlyf, x1, x2)
                     43: register SYM   *sp;
                     44: DIM            *ndp;
                     45: INFO           *ip;
                     46: unsigned long  x2;
                     47: {
                     48:        register DIM    *dp, *xdp;
                     49:        int             af, ff, rf, ft, oc, ot;
                     50:        unsigned long   value;
                     51:        unsigned        offs;
                     52: 
                     53:        /*
                     54:         * Demote some function definitions to references.
                     55:         * Adjust the return type of functions returning char, short or float.
                     56:         * If the s_level is wrong, due to missing "extern", check
                     57:         * for redeclaration.
                     58:         */
                     59:        if (ndp!=NULL && ndp->d_type==D_FUNC) {
                     60:                if (c==C_AUTO || c==C_PAUTO || c==C_SIN
                     61:                || ((c==C_GDEF || c==C_SEX) && (s==SEMI || s==COMMA)))
                     62:                        c = C_GREF;
                     63:                if (ndp->d_dp==NULL && ((ronlyf&S_ALIEN)==0 || t==T_FLOAT))
                     64:                        t = fixtype(t, sp, "function");
                     65:                if (sp->s_level > LL_EXT)
                     66:                        sp = fixlevel(sp);
                     67:        }
                     68:        /*
                     69:         * Make certain that the declarator is not
                     70:         * forbidden by the semantics of C. The declaration
                     71:         * reader allows anything that exhibits correct
                     72:         * syntax through.
                     73:         */
                     74:        if (c!=C_TYPE && t==T_VOID && !isfunction(ndp)) {
                     75:                cerror("illegal use of \"void\" type");
                     76:                t = T_INT;
                     77:        }
                     78:        af = ff = rf = 0;
                     79:        for (dp=ndp; dp!=NULL; dp=dp->d_dp) {
                     80:                switch (dp->d_type) {
                     81: 
                     82:                case D_ARRAY:
                     83:                        if (ff != 0)
                     84:                                cerror("function cannot return an array");
                     85:                        if ((xdp = dp->d_dp) != NULL    /* [10][] */
                     86:                        &&   xdp->d_type == D_ARRAY
                     87:                        &&   xdp->d_bound == 0)
                     88:                                cerror("bad flexible array declaration");
                     89:                        af = 1;
                     90:                        ff = 0;
                     91:                        break;
                     92: 
                     93:                case D_FUNC:
                     94:                        if (ff != 0)
                     95:                                cerror("function cannot return a function");
                     96:                        else if (af != 0)
                     97:                                cerror("cannot declare array of functions");
                     98:                        af = 0;
                     99:                        ff = 1;
                    100:                        break;
                    101: 
                    102:                case D_PTR:
                    103:                        af = ff = 0;
                    104:                }
                    105:        }
                    106:        if (ff!=0 && istruct(t))
                    107:                notbook();
                    108:        /* If MOS or MOU is T_ENUM, adjust its type to enum base type. */
                    109:        if (ismemb(c) && t == T_ENUM)
                    110:                t = ip->i_type;
                    111:        /*
                    112:         * Check for redeclarations.
                    113:         * If the old is "C_ARG" (a function parameter),
                    114:         * then just about any combination is ok.
                    115:         * The types are adjusted in consideration of the passing rules.
                    116:         * Other redeclarations are typechecked.
                    117:         */
                    118:        ot = sp->s_type;
                    119:        oc = sp->s_class;
                    120:        if (oc == C_ARG) {
                    121:                dp = ndp;
                    122:                if (dp == NULL || isfunction(dp)) {
                    123:                        t = fixtype(t, sp, "parameter");
                    124:                        if (istruct(t))
                    125:                                notbook();
                    126:                } else if (dp->d_type == D_ARRAY) {
                    127:                        dp->d_type = D_PTR;
                    128:                        dp->d_bound = 0;
                    129:                } else if (dp->d_type != D_PTR)
                    130:                        cerror("functions cannot be parameters");
                    131:        } else if (c==C_PAUTO || c==C_PREG) {
                    132:                cerror("identifier \"%s\" is not a parameter", sp->s_id);
                    133:                c = C_AUTO;
                    134:        } else if ((c==C_AUTO || c==C_REG)
                    135:         && ndp!=NULL && ndp->d_type==D_ARRAY && ndp->d_bound==0) {
                    136:                cerror("cannot declare flexible automatic array");
                    137:        } else if (ot!=T_NONE && ot!=t && !ismemb(oc)) {
                    138:                ++rf;
                    139:        } else if (oc == C_CXT) {
                    140:                if (ndp == NULL || ndp->d_type != D_FUNC || ronlyf != 0)
                    141:                        ++rf;
                    142:        } else if (oc==C_MOE && c==C_MOE) {
                    143:                if (sp->s_value != x1)
                    144:                        ++rf;
                    145:        } else if (ismemb(oc) && ismemb(c)) {
                    146:                ft = (x1 != 0) ? faligntype(t) : 1;
                    147:                offs = x2 % (NBPBYTE * ft);
                    148:                value = x2 / NBPBYTE;
                    149:                if (doalign(t) && x1 != 0 && (value&1) != 0) {
                    150:                        --value;
                    151:                        offs += 8;
                    152:                }
                    153:                if (x1 != sp->s_width
                    154:                 || value != sp->s_value
                    155:                 || offs != sp->s_offset)
                    156:                        ++rf;
                    157:        } else if (isdefn(oc) && isdefn(c)) {
                    158:                if (oc!=C_GREF && c!=C_GREF)
                    159:                        ++rf;
                    160:                else if (c == C_GREF)
                    161:                        c = oc;
                    162:        } else if (oc != C_NONE)
                    163:                ++rf;
                    164:        if (oc != C_NONE && (sp->s_flag&ronlyf) != ronlyf)
                    165:                ++rf;
                    166:        sp->s_class = c;
                    167:        sp->s_type  = t;
                    168:        dropdim(sp->s_dp);
                    169:        sp->s_dp = ndp;
                    170:        sp->s_dline = line;
                    171:        sp->s_flag |= ronlyf;
                    172:        if ((ronlyf&S_ALIEN) != 0) {
                    173:                if ( ! isdefn(c) || ndp==NULL || ndp->d_type!=D_FUNC)
                    174:                        cerror("inappropriate \"alien\" modifier");
                    175:                sp->s_seg = SALIEN;
                    176:        }
                    177:        if (istag(oc) || ot==T_STRUCT || ot==T_UNION || ot==T_ENUM) {
                    178:                dropinfo(sp->s_ip);
                    179:                sp->s_ip = NULL;
                    180:        }
                    181:        if (istag(c) || t>T_DOUBLE) {
                    182:                sp->s_ip = ip;
                    183:                if (istag(c) || t==T_STRUCT || t==T_UNION || t==T_ENUM)
                    184:                        ++ip->i_refc;
                    185:        }
                    186:        if (istag(c))
                    187:                backplug(sp);
                    188:        if (c == C_MOE) 
                    189:                sp->s_value = x1;
                    190:        if (ismemb(c)) {
                    191:                ft = (x1 != 0) ? faligntype(t) : 1;
                    192:                offs = x2 % (NBPBYTE * ft);
                    193:                value = (x2-offs) / NBPBYTE;
                    194:                if (doalign(t) && x1 != 0 && (value&1) != 0) {
                    195:                        --value;
                    196:                        offs += 8;
                    197:                }
                    198:                if (value > MAXMEMB)
                    199:                        cerror("member \"%s\" is not addressable", sp->s_id);
                    200:                sp->s_width  = x1;
                    201:                sp->s_value  = value;
                    202:                sp->s_offset = offs;
                    203:        }
                    204:        if (rf != 0)
                    205:                cerror("identifier \"%s\" is being redeclared", sp->s_id);
                    206:        return sp;
                    207: }
                    208: 
                    209: /*
                    210:  * Decrement reference count of a
                    211:  * structure info. block.
                    212:  * Free it if the block is now an
                    213:  * unreferenced one.
                    214:  */
                    215: dropinfo(ip)
                    216: register INFO  *ip;
                    217: {
                    218:        if (ip!=NULL && --ip->i_refc==0)
                    219:                free((char *) ip);
                    220: }
                    221: 
                    222: /*
                    223:  * Test if a storage class is a global storage class.
                    224:  */
                    225: int
                    226: isdefn(c) register int c;
                    227: {
                    228:        return (c==C_GDEF || c==C_GREF || c==C_SEX || c==C_SIN);
                    229: }
                    230: 
                    231: /*
                    232:  * Test if a type is one of the structure-like types.
                    233:  */
                    234: int
                    235: istruct(t) register int t;
                    236: {
                    237:        return (t>=T_STRUCT && t<=T_FUNION);
                    238: }
                    239: 
                    240: /*
                    241:  * Test for tag classes.
                    242:  */
                    243: int
                    244: istag(c) register int c;
                    245: {
                    246:        return (c==C_STAG || c==C_UTAG || c==C_ETAG);
                    247: }
                    248: 
                    249: /*
                    250:  * Test for one of the type definition classes.
                    251:  */
                    252: int
                    253: istype(c) register int c;
                    254: {
                    255:        return (c==C_STAG || c==C_UTAG || c==C_ETAG || c==C_TYPE);
                    256: }
                    257: 
                    258: /*
                    259:  * Test for member classes.
                    260:  */
                    261: int
                    262: ismemb(c) register int c;
                    263: {
                    264:        return (c==C_MOS || c==C_MOU);
                    265: }
                    266: 
                    267: /*
                    268:  * Examine a "DIM" chain to see if it describes a function.
                    269:  */
                    270: isfunction(dp) register DIM *dp;
                    271: {
                    272:        register int n;
                    273: 
                    274:        for (n = 0; dp!=NULL; dp = dp->d_dp)
                    275:                n = (dp->d_type == D_FUNC);
                    276:        return n;
                    277: }
                    278: 
                    279: /*
                    280:  * Given a type t, return the adjusted type xtype[t].
                    281:  * Issue a "type adjusted" warning for dangerous cases.
                    282:  * This does not determine "dangerous" rigorously,
                    283:  * rather it uses facts about the values in xtype[] above;
                    284:  * the only cases in which xtype[t]!=t are
                    285:  * char->int, uchar->uint, short->int, ushort->uint, float->double.
                    286:  */
                    287: fixtype(t, sp, s)
                    288: register int t;
                    289: SYM *sp;
                    290: char *s;
                    291: {
                    292:        register int xt;
                    293:        char *ntype;
                    294: 
                    295:        xt = xtype[t];
                    296:        if (xt != t && mysizes[xt] != mysizes[t]) {
                    297:                switch(xt) {
                    298:                case T_INT:
                    299:                        ntype = "int";
                    300:                        break;
                    301:                case T_UINT:
                    302:                        ntype = "unsigned int";
                    303:                        break;
                    304:                case T_DOUBLE:
                    305:                        ntype = "double";
                    306:                        break;
                    307:                }
                    308:                if (isvariant(VWIDEN))
                    309:                cwarn("type of %s \"%s\" adjusted to %s", s, sp->s_id, ntype);
                    310:        }
                    311:        return xt;
                    312: }
                    313: 
                    314: /* end of n0/ddecl.c */

unix.superglobalmegacorp.com

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