Annotation of 43BSDTahoe/ucb/pascal/src/fend.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[] = "@(#)fend.c     5.4 (Berkeley) 1/12/87";
        !             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: #include "align.h"
        !            17: #include "tmps.h"
        !            18: 
        !            19: /*
        !            20:  * this array keeps the pxp counters associated with
        !            21:  * functions and procedures, so that they can be output
        !            22:  * when their bodies are encountered
        !            23:  */
        !            24: int    bodycnts[ DSPLYSZ ];
        !            25: 
        !            26: #ifdef PC
        !            27: #   include "pc.h"
        !            28: #   include <pcc.h>
        !            29: #endif PC
        !            30: 
        !            31: #ifdef OBJ
        !            32: int    cntpatch;
        !            33: int    nfppatch;
        !            34: #endif OBJ
        !            35: 
        !            36: #include "tree_ty.h"
        !            37: 
        !            38: struct nl *Fp;
        !            39: int    pnumcnt;
        !            40: /*
        !            41:  * Funcend is called to
        !            42:  * finish a block by generating
        !            43:  * the code for the statements.
        !            44:  * It then looks for unresolved declarations
        !            45:  * of labels, procedures and functions,
        !            46:  * and cleans up the name list.
        !            47:  * For the program, it checks the
        !            48:  * semantics of the program
        !            49:  * statement (yuchh).
        !            50:  */
        !            51: funcend(fp, bundle, endline)
        !            52:        struct nl *fp;
        !            53:        struct tnode *bundle;
        !            54:        int endline;
        !            55: {
        !            56:        register struct nl *p;
        !            57:        register int i, b;
        !            58:        int inp, out;
        !            59:        struct tnode *blk;
        !            60:        bool chkref;
        !            61:        struct nl *iop;
        !            62:        char *cp;
        !            63:        extern int cntstat;
        !            64: #      ifdef PC
        !            65:            struct entry_exit_cookie    eecookie;
        !            66: #      endif PC
        !            67: #      ifndef PC
        !            68:        int var;
        !            69: #      endif PC
        !            70: 
        !            71:        cntstat = 0;
        !            72: /*
        !            73:  *     yyoutline();
        !            74:  */
        !            75:        if (program != NIL)
        !            76:                line = program->value[3];
        !            77:        blk = bundle->stmnt_blck.stmnt_list;
        !            78:        if (fp == NIL) {
        !            79:                cbn--;
        !            80: #              ifdef PTREE
        !            81:                    nesting--;
        !            82: #              endif PTREE
        !            83:                return;
        !            84:        }
        !            85: #ifdef OBJ
        !            86:        /*
        !            87:         * Patch the branch to the entry point of the function.
        !            88:         * Assure alignment of O_BEG structure.
        !            89:         */
        !            90:        if (((int)lc & 02) == 0)
        !            91:                word(0);
        !            92:        patch4((PTR_DCL) fp->value[NL_ENTLOC]);
        !            93:        /*
        !            94:         * Put out the block entrance code and the block name.
        !            95:         * HDRSZE is the number of bytes of info in the static
        !            96:         * BEG data area exclusive of the proc name. It is
        !            97:         * currently defined as:
        !            98:        /*      struct hdr {
        !            99:        /*              long framesze;  /* number of bytes of local vars */
        !           100:        /*              long nargs;     /* number of bytes of arguments */
        !           101:        /*              bool tests;     /* TRUE => perform runtime tests */
        !           102:        /*              short offset;   /* offset of procedure in source file */
        !           103:        /*              char name[1];   /* name of active procedure */
        !           104:        /*      };
        !           105:         */
        !           106: #      define HDRSZE (2 * sizeof(long) + sizeof(short) + sizeof(bool))
        !           107:        var = put(2, ((lenstr(fp->symbol,0) + HDRSZE) << 8)
        !           108:                | (cbn == 1 && opt('p') == 0 ? O_NODUMP: O_BEG), (long)0);
        !           109:            /*
        !           110:             *  output the number of bytes of arguments
        !           111:             *  this is only checked on formal calls.
        !           112:             */
        !           113:        (void) put(2, O_CASE4, cbn == 1 ? (long)0 : (long)(fp->value[NL_OFFS]-DPOFF2));
        !           114:            /*
        !           115:             *  Output the runtime test mode for the routine
        !           116:             */
        !           117:        (void) put(2, sizeof(bool) == 2 ? O_CASE2 : O_CASE4, opt('t') ? TRUE : FALSE);
        !           118:            /*
        !           119:             *  Output line number and routine name
        !           120:             */
        !           121:        (void) put(2, O_CASE2, bundle->stmnt_blck.line_no);
        !           122:        putstr(fp->symbol, 0);
        !           123: #endif OBJ
        !           124: #ifdef PC
        !           125:        /*
        !           126:         * put out the procedure entry code
        !           127:         */
        !           128:        eecookie.nlp = fp;
        !           129:        if ( fp -> class == PROG ) {
        !           130:                /*
        !           131:                 *      If there is a label declaration in the main routine
        !           132:                 *      then there may be a non-local goto to it that does
        !           133:                 *      not appear in this module. We have to assume that
        !           134:                 *      such a reference may occur and generate code to
        !           135:                 *      prepare for it.
        !           136:                 */
        !           137:            if ( parts[ cbn ] & LPRT ) {
        !           138:                parts[ cbn ] |= ( NONLOCALVAR | NONLOCALGOTO );
        !           139:            }
        !           140:            codeformain();
        !           141:            ftnno = fp -> value[NL_ENTLOC];
        !           142:            prog_prologue(&eecookie);
        !           143:            stabline(bundle->stmnt_blck.line_no);
        !           144:            stabfunc(fp, "program", bundle->stmnt_blck.line_no , (long) 0 );
        !           145:        } else {
        !           146:            ftnno = fp -> value[NL_ENTLOC];
        !           147:            fp_prologue(&eecookie);
        !           148:            stabline(bundle->stmnt_blck.line_no);
        !           149:            stabfunc(fp, fp->symbol, bundle->stmnt_blck.line_no,
        !           150:                (long)(cbn - 1));
        !           151:            for ( p = fp -> chain ; p != NIL ; p = p -> chain ) {
        !           152:                stabparam( p , p -> value[ NL_OFFS ] , (int) lwidth(p->type));
        !           153:            }
        !           154:            if ( fp -> class == FUNC ) {
        !           155:                    /*
        !           156:                     *  stab the function variable
        !           157:                     */
        !           158:                p = fp -> ptr[ NL_FVAR ];
        !           159:                stablvar( p , p -> value[ NL_OFFS ] , (int) lwidth( p -> type));
        !           160:            }
        !           161:                /*
        !           162:                 *      stab local variables
        !           163:                 *      rummage down hash chain links.
        !           164:                 */
        !           165:            for ( i = 0 ; i <= 077 ; i++ ) {
        !           166:                for ( p = disptab[ i ] ; p != NIL ; p = p->nl_next) {
        !           167:                    if ( ( p -> nl_block & 037 ) != cbn ) {
        !           168:                        break;
        !           169:                    }
        !           170:                    /*
        !           171:                     *  stab locals (not parameters)
        !           172:                     */
        !           173:                    if ( p -> symbol != NIL ) {
        !           174:                        if ( p -> class == VAR && p -> value[ NL_OFFS ] < 0 ) {
        !           175:                            stablvar( p , p -> value[ NL_OFFS ] ,
        !           176:                                (int) lwidth( p -> type ) );
        !           177:                        } else if ( p -> class == CONST ) {
        !           178:                            stabconst( p );
        !           179:                        }
        !           180:                    }
        !           181:                }
        !           182:            }
        !           183:        }
        !           184:        stablbrac( cbn );
        !           185:            /*
        !           186:             *  ask second pass to allocate known locals
        !           187:             */
        !           188:        putlbracket(ftnno, &sizes[cbn]);
        !           189:        fp_entrycode(&eecookie);
        !           190: #endif PC
        !           191:        if ( monflg ) {
        !           192:                if ( fp -> value[ NL_CNTR ] != 0 ) {
        !           193:                        inccnt( fp -> value [ NL_CNTR ] );
        !           194:                }
        !           195:                inccnt( bodycnts[ fp -> nl_block & 037 ] );
        !           196:        }
        !           197:        if (fp->class == PROG) {
        !           198:                /*
        !           199:                 * The glorious buffers option.
        !           200:                 *          0 = don't buffer output
        !           201:                 *          1 = line buffer output
        !           202:                 *          2 = 512 byte buffer output
        !           203:                 */
        !           204: #              ifdef OBJ
        !           205:                    if (opt('b') != 1)
        !           206:                            (void) put(1, O_BUFF | opt('b') << 8);
        !           207: #              endif OBJ
        !           208: #              ifdef PC
        !           209:                    if ( opt( 'b' ) != 1 ) {
        !           210:                        putleaf( PCC_ICON , 0 , 0
        !           211:                                , PCCM_ADDTYPE( PCCTM_FTN | PCCT_INT , PCCTM_PTR ) , "_BUFF" );
        !           212:                        putleaf( PCC_ICON , opt( 'b' ) , 0 , PCCT_INT , (char *) 0 );
        !           213:                        putop( PCC_CALL , PCCT_INT );
        !           214:                        putdot( filename , line );
        !           215:                    }
        !           216: #              endif PC
        !           217:                inp = 0;
        !           218:                out = 0;
        !           219:                for (p = fp->chain; p != NIL; p = p->chain) {
        !           220:                        if (pstrcmp(p->symbol, input->symbol) == 0) {
        !           221:                                inp++;
        !           222:                                continue;
        !           223:                        }
        !           224:                        if (pstrcmp(p->symbol, output->symbol) == 0) {
        !           225:                                out++;
        !           226:                                continue;
        !           227:                        }
        !           228:                        iop = lookup1(p->symbol);
        !           229:                        if (iop == NIL || bn != cbn) {
        !           230:                                error("File %s listed in program statement but not declared", p->symbol);
        !           231:                                continue;
        !           232:                        }
        !           233:                        if (iop->class != VAR) {
        !           234:                                error("File %s listed in program statement but declared as a %s", p->symbol, classes[iop->class]);
        !           235:                                continue;
        !           236:                        }
        !           237:                        if (iop->type == NIL)
        !           238:                                continue;
        !           239:                        if (iop->type->class != FILET) {
        !           240:                                error("File %s listed in program statement but defined as %s",
        !           241:                                        p->symbol, nameof(iop->type));
        !           242:                                continue;
        !           243:                        }
        !           244: #                      ifdef OBJ
        !           245:                            (void) put(2, O_CON24, text(iop->type) ? 0 : width(iop->type->type));
        !           246:                            i = lenstr(p->symbol,0);
        !           247:                            (void) put(2, O_CON24, i);
        !           248:                            (void) put(2, O_LVCON, i);
        !           249:                            putstr(p->symbol, 0);
        !           250:                            (void) put(2, O_LV | bn<<8+INDX, (int)iop->value[NL_OFFS]);
        !           251:                            (void) put(1, O_DEFNAME);
        !           252: #                      endif OBJ
        !           253: #                      ifdef PC
        !           254:                            putleaf( PCC_ICON , 0 , 0
        !           255:                                    , PCCM_ADDTYPE( PCCTM_FTN | PCCT_INT , PCCTM_PTR )
        !           256:                                    , "_DEFNAME" );
        !           257:                            putLV( p -> symbol , bn , iop -> value[NL_OFFS] ,
        !           258:                                    iop -> extra_flags , p2type( iop ) );
        !           259:                            putCONG( p -> symbol , strlen( p -> symbol )
        !           260:                                    , LREQ );
        !           261:                            putop( PCC_CM , PCCT_INT );
        !           262:                            putleaf( PCC_ICON , strlen( p -> symbol )
        !           263:                                    , 0 , PCCT_INT , (char *) 0 );
        !           264:                            putop( PCC_CM , PCCT_INT );
        !           265:                            putleaf( PCC_ICON
        !           266:                                , text(iop->type) ? 0 : width(iop->type->type)
        !           267:                                , 0 , PCCT_INT , (char *) 0 );
        !           268:                            putop( PCC_CM , PCCT_INT );
        !           269:                            putop( PCC_CALL , PCCT_INT );
        !           270:                            putdot( filename , line );
        !           271: #                      endif PC
        !           272:                }
        !           273:        }
        !           274:        /*
        !           275:         * Process the prog/proc/func body
        !           276:         */
        !           277:        noreach = FALSE;
        !           278:        line = bundle->stmnt_blck.line_no;
        !           279:        statlist(blk);
        !           280: #      ifdef PTREE
        !           281:            {
        !           282:                pPointer Body = tCopy( blk );
        !           283: 
        !           284:                pDEF( PorFHeader[ nesting -- ] ).PorFBody = Body;
        !           285:            }
        !           286: #      endif PTREE
        !           287: #      ifdef OBJ
        !           288:            if (cbn== 1 && monflg != FALSE) {
        !           289:                    patchfil((PTR_DCL) (cntpatch - 2), (long)cnts, 2);
        !           290:                    patchfil((PTR_DCL) (nfppatch - 2), (long)pfcnt, 2);
        !           291:            }
        !           292: #      endif OBJ
        !           293: #      ifdef PC
        !           294:            if ( fp -> class == PROG && monflg ) {
        !           295:                putleaf( PCC_ICON , 0 , 0 , PCCM_ADDTYPE( PCCTM_FTN | PCCT_INT , PCCTM_PTR )
        !           296:                        , "_PMFLUSH" );
        !           297:                putleaf( PCC_ICON , cnts , 0 , PCCT_INT , (char *) 0 );
        !           298:                putleaf( PCC_ICON , pfcnt , 0 , PCCT_INT , (char *) 0 );
        !           299:                putop( PCC_CM , PCCT_INT );
        !           300:                putLV( PCPCOUNT , 0 , 0 , NGLOBAL , PCCT_INT );
        !           301:                putop( PCC_CM , PCCT_INT );
        !           302:                putop( PCC_CALL , PCCT_INT );
        !           303:                putdot( filename , line );
        !           304:            }
        !           305: #      endif PC
        !           306:        /*
        !           307:         * Clean up the symbol table displays and check for unresolves
        !           308:         */
        !           309:        line = endline;
        !           310:        if (fp->class == PROG && inp == 0 && (input->nl_flags & (NUSED|NMOD)) != 0) {
        !           311:                recovered();
        !           312:                error("Input is used but not defined in the program statement");
        !           313:        }
        !           314:        if (fp->class == PROG && out == 0 && (output->nl_flags & (NUSED|NMOD)) != 0) {
        !           315:                recovered();
        !           316:                error("Output is used but not defined in the program statement");
        !           317:        }
        !           318:        b = cbn;
        !           319:        Fp = fp;
        !           320:        chkref = (syneflg == errcnt[cbn] && opt('w') == 0)?TRUE:FALSE;
        !           321:        for (i = 0; i <= 077; i++) {
        !           322:                for (p = disptab[i]; p != NIL && (p->nl_block & 037) == b; p = p->nl_next) {
        !           323:                        /*
        !           324:                         * Check for variables defined
        !           325:                         * but not referenced 
        !           326:                         */
        !           327:                        if (chkref && p->symbol != NIL)
        !           328:                        switch (p->class) {
        !           329:                                case FIELD:
        !           330:                                        /*
        !           331:                                         * If the corresponding record is
        !           332:                                         * unused, we shouldn't complain about
        !           333:                                         * the fields.
        !           334:                                         */
        !           335:                                default:
        !           336:                                        if ((p->nl_flags & (NUSED|NMOD)) == 0) {
        !           337:                                                warning();
        !           338:                                                nerror("%s %s is neither used nor set", classes[p->class], p->symbol);
        !           339:                                                break;
        !           340:                                        }
        !           341:                                        /*
        !           342:                                         * If a var parameter is either
        !           343:                                         * modified or used that is enough.
        !           344:                                         */
        !           345:                                        if (p->class == REF)
        !           346:                                                continue;
        !           347: #                                      ifdef OBJ
        !           348:                                            if ((p->nl_flags & NUSED) == 0) {
        !           349:                                                warning();
        !           350:                                                nerror("%s %s is never used", classes[p->class], p->symbol);
        !           351:                                                break;
        !           352:                                            }
        !           353: #                                      endif OBJ
        !           354: #                                      ifdef PC
        !           355:                                            if (((p->nl_flags & NUSED) == 0) && ((p->extra_flags & NEXTERN) == 0)) {
        !           356:                                                warning();
        !           357:                                                nerror("%s %s is never used", classes[p->class], p->symbol);
        !           358:                                                break;
        !           359:                                            }
        !           360: #                                      endif PC
        !           361:                                        if ((p->nl_flags & NMOD) == 0) {
        !           362:                                                warning();
        !           363:                                                nerror("%s %s is used but never set", classes[p->class], p->symbol);
        !           364:                                                break;
        !           365:                                        }
        !           366:                                case LABEL:
        !           367:                                case FVAR:
        !           368:                                case BADUSE:
        !           369:                                        break;
        !           370:                        }
        !           371:                        switch (p->class) {
        !           372:                                case BADUSE:
        !           373:                                        cp = "s";
        !           374:                                        /* This used to say ud_next
        !           375:                                           that is not a member of nl so
        !           376:                                           i changed it to nl_next,
        !           377:                                           which may be wrong */
        !           378:                                        if (p->chain->nl_next == NIL)
        !           379:                                                cp++;
        !           380:                                        eholdnl();
        !           381:                                        if (p->value[NL_KINDS] & ISUNDEF)
        !           382:                                                nerror("%s undefined on line%s", p->symbol, cp);
        !           383:                                        else
        !           384:                                                nerror("%s improperly used on line%s", p->symbol, cp);
        !           385:                                        pnumcnt = 10;
        !           386:                                        pnums((struct udinfo *) p->chain);
        !           387:                                        pchr('\n');
        !           388:                                        break;
        !           389: 
        !           390:                                case FUNC:
        !           391:                                case PROC:
        !           392: #                                      ifdef OBJ
        !           393:                                            if ((p->nl_flags & NFORWD))
        !           394:                                                nerror("Unresolved forward declaration of %s %s", classes[p->class], p->symbol);
        !           395: #                                      endif OBJ
        !           396: #                                      ifdef PC
        !           397:                                            if ((p->nl_flags & NFORWD) && ((p->extra_flags & NEXTERN) == 0))
        !           398:                                                nerror("Unresolved forward declaration of %s %s", classes[p->class], p->symbol);
        !           399: #                                      endif PC
        !           400:                                        break;
        !           401: 
        !           402:                                case LABEL:
        !           403:                                        if (p->nl_flags & NFORWD)
        !           404:                                                nerror("label %s was declared but not defined", p->symbol);
        !           405:                                        break;
        !           406:                                case FVAR:
        !           407:                                        if ((p->nl_flags & NMOD) == 0)
        !           408:                                                nerror("No assignment to the function variable");
        !           409:                                        break;
        !           410:                        }
        !           411:                }
        !           412:                /*
        !           413:                 * Pop this symbol
        !           414:                 * table slot
        !           415:                 */
        !           416:                disptab[i] = p;
        !           417:        }
        !           418: 
        !           419: #      ifdef OBJ
        !           420:            (void) put(1, O_END);
        !           421: #      endif OBJ
        !           422: #      ifdef PC
        !           423:            fp_exitcode(&eecookie);
        !           424:            stabrbrac(cbn);
        !           425:            putrbracket(ftnno);
        !           426:            fp_epilogue(&eecookie);
        !           427:            if (fp -> class != PROG) {
        !           428:                fp_formalentry(&eecookie);
        !           429:            }
        !           430:                /*
        !           431:                 *      declare pcp counters, if any
        !           432:                 */
        !           433:            if ( monflg && fp -> class == PROG ) {
        !           434:                putprintf( "    .data" , 0 );
        !           435:                aligndot(PCCT_INT);
        !           436:                putprintf( "    .comm   " , 1 );
        !           437:                putprintf( PCPCOUNT , 1 );
        !           438:                putprintf( ",%d" , 0 , ( cnts + 1 ) * sizeof (long) );
        !           439:                putprintf( "    .text" , 0 );
        !           440:            }
        !           441: #      endif PC
        !           442: #ifdef DEBUG
        !           443:        dumpnl(fp->ptr[2], (int) fp->symbol);
        !           444: #endif
        !           445: 
        !           446: #ifdef OBJ
        !           447:        /*
        !           448:         * save the namelist for the debugger pdx
        !           449:         */
        !           450: 
        !           451:        savenl(fp->ptr[2], (int) fp->symbol);
        !           452: #endif
        !           453: 
        !           454:        /*
        !           455:         * Restore the
        !           456:         * (virtual) name list
        !           457:         * position
        !           458:         */
        !           459:        nlfree(fp->ptr[2]);
        !           460:        /*
        !           461:         * Proc/func has been
        !           462:         * resolved
        !           463:         */
        !           464:        fp->nl_flags &= ~NFORWD;
        !           465:        /*
        !           466:         * Patch the beg
        !           467:         * of the proc/func to
        !           468:         * the proper variable size
        !           469:         */
        !           470:        if (Fp == NIL)
        !           471:                elineon();
        !           472: #      ifdef OBJ
        !           473:            patchfil((PTR_DCL) var,
        !           474:                roundup(-sizes[cbn].om_max, (long) A_STACK), 2);
        !           475: #      endif OBJ
        !           476:        cbn--;
        !           477:        if (inpflist(fp->symbol)) {
        !           478:                opop('l');
        !           479:        }
        !           480: }
        !           481: 
        !           482: #ifdef PC
        !           483:     /*
        !           484:      * construct the long name of a function based on it's static nesting.
        !           485:      * into a caller-supplied buffer (that should be about BUFSIZ big).
        !           486:      */
        !           487: sextname( buffer , name , level )
        !           488:     char       buffer[];
        !           489:     char       *name;
        !           490:     int                level;
        !           491: {
        !           492:     char       *starthere;
        !           493:     int        i;
        !           494: 
        !           495:     starthere = &buffer[0];
        !           496:     for ( i = 1 ; i < level ; i++ ) {
        !           497:        sprintf( starthere , EXTFORMAT , enclosing[ i ] );
        !           498:        starthere += strlen( enclosing[ i ] ) + 1;
        !           499:     }
        !           500:     sprintf( starthere , EXTFORMAT , name );
        !           501:     starthere += strlen( name ) + 1;
        !           502:     if ( starthere >= &buffer[ BUFSIZ ] ) {
        !           503:        panic( "sextname" );
        !           504:     }
        !           505: }
        !           506: 
        !           507:     /*
        !           508:      * code for main()
        !           509:      */
        !           510: #ifdef vax
        !           511: 
        !           512: codeformain()
        !           513: {
        !           514:     putprintf("        .text" , 0 );
        !           515:     putprintf("        .align  1" , 0 );
        !           516:     putprintf("        .globl  _main" , 0 );
        !           517:     putprintf("_main:" , 0 );
        !           518:     putprintf("        .word   0" , 0 );
        !           519:     if ( opt ( 't' ) ) {
        !           520:        putprintf("     pushl   $1" , 0 );
        !           521:     } else {
        !           522:        putprintf("     pushl   $0" , 0 );
        !           523:     }
        !           524:     putprintf("        calls   $1,_PCSTART" , 0 );
        !           525:     putprintf("        movl    4(ap),__argc" , 0 );
        !           526:     putprintf("        movl    8(ap),__argv" , 0 );
        !           527:     putprintf("        calls   $0,_program" , 0 );
        !           528:     putprintf("        pushl   $0" , 0 );
        !           529:     putprintf("        calls   $1,_PCEXIT" , 0 );
        !           530: }
        !           531: #endif vax
        !           532: 
        !           533: #ifdef tahoe
        !           534: codeformain()
        !           535: {
        !           536:     putprintf("        .text" , 0 );
        !           537:     putprintf("        .align  1" , 0 );
        !           538:     putprintf("        .globl  _main" , 0 );
        !           539:     putprintf("_main:" , 0 );
        !           540:     putprintf("        .word   0" , 0 );
        !           541:     if ( opt ( 't' ) ) {
        !           542:        putprintf("     pushl   $1" , 0 );
        !           543:     } else {
        !           544:        putprintf("     pushl   $0" , 0 );
        !           545:     }
        !           546:     putprintf("        callf   $8,_PCSTART" , 0 );
        !           547:     putprintf("        movl    4(fp),__argc" , 0 );
        !           548:     putprintf("        movl    8(fp),__argv" , 0 );
        !           549:     putprintf("        callf   $4,_program" , 0 );
        !           550:     putprintf("        pushl   $0" , 0 );
        !           551:     putprintf("        callf   $8,_PCEXIT" , 0 );
        !           552: }
        !           553: #endif tahoe
        !           554: 
        !           555:     /*
        !           556:      * prologue for the program.
        !           557:      * different because it
        !           558:      *         doesn't have formal entry point
        !           559:      */
        !           560: #if defined(vax) || defined(tahoe) 
        !           561: prog_prologue(eecookiep)
        !           562:     struct entry_exit_cookie   *eecookiep;
        !           563: {
        !           564:     putprintf("        .text" , 0 );
        !           565:     putprintf("        .align  1" , 0 );
        !           566:     putprintf("        .globl  _program" , 0 );
        !           567:     putprintf("_program:" , 0 );
        !           568:        /*
        !           569:         *      register save mask
        !           570:         */
        !           571:     eecookiep -> savlabel = (int) getlab();
        !           572:     putprintf("        .word   %s%d", 0, (int) SAVE_MASK_LABEL , eecookiep -> savlabel );
        !           573: }
        !           574: 
        !           575: fp_prologue(eecookiep)
        !           576:     struct entry_exit_cookie   *eecookiep;
        !           577: {
        !           578: 
        !           579:     sextname( eecookiep -> extname, eecookiep -> nlp -> symbol , cbn - 1 );
        !           580:     putprintf( "       .text" , 0 );
        !           581:     putprintf( "       .align  1" , 0 );
        !           582:     putprintf( "       .globl  %s%s", 0, (int) FORMALPREFIX, (int) eecookiep -> extname );
        !           583:     putprintf( "       .globl  %s" , 0 , (int) eecookiep -> extname );
        !           584:     putprintf( "%s:" , 0 , (int) eecookiep -> extname );
        !           585:        /*
        !           586:         *      register save mask
        !           587:         */
        !           588:     eecookiep -> savlabel = (int) getlab();
        !           589:     putprintf("        .word   %s%d", 0, (int) SAVE_MASK_LABEL , eecookiep -> savlabel );
        !           590: }
        !           591: #endif vax || tahoe
        !           592: 
        !           593:     /*
        !           594:      * code before any user code.
        !           595:      * or code that is machine dependent.
        !           596:      */
        !           597: #ifdef vax
        !           598: fp_entrycode(eecookiep)
        !           599:     struct entry_exit_cookie   *eecookiep;
        !           600: {
        !           601:     int        ftnno = eecookiep -> nlp -> value[NL_ENTLOC];
        !           602:     int        proflabel = (int) getlab();
        !           603:     int        setjmp0 = (int) getlab();
        !           604: 
        !           605:        /*
        !           606:         *      top of code;  destination of jump from formal entry code.
        !           607:         */
        !           608:     eecookiep -> toplabel = (int) getlab();
        !           609:     (void) putlab( (char *) eecookiep -> toplabel );
        !           610:     putprintf("        subl2   $%s%d,sp" , 0 , (int) FRAME_SIZE_LABEL, ftnno );
        !           611:     if ( profflag ) {
        !           612:            /*
        !           613:             *  call mcount for profiling
        !           614:             */
        !           615:        putprintf( "    moval   " , 1 );
        !           616:        putprintf( PREFIXFORMAT , 1 , (int) LABELPREFIX , proflabel );
        !           617:        putprintf( ",r0" , 0 );
        !           618:        putprintf( "    jsb     mcount" , 0 );
        !           619:        putprintf( "    .data" , 0 );
        !           620:        putprintf( "    .align  2" , 0 );
        !           621:        (void) putlab( (char *) proflabel );
        !           622:        putprintf( "    .long   0" , 0 );
        !           623:        putprintf( "    .text" , 0 );
        !           624:     }
        !           625:        /*
        !           626:         *      if there are nested procedures that access our variables
        !           627:         *      we must save the display.
        !           628:         */
        !           629:     if ( parts[ cbn ] & NONLOCALVAR ) {
        !           630:            /*
        !           631:             *  save old display 
        !           632:             */
        !           633:        putprintf( "    movq    %s+%d,%d(%s)" , 0
        !           634:                , (int) DISPLAYNAME , cbn * sizeof(struct dispsave)
        !           635:                , DSAVEOFFSET , (int) P2FPNAME );
        !           636:            /*
        !           637:             *  set up new display by saving AP and FP in appropriate
        !           638:             *  slot in display structure.
        !           639:             */
        !           640:        putprintf( "    movq    %s,%s+%d" , 0
        !           641:                , (int) P2APNAME , (int) DISPLAYNAME , cbn * sizeof(struct dispsave) );
        !           642:     }
        !           643:        /*
        !           644:         *      set underflow checking if runtime tests
        !           645:         */
        !           646:     if ( opt( 't' ) ) {
        !           647:        putprintf( "    bispsw  $0xe0" , 0 );
        !           648:     }
        !           649:        /*
        !           650:         *      zero local variables if checking is on
        !           651:         *      by calling blkclr( bytes of locals , starting local address );
        !           652:         */
        !           653:     if ( opt( 't' ) && ( -sizes[ cbn ].om_max ) > DPOFF1 ) {
        !           654:        putleaf( PCC_ICON , 0 , 0 , PCCM_ADDTYPE( PCCTM_FTN | PCCT_INT , PCCTM_PTR )
        !           655:                , "_blkclr" );
        !           656:        putLV((char *) 0 , cbn , (int) sizes[ cbn ].om_max , NLOCAL , PCCT_CHAR );
        !           657:        putleaf( PCC_ICON ,  (int) (( -sizes[ cbn ].om_max ) - DPOFF1)
        !           658:                , 0 , PCCT_INT ,(char *) 0 );
        !           659:        putop( PCC_CM , PCCT_INT );
        !           660:        putop( PCC_CALL , PCCT_INT );
        !           661:        putdot( filename , line );
        !           662:     }
        !           663:        /*
        !           664:         *  set up goto vector if non-local goto to this frame
        !           665:         */
        !           666:     if ( parts[ cbn ] & NONLOCALGOTO ) {
        !           667:        putleaf( PCC_ICON , 0 , 0 , PCCM_ADDTYPE( PCCTM_FTN | PCCT_INT , PCCTM_PTR )
        !           668:                , "_setjmp" );
        !           669:        putLV( (char *) 0 , cbn , GOTOENVOFFSET , NLOCAL , PCCTM_PTR|PCCT_STRTY );
        !           670:        putop( PCC_CALL , PCCT_INT );
        !           671:        putleaf( PCC_ICON , 0 , 0 , PCCT_INT , (char *) 0 );
        !           672:        putop( PCC_NE , PCCT_INT );
        !           673:        putleaf( PCC_ICON , setjmp0 , 0 , PCCT_INT , (char *) 0 );
        !           674:        putop( PCC_CBRANCH , PCCT_INT );
        !           675:        putdot( filename , line );
        !           676:            /*
        !           677:             *  on non-local goto, setjmp returns with address to
        !           678:             *  be branched to.
        !           679:             */
        !           680:        putprintf( "    jmp     (r0)" , 0 );
        !           681:        (void) putlab((char *) setjmp0);
        !           682:     }
        !           683: }
        !           684: #endif vax
        !           685: 
        !           686: #ifdef tahoe
        !           687: fp_entrycode(eecookiep)
        !           688:     struct entry_exit_cookie   *eecookiep;
        !           689: {
        !           690:     int        ftnno = eecookiep -> nlp -> value[NL_ENTLOC];
        !           691:     int        proflabel = (int) getlab();
        !           692:     int        setjmp0 = (int) getlab();
        !           693: 
        !           694:        /*
        !           695:         *      top of code;  destination of jump from formal entry code.
        !           696:         */
        !           697:     eecookiep -> toplabel = (int) getlab();
        !           698:     (void) putlab( (char *) eecookiep -> toplabel );
        !           699:     putprintf("        subl3   $%s%d,fp,sp" , 0 , (int) FRAME_SIZE_LABEL, ftnno );
        !           700:     if ( profflag ) {
        !           701:            /*
        !           702:             *  call mcount for profiling
        !           703:             */
        !           704:        putprintf( "    pushal  " , 1 );
        !           705:        putprintf( PREFIXFORMAT , 0 , (int) LABELPREFIX , proflabel );
        !           706:        putprintf( "    callf   $8,mcount" , 0 );
        !           707:        putprintf( "    .data" , 0 );
        !           708:        putprintf( "    .align  2" , 0 );
        !           709:        (void) putlab( (char *) proflabel );
        !           710:        putprintf( "    .long   0" , 0 );
        !           711:        putprintf( "    .text" , 0 );
        !           712:     }
        !           713:        /*
        !           714:         *      if there are nested procedures that access our variables
        !           715:         *      we must save the display.
        !           716:         */
        !           717:     if ( parts[ cbn ] & NONLOCALVAR ) {
        !           718:            /*
        !           719:             *  save old display 
        !           720:             */
        !           721:        putprintf( "    movl    %s+%d,%d(%s)" , 0
        !           722:                , (int) DISPLAYNAME , cbn * sizeof(struct dispsave)
        !           723:                , DSAVEOFFSET , (int) P2FPNAME );
        !           724:            /*
        !           725:             *  set up new display by saving FP in appropriate
        !           726:             *  slot in display structure.
        !           727:             */
        !           728:        putprintf( "    movl    %s,%s+%d" , 0
        !           729:                , (int) P2FPNAME , (int) DISPLAYNAME , cbn * sizeof(struct dispsave) );
        !           730:     }
        !           731:        /*
        !           732:         *      set underflow checking if runtime tests
        !           733:         */
        !           734:     if ( opt( 't' ) ) {
        !           735:        putprintf( "    bicpsw  $0x20" , 0 );
        !           736:     }
        !           737:        /*
        !           738:         *      zero local variables if checking is on
        !           739:         *      by calling blkclr( bytes of locals , starting local address );
        !           740:         */
        !           741:     if ( opt( 't' ) && ( -sizes[ cbn ].om_max ) > DPOFF1 ) {
        !           742:        putleaf( PCC_ICON , 0 , 0 , PCCM_ADDTYPE( PCCTM_FTN | PCCT_INT , PCCTM_PTR )
        !           743:                , "_blkclr" );
        !           744:        putLV((char *) 0 , cbn , (int) sizes[ cbn ].om_max , NLOCAL , PCCT_CHAR );
        !           745:        putleaf( PCC_ICON ,  (int) (( -sizes[ cbn ].om_max ) - DPOFF1)
        !           746:                , 0 , PCCT_INT ,(char *) 0 );
        !           747:        putop( PCC_CM , PCCT_INT );
        !           748:        putop( PCC_CALL , PCCT_INT );
        !           749:        putdot( filename , line );
        !           750:     }
        !           751:        /*
        !           752:         *  set up goto vector if non-local goto to this frame
        !           753:         */
        !           754:     if ( parts[ cbn ] & NONLOCALGOTO ) {
        !           755:        putleaf( PCC_ICON , 0 , 0 , PCCM_ADDTYPE( PCCTM_FTN | PCCT_INT , PCCTM_PTR )
        !           756:                , "_setjmp" );
        !           757:        putLV( (char *) 0 , cbn , GOTOENVOFFSET , NLOCAL , PCCTM_PTR|PCCT_STRTY );
        !           758:        putop( PCC_CALL , PCCT_INT );
        !           759:        putleaf( PCC_ICON , 0 , 0 , PCCT_INT , (char *) 0 );
        !           760:        putop( PCC_NE , PCCT_INT );
        !           761:        putleaf( PCC_ICON , setjmp0 , 0 , PCCT_INT , (char *) 0 );
        !           762:        putop( PCC_CBRANCH , PCCT_INT );
        !           763:        putdot( filename , line );
        !           764:            /*
        !           765:             *  on non-local goto, setjmp returns with address to
        !           766:             *  be branched to.
        !           767:             */
        !           768:        putprintf( "    jmp     (r0)" , 0 );
        !           769:        (void) putlab((char *) setjmp0);
        !           770:     }
        !           771: }
        !           772: #endif tahoe
        !           773: 
        !           774: #if defined(vax) || defined(tahoe)
        !           775: fp_exitcode(eecookiep)
        !           776:     struct entry_exit_cookie   *eecookiep;
        !           777: {
        !           778:        /*
        !           779:         *      if there were file variables declared at this level
        !           780:         *      call PCLOSE( ap ) to clean them up.
        !           781:         */
        !           782:     if ( dfiles[ cbn ] ) {
        !           783:        putleaf( PCC_ICON , 0 , 0 , PCCM_ADDTYPE( PCCTM_FTN | PCCT_INT , PCCTM_PTR )
        !           784:                , "_PCLOSE" );
        !           785:        putleaf( PCC_REG , 0 , P2AP , PCCM_ADDTYPE( PCCT_CHAR , PCCTM_PTR ) , (char *) 0 );
        !           786:        putop( PCC_CALL , PCCT_INT );
        !           787:        putdot( filename , line );
        !           788:     }
        !           789:        /*
        !           790:         *      if this is a function,
        !           791:         *      the function variable is the return value.
        !           792:         *      if it's a scalar valued function, return scalar,
        !           793:         *      else, return a pointer to the structure value.
        !           794:         */
        !           795:     if ( eecookiep-> nlp -> class == FUNC ) {
        !           796:        struct nl       *fvar = eecookiep-> nlp -> ptr[ NL_FVAR ];
        !           797:        long            fvartype = p2type( fvar -> type );
        !           798:        long            label;
        !           799:        char            labelname[ BUFSIZ ];
        !           800: 
        !           801:        switch ( classify( fvar -> type ) ) {
        !           802:            case TBOOL:
        !           803:            case TCHAR:
        !           804:            case TINT:
        !           805:            case TSCAL:
        !           806:            case TDOUBLE:
        !           807:            case TPTR:
        !           808:                putRV( fvar -> symbol , ( fvar -> nl_block ) & 037 ,
        !           809:                        fvar -> value[ NL_OFFS ] ,
        !           810:                        fvar -> extra_flags ,
        !           811:                        (int) fvartype );
        !           812:                putop( PCC_FORCE , (int) fvartype );
        !           813:                break;
        !           814:            default:
        !           815:                label = (int) getlab();
        !           816:                sprintf( labelname , PREFIXFORMAT , LABELPREFIX , label );
        !           817:                putprintf( "    .data" , 0 );
        !           818:                aligndot(A_STRUCT);
        !           819:                putprintf( "    .lcomm  %s,%d" , 0 ,
        !           820:                            (int) labelname , (int) lwidth( fvar -> type ) );
        !           821:                putprintf( "    .text" , 0 );
        !           822:                putleaf( PCC_NAME , 0 , 0 , (int) fvartype , labelname );
        !           823:                putLV( fvar -> symbol , ( fvar -> nl_block ) & 037 ,
        !           824:                        fvar -> value[ NL_OFFS ] ,
        !           825:                        fvar -> extra_flags ,
        !           826:                        (int) fvartype );
        !           827:                putstrop( PCC_STASG , (int) PCCM_ADDTYPE(fvartype, PCCTM_PTR) ,
        !           828:                        (int) lwidth( fvar -> type ) ,
        !           829:                        align( fvar -> type ) );
        !           830:                putdot( filename , line );
        !           831:                putleaf( PCC_ICON , 0 , 0 , (int) PCCM_ADDTYPE(fvartype, PCCTM_PTR), labelname );
        !           832:                putop( PCC_FORCE , (int) PCCM_ADDTYPE(fvartype, PCCTM_PTR) );
        !           833:                break;
        !           834:        }
        !           835:        putdot( filename , line );
        !           836:     }
        !           837:        /*
        !           838:         *      if there are nested procedures we must save the display.
        !           839:         */
        !           840:     if ( parts[ cbn ] & NONLOCALVAR ) {
        !           841:            /*
        !           842:             *  restore old display entry from save area
        !           843:             */
        !           844: #ifdef vax
        !           845:        putprintf( "    movq    %d(%s),%s+%d" , 0
        !           846:            , DSAVEOFFSET , (int) P2FPNAME
        !           847:            , (int) DISPLAYNAME , cbn * sizeof(struct dispsave) );
        !           848: #endif
        !           849: #ifdef tahoe
        !           850:        putprintf( "    movl    %d(%s),%s+%d" , 0
        !           851:            , DSAVEOFFSET , (int) P2FPNAME
        !           852:            , (int) DISPLAYNAME , cbn * sizeof(struct dispsave) );
        !           853: #endif
        !           854:     }
        !           855: }
        !           856: #endif vax || tahoe
        !           857: 
        !           858: #if defined(vax) || defined(tahoe)
        !           859: fp_epilogue(eecookiep)
        !           860:     struct entry_exit_cookie   *eecookiep;
        !           861: {
        !           862:     stabline(line);
        !           863:     putprintf("        ret" , 0 );
        !           864:        /*
        !           865:         *      set the register save mask.
        !           866:         */
        !           867:     putprintf("        .set    %s%d,0x%x", 0,
        !           868:                (int) SAVE_MASK_LABEL, eecookiep -> savlabel, savmask());
        !           869: }
        !           870: #endif vax || tahoe
        !           871: 
        !           872: #if defined(vax) || defined(tahoe)
        !           873: fp_formalentry(eecookiep)
        !           874:     struct entry_exit_cookie   *eecookiep;
        !           875: {
        !           876: 
        !           877:     putprintf("        .align 1", 0);
        !           878:     putprintf("%s%s:" , 0 , (int) FORMALPREFIX , (int) eecookiep -> extname );
        !           879:     putprintf("        .word   %s%d", 0, (int) SAVE_MASK_LABEL, eecookiep -> savlabel );
        !           880:     putleaf( PCC_ICON , 0 , 0 , PCCM_ADDTYPE( PCCTM_FTN | PCCT_INT , PCCTM_PTR ) , "_FCALL" );
        !           881:     putRV((char *) 0 , cbn ,
        !           882:        eecookiep -> nlp -> value[ NL_OFFS ] + sizeof( struct formalrtn * ) ,
        !           883:        NPARAM , PCCTM_PTR | PCCT_STRTY );
        !           884:     putRV((char *) 0, cbn, eecookiep -> nlp -> value[NL_OFFS], NPARAM, PCCTM_PTR|PCCT_STRTY);
        !           885:     putop( PCC_CM , PCCT_INT );
        !           886:     putop( PCC_CALL , PCCT_INT );
        !           887:     putdot( filename , line );
        !           888:     putjbr( (long) eecookiep -> toplabel );
        !           889: }
        !           890: #endif vax || tahoe
        !           891: 
        !           892: #ifdef mc68000
        !           893: 
        !           894: codeformain()
        !           895: {
        !           896:     putprintf("        .text", 0);
        !           897:     putprintf("        .globl  _main", 0);
        !           898:     putprintf("_main:", 0);
        !           899:     putprintf("        link    %s,#0", 0, P2FPNAME);
        !           900:     if (opt('t')) {
        !           901:        putprintf("     pea     1", 0);
        !           902:     } else {
        !           903:        putprintf("     pea     0", 0);
        !           904:     }
        !           905:     putprintf("        jbsr    _PCSTART", 0);
        !           906:     putprintf("        addql   #4,sp", 0);
        !           907:     putprintf("        movl    %s@(8),__argc", 0, P2FPNAME);
        !           908:     putprintf("        movl    %s@(12),__argv", 0, P2FPNAME);
        !           909:     putprintf("        jbsr    _program", 0);
        !           910:     putprintf("        pea     0", 0);
        !           911:     putprintf("        jbsr    _PCEXIT", 0);
        !           912: }
        !           913: 
        !           914: prog_prologue(eecookiep)
        !           915:     struct entry_exit_cookie   *eecookiep;
        !           916: {
        !           917:     int        ftnno = eecookiep -> nlp -> value[NL_ENTLOC];
        !           918: 
        !           919:     putprintf("        .text", 0);
        !           920:     putprintf("        .globl  _program", 0);
        !           921:     putprintf("_program:", 0);
        !           922:     putprintf("        link    %s,#0", 0, P2FPNAME);
        !           923:     putprintf("        addl    #-%s%d,sp", 0, FRAME_SIZE_LABEL, ftnno);
        !           924:        /* touch new end of stack, to break more stack space */
        !           925:     putprintf("        tstb    sp@(-%s%d)", 0, PAGE_BREAK_LABEL, ftnno);
        !           926:     putprintf("        moveml  #%s%d,sp@", 0, SAVE_MASK_LABEL, ftnno);
        !           927: }
        !           928: 
        !           929: fp_prologue(eecookiep)
        !           930:     struct entry_exit_cookie   *eecookiep;
        !           931: {
        !           932:     int                ftnno = eecookiep -> nlp -> value[NL_ENTLOC];
        !           933: 
        !           934:     sextname(eecookiep -> extname, eecookiep -> nlp -> symbol, cbn - 1);
        !           935:     putprintf("        .text", 0);
        !           936:     putprintf("        .globl  %s%s", 0, FORMALPREFIX, eecookiep -> extname);
        !           937:     putprintf("        .globl  %s", 0, eecookiep -> extname);
        !           938:     putprintf("%s:", 0, eecookiep -> extname);
        !           939:     putprintf("        link    %s,#0", 0, P2FPNAME);
        !           940:     putprintf("        addl    #-%s%d,sp", 0, FRAME_SIZE_LABEL, ftnno);
        !           941:        /* touch new end of stack, to break more stack space */
        !           942:     putprintf("        tstb    sp@(-%s%d)", 0, PAGE_BREAK_LABEL, ftnno);
        !           943:     putprintf("        moveml  #%s%d,sp@", 0, SAVE_MASK_LABEL, ftnno);
        !           944: }
        !           945: 
        !           946: fp_entrycode(eecookiep)
        !           947:     struct entry_exit_cookie   *eecookiep;
        !           948: {
        !           949:     char *proflabel = getlab();
        !           950:     char *setjmp0 = getlab();
        !           951: 
        !           952:        /*
        !           953:         *      fill in the label cookie
        !           954:         */
        !           955:     eecookiep -> toplabel = getlab();
        !           956:     (void) putlab(eecookiep -> toplabel);
        !           957:        /*
        !           958:         *      call mcount if we are profiling.
        !           959:         */
        !           960:     if ( profflag ) {
        !           961:        putprintf("     movl    #%s%d,a0", 0, LABELPREFIX,  proflabel);
        !           962:        putprintf("     jsr     mcount", 0);
        !           963:        putprintf("     .data", 0);
        !           964:        putprintf("     .even", 0);
        !           965:        (void) putlab(proflabel);
        !           966:        putprintf("     .long   0", 0);
        !           967:        putprintf("     .text", 0);
        !           968:     }
        !           969:        /*
        !           970:         *      if there are nested procedures that access our variables
        !           971:         *      we must save the display
        !           972:         */
        !           973:     if (parts[cbn] & NONLOCALVAR) {
        !           974:            /*
        !           975:             *  save the old display
        !           976:             */
        !           977:        putprintf("     movl    %s+%d,%s@(%d)", 0,
        !           978:                    DISPLAYNAME, cbn * sizeof(struct dispsave),
        !           979:                    P2FPNAME, DSAVEOFFSET);
        !           980:            /*
        !           981:             *  set up the new display by saving the framepointer
        !           982:             *  in the display structure.
        !           983:             */
        !           984:        putprintf("     movl    %s,%s+%d", 0,
        !           985:                    P2FPNAME, DISPLAYNAME, cbn * sizeof(struct dispsave));
        !           986:     }
        !           987:        /*
        !           988:         *      zero local variables if checking is on
        !           989:         *      by calling blkclr( bytes of locals , starting local address );
        !           990:         */
        !           991:     if ( opt( 't' ) && ( -sizes[ cbn ].om_max ) > DPOFF1 ) {
        !           992:        putleaf( PCC_ICON , 0 , 0 , PCCM_ADDTYPE( PCCTM_FTN | PCCT_INT , PCCTM_PTR )
        !           993:                , "_blkclr" );
        !           994:        putLV( 0 , cbn , sizes[ cbn ].om_max , NLOCAL , PCCT_CHAR );
        !           995:        putleaf( PCC_ICON ,  ( -sizes[ cbn ].om_max ) - DPOFF1
        !           996:                , 0 , PCCT_INT , 0 );
        !           997:        putop( PCC_CM , PCCT_INT );
        !           998:        putop( PCC_CALL , PCCT_INT );
        !           999:        putdot( filename , line );
        !          1000:     }
        !          1001:        /*
        !          1002:         *  set up goto vector if non-local goto to this frame
        !          1003:         */
        !          1004:     if ( parts[ cbn ] & NONLOCALGOTO ) {
        !          1005:        putleaf( PCC_ICON , 0 , 0 , PCCM_ADDTYPE( PCCTM_FTN | PCCT_INT , PCCTM_PTR )
        !          1006:                , "_setjmp" );
        !          1007:        putLV( 0 , cbn , GOTOENVOFFSET , NLOCAL , PCCTM_PTR|PCCT_STRTY );
        !          1008:        putop( PCC_CALL , PCCT_INT );
        !          1009:        putleaf( PCC_ICON , 0 , 0 , PCCT_INT , 0 );
        !          1010:        putop( PCC_NE , PCCT_INT );
        !          1011:        putleaf( PCC_ICON , setjmp0 , 0 , PCCT_INT , 0 );
        !          1012:        putop( PCC_CBRANCH , PCCT_INT );
        !          1013:        putdot( filename , line );
        !          1014:            /*
        !          1015:             *  on non-local goto, setjmp returns with address to
        !          1016:             *  be branched to.
        !          1017:             */
        !          1018:        putprintf("     movl    d0,a0", 0);
        !          1019:        putprintf("     jmp     a0@", 0);
        !          1020:        (void) putlab(setjmp0);
        !          1021:     }
        !          1022: }
        !          1023: 
        !          1024: fp_exitcode(eecookiep)
        !          1025:     struct entry_exit_cookie   *eecookiep;
        !          1026: {
        !          1027:        /*
        !          1028:         *      if there were file variables declared at this level
        !          1029:         *      call PCLOSE( ap ) to clean them up.
        !          1030:         */
        !          1031:     if ( dfiles[ cbn ] ) {
        !          1032:        putleaf( PCC_ICON , 0 , 0 , PCCM_ADDTYPE( PCCTM_FTN | PCCT_INT , PCCTM_PTR )
        !          1033:                , "_PCLOSE" );
        !          1034:        putleaf( PCC_REG , 0 , P2AP , PCCM_ADDTYPE( PCCT_CHAR , PCCTM_PTR ) , 0 );
        !          1035:        putop( PCC_CALL , PCCT_INT );
        !          1036:        putdot( filename , line );
        !          1037:     }
        !          1038:        /*
        !          1039:         *      if this is a function,
        !          1040:         *      the function variable is the return value.
        !          1041:         *      if it's a scalar valued function, return scalar,
        !          1042:         *      else, return a pointer to the structure value.
        !          1043:         */
        !          1044:     if ( eecookiep -> nlp -> class == FUNC ) {
        !          1045:        struct nl       *fvar = eecookiep -> nlp -> ptr[ NL_FVAR ];
        !          1046:        long            fvartype = p2type( fvar -> type );
        !          1047:        char            *label;
        !          1048:        char            labelname[ BUFSIZ ];
        !          1049: 
        !          1050:        switch ( classify( fvar -> type ) ) {
        !          1051:            case TBOOL:
        !          1052:            case TCHAR:
        !          1053:            case TINT:
        !          1054:            case TSCAL:
        !          1055:            case TDOUBLE:
        !          1056:            case TPTR:
        !          1057:                putRV( fvar -> symbol , ( fvar -> nl_block ) & 037 ,
        !          1058:                        fvar -> value[ NL_OFFS ] ,
        !          1059:                        fvar -> extra_flags ,
        !          1060:                        fvartype );
        !          1061:                putop( PCC_FORCE , fvartype );
        !          1062:                break;
        !          1063:            default:
        !          1064:                label = getlab();
        !          1065:                sprintf( labelname , PREFIXFORMAT , LABELPREFIX , label );
        !          1066:                putprintf("     .lcomm  %s,%d", 0,
        !          1067:                        labelname, lwidth(fvar -> type));
        !          1068:                putleaf( PCC_NAME , 0 , 0 , fvartype , labelname );
        !          1069:                putLV( fvar -> symbol , ( fvar -> nl_block ) & 037 ,
        !          1070:                        fvar -> value[ NL_OFFS ] ,
        !          1071:                        fvar -> extra_flags ,
        !          1072:                        fvartype );
        !          1073:                putstrop( PCC_STASG , PCCM_ADDTYPE(fvartype, PCCTM_PTR) ,
        !          1074:                        lwidth( fvar -> type ) ,
        !          1075:                        align( fvar -> type ) );
        !          1076:                putdot( filename , line );
        !          1077:                putleaf( PCC_ICON , 0 , 0 , PCCM_ADDTYPE(fvartype, PCCTM_PTR), labelname );
        !          1078:                putop( PCC_FORCE , PCCM_ADDTYPE(fvartype, PCCTM_PTR) );
        !          1079:                break;
        !          1080:        }
        !          1081:        putdot( filename , line );
        !          1082:     }
        !          1083:        /*
        !          1084:         *      if we saved a display, we must restore it.
        !          1085:         */
        !          1086:     if ( parts[ cbn ] & NONLOCALVAR ) {
        !          1087:            /*
        !          1088:             *  restore old display entry from save area
        !          1089:             */
        !          1090:        putprintf("     movl    %s@(%d),%s+%d", 0,
        !          1091:                    P2FPNAME, DSAVEOFFSET,
        !          1092:                    DISPLAYNAME, cbn * sizeof(struct dispsave));
        !          1093:     }
        !          1094: }
        !          1095: 
        !          1096: fp_epilogue(eecookiep)
        !          1097:     struct entry_exit_cookie   *eecookiep;
        !          1098: {
        !          1099:     /*
        !          1100:      * all done by the second pass.
        !          1101:      */
        !          1102: }
        !          1103: 
        !          1104: fp_formalentry(eecookiep)
        !          1105:     struct entry_exit_cookie   *eecookiep;
        !          1106: {
        !          1107:     putprintf( "%s%s:" , 0 , FORMALPREFIX , eecookiep -> extname );
        !          1108:     putprintf("        link    %s,#0", 0, P2FPNAME);
        !          1109:     putprintf("        addl    #-%s%d,sp", 0, FRAME_SIZE_LABEL, ftnno);
        !          1110:        /* touch new end of stack, to break more stack space */
        !          1111:     putprintf("        tstb    sp@(-%s%d)", 0, PAGE_BREAK_LABEL, ftnno);
        !          1112:     putprintf("        moveml  #%s%d,sp@", 0, SAVE_MASK_LABEL, ftnno);
        !          1113:     putleaf( PCC_ICON , 0 , 0 , PCCM_ADDTYPE( PCCTM_FTN | PCCT_INT , PCCTM_PTR ) , "_FCALL" );
        !          1114:     putRV( 0 , cbn ,
        !          1115:        eecookiep -> nlp -> value[ NL_OFFS ] + sizeof( struct formalrtn * ) ,
        !          1116:        NPARAM , PCCTM_PTR | PCCT_STRTY );
        !          1117:     putRV(0, cbn, eecookiep -> nlp -> value[NL_OFFS], NPARAM, PCCTM_PTR|PCCT_STRTY);
        !          1118:     putop( PCC_CM , PCCT_INT );
        !          1119:     putop( PCC_CALL , PCCT_INT );
        !          1120:     putdot( filename , line );
        !          1121:     putjbr( eecookiep -> toplabel );
        !          1122: }
        !          1123: #endif mc68000
        !          1124: #endif PC

unix.superglobalmegacorp.com

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