Annotation of 42BSD/ucb/pascal/src/stab.c, revision 1.1

1.1     ! root        1: /* Copyright (c) 1980 Regents of the University of California */
        !             2: 
        !             3: static char sccsid[] = "@(#)stab.c 1.9 7/26/83";
        !             4: 
        !             5:     /*
        !             6:      * procedures to put out sdb symbol table information.
        !             7:      * and stabs for separate compilation type checking.
        !             8:      * these use the new .stabs, .stabn, and .stabd directives
        !             9:      */
        !            10: 
        !            11: #include       "whoami.h"
        !            12: #ifdef PC
        !            13:     /* and the rest of the file */
        !            14: #   include    "0.h"
        !            15: #   include    "objfmt.h"
        !            16: #   include    "yy.h"
        !            17: #   include    <stab.h>
        !            18: 
        !            19:     /*
        !            20:      *  additional symbol definition for <stab.h>
        !            21:      * that is used by the separate compilation facility --
        !            22:      * eventually, <stab.h> should be updated to include this 
        !            23:      */
        !            24: 
        !            25: #   include    "pstab.h"
        !            26: #   include    "pc.h"
        !            27: 
        !            28:     /*
        !            29:      * absolute value: line numbers are negative if error recovery.
        !            30:      */
        !            31: #define        ABS( x )        ( x < 0 ? -x : x )
        !            32: 
        !            33:     /*
        !            34:      * global variables
        !            35:      */
        !            36: stabgvar( name , type , offset , length , line )
        !            37:     char       *name;
        !            38:     int                type;
        !            39:     int                offset;
        !            40:     int                length;
        !            41:     int                line;
        !            42:     {
        !            43: 
        !            44:            /*
        !            45:             *  for separate compilation
        !            46:             */
        !            47:        putprintf( "    .stabs  \"%s\",0x%x,0,0x%x,0x%x" , 0 
        !            48:                    , name , N_PC , N_PGVAR , ABS( line ) );
        !            49:            /*
        !            50:             *  for sdb
        !            51:             */
        !            52:        if ( ! opt('g') ) {
        !            53:                return;
        !            54:        }
        !            55:        putprintf( "    .stabs  \"" , 1 );
        !            56:        putprintf( NAMEFORMAT , 1 , name );
        !            57:        putprintf( "\",0x%x,0,0x%x,0" , 0 , N_GSYM , type );
        !            58:        putprintf( "    .stabs  \"" , 1 );
        !            59:        putprintf( NAMEFORMAT , 1 , name );
        !            60:        putprintf( "\",0x%x,0,0,0x%x" , 0 , N_LENG , length );
        !            61: }
        !            62: 
        !            63:     /*
        !            64:      * local variables
        !            65:      */
        !            66: stablvar( name , type , level , offset , length )
        !            67:     char       *name;
        !            68:     int                type;
        !            69:     int                level;
        !            70:     int                offset;
        !            71:     int                length;
        !            72:     {
        !            73: 
        !            74:        if ( ! opt('g') ) {
        !            75:                return;
        !            76:        }
        !            77:        putprintf( "    .stabs  \"" , 1 );
        !            78:        putprintf( NAMEFORMAT , 1 , name );
        !            79:        putprintf( "\",0x%x,0,0x%x,0x%x" , 0 , N_LSYM , type , -offset );
        !            80:        putprintf( "    .stabs  \"" , 1 );
        !            81:        putprintf( NAMEFORMAT , 1 , name );
        !            82:        putprintf( "\",0x%x,0,0,0x%x" , 0 , N_LENG , length );
        !            83: }
        !            84: 
        !            85: 
        !            86:     /*
        !            87:      * parameters
        !            88:      */
        !            89: stabparam( name , type , offset , length )
        !            90:     char       *name;
        !            91:     int                type;
        !            92:     int                offset;
        !            93:     int                length;
        !            94:     {
        !            95:        
        !            96:        if ( ! opt('g') ) {
        !            97:                return;
        !            98:        }
        !            99:        putprintf( "    .stabs  \"" , 1 );
        !           100:        putprintf( NAMEFORMAT , 1 , name );
        !           101:        putprintf( "\",0x%x,0,0x%x,0x%x" , 0 , N_PSYM , type , offset );
        !           102:        putprintf( "    .stabs  \"" , 1 );
        !           103:        putprintf( NAMEFORMAT , 1 , name );
        !           104:        putprintf( "\",0x%x,0,0,0x%x" , 0 , N_LENG , length );
        !           105:     }
        !           106: 
        !           107:     /*
        !           108:      * fields
        !           109:      */
        !           110: stabfield( name , type , offset , length )
        !           111:     char       *name;
        !           112:     int                type;
        !           113:     int                offset;
        !           114:     int                length;
        !           115:     {
        !           116:        
        !           117:        if ( ! opt('g') ) {
        !           118:                return;
        !           119:        }
        !           120:        putprintf( "    .stabs  \"" , 1 );
        !           121:        putprintf( NAMEFORMAT , 1 , name );
        !           122:        putprintf( "\",0x%x,0,0x%x,0x%x" , 0 , N_SSYM , type , offset );
        !           123:        putprintf( "    .stabs  \"" , 1 );
        !           124:        putprintf( NAMEFORMAT , 1 , name );
        !           125:        putprintf( "\",0x%x,0,0,0x%x" , 0 , N_LENG , length );
        !           126:     }
        !           127: 
        !           128:     /*
        !           129:      * left brackets
        !           130:      */
        !           131: stablbrac( level )
        !           132:     int        level;
        !           133:     {
        !           134: 
        !           135:        if ( ! opt('g') ) {
        !           136:                return;
        !           137:        }
        !           138:        putprintf( "    .stabd  0x%x,0,0x%x" , 0 , N_LBRAC , level );
        !           139:     }
        !           140: 
        !           141:     /*
        !           142:      * right brackets
        !           143:      */
        !           144: stabrbrac( level )
        !           145:     int        level;
        !           146:     {
        !           147: 
        !           148:        if ( ! opt('g') ) {
        !           149:                return;
        !           150:        }
        !           151:        putprintf( "    .stabd  0x%x,0,0x%x" , 0 , N_RBRAC , level );
        !           152:     }
        !           153: 
        !           154:     /*
        !           155:      * functions
        !           156:      */
        !           157: stabfunc( name , typeclass , line , level )
        !           158:     char       *name;
        !           159:     int                typeclass;
        !           160:     int                line;
        !           161:     long       level;
        !           162:     {
        !           163:        int     type;
        !           164:        long    i;
        !           165:        char    extname[ BUFSIZ ];
        !           166: 
        !           167:            /*
        !           168:             *  for separate compilation
        !           169:             */
        !           170:        if ( level == 1 ) {
        !           171:            if ( typeclass == FUNC ) {
        !           172:                putprintf( "    .stabs  \"%s\",0x%x,0,0x%x,0x%x" , 0 
        !           173:                            , name , N_PC , N_PGFUNC , ABS( line ) );
        !           174:            } else if ( typeclass == PROC ) {
        !           175:                putprintf( "    .stabs  \"%s\",0x%x,0,0x%x,0x%x" , 0 
        !           176:                            , name , N_PC , N_PGPROC , ABS( line ) );
        !           177:            }
        !           178:        }
        !           179:            /*
        !           180:             *  for sdb
        !           181:             */
        !           182:        if ( ! opt('g') ) {
        !           183:                return;
        !           184:        }
        !           185:        putprintf( "    .stabs  \"" , 1 );
        !           186:        putprintf( NAMEFORMAT , 1 , name );
        !           187:        sextname( extname , name , level );
        !           188:        putprintf( "\",0x%x,0,0x%x,%s" , 0 , N_FUN , line , extname );
        !           189:     }
        !           190: 
        !           191:     /*
        !           192:      * source line numbers
        !           193:      */
        !           194: stabline( line )
        !           195:     int        line;
        !           196:     {
        !           197:        if ( ! opt('g') ) {
        !           198:                return;
        !           199:        }
        !           200:        putprintf( "    .stabd  0x%x,0,0x%x" , 0 , N_SLINE , ABS( line ) );
        !           201:     }
        !           202: 
        !           203:     /*
        !           204:      * source files
        !           205:      */
        !           206: stabsource(filename)
        !           207:     char       *filename;
        !           208: {
        !           209:     int                label;
        !           210:     
        !           211:        /*
        !           212:         *      for separate compilation
        !           213:         */
        !           214:     putprintf("        .stabs  \"%s\",0x%x,0,0x%x,0x%x", 0,
        !           215:            filename, N_PC, N_PSO, N_FLAGCHECKSUM);
        !           216:        /*
        !           217:         *      for sdb
        !           218:         */
        !           219:     if ( ! opt('g') ) {
        !           220:            return;
        !           221:     }
        !           222:     label = getlab();
        !           223:     putprintf( "       .stabs  \"" , 1 );
        !           224:     putprintf( NAMEFORMAT , 1 , filename );
        !           225:     putprintf( "\",0x%x,0,0," , 1 , N_SO );
        !           226:     putprintf( PREFIXFORMAT , 0 , LLABELPREFIX , label );
        !           227:     putprintf( PREFIXFORMAT , 1 , LLABELPREFIX , label );
        !           228:     putprintf( ":" , 0 );
        !           229: }
        !           230: 
        !           231:     /*
        !           232:      * included files get one or more of these:
        !           233:      * one as they are entered by a #include,
        !           234:      * and one every time they are returned to from nested #includes.
        !           235:      */
        !           236: stabinclude(filename, firsttime)
        !           237:     char       *filename;
        !           238:     bool       firsttime;
        !           239: {
        !           240:     int        label;
        !           241:     long       check;
        !           242:     
        !           243:        /*
        !           244:         *      for separate compilation
        !           245:         */
        !           246:     if (firsttime) {
        !           247:        check = checksum(filename);
        !           248:     } else {
        !           249:        check = N_FLAGCHECKSUM;
        !           250:     }
        !           251:     putprintf("        .stabs  \"%s\",0x%x,0,0x%x,0x%x", 0,
        !           252:            filename, N_PC, N_PSOL, check);
        !           253:        /*
        !           254:         *      for sdb
        !           255:         */
        !           256:     if ( ! opt('g') ) {
        !           257:            return;
        !           258:     }
        !           259:     label = getlab();
        !           260:     putprintf( "       .stabs  \"" , 1 );
        !           261:     putprintf( NAMEFORMAT , 1 , filename );
        !           262:     putprintf( "\",0x%x,0,0," , 1 , N_SOL );
        !           263:     putprintf( PREFIXFORMAT , 0 , LLABELPREFIX , label );
        !           264:     putprintf( PREFIXFORMAT , 1 , LLABELPREFIX , label );
        !           265:     putprintf( ":" , 0 );
        !           266: }
        !           267: 
        !           268:     /*
        !           269:      * anyone know a good checksum for ascii files?
        !           270:      * this does a rotate-left and then exclusive-or's in the character.
        !           271:      * also, it avoids returning checksums of 0.
        !           272:      * The rotate is implemented by shifting and adding back the
        !           273:      * sign bit when negative.
        !           274:      */
        !           275: long
        !           276: checksum(filename)
        !           277:     char       *filename;
        !           278: {
        !           279:     FILE               *filep;
        !           280:     register int       input;
        !           281:     register long      check;
        !           282: 
        !           283:     filep = fopen(filename, "r");
        !           284:     if (filep == NULL) {
        !           285:        perror(filename);
        !           286:        pexit(DIED);
        !           287:     }
        !           288:     check = 0;
        !           289:     while ((input = getc(filep)) != EOF) {
        !           290:        if (check < 0) {
        !           291:            check <<= 1;
        !           292:            check += 1;
        !           293:        } else {
        !           294:            check <<= 1;
        !           295:        }
        !           296:        check ^= input;
        !           297:     }
        !           298:     fclose(filep);
        !           299:     if ((unsigned) check <= N_FLAGCHECKSUM) {
        !           300:        return N_FLAGCHECKSUM + 1;
        !           301:     } else {
        !           302:        return check;
        !           303:     }
        !           304: }
        !           305: 
        !           306: /*
        !           307:  * global Pascal symbols :
        !           308:  *   labels, types, constants, and external procedure and function names:
        !           309:  *   These are used by the separate compilation facility
        !           310:  *   to be able to check for disjoint header files.
        !           311:  */
        !           312: 
        !           313:     /*
        !           314:      * global labels
        !           315:      */
        !           316: stabglabel( label , line )
        !           317:     char       *label;
        !           318:     int                line;
        !           319:     {
        !           320: 
        !           321:        putprintf( "    .stabs  \"%s\",0x%x,0,0x%x,0x%x" , 0 
        !           322:                    , label , N_PC , N_PGLABEL , ABS( line ) );
        !           323:     }
        !           324: 
        !           325:     /*
        !           326:      * global constants
        !           327:      */
        !           328: stabgconst( const , line )
        !           329:     char       *const;
        !           330:     int                line;
        !           331:     {
        !           332: 
        !           333:            putprintf( "        .stabs  \"%s\",0x%x,0,0x%x,0x%x" , 0 
        !           334:                        , const , N_PC , N_PGCONST , ABS( line ) );
        !           335:     }
        !           336: 
        !           337:     /*
        !           338:      * global types
        !           339:      */
        !           340: stabgtype( type , line )
        !           341:     char       *type;
        !           342:     int                line;
        !           343:     {
        !           344: 
        !           345:            putprintf( "        .stabs  \"%s\",0x%x,0,0x%x,0x%x" , 0 
        !           346:                        , type , N_PC , N_PGTYPE , ABS( line ) );
        !           347:     }
        !           348: 
        !           349: 
        !           350:     /*
        !           351:      * external functions and procedures
        !           352:      */        
        !           353: stabefunc( name , typeclass , line )
        !           354:     char       *name;
        !           355:     int                typeclass;
        !           356:     int                line;
        !           357:     {
        !           358:        int     type;
        !           359: 
        !           360:        if ( typeclass == FUNC ) {
        !           361:            type = N_PEFUNC;
        !           362:        } else if ( typeclass == PROC ) {
        !           363:            type = N_PEPROC;
        !           364:        } else {
        !           365:            return;
        !           366:        }
        !           367:        putprintf( "    .stabs  \"%s\",0x%x,0,0x%x,0x%x" , 0 
        !           368:                    , name , N_PC , type , ABS( line ) );
        !           369:     }
        !           370: 
        !           371: #endif PC

unix.superglobalmegacorp.com

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