Annotation of coherent/d/bin/cc/c/n0/dbgt0.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * cc0 - debug table and symbol table type information output.
                      3:  * all intermediate file items are of format:
                      4:  * DLABEL, class, lineno, name, optional value, type.
                      5:  */
                      6: #ifndef __LINE__
                      7: #define __LINE__ 0
                      8: #endif
                      9: #ifdef vax
                     10: #include "INC$LIB:cc0.h"
                     11: #else
                     12: #include "cc0.h"
                     13: #endif
                     14: 
                     15: /*
                     16:  * Called from cc0.c/main() for the original source file name.
                     17:  *
                     18:  * The compiler passes source filename information to the output
                     19:  * writer as DC_FILE debug records.  The output writer will
                     20:  * nest file name records, but csd is not prepared to deal with
                     21:  * nested source files so we mark all included source as part
                     22:  * of the line which included it.
                     23:  */
                     24: dbfname(f)
                     25: char *f;
                     26: {
                     27:        if (notvariant(VDEBUG) && notvariant(VLINES))
                     28:                return;
                     29:        bput(DLABEL);
                     30:        bput(DC_FILE);
                     31:        iput((ival_t) line);
                     32:        sput(f);
                     33:        bput(DT_NONE);
                     34:        zput((sizeof_t) 0);
                     35: }
                     36: 
                     37: /*
                     38:  * Called from stat.c/statement() at entry, LBRACE, and RBRACE.
                     39:  * Also in cc0.c/xfunc() for declaration brackets.
                     40:  */
                     41: dbstat(s, line)
                     42: int s;
                     43: int line;
                     44: {
                     45:        register int mys;
                     46: 
                     47:        if (line == 0 || (notvariant(VDEBUG) && notvariant(VLINES))
                     48:         || s==CASE || s==DEFAULT || (s==ID && spnextis(':'))) {
                     49:                return;
                     50:        } else if (s==LBRACE) {
                     51:                mys = '{';
                     52:        } else if (s==RBRACE) {
                     53:                mys = '}';
                     54:        } else {
                     55:                mys = ';';
                     56:                if (notvariant(VLINES))
                     57:                        return;
                     58:        }
                     59:        bput(DLABEL);
                     60:        bput(DC_LINE);
                     61:        iput((ival_t) (istackp<istack+NLEV ? istack[NLEV-1].i_line : line));
                     62:        bput(mys);
                     63:        bput(0);
                     64:        bput(DT_NONE);
                     65:        zput((sizeof_t) 0);
                     66: }
                     67: 
                     68: /*
                     69:  * Output a label identifier.
                     70:  * These work like line number records in cc2
                     71:  * so that the exact label number assigned is
                     72:  * irrelevant.
                     73:  */
                     74: dblabel(sp) SYM *sp;
                     75: {
                     76:        if (notvariant(VDEBUG))
                     77:                return;
                     78:        dbdecl(sp);
                     79: }
                     80: 
                     81: /*
                     82:  * Called directly for external and static declaration.
                     83:  * Arg lists are driven by dbargs(),
                     84:  * locals are filtered by dblocal(),
                     85:  * extrefs, typedefs, structs, unions and enums are driven by dblevel().
                     86:  */
                     87: dbdecl(sp) SYM *sp;
                     88: {
                     89:        if (notvariant(VDEBUG) && (notvariant(VTYPES) || sp->s_class==C_SEX))
                     90:                return;
                     91:        if (sp->s_seg==SALIEN)
                     92:                return;
                     93:        bput(DLABEL);
                     94:        dbpr(sp);
                     95: }
                     96: 
                     97: /*
                     98:  * Put out the parameters to a function.
                     99:  */
                    100: dbargs()
                    101: {
                    102:        register int i;
                    103:        register SYM *sp;
                    104: 
                    105:        if (notvariant(VDEBUG))
                    106:                return;
                    107:        for (i = 0; i < nargs; i += 1) {
                    108:                sp = args[i];
                    109:                if (sp->s_class == C_REG) {
                    110:                        sp->s_class = C_PREG;
                    111:                        dbdecl(sp);
                    112:                        sp->s_class = C_REG;
                    113:                } else
                    114:                        dbdecl(sp);
                    115:        }
                    116: }
                    117: 
                    118: /*
                    119:  * Output a local symbol declaration.
                    120:  * Forget about references.
                    121:  */
                    122: dblocal(sp) SYM *sp;
                    123: {
                    124:        register int class;
                    125: 
                    126:        if (notvariant(VDEBUG))
                    127:                return;
                    128:        class = sp->s_class;
                    129:        if (class!=C_GREF
                    130:         && class!=C_GDEF
                    131:         && class!=C_SEX
                    132:         && class!=C_CXT
                    133:         && class!=C_TYPE)
                    134:                dbdecl(sp);
                    135: }
                    136: 
                    137: /*
                    138:  * Output any debug information at the current lexical
                    139:  * level -- this will generally be typedef/struct/union/enum
                    140:  * definitions, and when llex is < LL_EXT the external
                    141:  * references which have been used.
                    142:  */
                    143: dbdown()
                    144: {
                    145:        register SYM *tsp;
                    146:        register int c;
                    147:        register TOK *tp;
                    148:        register int i;
                    149:        int changes;
                    150: 
                    151:        if (notvariant(VDEBUG) && notvariant(VTYPES))
                    152:                return;
                    153:        /* External references */
                    154:        if (llex < LL_EXT) {
                    155:                for (i=0; i < NHASH; i+=1)
                    156:                for (tp = hash0[i]; tp != NULL; tp = tp->t_tp) {
                    157:                        for (tsp = tp->t_sym; tsp != NULL; tsp = tsp->s_sp) {
                    158:                                if (tsp->s_slevel < SL_VAR)
                    159:                                        continue;
                    160:                                c = tsp->s_class;
                    161:                                if ((tsp->s_flag&S_USED) != 0
                    162:                                 && (c==C_GREF || c==C_CXT))
                    163:                                        dbdecl(tsp);
                    164:                        }
                    165:                }
                    166:        }
                    167:        /* Type definitions */
                    168:        do {
                    169:                changes = 0;
                    170:                for (i=0; i < NHASH; i+=1)
                    171:                for (tp = hash0[i]; tp != NULL; tp = tp->t_tp) {
                    172:                        for (tsp = tp->t_sym; tsp != NULL; tsp = tsp->s_sp) {
                    173:                                if (tsp->s_slevel < SL_VAR)
                    174:                                        continue;
                    175:                                if (tsp->s_level <= llex)
                    176:                                        continue;
                    177:                                c = tsp->s_class;
                    178:                                if (istype(c)
                    179:                                 && (tsp->s_flag&S_USED) != 0
                    180:                                 && (tsp->s_flag&S_SYMB) == 0) {
                    181:                                        tsp->s_flag |= S_SYMB;
                    182:                                        changes += 1;
                    183:                                        dbdecl(tsp);
                    184:                                }
                    185:                        }
                    186:                }
                    187:        } while (changes);
                    188: }
                    189: 
                    190: /*
                    191:  * Given a symbol, see if typedef or tagged type is defined for it.
                    192:  */
                    193: static
                    194: SYM *
                    195: findtype(sp)
                    196: register SYM *sp;
                    197: {
                    198:        register int i;
                    199: 
                    200:        i = sp->s_type;
                    201:        if (i==T_FSTRUCT || i==T_FUNION || i==T_FENUM)
                    202:                return (sp->s_ip);
                    203:        if (i!=T_STRUCT && i!=T_UNION && i!=T_ENUM)
                    204:                return (NULL);
                    205:        return (taglookup(sp->s_ip));
                    206: }
                    207: 
                    208: /*
                    209:  * Write a symbol entry in intermediate format.
                    210:  */
                    211: 
                    212: static char tmap[] = {
                    213:        DT_NONE,
                    214:        DT_CHAR,
                    215:        DT_UCHAR,
                    216:        DT_SHORT,
                    217:        DT_USHORT,
                    218:        DT_INT,
                    219:        DT_UINT,
                    220:        -1,             /* T_PTR */
                    221:        DT_LONG,
                    222:        DT_ULONG,
                    223:        DT_FLOAT,
                    224:        DT_DOUBLE,
                    225:        DT_VOID,
                    226:        DT_STRUCT,
                    227:        DT_STRUCT,      /* T_FSTRUCT */
                    228:        DT_UNION,
                    229:        DT_UNION,       /* T_FUNION */
                    230:        DT_ENUM,
                    231:        DT_ENUM         /* T_FENUM */
                    232: };
                    233: 
                    234: static char dmap[] = {
                    235:        DD_PTR,
                    236:        DD_FUNC,
                    237:        DD_ARRAY,
                    238:        -1              /* D_MOSAR */
                    239: };
                    240: 
                    241: static char cmap[] = {
                    242:        -1,             /* C_NONE */
                    243:        DC_AUTO,
                    244:        DC_SIN,
                    245:        DC_SEX,
                    246:        DC_GDEF,
                    247:        DC_GREF,
                    248:        -1,             /* C_ARG */
                    249:        DC_GREF,        /* C_CXT */
                    250:        DC_LAB,
                    251:        -1,             /* C_FREF */
                    252:        -1,             /* C_KEY */
                    253:        DC_TYPE,
                    254:        DC_REG,
                    255:        DC_STAG,
                    256:        DC_UTAG,
                    257:        DC_ETAG,
                    258:        DC_MOS,
                    259:        DC_MOU,
                    260:        DC_MOE,
                    261:        DC_PAUTO,
                    262:        DC_PREG
                    263: };
                    264: 
                    265: dbpr(sp) register SYM *sp;
                    266: {
                    267:        register int n;
                    268:        int t;
                    269: 
                    270:        /* Identify class-segment */
                    271:        if ((n = cmap[sp->s_class]) < 0)
                    272:                dfatal(__LINE__);
                    273:        bput(n);
                    274: 
                    275:        /* Put line number */
                    276:        if (istackp < istack+NLEV)
                    277:                iput((ival_t) istack[NLEV-1].i_line);
                    278:        else
                    279:                iput((ival_t) sp->s_dline);
                    280: 
                    281:        /* Identify value */
                    282:        if (n < DC_AUTO) {
                    283:                ;       /* No value */
                    284:        } else if (n < DC_MOS) {
                    285:                iput((ival_t) sp->s_value);
                    286:        } else {
                    287:                bput(sp->s_width);
                    288:                bput(sp->s_offset);
                    289:                iput((ival_t) sp->s_value);
                    290:        }
                    291: 
                    292:        /* Identify symbol */
                    293:        if (n < DC_TYPE)        /* Global */
                    294:                nput(sp->s_id);
                    295:        else if (n < DC_FILE)   /* Type name */
                    296:                sput(sp->s_id);
                    297:        else                    /* Local */
                    298:                sput(sp->s_id);
                    299: 
                    300:        /* Get a real type name */
                    301:        if ((t = sp->s_type) == T_NONE) {
                    302:                switch (sp->s_class) {
                    303:                case C_STAG: t = T_STRUCT; break;
                    304:                case C_UTAG: t = T_UNION; break;
                    305:                case C_ETAG: t = T_ENUM; break;
                    306:                case C_MOE:
                    307:                case C_LAB: t = T_NONE; break;
                    308:                default: dfatal(__LINE__); break;
                    309:                }
                    310:        }
                    311: 
                    312:        /* Generate dimension string */
                    313:        if (notvariant(VTYPES)) {
                    314:                bput(DT_NONE);
                    315:                zput((sizeof_t)0);
                    316:        } else {
                    317:                register DIM *dp;
                    318:        
                    319:                for (dp = sp->s_dp; dp != NULL; dp = dp->d_dp) {
                    320:                        if ((n = dmap[dp->d_type]) < 0)
                    321:                                dfatal(__LINE__);
                    322:                        bput(n);
                    323:                        zput(tidsize(t, sp->s_ip, dp, 0));
                    324:                }
                    325: 
                    326:                /* Generate type string */
                    327:                if ((n = tmap[t]) < 0)
                    328:                        dfatal(__LINE__);
                    329:                bput(n);
                    330:                zput(tidsize(t, sp->s_ip, dp, 0));
                    331: 
                    332:                /* Generate tag string */
                    333:                if (n==DT_STRUCT || n==DT_UNION || n==DT_ENUM)
                    334:                        dbinfo(sp);
                    335:        }
                    336: }
                    337: 
                    338: static dbinfo(sp) SYM *sp;
                    339: {
                    340:        register INFO *ip;
                    341:        register SYM **ssp;
                    342:        register int i;
                    343: 
                    344:        if ((ip = sp->s_ip) == NULL)
                    345:                dfatal(__LINE__);
                    346:        if ( ! istag(sp->s_class) && (sp = findtype(sp)) != NULL) {
                    347:                sp->s_flag |= S_USED;
                    348:                bput(DX_NAME);
                    349:                zput((sizeof_t)0);
                    350:                sput(sp->s_id);
                    351:                return;
                    352:        }
                    353: 
                    354:        i = ip->i_nsp;
                    355:        ssp = ip->i_sp;
                    356:        bput(DX_MEMBS);
                    357:        zput((sizeof_t)i);
                    358:        while (--i >= 0) dbpr(*ssp++);
                    359:        return;
                    360: }
                    361: 
                    362: dfatal(line)
                    363: {
                    364:        cbotch("bad value in debug on line %d", line);
                    365: }

unix.superglobalmegacorp.com

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