Annotation of researchv10no/cmd/ccom/vax/debug.c, revision 1.1

1.1     ! root        1: # include "mfile1.h"
        !             2: # include "debug.h"
        !             3: 
        !             4: /*     File where debugging information is collected and printed out */
        !             5: 
        !             6: /*     This file is for pi, mostly */
        !             7: 
        !             8: int gdebug, slineno;
        !             9: extern int Oflag;
        !            10: 
        !            11: #define SYMTAB struct symtab
        !            12: 
        !            13: /* (year-80) month day(in dec), as 4 hexits */
        !            14: 
        !            15: static vernum = 0x4501;
        !            16: 
        !            17: static char verstr[] = "vaxpcc2";
        !            18: 
        !            19: static char strvalfmt[] = "    .stabs  \"%s\",0x%x,0,%d,%d\n";
        !            20: 
        !            21: static char strsymfmt[] = "    .stabs  \"%s\",0x%x,0,%d,%s\n";
        !            22: 
        !            23: static char nulvalfmt[] = "    .stabn  0x%x,0,%d,%d\n";
        !            24: 
        !            25: static char nulsymfmt[] = "    .stabn  0x%x,0,%d,%s\n";
        !            26: 
        !            27: static char dotfmt[]   = "     .stabd  0x%x,0,%d\n";
        !            28: 
        !            29: static char labstr[16];
        !            30: 
        !            31: static char *
        !            32: maklab(val)
        !            33: {
        !            34:        sprintx(labstr, LABFMT, val);
        !            35:        return labstr;
        !            36: }
        !            37: 
        !            38: static
        !            39: wasused( p )
        !            40: register SYMTAB *p; 
        !            41: {
        !            42:        register i;
        !            43: 
        !            44:        switch( p->sclass ) {
        !            45:        case STNAME:
        !            46:        case UNAME:
        !            47:        case ENAME:
        !            48:                for (i = dimtab[p->sizoff+1]; i >= 0 && dimtab[i] >= 0; i++)
        !            49:                        if (wasused( &stab[dimtab[i]] ))
        !            50:                                return 1;
        !            51:                return 0;
        !            52:        default:
        !            53:                return p->suse < 0;
        !            54:        }
        !            55: }
        !            56: 
        !            57: dbnargs( n )   /* number of argument bytes in call to a function */
        !            58: {
        !            59:        if (gdebug)
        !            60:                printx(dotfmt, N_NARGS, n/SZCHAR );
        !            61: }
        !            62: 
        !            63: dbfunbeg( p )  /* beginning of a function */
        !            64: SYMTAB *p;
        !            65: {
        !            66:        dbfile(exname(p->sname));
        !            67:        printx(strsymfmt, p->sname, N_BFUN, lineno, exname(p->sname));
        !            68:        ppstab(p);
        !            69: }
        !            70: 
        !            71: dbfunarg( p )  /* called for each argument of a function */
        !            72: SYMTAB *p; 
        !            73: {
        !            74:        ppstab( p );            /* we can pick up the reg later */
        !            75: }
        !            76: 
        !            77: dbfunret()     /* return from a function */
        !            78: {
        !            79:        if (gdebug) {
        !            80:                dbfile(NULL);
        !            81:                printx(dotfmt, N_RFUN, slineno ? slineno : lineno );
        !            82:                slineno = 0;
        !            83:        }
        !            84: }
        !            85: 
        !            86: dbfunend( lab )        /* end of a function */
        !            87: {
        !            88:        register SYMTAB *p = &stab[curftn];
        !            89: 
        !            90:        printx("%s:", maklab(lab));
        !            91:        dbfile(labstr);
        !            92:        if(gdebug)
        !            93:                printx(strsymfmt, p->sname, N_EFUN, lineno, labstr);
        !            94: }      
        !            95: 
        !            96: dblbrac()      /* block level when a { is seen */
        !            97: {
        !            98:        if (gdebug)
        !            99:                printx(dotfmt, N_LBRAC, blevel);
        !           100: }
        !           101: 
        !           102: dbrbrac()      /* block level when a } is seen */
        !           103: {
        !           104:        if (gdebug)
        !           105:                printx(dotfmt, N_RBRAC, blevel);
        !           106: }
        !           107: 
        !           108: aobeg()        /* called before printing out the autos */
        !           109: {
        !           110: }
        !           111: 
        !           112: aocode(p)
        !           113: register struct symtab *p; 
        !           114: {
        !           115:        /* called when automatic p removed from stab */
        !           116: 
        !           117:        switch( p->sclass ) {
        !           118:        case REGISTER:
        !           119:        case AUTO:
        !           120:        case STATIC:
        !           121:        case EXTDEF:
        !           122:        case STNAME:
        !           123:        case UNAME:
        !           124:        case ENAME:
        !           125:                if(!ISFTN(p->stype) && (gdebug || wasused(p)))
        !           126:                        ppstab( p );
        !           127:                return;
        !           128:        case EXTERN:
        !           129:                /*      for now, do not report externs  */
        !           130:                return;
        !           131:        }
        !           132: }
        !           133: 
        !           134: aoend()
        !           135: {
        !           136: }
        !           137: 
        !           138: # ifndef OUTREGNO
        !           139: # define OUTREGNO(p) ((p)->offset)
        !           140: # endif
        !           141: 
        !           142: #define BYTOFF(p)      (((off = (p)->offset) < 0 ? -off : off)/SZCHAR)
        !           143: 
        !           144: ppstab( p )
        !           145: register SYMTAB *p; 
        !           146: {
        !           147:        /* write out .stabs for the symbol p */
        !           148:        register TWORD t;
        !           149:        register off, i;
        !           150: 
        !           151:        if( p->stype == TNULL ) return;
        !           152: 
        !           153:        if(gdebug && p->sclass & FIELD) {
        !           154:                printx(strvalfmt, p->sname, N_SFLD,
        !           155:                        ((p->sclass&FLDSIZ)<<BTSHIFT)|p->stype, p->offset);
        !           156:                return;
        !           157:        }
        !           158: 
        !           159:        switch( p->sclass ) {
        !           160:        case AUTO:
        !           161:                printx(strvalfmt, p->sname, N_LSYM, p->stype, BYTOFF(p));
        !           162:                break;
        !           163:        case REGISTER:
        !           164:                printx(strvalfmt, p->sname, N_RSYM, p->stype, OUTREGNO(p));
        !           165:                break;
        !           166:        case PARAM:
        !           167:                printx(strvalfmt, p->sname, N_PSYM, p->stype, BYTOFF(p));
        !           168:                break;
        !           169:        case EXTERN:
        !           170:        case EXTDEF:
        !           171:                if(gdebug)
        !           172:                        printx(strvalfmt, p->sname, N_GSYM, p->stype, 0);
        !           173:                break;
        !           174: /*
        !           175:        case EXTDEF:
        !           176:                printx(strsymfmt, p->sname, N_GSYM, p->stype,
        !           177:                        exname(p->sname));
        !           178:                break;
        !           179: */
        !           180:        case STATIC:
        !           181:                if (ISFTN(p->stype))
        !           182:                        printx(strvalfmt, p->sname, N_STFUN, p->stype, 0);
        !           183:                else
        !           184:                        printx(strsymfmt, p->sname,
        !           185:                            (p->sflags&SBSS) ? N_LCSYM : N_STSYM, p->stype,
        !           186:                            p->slevel ? maklab(p->offset) : exname(p->sname));
        !           187:                break;
        !           188:        case STNAME:
        !           189:        case UNAME:
        !           190:        case ENAME:
        !           191:                if(!gdebug)
        !           192:                        break;
        !           193:                printx(strvalfmt, p->sname, N_BSTR, p->stype, 0);
        !           194:                for (i = dimtab[p->sizoff+1]; i >= 0 && dimtab[i] >= 0; i++)
        !           195:                        ppstab( &stab[dimtab[i]] );
        !           196:                printx(strvalfmt, p->sname, N_ESTR, p->stype,
        !           197:                        dimtab[p->sizoff]/SZCHAR);
        !           198:                return;
        !           199:        case MOS:
        !           200:        case MOU:
        !           201:                if(gdebug)
        !           202:                        printx(strvalfmt, p->sname, N_SSYM, p->stype, BYTOFF(p));
        !           203:                break;
        !           204:        case MOE:
        !           205:                if(gdebug)
        !           206:                        printx(strvalfmt, p->sname, N_SSYM, p->stype, p->offset);
        !           207:                return;
        !           208:        case TYPEDEF: /* !? */
        !           209:                return;
        !           210:        default:
        !           211:                fprintf(stderr,"unexpected stab class %d: %s, type = 0x%04x\n",
        !           212:                        p->sclass, p->sname, p->stype);
        !           213:                fflush(stderr);
        !           214:                return;
        !           215:        }
        !           216:        /* make another entry to describe structs, unions, enums */
        !           217:        switch( BTYPE(p->stype) ) {
        !           218:        case STRTY:
        !           219:        case UNIONTY:
        !           220:        case ENUMTY:
        !           221:                if(gdebug)
        !           222:                        printx(strvalfmt, stab[dimtab[p->sizoff+3]].sname,
        !           223:                                N_TYID, 0, 0);
        !           224:        }
        !           225: 
        !           226:        /* make other entries with the dimensions */
        !           227:        if(!gdebug)
        !           228:                return;
        !           229:        for( t=p->stype, i=p->dimoff; t&TMASK; t = DECREF(t) ) 
        !           230:        {
        !           231:                if( ISARY(t) ) printx(nulvalfmt, N_DIM, 0, dimtab[i++]);
        !           232:        }
        !           233: }
        !           234: 
        !           235: static char orgfile[100], curfile[100], prtfile[100];
        !           236: 
        !           237: static int srcfilop = N_SO;
        !           238: 
        !           239: static char *
        !           240: makstr(ip)
        !           241: register char *ip;
        !           242: {
        !           243:        register c; register char *jp = prtfile;
        !           244:        do {
        !           245:                if ((c = *ip++) != '"')
        !           246:                        *jp++ = c;
        !           247:        } while (c);
        !           248:        return prtfile;
        !           249: }
        !           250: 
        !           251: dbfile(pname)
        !           252: char *pname;
        !           253: {
        !           254:        int seg;
        !           255:        if (strcmp(curfile, ftitle) == 0)
        !           256:                return 0;
        !           257:        strcpy(curfile, ftitle);
        !           258:        seg = locctr(PROG);
        !           259:        if(!Oflag) {    /* Ln: .stabs...Ln confuses c2 */
        !           260:                if (pname == NULL)
        !           261:                        printx("%s:", pname = maklab(getlab()));
        !           262:                printx(strsymfmt, makstr(curfile), srcfilop,
        !           263:                    slineno ? slineno : lineno, pname);
        !           264:        }
        !           265:        slineno = 0;
        !           266:        if (srcfilop == N_SO) { /* first file */
        !           267:                printx(strvalfmt, verstr, N_VER, vernum, time(0));
        !           268:                strcpy(orgfile, ftitle);
        !           269:                srcfilop = N_SOL;
        !           270:        }
        !           271:        if (seg >= 0)
        !           272:                locctr(seg);
        !           273:        return 1;
        !           274: }
        !           275: 
        !           276: dbline()
        !           277: {
        !           278:        int seg;
        !           279:        if (blevel && !dbfile(NULL) && gdebug) {
        !           280:                seg = locctr(PROG);
        !           281:                printx(dotfmt, N_SLINE, slineno ? slineno : lineno);
        !           282:                slineno = 0;
        !           283:                if (seg >= 0)
        !           284:                        locctr(seg);
        !           285:        }
        !           286: }
        !           287: 
        !           288: ejsdb()
        !           289: {
        !           290:        /* called at the end of the entire file */
        !           291:        register struct symtab *p;
        !           292:        extern Pflag, bbcnt;
        !           293:        int i;
        !           294:        if(Pflag) {
        !           295:                printx("\t.data\nlocprof:\t.long %d\n", bbcnt+4);
        !           296:                printx("\t.long 0\n\t.long L%db\n", bbcnt);
        !           297:                printx("\t.space %d\n", 4*bbcnt+4);
        !           298:                printx("L%db:\t.byte ", bbcnt);
        !           299:                for(i = 0; curfile[i]; i++)
        !           300:                        printx("0x%x,", curfile[i]);
        !           301:                printx("0\n");
        !           302:        }
        !           303:        for( p = &stab[SYMTSZ]; --p>=stab; )
        !           304:        {
        !           305:                if( p->stype != TNULL && !ISFTN(p->stype) ) 
        !           306:                {
        !           307:                        switch( p->sclass ) 
        !           308:                        {
        !           309:                        case EXTERN:
        !           310:                                if( p->suse > 0 ) continue;     /* unused */
        !           311:                        case EXTDEF:
        !           312:                        case STATIC:
        !           313:                        case STNAME:
        !           314:                        case UNAME:
        !           315:                        case ENAME:
        !           316:                                if (gdebug || wasused(p))
        !           317:                                        ppstab(p);
        !           318:                                break;
        !           319:                        }
        !           320:                }
        !           321:        }
        !           322:        printx("        .text\n");
        !           323:        printx("%s:", maklab(getlab()));
        !           324:        printx(strsymfmt, makstr(orgfile), N_ESO, lineno, labstr);
        !           325: }

unix.superglobalmegacorp.com

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