Annotation of coherent/d/bin/cc/c/n2/dbgt2.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * Debug table management.
        !             3:  */
        !             4: #ifdef vax
        !             5: #include "INC$LIB:cc2.h"
        !             6: #else
        !             7: #include "cc2.h"
        !             8: #endif
        !             9: 
        !            10: #define NDHASH 16
        !            11: #define hash(p) ((((int)(p))>>4)&15)
        !            12: 
        !            13: struct dline {
        !            14:        struct dline *d_dp;     /* List link */
        !            15:        INS *d_ip;              /* Referenced instruction */
        !            16:        int d_nv;               /* Vector size */
        !            17:        int d_dv[];             /* Vector of drefnum numbers */
        !            18: };
        !            19: 
        !            20: struct dline *dhash[NDHASH];   /* Hash table */
        !            21: 
        !            22: struct dline *newdn();
        !            23: struct dline *mrgdlin();
        !            24: struct dline **getdlin();
        !            25: extern int vflag;
        !            26: 
        !            27: /*
        !            28:  * Generate a debug table entry during first pass.
        !            29:  *     level == 0 called from outside a function body.
        !            30:  *     level == 1 called from inside a function body.
        !            31:  *     The label information is invariably copied to output
        !            32:  *     either via outdlab or tcpy.
        !            33:  *     DC_LINE and DC_LAB items are hashed to the current ins node
        !            34:  *     so their ultimate locations can be known.
        !            35:  */
        !            36: gendbgt(level)
        !            37: register int level;
        !            38: {
        !            39:        static int drefnum;
        !            40:        int nline, class;
        !            41: 
        !            42:        /* Read class */
        !            43:        class = bget();
        !            44: 
        !            45:        /* Output the information in some form */
        !            46:        if (isvariant(VASM)) {
        !            47:                bput(DLABEL);
        !            48:                tcpy(class);
        !            49:        } else
        !            50:                outdlab(0, class);
        !            51:        if (class == DC_LINE || class == DC_LAB) {
        !            52:                if (level == 0) {
        !            53:                        if (isvariant(VASM)) {
        !            54:                                bput(DLOCAT);
        !            55:                                iput(drefnum);
        !            56:                        } else
        !            57:                                outdloc(drefnum);
        !            58:                } else
        !            59:                        newdlin(drefnum);
        !            60:        }
        !            61:        drefnum += 1;
        !            62: }
        !            63: 
        !            64: /*
        !            65:  * Enter a new dline item into the initial list.
        !            66:  * dline records are initially stored in a list starting at
        !            67:  * dhash[0].
        !            68:  */
        !            69: newdlin(drefnum)
        !            70: {
        !            71:        register struct dline *dp;
        !            72: 
        !            73:        dp = newdn(1);
        !            74:        dp->d_ip = ins.i_bp;
        !            75:        dp->d_dv[0] = drefnum;
        !            76:        if (dhash[0] == NULL || ins.i_bp != dhash[0]->d_ip) {
        !            77:                dp->d_dp = dhash[0];
        !            78:                dhash[0] = dp;
        !            79:        } else {
        !            80:                dhash[0] = mrgdlin(dp, dhash[0]);
        !            81:        }
        !            82: }
        !            83: 
        !            84: /*
        !            85:  * Merge two dline items into a single item.
        !            86:  * Retain the link's of dp2.
        !            87:  */
        !            88: struct dline *
        !            89: mrgdlin(dp1, dp2)
        !            90: struct dline *dp1, *dp2;
        !            91: {
        !            92:        struct dline *dp;
        !            93:        int nv1, nv2, nv;
        !            94:        register int *ip1, *ip2, *ip;
        !            95: 
        !            96:        nv1 = dp1->d_nv;
        !            97:        nv2 = dp2->d_nv;
        !            98:        nv = nv1 + nv2;
        !            99:        dp = newdn(nv);
        !           100:        dp->d_dp = dp2->d_dp;
        !           101:        dp->d_ip = dp2->d_ip;
        !           102:        ip = dp->d_dv;
        !           103:        ip1 = dp1->d_dv;
        !           104:        ip2 = dp2->d_dv;
        !           105:        while (--nv >= 0) {
        !           106:                if (nv1 == 0) {
        !           107:        cp2:            *ip++ = *ip2++;
        !           108:                        --nv2;
        !           109:                } else if (nv2 == 0) {
        !           110:        cp1:            *ip++ = *ip1++;
        !           111:                        --nv1;
        !           112:                } else if (*ip2 < *ip1) {
        !           113:                        goto cp2;
        !           114:                } else {
        !           115:                        goto cp1;
        !           116:                }
        !           117:        }
        !           118:        free(dp1);
        !           119:        free(dp2);
        !           120:        return (dp);
        !           121: }
        !           122: 
        !           123: /*
        !           124:  * Allocate a dline record for n items.
        !           125:  */
        !           126: struct dline *
        !           127: newdn(n)
        !           128: register int n;
        !           129: {
        !           130:        register struct dline *dp;
        !           131:        register int size;
        !           132: 
        !           133:        size = n * sizeof(int);
        !           134:        size += sizeof(struct dline);
        !           135:        dp = (struct dline *)malloc(size);
        !           136:        if (dp == NULL)
        !           137:                cnomem("newdn");
        !           138:        dp->d_dp = NULL;
        !           139:        dp->d_ip = NULL;
        !           140:        dp->d_nv = n;
        !           141:        return (dp);
        !           142: }
        !           143: 
        !           144: /*
        !           145:  * Advance the ip field of each debug table item
        !           146:  * and enter into hash table based off the ip field.
        !           147:  */
        !           148: fixdbgt()
        !           149: {
        !           150:        register struct dline *dp, *ddp, **dpp;
        !           151:        int     seg = SCODE;
        !           152: 
        !           153:        dp = dhash[0];
        !           154:        dhash[0] = NULL;
        !           155:        while (dp != NULL) {
        !           156:                int     t;
        !           157:                register INS    *ip;
        !           158: 
        !           159:                do {
        !           160:                        ip = dp->d_ip = dp->d_ip->i_fp;
        !           161:                        if ((t=ip->i_type) == ENTER)
        !           162:                                seg = ip->i_seg;
        !           163:                } while (seg!=SCODE
        !           164:                 || t!=PROLOG && t!=EPILOG && t!=CODE && t!=JUMP);
        !           165:                ddp = dp->d_dp;
        !           166:                dp->d_dp = NULL;
        !           167:                dpp = getdlin(ip);
        !           168:                *dpp = *dpp!=NULL ? mrgdlin(dp, *dpp) : dp;
        !           169:                dp = ddp;
        !           170:        }
        !           171: }
        !           172: 
        !           173: /*
        !           174:  * Search dhash for a dp referencing instruction ip.
        !           175:  * Return a pointer to the link to that ip.
        !           176:  */
        !           177: struct dline **
        !           178: getdlin(ip)
        !           179: register INS *ip;
        !           180: {
        !           181:        register struct dline *dp, **dpp;
        !           182: 
        !           183:        dpp = &dhash[hash(ip)];
        !           184:        while ((dp = *dpp) != NULL && dp->d_ip != ip)
        !           185:                dpp = &dp->d_dp;
        !           186:        return (dpp);
        !           187: }
        !           188: 
        !           189: /*
        !           190:  * Merge the debug table entries on ip1, if any, onto ip2.
        !           191:  *     called from within optim loop.
        !           192:  */
        !           193: mrgdbgt(ip1, ip2)
        !           194: INS *ip1, *ip2;
        !           195: {
        !           196:        register struct dline *dp, **dpp1, **dpp2;
        !           197: 
        !           198:        dpp1 = getdlin(ip1);
        !           199:        if ((dp = *dpp1) != NULL) {
        !           200:                *dpp1 = dp->d_dp;
        !           201:                dpp2 = getdlin(ip2);
        !           202:                if (*dpp2 == NULL) {
        !           203:                        dp->d_dp = NULL;
        !           204:                        dp->d_ip = ip2;
        !           205:                        *dpp2 = dp;
        !           206:                } else {
        !           207:                        *dpp2 = mrgdlin(dp, *dpp2);
        !           208:                }
        !           209:        }
        !           210: }
        !           211: 
        !           212: /*
        !           213:  * Assemble the debug table entries associated with ip1.
        !           214:  *     called from assembler loop.
        !           215:  */
        !           216: asmdbgt(ip1)
        !           217: INS *ip1;
        !           218: {
        !           219:        register struct dline *dp, **dpp;
        !           220:        register int *ip;
        !           221: 
        !           222:        dpp = getdlin(ip1);
        !           223:        if ((dp = *dpp) != NULL) {
        !           224:                ip = dp->d_dv;
        !           225:                while (--dp->d_nv >= 0) {
        !           226:                        if (isvariant(VASM)) {
        !           227:                                bput(DLOCAT);
        !           228:                                iput(ip[0]);
        !           229:                        } else {
        !           230:                                outdloc(ip[0]);
        !           231:                        }
        !           232:                        ip += 1;
        !           233:                }
        !           234:                *dpp = dp->d_dp;
        !           235:                free(dp);
        !           236:        }
        !           237: }
        !           238: 
        !           239: #if !TINY
        !           240: /*
        !           241:  * Compiler debugging printout.
        !           242:  */
        !           243: dprint(ip)
        !           244: INS *ip;
        !           245: {
        !           246:        ddprint(*getdlin(ip));
        !           247: }
        !           248: 
        !           249: 
        !           250: ddprint(dp)
        !           251: register struct dline *dp;
        !           252: {
        !           253:        register int *vp;
        !           254:        register int nv;
        !           255: 
        !           256:        if (dp != NULL) {
        !           257:                vp = dp->d_dv;
        !           258:                nv = dp->d_nv;
        !           259:                while (--nv >= 0) {
        !           260:                        printf(" %d", *vp++);
        !           261:                }
        !           262:                printf("\n");
        !           263:        }
        !           264: }
        !           265: #endif

unix.superglobalmegacorp.com

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