Annotation of 41BSD/cmd/pi/lab.c, revision 1.1

1.1     ! root        1: /* Copyright (c) 1979 Regents of the University of California */
        !             2: 
        !             3: static char sccsid[] = "@(#)lab.c 1.5 10/14/80";
        !             4: 
        !             5: #include "whoami.h"
        !             6: #include "0.h"
        !             7: #include "tree.h"
        !             8: #include "opcode.h"
        !             9: #include "objfmt.h"
        !            10: #ifdef PC
        !            11: #   include    "pc.h"
        !            12: #   include    "pcops.h"
        !            13: #endif PC
        !            14: 
        !            15: /*
        !            16:  * Label enters the definitions
        !            17:  * of the label declaration part
        !            18:  * into the namelist.
        !            19:  */
        !            20: label(r, l)
        !            21:        int *r, l;
        !            22: {
        !            23: #ifndef PI0
        !            24:        register *ll;
        !            25:        register struct nl *p, *lp;
        !            26: 
        !            27:        lp = NIL;
        !            28: #else
        !            29:        send(REVLAB, r);
        !            30: #endif
        !            31:        if ( ! progseen ) {
        !            32:            level1();
        !            33:        }
        !            34:        line = l;
        !            35: #ifndef PI1
        !            36:        if (parts[ cbn ] & (CPRT|TPRT|VPRT|RPRT)){
        !            37:            if ( opt( 's' ) ) {
        !            38:                standard();
        !            39:            } else {
        !            40:                warning();
        !            41:            }
        !            42:            error("Label declarations should precede const, type, var and routine declarations");
        !            43:        }
        !            44:        if (parts[ cbn ] & LPRT) {
        !            45:            if ( opt( 's' ) ) {
        !            46:                standard();
        !            47:            } else {
        !            48:                warning();
        !            49:            }
        !            50:            error("All labels should be declared in one label part");
        !            51:        }
        !            52:        parts[ cbn ] |= LPRT;
        !            53: #endif
        !            54: #ifndef PI0
        !            55:        for (ll = r; ll != NIL; ll = ll[2]) {
        !            56:                l = getlab();
        !            57:                p = enter(defnl(ll[1], LABEL, 0, l));
        !            58:                /*
        !            59:                 * Get the label for the eventual target
        !            60:                 */
        !            61:                p->value[1] = getlab();
        !            62:                p->chain = lp;
        !            63:                p->nl_flags |= (NFORWD|NMOD);
        !            64:                p->value[NL_GOLEV] = NOTYET;
        !            65:                p->entloc = l;
        !            66:                lp = p;
        !            67: #              ifdef OBJ
        !            68:                    /*
        !            69:                     * This operator is between
        !            70:                     * the bodies of two procedures
        !            71:                     * and provides a target for
        !            72:                     * gotos for this label via TRA.
        !            73:                     */
        !            74:                    putlab(l);
        !            75:                    put2(O_GOTO | cbn<<8+INDX, p->value[1]);
        !            76: #              endif OBJ
        !            77: #              ifdef PC
        !            78:                    /*
        !            79:                     *  labels have to be .globl otherwise /lib/c2 may
        !            80:                     *  throw them away if they aren't used in the function
        !            81:                     *  which defines them.
        !            82:                     */
        !            83:                    {
        !            84:                        char    extname[ BUFSIZ ];
        !            85:                        char    *starthere;
        !            86:                        int     i;
        !            87: 
        !            88:                        starthere = &extname[0];
        !            89:                        for ( i = 1 ; i < cbn ; i++ ) {
        !            90:                            sprintf( starthere , EXTFORMAT , enclosing[ i ] );
        !            91:                            starthere += strlen( enclosing[ i ] ) + 1;
        !            92:                        }
        !            93:                        sprintf( starthere , EXTFORMAT , p -> symbol );
        !            94:                        starthere += strlen( p -> symbol ) + 1;
        !            95:                        if ( starthere >= &extname[ BUFSIZ ] ) {
        !            96:                            panic( "lab decl namelength" );
        !            97:                        }
        !            98:                        putprintf( "    .globl  " , 1 );
        !            99:                        putprintf( NAMEFORMAT , 0 , extname );
        !           100:                        if ( cbn == 1 ) {
        !           101:                            stabglabel( extname , line );
        !           102:                        }
        !           103:                    }
        !           104: #              endif PC
        !           105:        }
        !           106:        gotos[cbn] = lp;
        !           107: #      ifdef PTREE
        !           108:            {
        !           109:                pPointer        Labels = LabelDCopy( r );
        !           110: 
        !           111:                pDEF( PorFHeader[ nesting ] ).PorFLabels = Labels;
        !           112:            }
        !           113: #      endif PTREE
        !           114: #endif
        !           115: }
        !           116: 
        !           117: #ifndef PI0
        !           118: /*
        !           119:  * Gotoop is called when
        !           120:  * we get a statement "goto label"
        !           121:  * and generates the needed tra.
        !           122:  */
        !           123: gotoop(s)
        !           124:        char *s;
        !           125: {
        !           126:        register struct nl *p;
        !           127: 
        !           128:        gocnt++;
        !           129:        p = lookup(s);
        !           130:        if (p == NIL)
        !           131:                return (NIL);
        !           132: #      ifdef OBJ
        !           133:            put2(O_TRA4, p->entloc);
        !           134: #      endif OBJ
        !           135: #      ifdef PC
        !           136:            if ( cbn != bn ) {
        !           137:                    /*
        !           138:                     *  call goto to unwind the stack to the destination level
        !           139:                     */
        !           140:                putleaf( P2ICON , 0 , 0 , ADDTYPE( P2FTN | P2INT , P2PTR )
        !           141:                        , "_GOTO" );
        !           142:                putLV( DISPLAYNAME , 0 , bn * sizeof( struct dispsave )
        !           143:                        , P2PTR | P2INT );
        !           144:                putop( P2CALL , P2INT );
        !           145:                putdot( filename , line );
        !           146:            }
        !           147:            {
        !           148:                char    extname[ BUFSIZ ];
        !           149:                char    *starthere;
        !           150:                int     i;
        !           151: 
        !           152:                starthere = &extname[0];
        !           153:                for ( i = 1 ; i < bn ; i++ ) {
        !           154:                    sprintf( starthere , EXTFORMAT , enclosing[ i ] );
        !           155:                    starthere += strlen( enclosing[ i ] ) + 1;
        !           156:                }
        !           157:                sprintf( starthere , EXTFORMAT , p -> symbol );
        !           158:                starthere += strlen( p -> symbol ) + 1;
        !           159:                if ( starthere >= &extname[ BUFSIZ ] ) {
        !           160:                    panic( "goto namelength" );
        !           161:                }
        !           162:                putprintf( "    jbr     " , 1 );
        !           163:                putprintf( NAMEFORMAT , 0 , extname );
        !           164:            }
        !           165: #      endif PC
        !           166:        if (bn == cbn)
        !           167:                if (p->nl_flags & NFORWD) {
        !           168:                        if (p->value[NL_GOLEV] == NOTYET) {
        !           169:                                p->value[NL_GOLEV] = level;
        !           170:                                p->value[NL_GOLINE] = line;
        !           171:                        }
        !           172:                } else
        !           173:                        if (p->value[NL_GOLEV] == DEAD) {
        !           174:                                recovered();
        !           175:                                error("Goto %s is into a structured statement", p->symbol);
        !           176:                        }
        !           177: }
        !           178: 
        !           179: /*
        !           180:  * Labeled is called when a label
        !           181:  * definition is encountered, and
        !           182:  * marks that it has been found and
        !           183:  * patches the associated GOTO generated
        !           184:  * by gotoop.
        !           185:  */
        !           186: labeled(s)
        !           187:        char *s;
        !           188: {
        !           189:        register struct nl *p;
        !           190: 
        !           191:        p = lookup(s);
        !           192:        if (p == NIL)
        !           193:                return (NIL);
        !           194:        if (bn != cbn) {
        !           195:                error("Label %s not defined in correct block", s);
        !           196:                return;
        !           197:        }
        !           198:        if ((p->nl_flags & NFORWD) == 0) {
        !           199:                error("Label %s redefined", s);
        !           200:                return;
        !           201:        }
        !           202:        p->nl_flags &= ~NFORWD;
        !           203: #      ifdef OBJ
        !           204:            patch4(p->entloc);
        !           205: #      endif OBJ
        !           206: #      ifdef PC
        !           207:            {
        !           208:                char    extname[ BUFSIZ ];
        !           209:                char    *starthere;
        !           210:                int     i;
        !           211: 
        !           212:                starthere = &extname[0];
        !           213:                for ( i = 1 ; i < bn ; i++ ) {
        !           214:                    sprintf( starthere , EXTFORMAT , enclosing[ i ] );
        !           215:                    starthere += strlen( enclosing[ i ] ) + 1;
        !           216:                }
        !           217:                sprintf( starthere , EXTFORMAT , p -> symbol );
        !           218:                starthere += strlen( p -> symbol ) + 1;
        !           219:                if ( starthere >= &extname[ BUFSIZ ] ) {
        !           220:                    panic( "labeled namelength" );
        !           221:                }
        !           222:                putprintf( NAMEFORMAT , 1 , extname );
        !           223:                putprintf( ":" , 0 );
        !           224:            }
        !           225: #      endif PC
        !           226:        if (p->value[NL_GOLEV] != NOTYET)
        !           227:                if (p->value[NL_GOLEV] < level) {
        !           228:                        recovered();
        !           229:                        error("Goto %s from line %d is into a structured statement", s, p->value[NL_GOLINE]);
        !           230:                }
        !           231:        p->value[NL_GOLEV] = level;
        !           232: }
        !           233: #endif

unix.superglobalmegacorp.com

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