Annotation of 43BSD/usr.bin/f77/src/f77pass1/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.2 (Berkeley) 1/10/86";
                      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 5.3  86/01/10  17:12:58  donn
                     23:  * Add junk to handle PARAMETER variables.
                     24:  * 
                     25:  * Revision 5.2  86/01/10  13:51:31  donn
                     26:  * Changes to produce correct stab information for logical and logical*2 types
                     27:  * (from Jerry Berkman) plus changes for dummy procedures.
                     28:  * 
                     29:  * Revision 5.1  85/08/10  03:50:06  donn
                     30:  * 4.3 alpha
                     31:  * 
                     32:  * Revision 1.2  85/02/02  01:30:09  donn
                     33:  * Don't put the 'program' name into the file; it only confuses dbx, sigh.
                     34:  * 
                     35:  */
                     36: 
                     37: #include "defs.h"
                     38: 
                     39: #include <sys/types.h>
                     40: #include <a.out.h>
                     41: #include <stab.h>
                     42: 
                     43: #define public
                     44: #define private static
                     45: #define and &&
                     46: #define or ||
                     47: #define not !
                     48: #define div /
                     49: #define mod %
                     50: #define nil 0
                     51: 
                     52: typedef enum { false, true } Boolean;
                     53: 
                     54: static char asmline[128];
                     55: int len;
                     56: extern char *malloc();
                     57: 
                     58: prstab(s, code, type, loc)
                     59: char *s, *loc;
                     60: int code, type;
                     61: {
                     62:     char *locout;
                     63: 
                     64:     if (sdbflag) {
                     65:        locout = (loc == nil) ? "0" : loc;
                     66:        if (s == nil) {
                     67:            sprintf(asmline, "\t.stabn\t0x%x,0,0x%x,%s\n", code, type, locout);
                     68:        } else {
                     69:            sprintf(asmline, "\t.stabs\t\"%s\",0x%x,0,0x%x,%s\n", s, code, type,
                     70:                locout);
                     71:        }
                     72:         p2pass( asmline );
                     73:     }
                     74: }
                     75: 
                     76: filenamestab(s)
                     77: char *s;
                     78: {
                     79:    sprintf(asmline,"\t.stabs\t\"%s\",0x%x,0,0,0\n", s, N_SO);
                     80:    p2pass( asmline );
                     81: }
                     82: 
                     83: linenostab(lineno)
                     84: int lineno;
                     85: {
                     86:    sprintf(asmline,"\t.stabd\t0x%x,0,%d\n", N_SLINE, lineno);
                     87:    p2pass( asmline );
                     88: }
                     89: 
                     90: /*
                     91:  * Generate information for an entry point
                     92:  */
                     93: 
                     94: public entrystab(p,class)
                     95: register struct Entrypoint *p;
                     96: int class;
                     97: {
                     98: int et;
                     99: Namep q;
                    100: 
                    101:   switch(class) {
                    102:     case CLMAIN: 
                    103:         et=writestabtype(TYSUBR);
                    104:        sprintf(asmline, "\t.stabs\t\"MAIN:F%2d\",0x%x,0,0,L%d\n",
                    105:                                et,N_FUN,p->entrylabel);
                    106:        p2pass(asmline);
                    107:        break;
                    108:        
                    109:      case CLBLOCK:     /* May need to something with block data LATER */
                    110:        break;
                    111: 
                    112:      default :
                    113:        if( (q=p->enamep) == nil) fatal("entrystab has no nameblock");
                    114:        sprintf(asmline, "\t.stabs\t\"%s:F", varstr(VL,q->varname));
                    115:        len = strlen(asmline);
                    116:        /* when insufficient information is around assume TYSUBR; enddcl
                    117:           will fill this in*/
                    118:        if(q->vtype == TYUNKNOWN || (q->vtype == TYCHAR && q->vleng == nil) ){
                    119:            sprintf(asmline+len, "%2d", writestabtype(TYSUBR));
                    120:        }
                    121:         else addtypeinfo(q);
                    122:        len += strlen(asmline+len);
                    123:        sprintf(asmline+len, "\",0x%x,0,0,L%d\n",N_FUN,p->entrylabel);
                    124:        p2pass(asmline);
                    125:         break;
                    126:    }
                    127: }
                    128: 
                    129: /*
                    130:  * Generate information for a symbol table (name block ) entry.
                    131:  */
                    132: 
                    133: public namestab(sym)
                    134: Namep sym;
                    135: {
                    136:     register Namep p;
                    137:     char *varname, *classname;
                    138:     expptr ep;
                    139:     char buf[100];
                    140:     Boolean ignore;
                    141:     int vartype;
                    142: 
                    143:        ignore = false;
                    144:        p = sym;
                    145:        if(!p->vdcldone) return;
                    146:        vartype = p->vtype;
                    147:        varname = varstr(VL, p->varname);
                    148:        switch (p->vclass) {
                    149:            case CLPARAM:       /* parameter (constant) */
                    150:                classname = buf;
                    151:                if ((ep = ((struct Paramblock *) p)->paramval) &&
                    152:                    ep->tag == TCONST) {
                    153:                  switch(ep->constblock.vtype) {
                    154:                    case TYLONG:
                    155:                    case TYSHORT:
                    156:                    case TYLOGICAL:
                    157:                    case TYADDR:
                    158:                      sprintf(buf, "c=i%d", ep->constblock.const.ci);
                    159:                      break;
                    160:                    case TYREAL:
                    161:                    case TYDREAL:
                    162:                      sprintf(buf, "c=r%f", ep->constblock.const.cd[0]);
                    163:                      break;
                    164:                    default:
                    165:                      /* punt */
                    166:                      ignore = true;
                    167:                      break;
                    168:                  }
                    169:                } else {
                    170:                  ignore = true;
                    171:                }
                    172:                break;
                    173: 
                    174:            case CLVAR:         /* variable */
                    175:            case CLUNKNOWN:   
                    176:                if(p->vstg == STGARG) classname = "v";
                    177:                else classname = "V";
                    178:                break;
                    179: 
                    180:            case CLPROC:        /* external or function or subroutine */
                    181:                if(p->vstg == STGARG) {
                    182:                    classname = "v";
                    183:                    break;
                    184:                }
                    185:                /* FALL THROUGH */
                    186:            case CLMAIN:        /* main program */
                    187:            case CLENTRY:       /* secondary entry point */
                    188:            case CLBLOCK:       /* block data name*/
                    189:                ignore = true;  /* these are put out by entrystab */
                    190:                break;
                    191: 
                    192: 
                    193:        }
                    194:        if (not ignore) {
                    195:            sprintf(asmline, "\t.stabs\t\"%s:%s", varname, classname);
                    196:            len = strlen(asmline);
                    197:             addtypeinfo(p);
                    198:            len += strlen(asmline+len);
                    199:            switch(p->vstg) {
                    200: 
                    201:              case STGUNKNOWN :
                    202:              case STGCONST :
                    203:              case STGEXT :
                    204:              case STGINTR :
                    205:              case STGSTFUNCT :
                    206:              case STGLENG :
                    207:              case STGNULL :
                    208:              case STGREG :
                    209:              case STGINIT :
                    210:                  if (p->vclass == CLPARAM) {
                    211:                      /* these have zero storage class for some reason */
                    212:                      sprintf(asmline+len, "\",0x%x,0,0,0\n", N_LSYM);
                    213:                      break;
                    214:                  }
                    215:                  sprintf(asmline+len,
                    216:                  "\",0x%x,0,0,0 /* don't know how to calc loc for stg %d*/ \n",
                    217:                               N_LSYM,p->vstg);
                    218:                  break;
                    219: 
                    220:              case STGARG :
                    221:                  sprintf(asmline+len,"\",0x%x,0,0,%d \n",
                    222:                              N_PSYM,p->vardesc.varno + ARGOFFSET );
                    223:                  break;
                    224: 
                    225:              case STGCOMMON :
                    226:                  sprintf(asmline+len, "\",0x%x,0,0,%d\n", 
                    227:                       N_GSYM, p->voffset);
                    228:                  break;
                    229: 
                    230:              case STGBSS :
                    231:                  sprintf(asmline+len, "\",0x%x,0,0,v.%d\n",
                    232:                         (p->inlcomm ? N_LCSYM : N_STSYM), 
                    233:                          p->vardesc.varno);
                    234:                  break;
                    235: 
                    236:              case STGEQUIV :
                    237:                  sprintf(asmline+len, "\",0x%x,0,0,%s + %d \n",
                    238:                         (p->inlcomm ? N_LCSYM : N_STSYM) , 
                    239:                          memname(STGEQUIV,p->vardesc.varno),(p->voffset)) ;
                    240:                  break;
                    241: 
                    242:              case STGAUTO :
                    243:                  sprintf(asmline+len, "\",0x%x,0,0,-%d \n",
                    244:                        N_LSYM, p->voffset);
                    245: 
                    246:            }
                    247:            p2pass(asmline);       
                    248:        }
                    249: }
                    250: 
                    251: static typenum[NTYPES+1]; /* has the given type already been defined ?*/
                    252: 
                    253: private writestabtype(type)
                    254: int type;
                    255: {
                    256:  char asmline[130];
                    257:  static char *typename[NTYPES+1] = {
                    258:  "unknown", "addr", "integer*2", "integer", "real", "double precision",
                    259:  "complex", "double complex", "logical", "char", "void", "error", "logical*2" };
                    260: 
                    261:  static int typerange[NTYPES+1] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };
                    262: 
                    263:  /* compare with typesize[] in init.c */
                    264:  static int typebounds[2] [NTYPES+1] ={
                    265:  /* "unknown", "addr","integer*2", "integer",    "real", "double precision", */
                    266:     { 0      ,   0   ,   -32768,    -2147483648,   4,       8,
                    267:  /* "complex", "d-complex", "logical", "char", "void", "error", "logical*2" */
                    268:       8,         16,          4,        0,       0,      0,       2 },
                    269:  /* "unknown", "addr","integer*2", "integer",    "real", "double precision", */
                    270:     { 0  ,       -1,      32767,    2147483647,    0,       0,
                    271:  /* "complex", "d-complex", "logical", "char", "void", "error", "logical*2" */
                    272:       0,         0,           0,        127,     0,      0,       0 }
                    273:  };
                    274:                     
                    275: 
                    276:     if (type < 0 || type > NTYPES)
                    277:        badtype("writestabtype",type);
                    278: 
                    279:     /* substitute "logical*2" for "logical" when "-i2" compiler flag used */
                    280:     if (type == TYLOGICAL && tylogical == TYSHORT)
                    281:        type = NTYPES;
                    282: 
                    283:     if (typenum[type]) return(typenum[type]);
                    284:     typenum[type] = type;
                    285:     sprintf(asmline, "\t.stabs\t\"%s:t%d=r%d;%ld;%ld;\",0x%x,0,0,0 \n", 
                    286:        typename[type], type, typerange[type], typebounds[0][type], 
                    287:         typebounds[1][type], N_GSYM) ;
                    288:     p2pass(asmline);
                    289:     return(typenum[type]);
                    290: }
                    291: 
                    292: 
                    293: private getbasenum(p)
                    294: Namep p;
                    295: {
                    296: 
                    297:   int t;
                    298: 
                    299:   if (p->vclass == CLPROC && p->vstg == STGARG)
                    300:     t = TYADDR;
                    301:   else
                    302:     t = p->vtype;
                    303: 
                    304:   if (t < TYADDR || t > TYSUBR)
                    305:     dclerr("can't get dbx basetype information",p);
                    306: 
                    307:   if (p->vtype == TYCHAR || p->vdim != nil)
                    308:     writestabtype(TYINT);
                    309:   return(writestabtype(t));
                    310: }
                    311: 
                    312: /*
                    313:  * Generate debugging information for the given type of the given symbol.
                    314:  */
                    315: 
                    316: private addtypeinfo(sym)
                    317: Namep sym;
                    318: {
                    319:     Namep p;
                    320:     int i,tnum;
                    321:     char lb[20],ub[20];
                    322: 
                    323:     p = sym;
                    324:     if (p->tag != TNAME) badtag("addtypeinfo",p->tag);
                    325:     if (p->vclass == CLPARAM)
                    326:        return;
                    327: 
                    328:     tnum = getbasenum(p);
                    329:     if(p->vdim != (struct Dimblock *) ENULL) {
                    330:     
                    331:       for (i = p->vdim->ndim-1; i >=0 ; --i) { 
                    332:          if(p->vdim->dims[i].lbaddr == ENULL) {
                    333:              sprintf(lb,"%d", p->vdim->dims[i].lb->constblock.const.ci);
                    334:         }
                    335:         else  { 
                    336:              sprintf(lb,"T%d", p->vdim->dims[i].lbaddr->addrblock.memoffset->constblock.const.ci);
                    337:          }
                    338:          if(p->vdim->dims[i].ubaddr == ENULL) {
                    339:              sprintf(ub,"%d",p->vdim->dims[i].ub->constblock.const.ci);
                    340:         }
                    341:         else  {
                    342:              sprintf(ub,"T%d",p->vdim->dims[i].ubaddr->addrblock.memoffset->constblock.const.ci);
                    343:          }
                    344:                 sprintf(asmline+len, "ar%d;%s;%s;", TYINT, lb, ub);
                    345:         len += strlen(asmline+len);
                    346:      }
                    347:    }
                    348:     if (p->vtype == TYCHAR) {
                    349:     /* character type always an array(1:?) */
                    350:         if( ! (p->vleng ) )
                    351:            fatalstr("missing length in addtypeinfo for character variable %s", varstr(p->varname));
                    352: 
                    353:         if (ISCONST(p->vleng)) sprintf(ub,"%d",p->vleng->constblock.const.ci);
                    354:          else sprintf(ub,"A%d",p->vleng->addrblock.memno + ARGOFFSET);
                    355: 
                    356:        sprintf(asmline+len,"ar%d;1;%s;", TYINT, ub);
                    357:        len += strlen(asmline+len);
                    358:     }
                    359:     sprintf(asmline+len, "%d",tnum);
                    360: }

unix.superglobalmegacorp.com

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