Annotation of 43BSDReno/pgrm/f77/pass1.tahoe/stab.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1980 Regents of the University of California.
                      3:  * All rights reserved.  The Berkeley software License Agreement
                      4:  * specifies the terms and conditions for redistribution.
                      5:  */
                      6: 
                      7: #ifndef lint
                      8: static char sccsid[] = "@(#)stab.c     5.1 (Berkeley) 6/7/85";
                      9: #endif not lint
                     10: 
                     11: /*
                     12:  * stab.c
                     13:  *
                     14:  * Symbolic debugging info interface for the f77 compiler.
                     15:  *
                     16:  * Here we generate pseudo-ops that cause the assembler to put
                     17:  * symbolic debugging information into the object file.
                     18:  *
                     19:  * University of Utah CS Dept modification history:
                     20:  *
                     21:  * $Log:       stab.c,v $
                     22:  * Revision 1.2  85/02/02  01:30:09  donn
                     23:  * Don't put the 'program' name into the file; it only confuses dbx, sigh.
                     24:  * 
                     25:  */
                     26: 
                     27: #include "defs.h"
                     28: 
                     29: #include <sys/types.h>
                     30: #include <a.out.h>
                     31: #include <stab.h>
                     32: 
                     33: #define public
                     34: #define private static
                     35: #define and &&
                     36: #define or ||
                     37: #define not !
                     38: #define div /
                     39: #define mod %
                     40: #define nil 0
                     41: 
                     42: typedef enum { false, true } Boolean;
                     43: 
                     44: static char asmline[128];
                     45: int len;
                     46: extern char *malloc();
                     47: 
                     48: prstab(s, code, type, loc)
                     49: char *s, *loc;
                     50: int code, type;
                     51: {
                     52:     char *locout;
                     53: 
                     54:     if (sdbflag) {
                     55:        locout = (loc == nil) ? "0" : loc;
                     56:        if (s == nil) {
                     57:            sprintf(asmline, "\t.stabn\t0x%x,0,0x%x,%s\n", code, type, locout);
                     58:        } else {
                     59:            sprintf(asmline, "\t.stabs\t\"%s\",0x%x,0,0x%x,%s\n", s, code, type,
                     60:                locout);
                     61:        }
                     62:         p2pass( asmline );
                     63:     }
                     64: }
                     65: 
                     66: filenamestab(s)
                     67: char *s;
                     68: {
                     69:    sprintf(asmline,"\t.stabs\t\"%s\",0x%x,0,0,0\n", s, N_SO);
                     70:    p2pass( asmline );
                     71: }
                     72: 
                     73: linenostab(lineno)
                     74: int lineno;
                     75: {
                     76:    sprintf(asmline,"\t.stabd\t0x%x,0,%d\n", N_SLINE, lineno);
                     77:    p2pass( asmline );
                     78: }
                     79: 
                     80: /*
                     81:  * Generate information for an entry point
                     82:  */
                     83: 
                     84: public entrystab(p,class)
                     85: register struct Entrypoint *p;
                     86: int class;
                     87: {
                     88: int et;
                     89: Namep q;
                     90: 
                     91:   switch(class) {
                     92:     case CLMAIN: 
                     93:         et=writestabtype(TYSUBR);
                     94:        sprintf(asmline, "\t.stabs\t\"MAIN:F%2d\",0x%x,0,0,L%d\n",
                     95:                                et,N_FUN,p->entrylabel);
                     96:        p2pass(asmline);
                     97:        break;
                     98:        
                     99:      case CLBLOCK:     /* May need to something with block data LATER */
                    100:        break;
                    101: 
                    102:      default :
                    103:        if( (q=p->enamep) == nil) fatal("entrystab has no nameblock");
                    104:        sprintf(asmline, "\t.stabs\t\"%s:F", varstr(VL,q->varname));
                    105:        len = strlen(asmline);
                    106:        /* when insufficient information is around assume TYSUBR; enddcl
                    107:           will fill this in*/
                    108:        if(q->vtype == TYUNKNOWN || (q->vtype == TYCHAR && q->vleng == nil) ){
                    109:            sprintf(asmline+len, "%2d", writestabtype(TYSUBR));
                    110:        }
                    111:         else addtypeinfo(q);
                    112:        len += strlen(asmline+len);
                    113:        sprintf(asmline+len, "\",0x%x,0,0,L%d\n",N_FUN,p->entrylabel);
                    114:        p2pass(asmline);
                    115:         break;
                    116:    }
                    117: }
                    118: 
                    119: /*
                    120:  * Generate information for a symbol table (name block ) entry.
                    121:  */
                    122: 
                    123: public namestab(sym)
                    124: Namep sym;
                    125: {
                    126:     register Namep p;
                    127:     char *varname, *classname;
                    128:     Boolean ignore;
                    129:     int vartype;
                    130: 
                    131:        ignore = false;
                    132:        p = sym;
                    133:        if(!p->vdcldone) return;
                    134:        vartype = p->vtype;
                    135:        varname = varstr(VL, p->varname);
                    136:        switch (p->vclass) {
                    137:            case CLPARAM:       /* parameter (constant) */
                    138:                classname = "c";
                    139:                break;
                    140: 
                    141:            case CLVAR:         /* variable */
                    142:            case CLUNKNOWN:   
                    143:                if(p->vstg == STGARG) classname = "v";
                    144:                else classname = "V";
                    145:                break;
                    146: 
                    147:            case CLMAIN:        /* main program */
                    148:            case CLENTRY:       /* secondary entry point */
                    149:            case CLBLOCK:       /* block data name*/
                    150:            case CLPROC:        /* external or function or subroutine */
                    151:                ignore = true;  /* these are put out by entrystab */
                    152:                break;
                    153: 
                    154: 
                    155:        }
                    156:        if (not ignore) {
                    157:            sprintf(asmline, "\t.stabs\t\"%s:%s", varname, classname);
                    158:            len = strlen(asmline);
                    159:             addtypeinfo(p);
                    160:            len += strlen(asmline+len);
                    161:            switch(p->vstg) {
                    162: 
                    163:              case STGUNKNOWN :
                    164:              case STGCONST :
                    165:              case STGEXT :
                    166:              case STGINTR :
                    167:              case STGSTFUNCT :
                    168:              case STGLENG :
                    169:              case STGNULL :
                    170:              case STGREG :
                    171:              case STGINIT :
                    172:                  sprintf(asmline+len,
                    173:                  "\",0x%x,0,0,0 /* don't know how to calc loc for stg %d*/ \n",
                    174:                               N_LSYM,p->vstg);
                    175:                  break;
                    176: 
                    177:              case STGARG :
                    178:                  sprintf(asmline+len,"\",0x%x,0,0,%d \n",
                    179:                              N_PSYM,p->vardesc.varno + ARGOFFSET );
                    180:                  break;
                    181: 
                    182:              case STGCOMMON :
                    183:                  sprintf(asmline+len, "\",0x%x,0,0,%d\n", 
                    184:                       N_GSYM, p->voffset);
                    185:                  break;
                    186: 
                    187:              case STGBSS :
                    188:                  sprintf(asmline+len, "\",0x%x,0,0,v.%d\n",
                    189:                         (p->inlcomm ? N_LCSYM : N_STSYM), 
                    190:                          p->vardesc.varno);
                    191:                  break;
                    192: 
                    193:              case STGEQUIV :
                    194:                  sprintf(asmline+len, "\",0x%x,0,0,%s + %d \n",
                    195:                         (p->inlcomm ? N_LCSYM : N_STSYM) , 
                    196:                          memname(STGEQUIV,p->vardesc.varno),(p->voffset)) ;
                    197:                  break;
                    198: 
                    199:              case STGAUTO :
                    200:                  sprintf(asmline+len, "\",0x%x,0,0,-%d \n",
                    201:                        N_LSYM, p->voffset);
                    202: 
                    203:            }
                    204:            p2pass(asmline);       
                    205:        }
                    206: }
                    207: 
                    208: static typenum[NTYPES]; /* has the given type already been defined ?*/
                    209: 
                    210: private writestabtype(type)
                    211: int type;
                    212: {
                    213:  char asmline[130];
                    214:  static char *typename[NTYPES] =
                    215:  { "unknown", "addr","integer*2", "integer", "real", "double precision",
                    216:    "complex", "double complex", "logical", "char", "void", "error" };
                    217: 
                    218:  static int typerange[NTYPES] = { 0, 3, 2, 3, 4, 5, 6, 7, 3, 9, 10, 11 };
                    219: 
                    220:  /* compare with typesize[] in init.c */
                    221:  static int typebounds[2] [NTYPES] ={
                    222:  /* "unknown", "addr","integer*2", "integer",    "real", "double precision", */
                    223:     { 0      ,   0   ,   -32768,    -2147483648,   4,       8,
                    224:  /* "complex", "double complex", "logical", "char", "void", "error" }; */
                    225:       8,         16,               0,        0,       0,          0 },
                    226:  /* "unknown", "addr","integer*2", "integer",    "real", "double precision", */
                    227:     { 0  ,       -1,      32767,    2147483647,   0,         0,
                    228:  /* "complex", "double complex", "logical", "char", "void", "error" }; */
                    229:       0,         0,               1,        127,       0,          0 }
                    230:  };
                    231:                     
                    232: 
                    233:  if( type < 0 || type > NTYPES) badtype("writestabtype",type);
                    234: 
                    235:     if (typenum[type]) return(typenum[type]);
                    236:     typenum[type] = type;
                    237:     sprintf(asmline, "\t.stabs\t\"%s:t%d=r%d;%ld;%ld;\",0x%x,0,0,0 \n", 
                    238:        typename[type], type, typerange[type], typebounds[0][type], 
                    239:         typebounds[1][type], N_GSYM) ;
                    240:     p2pass(asmline);
                    241:     return(typenum[type]);
                    242: }
                    243: 
                    244: 
                    245: private getbasenum(p)
                    246: Namep p;
                    247: {
                    248: 
                    249:   int t;
                    250:   t = p->vtype;
                    251:   if( t < TYSHORT || t > TYSUBR)
                    252:   dclerr("can't get dbx basetype information",p);
                    253: 
                    254:   if (p->vtype == TYCHAR || p->vdim != nil ) writestabtype(TYINT);
                    255:   return(writestabtype(t));
                    256: }
                    257: 
                    258: /*
                    259:  * Generate debugging information for the given type of the given symbol.
                    260:  */
                    261: 
                    262: private addtypeinfo(sym)
                    263: Namep sym;
                    264: {
                    265:     Namep p;
                    266:     int i,tnum;
                    267:     char lb[20],ub[20];
                    268: 
                    269:     p = sym;
                    270:     if (p->tag != TNAME) badtag("addtypeinfo",p->tag);
                    271: 
                    272:     tnum = getbasenum(p);
                    273:     if(p->vdim != (struct Dimblock *) ENULL) {
                    274:     
                    275:       for (i = p->vdim->ndim-1; i >=0 ; --i) { 
                    276:          if(p->vdim->dims[i].lbaddr == ENULL) {
                    277:              sprintf(lb,"%d", p->vdim->dims[i].lb->constblock.const.ci);
                    278:         }
                    279:         else  { 
                    280:              sprintf(lb,"T%d", p->vdim->dims[i].lbaddr->addrblock.memoffset->constblock.const.ci);
                    281:          }
                    282:          if(p->vdim->dims[i].ubaddr == ENULL) {
                    283:              sprintf(ub,"%d",p->vdim->dims[i].ub->constblock.const.ci);
                    284:         }
                    285:         else  {
                    286:              sprintf(ub,"T%d",p->vdim->dims[i].ubaddr->addrblock.memoffset->constblock.const.ci);
                    287:          }
                    288:                 sprintf(asmline+len, "ar%d;%s;%s;", TYINT, lb, ub);
                    289:         len += strlen(asmline+len);
                    290:      }
                    291:    }
                    292:     if (p->vtype == TYCHAR) {
                    293:     /* character type always an array(1:?) */
                    294:         if( ! (p->vleng ) )
                    295:            fatalstr("missing length in addtypeinfo for character variable %s", varstr(p->varname));
                    296: 
                    297:         if (ISCONST(p->vleng)) sprintf(ub,"%d",p->vleng->constblock.const.ci);
                    298:          else sprintf(ub,"A%d",p->vleng->addrblock.memno + ARGOFFSET);
                    299: 
                    300:        sprintf(asmline+len,"ar%d;1;%s;", TYINT, ub);
                    301:        len += strlen(asmline+len);
                    302:     }
                    303:     sprintf(asmline+len, "%d",tnum);
                    304: }

unix.superglobalmegacorp.com

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