Annotation of researchv10no/cmd/lcc/gen2/stabbsd.c, revision 1.1.1.1

1.1       root        1: /* C compiler: UNIX code generator
                      2:  *
                      3:  * Outputs `stab' entries for the UNIX dbx debugger,
                      4:  * if -g is specified.
                      5:  */
                      6: 
                      7: static char *currentfile;      /* current file name */
                      8: static int ntypes;
                      9: 
                     10: dclproto(static void stabblock,(int, int, Symbol*));
                     11: dclproto(static void stabfend,(Symbol, int));
                     12: dclproto(static void stabinit,(char *, int, char *[]));
                     13: dclproto(static void stabline,(Coordinate *));
                     14: dclproto(static void stabsym,(Symbol));
                     15: dclproto(static void stabtype,(Symbol));
                     16:        
                     17: dclproto(static void asgncode,(Type, int));
                     18: dclproto(static void dbxout,(Type));
                     19: dclproto(static int dbxtype,(Type));
                     20: dclproto(static int emittype,(Type, int, int));
                     21: 
                     22: /* asgncode - assign type code to ty */
                     23: static void asgncode(ty, lev) Type ty; {
                     24:        if (ty->x.marked || ty->x.typeno)
                     25:                return;
                     26: /*     fprint(2, "asgncode(`%t',%d) ty->x.typeno=0x%x\n", ty, lev, ty->x.typeno); */
                     27:        ty->x.marked = 1;
                     28:        switch (ty->op) {
                     29:        case VOLATILE: case CONST: case VOLATILE+CONST:
                     30:                asgncode(ty->type, lev);
                     31:                ty->x.typeno = ty->type->x.typeno;
                     32:                break;
                     33:        case POINTER: case FUNCTION: case ARRAY:
                     34:                asgncode(ty->type, lev + 1);
                     35:                /* fall thru */
                     36:        case VOID: case CHAR: case SHORT: case INT: case UNSIGNED:
                     37:        case FLOAT: case DOUBLE:
                     38:                break;
                     39:        case STRUCT: case UNION: {
                     40:                Field p;
                     41:                for (p = fieldlist(ty); p; p = p->link)
                     42:                        asgncode(p->type, lev + 1);
                     43:                /* fall thru */
                     44:        case ENUM:
                     45:                if (ty->x.typeno == 0) {
                     46:                        ty->x.typeno = ++ntypes;
                     47: /*                     fprint(2,"`%t'=%d in asgncode\n", ty, ntypes); */
                     48:                }
                     49:                if (lev > 0 && (*ty->u.sym->name < '0' || *ty->u.sym->name > '9'))
                     50:                        dbxout(ty);
                     51:                break;
                     52:                }
                     53:        default:
                     54:                assert(0);
                     55:        }
                     56: }
                     57: 
                     58: /* dbxout - output .stabs entry for type ty */
                     59: static void dbxout(ty) Type ty; {
                     60:        ty = unqual(ty);
                     61:        if (!ty->x.printed) {
                     62:                int col = 0;
                     63:                print(".stabs \""), col += 8;
                     64:                if (ty->u.sym && !(isfunc(ty) || isarray(ty) || isptr(ty)))
                     65:                        print("%s", ty->u.sym->name), col += strlen(ty->u.sym->name);
                     66:                print(":%c", isstruct(ty) || isenum(ty) ? 'T' : 't'), col += 2;
                     67:                emittype(ty, 0, col);
                     68:                print("\",%d,0,0,0\n", N_LSYM);
                     69:        }
                     70: }
                     71: 
                     72: /* dbxtype - emit a stabs entry for type ty, return type code */
                     73: static int dbxtype(ty) Type ty; {
                     74:        asgncode(ty, 0);
                     75:        dbxout(ty);
                     76:        return ty->x.typeno;
                     77: }
                     78: 
                     79: /*
                     80:  * emittype - emit ty's type number, emitting its definition if necessary.
                     81:  * Returns the output column number after emission; col is the approximate
                     82:  * output column before emission and is used to emit continuation lines for long
                     83:  * struct, union, and enum types. Continuations are not emitted for other types,
                     84:  * even if the definition is long. lev is the depth of calls to emittype.
                     85:  */
                     86: static int emittype(ty, lev, col) Type ty; {
                     87:        int tc = ty->x.typeno;
                     88: 
                     89:        if (isconst(ty) || isvolatile(ty)) {
                     90:                col = emittype(ty->type, lev, col);
                     91:                ty->x.typeno = ty->type->x.typeno;
                     92:                ty->x.printed = 1;
                     93:                return col;
                     94:        }
                     95:        if (tc == 0) {
                     96:                ty->x.typeno = tc = ++ntypes;
                     97: /*             fprint(2,"`%t'=%d\n", ty, tc); */
                     98:        }
                     99:        print("%d", tc), col += 3;
                    100:        if (ty->x.printed)
                    101:                return col;
                    102:        ty->x.printed = 1;
                    103:        switch (ty->op) {
                    104:        case VOID:      /* void is defined as itself */
                    105:                print("=%d", tc), col += 1+3;
                    106:                break;
                    107:        case CHAR:      /* unsigned char is a subrange of int */
                    108:                if (ty == unsignedchar)
                    109:                        print("=r1;0;255;"), col += 10;
                    110:                else    /* following pcc, char is a subrange of itself */
                    111:                        print("=r%d;-128;127;", tc), col += 2+3+10;
                    112:                break;
                    113:        case SHORT:     /* short is a subrange of int */
                    114:                if (ty == unsignedshort)
                    115:                        print("=r1;0;65535;"), col += 12;
                    116:                else    /* signed */
                    117:                        print("=r1;-32768;32767;"), col += 17;
                    118:                break;
                    119:        case INT:       /* int is a subrange of itself */
                    120:                print("=r1;%d;%d;", INT_MIN, INT_MAX), col += 4+11+1+10+1;
                    121:                break;
                    122:        case UNSIGNED:  /* unsigned is a subrange of int */
                    123:                print("=r1;0;-1;"), col += 9;
                    124:                break;
                    125:        case FLOAT: case DOUBLE:        /* float, double get sizes instead of ranges */
                    126:                print("=r1;%d;0;", ty->size), col += 4+1+3;
                    127:                break;
                    128:        case POINTER:
                    129:                print("=*"), col += 2;
                    130:                col = emittype(ty->type, lev + 1, col);
                    131:                break;
                    132:        case FUNCTION:
                    133:                print("=f"), col += 2;
                    134:                col = emittype(ty->type, lev + 1, col);
                    135:                break;
                    136:        case ARRAY:     /* array includes subscript as an int range */
                    137:                if (ty->size && ty->type->size)
                    138:                        print("=ar1;0;%d;", ty->size/ty->type->size - 1), col += 7+3+1;
                    139:                else
                    140:                        print("=ar1;0;-1;"), col += 10;
                    141:                col = emittype(ty->type, lev + 1, col);
                    142:                break;
                    143:        case STRUCT: case UNION: {
                    144:                Field p;
                    145: #ifdef sun
                    146:                if (!ty->u.sym->defined) {
                    147:                        print("=x%c%s:", ty->op == STRUCT ? 's' : 'u', ty->u.sym->name);
                    148:                        col += 2+1+strlen(ty->u.sym->name)+1;
                    149:                        break;
                    150:                }
                    151: #endif
                    152:                if (lev > 0 && (*ty->u.sym->name < '0' || *ty->u.sym->name > '9')) {
                    153:                        ty->x.printed = 0;
                    154:                        break;
                    155:                }
                    156:                print("=%c%d", ty->op == STRUCT ? 's' : 'u', ty->size), col += 1+1+3;
                    157:                for (p = fieldlist(ty); p; p = p->link) {
                    158:                        if (p->name)
                    159:                                print("%s:", p->name), col += strlen(p->name)+1;
                    160:                        else
                    161:                                print(":"), col += 1;
                    162:                        col = emittype(p->type, lev + 1, col);
                    163:                        if (p->lsb)
                    164:                                print(",%d,%d;", 8*p->offset +
                    165:                                        (IR->little_endian ? fieldright(p) : fieldleft(p)), 
                    166:                                        fieldsize(p));
                    167:                        else
                    168:                                print(",%d,%d;", 8*p->offset, 8*p->type->size);
                    169:                        col += 1+3+1+3+1;       /* accounts for ,%d,%d; */
                    170: #if mc68020 || mc68030 || sparc
                    171:                        if (col >= 80 && p->link) {
                    172:                                print("\\\\\",%d,0,0,0\n.stabs \"", N_LSYM);
                    173:                                col = 8;
                    174:                        }
                    175: #endif
                    176:                }
                    177:                print(";"), col += 1;
                    178:                break;
                    179:                }
                    180:        case ENUM: {
                    181:                Symbol *p;
                    182:                if (lev > 0 && (*ty->u.sym->name < '0' || *ty->u.sym->name > '9')) {
                    183:                        ty->x.printed = 0;
                    184:                        break;
                    185:                }
                    186:                print("=e"), col += 2;
                    187:                for (p = ty->u.sym->u.idlist; *p; p++) {
                    188:                        print("%s:%d,", (*p)->name, (*p)->u.value), col += strlen((*p)->name)+3;
                    189: #if mc68020 || mc68030 || sparc
                    190:                        if (col >= 80 && p[1]) {
                    191:                                print("\\\\\",%d,0,0,0\n.stabs \"", N_LSYM);
                    192:                                col = 8;
                    193:                        }
                    194: #endif
                    195:                }
                    196:                print(";"), col += 1;
                    197:                break;
                    198:                }
                    199:        default:
                    200:                assert(0);
                    201:        }
                    202:        return col;
                    203: }
                    204: 
                    205: /* stabblock - output a stab entry for '{' or '}' at level lev */
                    206: static void stabblock(brace, lev, p) Symbol *p; {
                    207:        if (brace == '{')
                    208:                while (*p)
                    209:                        stabsym(*p++);
                    210:        print(".stabd 0x%x,0,%d\n", brace == '{' ? N_LBRAC : N_RBRAC, lev);
                    211: }
                    212: 
                    213: /* stabfend - end of function p */
                    214: static void stabfend(p, line) Symbol p; {}
                    215: 
                    216: /* stabinit - initialize stab output */
                    217: static void stabinit(file, argc, argv) char *file, *argv[]; {
                    218:        dclproto(typedef void (*Closure),(Symbol, Generic));
                    219: 
                    220:        if (file && *file) {
                    221:                (*IR->segment)(CODE);
                    222:                print("Ltext:.stabs \"%s\",0x%x,0,0,Ltext\n", file, N_SO);
                    223:                currentfile = file;
                    224:        }
                    225:        stabtype(inttype->u.sym);
                    226:        stabtype(chartype->u.sym);
                    227:        foreach(types, 0, (Closure)stabtype, (Generic)0);
                    228:        foreach(types, GLOBAL, (Closure)stabtype, (Generic)0);
                    229: }
                    230: 
                    231: /* stabline - emit stab entry for source coordinate *cp */
                    232: static void stabline(cp) Coordinate *cp; {
                    233:        if (cp->file && cp->file != currentfile) {
                    234:                int lab = genlabel(1);
                    235:                print("L%d: .stabs \"%s\",0x%x,0,0,L%d\n", lab,
                    236:                                cp->file, N_SOL, lab);
                    237:                currentfile = cp->file;
                    238:        }
                    239:        print(".stabd 0x%x,0,%d\n", N_SLINE, cp->y);
                    240: }
                    241: 
                    242: /* stabsym - output a stab entry for symbol p */
                    243: static void stabsym(p) Symbol p; {
                    244:        int code, tc, sz = p->type->size;
                    245: 
                    246:        if (p->generated || p->computed)
                    247:                return;
                    248:        if (isfunc(p->type)) {
                    249:                print(".stabs \"%s:%c%d\",%d,0,0,%s\n", p->name,
                    250:                        p->sclass == STATIC ? 'f' : 'F', dbxtype(freturn(p->type)),
                    251:                        N_FUN, p->x.name);
                    252:                return;
                    253:        }
                    254:        if (IR->no_argb && p->scope == PARAM && p->structarg) {
                    255:                assert(isptr(p->type) && isstruct(p->type->type));
                    256:                tc = dbxtype(p->type->type);
                    257:                sz = p->type->type->size;
                    258:        } else
                    259:                tc = dbxtype(p->type);
                    260:        if (p->sclass == AUTO && p->scope == GLOBAL || p->sclass == EXTERN) {
                    261:                print(".stabs \"%s:G", p->name);
                    262:                code = N_GSYM;
                    263:        } else if (p->sclass == STATIC) {
                    264:                print(".stabs \"%s:%c%d\",%d,0,0,%s\n", p->name, p->scope == GLOBAL ? 'S' : 'V',
                    265:                        tc, p->u.seg == BSS ? N_LCSYM : N_STSYM, p->x.name);
                    266:                return;
                    267:        } else if (isregvar(p)) {
                    268:                print(".stabs \"%s:r%d\",%d,0,", p->name, tc, N_RSYM);
                    269: #ifdef vax
                    270:                print("0,%s\n", p->x.name);
                    271: #endif
                    272: #if mc68020 || mc68030 || NeXT
                    273:                print("0,%s%s\n", isptr(p->type) ? "8+" : "", p->x.name);
                    274: #endif
                    275: #ifdef sparc
                    276:                { int r = p->x.regvar->x.regnode->regnum;
                    277:                switch (p->x.name[0]) {
                    278:                case 'r': break;
                    279:                case 'f': r += 32; break;
                    280:                default: assert(0);
                    281:                }
                    282:                print("%d,%d\n", sz, r);
                    283:                }
                    284: #endif
                    285:                return;
                    286:        } else if (p->scope == PARAM) {
                    287:                print(".stabs \"%s:p", p->name);
                    288:                code = N_PSYM;
                    289:        } else if (p->scope >= LOCAL) {
                    290:                print(".stabs \"%s:", p->name);
                    291:                code = N_LSYM;
                    292:        } else
                    293:                assert(0);
                    294:        print("%d\",%d,0,0,%s\n", tc, code, p->scope >= PARAM && p->sclass != EXTERN ? p->x.name : "0");
                    295: }
                    296: 
                    297: /* stabtype - output a stab entry for type *p */
                    298: static void stabtype(p) Symbol p; {
                    299:        if (p->type) {
                    300:                if (p->sclass == 0)
                    301:                        dbxtype(p->type);
                    302:                else if (p->sclass == TYPEDEF)
                    303:                        print(".stabs \"%s:t%d\",%d,0,0,0\n", p->name, dbxtype(p->type), N_LSYM);
                    304:        }
                    305: }

unix.superglobalmegacorp.com

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