Annotation of 42BSD/ucb/pascal/src/lab.c, revision 1.1.1.1

1.1       root        1: /* Copyright (c) 1979 Regents of the University of California */
                      2: 
                      3: static char sccsid[] = "@(#)lab.c 1.17 2/1/83";
                      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:     static bool        label_order = FALSE;
                     24:     static bool        label_seen = FALSE;
                     25: #ifdef PC
                     26:        char    extname[ BUFSIZ ];
                     27: #endif PC
                     28: #ifndef PI0
                     29:        register *ll;
                     30:        register struct nl *p, *lp;
                     31: 
                     32:        lp = NIL;
                     33: #else
                     34:        send(REVLAB, r);
                     35: #endif
                     36:        if ( ! progseen ) {
                     37:            level1();
                     38:        }
                     39:        line = l;
                     40: #ifndef PI1
                     41:        if (parts[ cbn ] & (CPRT|TPRT|VPRT|RPRT)){
                     42:            if ( opt( 's' ) ) {
                     43:                standard();
                     44:                error("Label declarations should precede const, type, var and routine declarations");
                     45:            } else {
                     46:                if ( !label_order ) {
                     47:                    label_order = TRUE;
                     48:                    warning();
                     49:                    error("Label declarations should precede const, type, var and routine declarations");
                     50:                }
                     51:            }
                     52:        }
                     53:        if (parts[ cbn ] & LPRT) {
                     54:            if ( opt( 's' ) ) {
                     55:                standard();
                     56:                error("All labels should be declared in one label part");
                     57:            } else {
                     58:                if ( !label_seen ) {
                     59:                    label_seen = TRUE;
                     60:                    warning();
                     61:                    error("All labels should be declared in one label part");
                     62:                }
                     63:            }
                     64:        }
                     65:        parts[ cbn ] |= LPRT;
                     66: #endif
                     67: #ifndef PI0
                     68:        for (ll = r; ll != NIL; ll = ll[2]) {
                     69:                l = getlab();
                     70:                p = enter(defnl(ll[1], LABEL, 0, l));
                     71:                /*
                     72:                 * Get the label for the eventual target
                     73:                 */
                     74:                p->value[1] = getlab();
                     75:                p->chain = lp;
                     76:                p->nl_flags |= (NFORWD|NMOD);
                     77:                p->value[NL_GOLEV] = NOTYET;
                     78:                p->value[NL_ENTLOC] = l;
                     79:                lp = p;
                     80: #              ifdef OBJ
                     81:                    /*
                     82:                     * This operator is between
                     83:                     * the bodies of two procedures
                     84:                     * and provides a target for
                     85:                     * gotos for this label via TRA.
                     86:                     */
                     87:                    putlab(l);
                     88:                    put(2, O_GOTO | cbn<<8, (long)p->value[1]);
                     89: #              endif OBJ
                     90: #              ifdef PC
                     91:                    /*
                     92:                     *  labels have to be .globl otherwise /lib/c2 may
                     93:                     *  throw them away if they aren't used in the function
                     94:                     *  which defines them.
                     95:                     */
                     96:                    extlabname( extname , p -> symbol , cbn );
                     97:                    putprintf(" .globl  %s", 0, extname);
                     98:                    if ( cbn == 1 ) {
                     99:                        stabglabel( extname , line );
                    100:                    }
                    101: #              endif PC
                    102:        }
                    103:        gotos[cbn] = lp;
                    104: #      ifdef PTREE
                    105:            {
                    106:                pPointer        Labels = LabelDCopy( r );
                    107: 
                    108:                pDEF( PorFHeader[ nesting ] ).PorFLabels = Labels;
                    109:            }
                    110: #      endif PTREE
                    111: #endif
                    112: }
                    113: 
                    114: #ifndef PI0
                    115: /*
                    116:  * Gotoop is called when
                    117:  * we get a statement "goto label"
                    118:  * and generates the needed tra.
                    119:  */
                    120: gotoop(s)
                    121:        char *s;
                    122: {
                    123:        register struct nl *p;
                    124: #ifdef PC
                    125:        char    extname[ BUFSIZ ];
                    126: #endif PC
                    127: 
                    128:        gocnt++;
                    129:        p = lookup(s);
                    130:        if (p == NIL)
                    131:                return (NIL);
                    132: #      ifdef OBJ
                    133:            put(2, O_TRA4, (long)p->value[NL_ENTLOC]);
                    134: #      endif OBJ
                    135: #      ifdef PC
                    136:            if ( cbn == bn ) {
                    137:                    /*
                    138:                     *  local goto.
                    139:                     */
                    140:                extlabname( extname , p -> symbol , bn );
                    141:                    /*
                    142:                     * this is a funny jump because it's to a label that
                    143:                     * has been declared global.
                    144:                     * Although this branch is within this module
                    145:                     * the assembler will complain that the destination
                    146:                     * is a global symbol.
                    147:                     * The complaint arises because the assembler
                    148:                     * doesn't change relative jumps into absolute jumps.
                    149:                     * and this  may cause a branch displacement overflow
                    150:                     * when the module is subsequently linked with
                    151:                     * the rest of the program.
                    152:                     */
                    153: #              ifdef vax
                    154:                    putprintf(" jmp     %s", 0, extname);
                    155: #              endif vax
                    156: #              ifdef mc68000
                    157:                    putprintf(" jra     %s", 0, extname);
                    158: #              endif mc68000
                    159:            } else {
                    160:                    /*
                    161:                     *  Non-local goto.
                    162:                     *
                    163:                     *  Close all active files between top of stack and
                    164:                     *  frame at the destination level. Then call longjmp
                    165:                     *  to unwind the stack to the destination level.
                    166:                     *
                    167:                     *  For nested routines the end of the frame
                    168:                     *  is calculated as:
                    169:                     *      __disply[bn].fp + sizeof(local frame)
                    170:                     *  (adjusted by (sizeof int) to get just past the end).
                    171:                     *  The size of the local frame is dumped out by
                    172:                     *  the second pass as an assembler constant.
                    173:                     *  The main routine may not be compiled in this
                    174:                     *  module, so its size may not be available.
                    175:                     *  However all of its variables will be globally
                    176:                     *  declared, so only the known runtime temporaries
                    177:                     *  will be in its stack frame.
                    178:                     */
                    179:                parts[ bn ] |= NONLOCALGOTO;
                    180:                putleaf( P2ICON , 0 , 0 , ADDTYPE( P2FTN | P2INT , P2PTR )
                    181:                        , "_PCLOSE" );
                    182:                if ( bn > 1 ) {
                    183:                    p = lookup( enclosing[ bn - 1 ] );
                    184:                    sprintf( extname, "%s%d+%d",
                    185:                        FRAME_SIZE_LABEL, p -> value[NL_ENTLOC], sizeof(int));
                    186:                    p = lookup(s);
                    187:                    putLV( extname , bn , 0 , NNLOCAL , P2PTR | P2CHAR );
                    188:                } else {
                    189:                    putLV( 0 , bn , -( DPOFF1 + sizeof( int ) ) , LOCALVAR ,
                    190:                        P2PTR | P2CHAR );
                    191:                }
                    192:                putop( P2CALL , P2INT );
                    193:                putdot( filename , line );
                    194:                putleaf( P2ICON , 0 , 0 , ADDTYPE( P2FTN | P2INT , P2PTR )
                    195:                        , "_longjmp" );
                    196:                putLV( 0 , bn , GOTOENVOFFSET , NLOCAL , P2PTR|P2STRTY );
                    197:                extlabname( extname , p -> symbol , bn );
                    198:                putLV( extname , 0 , 0 , NGLOBAL , P2PTR|P2STRTY );
                    199:                putop( P2LISTOP , P2INT );
                    200:                putop( P2CALL , P2INT );
                    201:                putdot( filename , line );
                    202:            }
                    203: #      endif PC
                    204:        if (bn == cbn)
                    205:                if (p->nl_flags & NFORWD) {
                    206:                        if (p->value[NL_GOLEV] == NOTYET) {
                    207:                                p->value[NL_GOLEV] = level;
                    208:                                p->value[NL_GOLINE] = line;
                    209:                        }
                    210:                } else
                    211:                        if (p->value[NL_GOLEV] == DEAD) {
                    212:                                recovered();
                    213:                                error("Goto %s is into a structured statement", p->symbol);
                    214:                        }
                    215: }
                    216: 
                    217: /*
                    218:  * Labeled is called when a label
                    219:  * definition is encountered, and
                    220:  * marks that it has been found and
                    221:  * patches the associated GOTO generated
                    222:  * by gotoop.
                    223:  */
                    224: labeled(s)
                    225:        char *s;
                    226: {
                    227:        register struct nl *p;
                    228: #ifdef PC
                    229:        char    extname[ BUFSIZ ];
                    230: #endif PC
                    231: 
                    232:        p = lookup(s);
                    233:        if (p == NIL)
                    234:                return (NIL);
                    235:        if (bn != cbn) {
                    236:                error("Label %s not defined in correct block", s);
                    237:                return;
                    238:        }
                    239:        if ((p->nl_flags & NFORWD) == 0) {
                    240:                error("Label %s redefined", s);
                    241:                return;
                    242:        }
                    243:        p->nl_flags &= ~NFORWD;
                    244: #      ifdef OBJ
                    245:            patch4(p->value[NL_ENTLOC]);
                    246: #      endif OBJ
                    247: #      ifdef PC
                    248:            extlabname( extname , p -> symbol , bn );
                    249:            putprintf( "%s:" , 0 , extname );
                    250: #      endif PC
                    251:        if (p->value[NL_GOLEV] != NOTYET)
                    252:                if (p->value[NL_GOLEV] < level) {
                    253:                        recovered();
                    254:                        error("Goto %s from line %d is into a structured statement", s, p->value[NL_GOLINE]);
                    255:                }
                    256:        p->value[NL_GOLEV] = level;
                    257: }
                    258: #endif
                    259: 
                    260: #ifdef PC
                    261:     /*
                    262:      * construct the long name of a label based on it's static nesting.
                    263:      * into a caller-supplied buffer (that should be about BUFSIZ big).
                    264:      */
                    265: extlabname( buffer , name , level )
                    266:     char       buffer[];
                    267:     char       *name;
                    268:     int                level;
                    269: {
                    270:     char       *starthere;
                    271:     int                i;
                    272: 
                    273:     starthere = &buffer[0];
                    274:     for ( i = 1 ; i < level ; i++ ) {
                    275:        sprintf( starthere , EXTFORMAT , enclosing[ i ] );
                    276:        starthere += strlen( enclosing[ i ] ) + 1;
                    277:     }
                    278:     sprintf( starthere , EXTFORMAT , "" );
                    279:     starthere += 1;
                    280:     sprintf( starthere , LABELFORMAT , name );
                    281:     starthere += strlen( name ) + 1;
                    282:     if ( starthere >= &buffer[ BUFSIZ ] ) {
                    283:        panic( "extlabname" );
                    284:     }
                    285: }
                    286: #endif PC

unix.superglobalmegacorp.com

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