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

unix.superglobalmegacorp.com

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