Annotation of 42BSD/lib/pcc/stab.c, revision 1.1.1.1

1.1       root        1: #ifndef lint
                      2: static char *sccsid ="@(#)stab.c       1.10 (Berkeley) 10/22/83";
                      3: #endif
                      4: /*
                      5:  * Symbolic debugging info interface.
                      6:  *
                      7:  * Here we generate pseudo-ops that cause the assembler to put
                      8:  * symbolic debugging information into the object file.
                      9:  */
                     10: 
                     11: #include "mfile1"
                     12: 
                     13: #include <sys/types.h>
                     14: #include <a.out.h>
                     15: #include <stab.h>
                     16: 
                     17: #define private static
                     18: #define and &&
                     19: #define or ||
                     20: #define not !
                     21: #define div /
                     22: #define mod %
                     23: #define nil 0
                     24: 
                     25: #define bytes(bits) ((bits) / SZCHAR)
                     26: #define bsize(p) bytes(dimtab[p->sizoff])      /* size in bytes of a symbol */
                     27: 
                     28: #define NILINDEX -1
                     29: #define FORWARD -2
                     30: 
                     31: typedef int Boolean;
                     32: 
                     33: #define false 0
                     34: #define true 1
                     35: 
                     36: extern int ddebug;
                     37: extern int gdebug;
                     38: extern char *malloc();
                     39: 
                     40: int stabLCSYM;
                     41: 
                     42: /*
                     43:  * Flag for producing either sdb or dbx symbol information.
                     44:  */
                     45: int oldway = false;
                     46: 
                     47: /*
                     48:  * Generate debugging info for a parameter.
                     49:  * The offset isn't known when it is first entered into the symbol table
                     50:  * since the types are read later.
                     51:  */
                     52: 
                     53: fixarg(p)
                     54: struct symtab *p;
                     55: {
                     56:     if (oldway) {
                     57:        old_fixarg(p);
                     58:     } else if (gdebug) {
                     59:        printf("\t.stabs\t\"%s:p", p->sname);
                     60:        gentype(p);
                     61:        printf("\",0x%x,0,%d,%d\n", N_PSYM, bsize(p), bytes(argoff));
                     62:     }
                     63: }
                     64: 
                     65: /*
                     66:  * Determine if the given symbol is a global array with dimension 0,
                     67:  * which only makes sense if it's dimension is to be given later.
                     68:  * We therefore currently do not generate symbol information for
                     69:  * such entries.
                     70:  */
                     71: 
                     72: #define isglobal(class) ( \
                     73:     class == EXTDEF or class == EXTERN or class == STATIC \
                     74: )
                     75: 
                     76: private Boolean zero_length_array(p)
                     77: register struct symtab *p;
                     78: {
                     79:     Boolean b;
                     80:     int t;
                     81: 
                     82:     if (not isglobal(p->sclass)) {
                     83:        b = false;
                     84:     } else {
                     85:        t = p->stype;
                     86:        if (ISFTN(t)) {
                     87:            t = DECREF(t);
                     88:        }
                     89:        b = (Boolean) (ISARY(t) and dimtab[p->dimoff] == 0);
                     90:     }
                     91:     return b;
                     92: }
                     93: 
                     94: /*
                     95:  * Generate debugging info for a given symbol.
                     96:  */
                     97: 
                     98: outstab(sym)
                     99: struct symtab *sym;
                    100: {
                    101:     register struct symtab *p;
                    102:     char *classname;
                    103:     int offset;
                    104:     Boolean ignore;
                    105:     static Boolean firsttime = true;
                    106: 
                    107:     if (oldway) {
                    108:        old_outstab(sym);
                    109:     } else if (gdebug and not zero_length_array(sym)) {
                    110:        if (firsttime) {
                    111:            firsttime = false;
                    112:            inittypes();
                    113:        }
                    114:        ignore = false;
                    115:        p = sym;
                    116:        offset = bytes(p->offset);
                    117:        switch (p->sclass) {
                    118:        case REGISTER:
                    119:            classname = "r";
                    120:            offset = p->offset;
                    121:            break;
                    122: 
                    123:        /*
                    124:         * Locals are the default class.
                    125:         */
                    126:        case AUTO:
                    127:            classname = "";
                    128:            break;
                    129: 
                    130:        case STATIC:
                    131:            if (ISFTN(p->stype)) {
                    132:                ignore = true;
                    133:            } else if (p->slevel <= 1) {
                    134:                classname = "S";
                    135:            } else {
                    136:                classname = "V";
                    137:            }
                    138:            break;
                    139: 
                    140:        case EXTDEF:
                    141:        case EXTERN:
                    142:            if (ISFTN(p->stype)) {
                    143:                ignore = true;
                    144:            } else {
                    145:                classname = "G";
                    146:            }
                    147:            break;
                    148: 
                    149:        case TYPEDEF:
                    150:            classname = "t";
                    151:            break;
                    152: 
                    153:        case PARAM:
                    154:        case MOS:
                    155:        case MOU:
                    156:        case MOE:
                    157:            ignore = true;
                    158:            break;
                    159: 
                    160:        case ENAME:
                    161:        case UNAME:
                    162:        case STNAME:
                    163:            entertype(p->stype, NILINDEX, FORWARD, dimtab[p->sizoff + 3]);
                    164:            ignore = true;
                    165:            break;
                    166: 
                    167:        default:
                    168:            if ((p->sclass&FIELD) == 0) {
                    169:                printf("/* no info for %s (%d) */\n", p->sname, p->sclass);
                    170:            }
                    171:            ignore = true;
                    172:            break;
                    173:        }
                    174:        if (not ignore) {
                    175:            printf("\t.stabs\t\"%s:%s", p->sname, classname);
                    176:            gentype(p);
                    177:            geninfo(p);
                    178:        }
                    179:     }
                    180: }
                    181: 
                    182: /*
                    183:  * Since type names are lost in the travels and because C has
                    184:  * structural type equivalence we keep a table of type words that
                    185:  * we've already seen.  The first time we see a type, it is assigned
                    186:  * (inline) a number and future references just list that number.
                    187:  * Structures, unions, enums, and arrays must be handled carefully
                    188:  * since not all the necessary information is in the type word.
                    189:  */
                    190: 
                    191: typedef struct Typeid *Typeid;
                    192: 
                    193: struct Typeid {
                    194:     TWORD tword;
                    195:     int tarray;
                    196:     int tstruct;
                    197:     int tstrtag;
                    198:     int tnum;
                    199:     Typeid chain;
                    200: };
                    201: 
                    202: #define TABLESIZE 2003
                    203: 
                    204: private int tcount = 1;
                    205: private int t_int, t_char;
                    206: private Typeid typetable[TABLESIZE];
                    207: 
                    208: /*
                    209:  * Look for the given type word in the type table.
                    210:  */
                    211: 
                    212: private Typeid typelookup(type, arrindex, strindex, strtag)
                    213: TWORD type;
                    214: int arrindex;
                    215: int strindex;
                    216: int strtag;
                    217: {
                    218:     register TWORD tword;
                    219:     register int i1, i2;
                    220:     Typeid t;
                    221: 
                    222:     t = typetable[type mod TABLESIZE];
                    223:     while (t != nil) {
                    224:        if (t->tword == type and
                    225:          strindex == t->tstruct and strtag == t->tstrtag) {
                    226:            if (arrindex == NILINDEX) {
                    227:                break;
                    228:            } else {
                    229:                tword = type;
                    230:                i1 = arrindex;
                    231:                i2 = t->tarray;
                    232:                while (ISARY(tword) and dimtab[i1] == dimtab[i2]) {
                    233:                    ++i1;
                    234:                    ++i2;
                    235:                    tword >>= TSHIFT;
                    236:                }
                    237:                if (!ISARY(tword)) {
                    238:                    break;
                    239:                }
                    240:            }
                    241:        }
                    242:        t = t->chain;
                    243:     }
                    244:     return t;
                    245: }
                    246: 
                    247: /*
                    248:  * Enter a type word and associated symtab indices into the type table.
                    249:  */
                    250: 
                    251: private int entertype(type, arrindex, strindex, strtag)
                    252: TWORD type;
                    253: int arrindex;
                    254: int strindex;
                    255: int strtag;
                    256: {
                    257:     register Typeid t;
                    258:     register int i;
                    259: 
                    260:     t = (Typeid) malloc(sizeof(struct Typeid));
                    261:     t->tword = type;
                    262:     t->tarray = arrindex;
                    263:     t->tstruct = strindex;
                    264:     t->tstrtag = strtag;
                    265:     t->tnum = tcount;
                    266:     ++tcount;
                    267:     i = type mod TABLESIZE;
                    268:     t->chain = typetable[i];
                    269:     typetable[i] = t;
                    270:     return t->tnum;
                    271: }
                    272: 
                    273: /*
                    274:  * Change the information associated with a type table entry.
                    275:  * Since I'm lazy this just creates a new entry with the number
                    276:  * as the old one.
                    277:  */
                    278: 
                    279: private reentertype(typeid, type, arrindex, strindex, strtag)
                    280: Typeid typeid;
                    281: TWORD type;
                    282: int arrindex;
                    283: int strindex;
                    284: int strtag;
                    285: {
                    286:     register Typeid t;
                    287:     register int i;
                    288: 
                    289:     t = (Typeid) malloc(sizeof(struct Typeid));
                    290:     t->tword = type;
                    291:     t->tarray = arrindex;
                    292:     t->tstruct = strindex;
                    293:     t->tstrtag = strtag;
                    294:     t->tnum = typeid->tnum;
                    295:     i = type mod TABLESIZE;
                    296:     t->chain = typetable[i];
                    297:     typetable[i] = t;
                    298: }
                    299: 
                    300: /*
                    301:  * Initialize type table with predefined types.
                    302:  */
                    303: 
                    304: #define builtintype(type) entertype(type, NILINDEX, NILINDEX, NILINDEX)
                    305: 
                    306: private inittypes()
                    307: {
                    308:     int t;
                    309: 
                    310:     t_int = builtintype(INT);
                    311:     t_char = builtintype(CHAR);
                    312:     maketype("int", t_int, t_int, 0x80000000L, 0x7fffffffL);
                    313:     maketype("char", t_char, t_char, 0L, 127L);
                    314:     maketype("long", builtintype(LONG), t_int, 0x80000000L, 0x7fffffffL);
                    315:     maketype("short", builtintype(SHORT), t_int, 0xffff8000L, 0x7fffL);
                    316:     maketype("unsigned char", builtintype(UCHAR), t_int, 0L, 255L);
                    317:     maketype("unsigned short", builtintype(USHORT), t_int, 0L, 0xffffL);
                    318:     maketype("unsigned long", builtintype(ULONG), t_int, 0L, 0xffffffffL);
                    319:     maketype("unsigned int", builtintype(UNSIGNED), t_int, 0L, 0xffffffffL);
                    320:     maketype("float", builtintype(FLOAT), t_int, 4L, 0L);
                    321:     maketype("double", builtintype(DOUBLE), t_int, 8L, 0L);
                    322:     t = builtintype(UNDEF);
                    323:     printf("\t.stabs\t\"void:t%d=%d", t, t);
                    324:     geninfo(nil);
                    325:     t = builtintype(FARG);
                    326:     printf("\t.stabs\t\"???:t%d=%d", t, t_int);
                    327:     geninfo(nil);
                    328: }
                    329: 
                    330: /*
                    331:  * Generate info for a new range type.
                    332:  */
                    333: 
                    334: private maketype(name, tnum, eqtnum, lower, upper)
                    335: char *name;
                    336: int tnum, eqtnum;
                    337: long lower, upper;
                    338: {
                    339:     printf("\t.stabs\t\"%s:t%d=r%d;%d;%d;", name, tnum, eqtnum, lower, upper);
                    340:     geninfo(nil);
                    341: }
                    342: 
                    343: /*
                    344:  * Generate debugging information for the given type of the given symbol.
                    345:  */
                    346: 
                    347: private gentype(sym)
                    348: struct symtab *sym;
                    349: {
                    350:     register struct symtab *p;
                    351:     register TWORD t;
                    352:     register TWORD basictype;
                    353:     register Typeid typeid;
                    354:     int i, arrindex, strindex, strtag;
                    355: 
                    356:     p = sym;
                    357:     t = p->stype;
                    358:     if (ISFTN(t)) {
                    359:        t = DECREF(t);
                    360:     }
                    361:     basictype = BTYPE(t);
                    362:     if (ISARY(t)) {
                    363:        arrindex = p->dimoff;
                    364:     } else {
                    365:        arrindex = NILINDEX;
                    366:     }
                    367:     if (basictype == STRTY or basictype == UNIONTY or basictype == ENUMTY) {
                    368:        strindex = dimtab[p->sizoff + 1];
                    369:        if (strindex == -1) {
                    370:            strindex = FORWARD;
                    371:            strtag = dimtab[p->sizoff + 3];
                    372:        } else {
                    373:            strtag = NILINDEX;
                    374:        }
                    375:     } else {
                    376:        strindex = NILINDEX;
                    377:        strtag = NILINDEX;
                    378:     }
                    379:     i = arrindex;
                    380:     typeid = typelookup(t, arrindex, strindex, strtag);
                    381:     while (t != basictype and typeid == nil) {
                    382:        printf("%d=", entertype(t, i, strindex, strtag));
                    383:        switch (t&TMASK) {
                    384:        case PTR:
                    385:            printf("*");
                    386:            break;
                    387: 
                    388:        case FTN:
                    389:            printf("f");
                    390:            break;
                    391: 
                    392:        case ARY:
                    393:            printf("ar%d;0;%d;", t_int, dimtab[i++] - 1);
                    394:            break;
                    395:        }
                    396:        t = DECREF(t);
                    397:        if (t == basictype) {
                    398:            typeid = typelookup(t, NILINDEX, strindex, strtag);
                    399:        } else {
                    400:            typeid = typelookup(t, i, strindex, strtag);
                    401:        }
                    402:     }
                    403:     if (typeid == nil) {
                    404:        if (strindex == FORWARD) {
                    405:            typeid = typelookup(t, NILINDEX, FORWARD, dimtab[p->sizoff + 3]);
                    406:            if (typeid == nil) {
                    407:                cerror("unbelievable forward reference");
                    408:            }
                    409:            printf("%d", typeid->tnum);
                    410:        } else {
                    411:            genstruct(t, NILINDEX, strindex, p->sname, bsize(p));
                    412:        }
                    413:     } else {
                    414:        printf("%d", typeid->tnum);
                    415:     }
                    416: }
                    417: 
                    418: /*
                    419:  * Generate type information for structures, unions, and enumerations.
                    420:  */
                    421: 
                    422: private genstruct(t, structid, index, name, size)
                    423: TWORD t;
                    424: int structid;
                    425: int index;
                    426: char *name;
                    427: int size;
                    428: {
                    429:     register int i;
                    430:     register struct symtab *field;
                    431:     int id;
                    432: 
                    433:     if (structid == NILINDEX) {
                    434:        id = entertype(t, NILINDEX, index, NILINDEX);
                    435:     } else {
                    436:        id = structid;
                    437:     }
                    438:     switch (t) {
                    439:     case STRTY:
                    440:     case UNIONTY:
                    441:        printf("%d=%c%d", id, t == STRTY ? 's' : 'u', size);
                    442:        i = index;
                    443:        while (dimtab[i] != -1) {
                    444:            field = &stab[dimtab[i]];
                    445:            printf("%s:", field->sname);
                    446:            gentype(field);
                    447:            if (field->sclass > FIELD) {
                    448:                printf(",%d,%d;", field->offset, field->sclass - FIELD);
                    449:            } else {
                    450:                printf(",%d,%d;", field->offset,
                    451:                    tsize(field->stype, field->dimoff, field->sizoff));
                    452:            }
                    453:            ++i;
                    454:        }
                    455:        putchar(';');
                    456:        break;
                    457: 
                    458:     case ENUMTY:
                    459:        printf("%d=e", id);
                    460:        i = index;
                    461:        while (dimtab[i] != -1) {
                    462:            field = &stab[dimtab[i]];
                    463:            printf("%s:%d,", field->sname, field->offset);
                    464:            i++;
                    465:        }
                    466:        putchar(';');
                    467:        break;
                    468: 
                    469:     default:
                    470:        cerror("couldn't find basic type %d for %s\n", t, name);
                    471:        break;
                    472:     }
                    473: }
                    474: 
                    475: /*
                    476:  * Generate offset and size info.
                    477:  */
                    478: 
                    479: private geninfo(p)
                    480: register struct symtab *p;
                    481: {
                    482:     int stabtype;
                    483: 
                    484:     if (p == nil) {
                    485:        printf("\",0x%x,0,0,0\n", N_LSYM);
                    486:     } else {
                    487:        switch (p->sclass) {
                    488:            case EXTERN:
                    489:            case EXTDEF:
                    490:                if (ISFTN(p->stype)) {
                    491:                    printf("\",0x%x,0,%d,_%s\n", N_FUN, bsize(p), p->sname);
                    492:                } else {
                    493:                    printf("\",0x%x,0,%d,0\n", N_GSYM, bsize(p));
                    494:                }
                    495:                break;
                    496: 
                    497:            case STATIC:
                    498:                stabtype = stabLCSYM ? N_LCSYM : N_STSYM;
                    499:                if (ISFTN(p->stype)) {
                    500:                    printf("\",0x%x,0,%d,_%s\n", N_FUN, bsize(p), p->sname);
                    501:                } else if (p->slevel > 1) {
                    502:                    printf("\",0x%x,0,%d,L%d\n", stabtype, bsize(p), p->offset);
                    503:                } else {
                    504:                    printf("\",0x%x,0,%d,_%s\n", stabtype, bsize(p), p->sname);
                    505:                }
                    506:                break;
                    507: 
                    508:            case REGISTER:
                    509:                printf("\",0x%x,0,%d,%d\n", N_RSYM, bsize(p), p->offset);
                    510:                break;
                    511: 
                    512:            case PARAM:
                    513:                printf("\",0x%x,0,%d,%d\n", N_PSYM, bsize(p), bytes(argoff));
                    514:                break;
                    515: 
                    516:            default:
                    517:                printf("\",0x%x,0,%d,%d\n", N_LSYM, bsize(p), bytes(p->offset));
                    518:                break;
                    519:        }
                    520:     }
                    521: }
                    522: 
                    523: /*
                    524:  * Generate information for a newly-defined structure.
                    525:  */
                    526: 
                    527: outstruct(szindex, paramindex)
                    528: int szindex, paramindex;
                    529: {
                    530:     register Typeid typeid;
                    531:     register struct symtab *p;
                    532:     register int i, t, strindex;
                    533: 
                    534:     if (oldway) {
                    535:        /* do nothing */;
                    536:     } else if (gdebug) {
                    537:        i = dimtab[szindex + 3];
                    538:        p = &stab[i];
                    539:        if (p->sname != nil) {
                    540:            strindex = dimtab[p->sizoff + 1];
                    541:            typeid = typelookup(p->stype, NILINDEX, FORWARD, i);
                    542:            if (typeid == nil) {
                    543:                t = 0;
                    544:            } else {
                    545:                t = typeid->tnum;
                    546:                reentertype(typeid, p->stype, NILINDEX, strindex, NILINDEX);
                    547:            }
                    548:            printf("\t.stabs\t\"%s:T", p->sname);
                    549:            genstruct(p->stype, t, strindex, p->sname, bsize(p));
                    550:            geninfo(p);
                    551:        }
                    552:     }
                    553: }
                    554: 
                    555: pstab(name, type)
                    556: char *name;
                    557: int type;
                    558: {
                    559:     register int i;
                    560:     register char c;
                    561: 
                    562:     if (!gdebug) {
                    563:        return;
                    564:     } else if (oldway) {
                    565:        old_pstab(name, type);
                    566:        return;
                    567:     }
                    568:     /* locctr(PROG);  /* .stabs must appear in .text for c2 */
                    569: #ifdef ASSTRINGS
                    570:     if ( name[0] == '\0')
                    571:        printf("\t.stabn\t");
                    572:     else
                    573: #ifndef FLEXNAMES
                    574:        printf("\t.stabs\t\"%.8s\",", name);
                    575: #else
                    576:        printf("\t.stabs\t\"%s\",", name);
                    577: #endif
                    578: #else
                    579:     printf("    .stab   ");
                    580:     for(i=0; i<8; i++) 
                    581:        if (c = name[i]) printf("'%c,", c);
                    582:        else printf("0,");
                    583: #endif
                    584:     printf("0%o,", type);
                    585: }
                    586: 
                    587: #ifdef STABDOT
                    588: pstabdot(type, value)
                    589: int type;
                    590: int value;
                    591: {
                    592:     if ( ! gdebug) {
                    593:        return;
                    594:     } else if (oldway) {
                    595:        old_pstabdot(type, value);
                    596:        return;
                    597:     }
                    598:     /* locctr(PROG);  /* .stabs must appear in .text for c2 */
                    599:     printf("\t.stabd\t");
                    600:     printf("0%o,0,0%o\n",type, value);
                    601: }
                    602: #endif
                    603: 
                    604: extern char NULLNAME[8];
                    605: extern int  labelno;
                    606: extern int  fdefflag;
                    607: 
                    608: psline()
                    609: {
                    610:     static int lastlineno;
                    611:     register char *cp, *cq;
                    612:     register int i;
                    613:     
                    614:     if (!gdebug) {
                    615:        return;
                    616:     } else if (oldway) {
                    617:        old_psline();
                    618:        return;
                    619:     }
                    620: 
                    621:     cq = ititle;
                    622:     cp = ftitle;
                    623: 
                    624:     while ( *cq ) if ( *cp++ != *cq++ ) goto neq;
                    625:     if ( *cp == '\0' ) goto eq;
                    626:     
                    627: neq:    for (i=0; i<100; i++)
                    628:        ititle[i] = '\0';
                    629:     cp = ftitle;
                    630:     cq = ititle;
                    631:     while ( *cp )  
                    632:        *cq++ = *cp++;
                    633:     *cq = '\0';
                    634:     *--cq = '\0';
                    635: #ifndef FLEXNAMES
                    636:     for ( cp = ititle+1; *(cp-1); cp += 8 ) {
                    637:        pstab(cp, N_SOL);
                    638:        if (gdebug) printf("0,0,LL%d\n", labelno);
                    639:     }
                    640: #else
                    641:     pstab(ititle+1, N_SOL);
                    642:     if (gdebug) printf("0,0,LL%d\n", labelno);
                    643: #endif
                    644:     *cq = '"';
                    645:     printf("LL%d:\n", labelno++);
                    646: 
                    647: eq: if (lineno == lastlineno) return;
                    648:     lastlineno = lineno;
                    649: 
                    650:     if (fdefflag) {
                    651: #ifdef STABDOT
                    652:        pstabdot(N_SLINE, lineno);
                    653: #else
                    654:        pstab(NULLNAME, N_SLINE);
                    655:        printf("0,%d,LL%d\n", lineno, labelno);
                    656:        printf("LL%d:\n", labelno++);
                    657: #endif
                    658:     }
                    659: }
                    660:     
                    661: plcstab(level)
                    662: int level;
                    663: {
                    664:     if (!gdebug) {
                    665:        return;
                    666:     } else if (oldway) {
                    667:        old_plcstab(level);
                    668:        return;
                    669:     }
                    670: #ifdef STABDOT
                    671:     pstabdot(N_LBRAC, level);
                    672: #else
                    673:     pstab(NULLNAME, N_LBRAC);
                    674:     printf("0,%d,LL%d\n", level, labelno);
                    675:     printf("LL%d:\n", labelno++);
                    676: #endif
                    677: }
                    678:     
                    679: prcstab(level)
                    680: int level;
                    681: {
                    682:     if (!gdebug) {
                    683:        return;
                    684:     } else if (oldway) {
                    685:        old_prcstab(level);
                    686:        return;
                    687:     }
                    688: #ifdef STABDOT
                    689:     pstabdot(N_RBRAC, level);
                    690: #else
                    691:     pstab(NULLNAME, N_RBRAC);
                    692:     printf("0,%d,LL%d\n", level, labelno);
                    693:     printf("LL%d:\n", labelno++);
                    694: #endif
                    695: }
                    696:     
                    697: pfstab(sname) 
                    698: char *sname;
                    699: {
                    700:     register struct symtab *p;
                    701: 
                    702:     if (gdebug) {
                    703:        if (oldway) {
                    704:            old_pfstab(sname);
                    705:        } else {
                    706:            p = &stab[lookup(sname, 0)];
                    707:            printf("\t.stabs\t\"%s:", p->sname);
                    708:            putchar((p->sclass == STATIC) ? 'f' : 'F');
                    709:            gentype(p);
                    710:            geninfo(p);
                    711:        }
                    712:     }
                    713: }
                    714: 
                    715: /*
                    716:  * Old way of doing things.
                    717:  */
                    718: 
                    719: private old_fixarg(p)
                    720: struct symtab *p; {
                    721:        if (gdebug) {
                    722:                old_pstab(p->sname, N_PSYM);
                    723:                if (gdebug) printf("0,%d,%d\n", p->stype, argoff/SZCHAR);
                    724:                old_poffs(p);
                    725:        }
                    726: }
                    727: 
                    728: private old_outstab(p)
                    729: struct symtab *p; {
                    730:        register TWORD ptype;
                    731:        register char *pname;
                    732:        register char pclass;
                    733:        register int poffset;
                    734: 
                    735:        if (!gdebug) return;
                    736: 
                    737:        ptype = p->stype;
                    738:        pname = p->sname;
                    739:        pclass = p->sclass;
                    740:        poffset = p->offset;
                    741: 
                    742:        if (ISFTN(ptype)) {
                    743:                return;
                    744:        }
                    745:        
                    746:        switch (pclass) {
                    747:        
                    748:        case AUTO:
                    749:                old_pstab(pname, N_LSYM);
                    750:                printf("0,%d,%d\n", ptype, (-poffset)/SZCHAR);
                    751:                old_poffs(p);
                    752:                return;
                    753:        
                    754:        case EXTDEF:
                    755:        case EXTERN:
                    756:                old_pstab(pname, N_GSYM);
                    757:                printf("0,%d,0\n", ptype);
                    758:                old_poffs(p);
                    759:                return;
                    760:                        
                    761:        case STATIC:
                    762: #ifdef LCOMM
                    763:                /* stabLCSYM is 1 during nidcl so we can get stab type right */
                    764:                old_pstab(pname, stabLCSYM ? N_LCSYM : N_STSYM);
                    765: #else
                    766:                old_pstab(pname, N_STSYM);
                    767: #endif
                    768:                if (p->slevel > 1) {
                    769:                        printf("0,%d,L%d\n", ptype, poffset);
                    770:                } else {
                    771:                        printf("0,%d,%s\n", ptype, exname(pname));
                    772:                }
                    773:                old_poffs(p);
                    774:                return;
                    775:        
                    776:        case REGISTER:
                    777:                old_pstab(pname, N_RSYM);
                    778:                printf("0,%d,%d\n", ptype, poffset);
                    779:                old_poffs(p);
                    780:                return;
                    781:        
                    782:        case MOS:
                    783:        case MOU:
                    784:                old_pstab(pname, N_SSYM);
                    785:                printf("0,%d,%d\n", ptype, poffset/SZCHAR);
                    786:                old_poffs(p);
                    787:                return;
                    788:        
                    789:        case PARAM:
                    790:                /* parameter stab entries are processed in dclargs() */
                    791:                return;
                    792:        
                    793:        default:
                    794: #ifndef FLEXNAMES
                    795:                if (ddebug) printf("    No .stab for %.8s\n", pname);
                    796: #else
                    797:                if (ddebug) printf("    No .stab for %s\n", pname);
                    798: #endif
                    799:                
                    800:        }
                    801: }
                    802: 
                    803: private old_pstab(name, type)
                    804: char *name;
                    805: int type; {
                    806:        register int i;
                    807:        register char c;
                    808:        if (!gdebug) return;
                    809:        /* locctr(PROG);  /* .stabs must appear in .text for c2 */
                    810: #ifdef ASSTRINGS
                    811:        if ( name[0] == '\0')
                    812:                printf("\t.stabn\t");
                    813:        else
                    814: #ifndef FLEXNAMES
                    815:                printf("\t.stabs\t\"%.8s\", ", name);
                    816: #else
                    817:                printf("\t.stabs\t\"%s\", ", name);
                    818: #endif
                    819: #else
                    820:        printf("        .stab   ");
                    821:        for(i=0; i<8; i++) 
                    822:                if (c = name[i]) printf("'%c,", c);
                    823:                else printf("0,");
                    824: #endif
                    825:        printf("0%o,", type);
                    826: }
                    827: 
                    828: #ifdef STABDOT
                    829: private old_pstabdot(type, value)
                    830:        int     type;
                    831:        int     value;
                    832: {
                    833:        if ( ! gdebug) return;
                    834:        /* locctr(PROG);  /* .stabs must appear in .text for c2 */
                    835:        printf("\t.stabd\t");
                    836:        printf("0%o,0,0%o\n",type, value);
                    837: }
                    838: #endif
                    839: 
                    840: private old_poffs(p)
                    841: register struct symtab *p; {
                    842:        int s;
                    843:        if (!gdebug) return;
                    844:        if ((s = dimtab[p->sizoff]/SZCHAR) > 1) {
                    845:                old_pstab(p->sname, N_LENG);
                    846:                printf("1,0,%d\n", s);
                    847:        }
                    848: }
                    849: 
                    850: private old_psline() {
                    851:        static int lastlineno;
                    852:        register char *cp, *cq;
                    853:        register int i;
                    854:        
                    855:        if (!gdebug) return;
                    856: 
                    857:        cq = ititle;
                    858:        cp = ftitle;
                    859: 
                    860:        while ( *cq ) if ( *cp++ != *cq++ ) goto neq;
                    861:        if ( *cp == '\0' ) goto eq;
                    862:        
                    863: neq:   for (i=0; i<100; i++)
                    864:                ititle[i] = '\0';
                    865:        cp = ftitle;
                    866:        cq = ititle;
                    867:        while ( *cp )  
                    868:                *cq++ = *cp++;
                    869:        *cq = '\0';
                    870:        *--cq = '\0';
                    871: #ifndef FLEXNAMES
                    872:        for ( cp = ititle+1; *(cp-1); cp += 8 ) {
                    873:                old_pstab(cp, N_SOL);
                    874:                if (gdebug) printf("0,0,LL%d\n", labelno);
                    875:                }
                    876: #else
                    877:        old_pstab(ititle+1, N_SOL);
                    878:        if (gdebug) printf("0,0,LL%d\n", labelno);
                    879: #endif
                    880:        *cq = '"';
                    881:        printf("LL%d:\n", labelno++);
                    882: 
                    883: eq:    if (lineno == lastlineno) return;
                    884:        lastlineno = lineno;
                    885: 
                    886:        if (fdefflag) {
                    887: #ifdef STABDOT
                    888:                old_pstabdot(N_SLINE, lineno);
                    889: #else
                    890:                old_pstab(NULLNAME, N_SLINE);
                    891:                printf("0,%d,LL%d\n", lineno, labelno);
                    892:                printf("LL%d:\n", labelno++);
                    893: #endif
                    894:                }
                    895:        }
                    896:        
                    897: private old_plcstab(level) {
                    898:        if (!gdebug) return;
                    899: #ifdef STABDOT
                    900:        old_pstabdot(N_LBRAC, level);
                    901: #else
                    902:        old_pstab(NULLNAME, N_LBRAC);
                    903:        printf("0,%d,LL%d\n", level, labelno);
                    904:        printf("LL%d:\n", labelno++);
                    905: #endif
                    906:        }
                    907:        
                    908: private old_prcstab(level) {
                    909:        if (!gdebug) return;
                    910: #ifdef STABDOT
                    911:        pstabdot(N_RBRAC, level);
                    912: #else
                    913:        pstab(NULLNAME, N_RBRAC);
                    914:        printf("0,%d,LL%d\n", level, labelno);
                    915:        printf("LL%d:\n", labelno++);
                    916: #endif
                    917:        }
                    918:        
                    919: private old_pfstab(sname) 
                    920: char *sname; {
                    921:        if (!gdebug) return;
                    922:        pstab(sname, N_FUN);
                    923: #ifndef FLEXNAMES
                    924:        printf("0,%d,_%.7s\n", lineno, sname);
                    925: #else
                    926:        printf("0,%d,_%s\n", lineno, sname);
                    927: #endif
                    928: }

unix.superglobalmegacorp.com

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