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

unix.superglobalmegacorp.com

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