Annotation of 43BSDReno/pgrm/pascal/src/p2put.c, revision 1.1.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[] = "@(#)p2put.c    5.4 (Berkeley) 11/12/86";
                      9: #endif not lint
                     10: 
                     11:     /*
                     12:      * functions to help pi put out
                     13:      * polish postfix binary portable c compiler intermediate code
                     14:      * thereby becoming the portable pascal compiler
                     15:      */
                     16: 
                     17: #include       "whoami.h"
                     18: #ifdef PC
                     19: #include       "0.h"
                     20: #include       "objfmt.h"
                     21: #include       <pcc.h>
                     22: #include       "pc.h"
                     23: #include       "align.h"
                     24: #include       "tmps.h"
                     25: 
                     26:     /*
                     27:      * emits an ftext operator and a string to the pcstream
                     28:      */
                     29: puttext( string )
                     30:     char       *string;
                     31:     {
                     32:        int     length = str4len( string );
                     33: 
                     34:        if ( !CGENNING )
                     35:            return;
                     36:        p2word( PCCM_TRIPLE( PCCF_FTEXT , length , 0 ) );
                     37: #      ifdef DEBUG
                     38:            if ( opt( 'k' ) ) {
                     39:                fprintf( stdout , "PCCF_FTEXT | %3d | 0 " , length );
                     40:            }
                     41: #      endif
                     42:        p2string( string );
                     43:     }
                     44: 
                     45: int
                     46: str4len( string )
                     47:     char       *string;
                     48:     {
                     49:        
                     50:        return ( ( strlen( string ) + 3 ) / 4 );
                     51:     }
                     52: 
                     53:     /*
                     54:      * put formatted text into a buffer for printing to the pcstream.
                     55:      * a call to putpflush actually puts out the text.
                     56:      * none of arg1 .. arg5 need be present.
                     57:      * and you can add more if you need them.
                     58:      */
                     59: /* VARARGS */
                     60: putprintf( format , incomplete , arg1 , arg2 , arg3 , arg4 , arg5 )
                     61:     char       *format;
                     62:     int                incomplete;
                     63:     {
                     64:        static char     ppbuffer[ BUFSIZ ];
                     65:        static char     *ppbufp = ppbuffer;
                     66: 
                     67:        if ( !CGENNING )
                     68:            return;
                     69:        sprintf( ppbufp , format , arg1 , arg2 , arg3 , arg4 , arg5 );
                     70:        ppbufp = &( ppbuffer[ strlen( ppbuffer ) ] );
                     71:        if ( ppbufp >= &( ppbuffer[ BUFSIZ ] ) )
                     72:            panic( "putprintf" );
                     73:        if ( ! incomplete ) {
                     74:            puttext( ppbuffer );
                     75:            ppbufp = ppbuffer;
                     76:        }
                     77:     }
                     78: 
                     79:     /*
                     80:      * emit a left bracket operator to pcstream
                     81:      * with function number, the maximum temp register, and total local bytes
                     82:      */
                     83: putlbracket(ftnno, sizesp)
                     84:     int                ftnno;
                     85:     struct om  *sizesp;
                     86: {
                     87:     int        maxtempreg;     
                     88:     int        alignedframesize;
                     89: 
                     90: #   if defined(vax) || defined(tahoe)
                     91:        maxtempreg = sizesp->curtmps.next_avail[REG_GENERAL];
                     92: #   endif vax || tahoe
                     93: #   ifdef mc68000
                     94:            /*
                     95:             *  this is how /lib/f1 wants it.
                     96:             */
                     97:        maxtempreg =    (sizesp->curtmps.next_avail[REG_ADDR] << 4)
                     98:                      | (sizesp->curtmps.next_avail[REG_DATA]);
                     99: #   endif mc68000
                    100:     alignedframesize = roundup((int)(BITSPERBYTE * -sizesp->curtmps.om_off),
                    101:        (long)(BITSPERBYTE * A_STACK));
                    102:     p2word( PCCM_TRIPLE( PCCF_FLBRAC , maxtempreg , ftnno ) );
                    103:     p2word(alignedframesize);
                    104: #   ifdef DEBUG
                    105:        if ( opt( 'k' ) ) {
                    106:            fprintf(stdout, "PCCF_FLBRAC | %3d | %d     %d\n",
                    107:                maxtempreg, ftnno, alignedframesize);
                    108:        }
                    109: #   endif
                    110: }
                    111: 
                    112:     /*
                    113:      * emit a right bracket operator
                    114:      * which for the binary interface
                    115:      * forces the stack allocate and register mask
                    116:      */
                    117: putrbracket( ftnno )
                    118:     int        ftnno;
                    119:     {
                    120: 
                    121:        p2word( PCCM_TRIPLE( PCCF_FRBRAC , 0 , ftnno ) );
                    122: #      ifdef DEBUG
                    123:            if ( opt( 'k' ) ) {
                    124:                fprintf( stdout , "PCCF_FRBRAC |   0 | %d\n" , ftnno );
                    125:            }
                    126: #      endif
                    127:     }
                    128: 
                    129:     /*
                    130:      * emit an eof operator
                    131:      */
                    132: puteof()
                    133:     {
                    134:        
                    135:        p2word( PCCF_FEOF );
                    136: #      ifdef DEBUG
                    137:            if ( opt( 'k' ) ) {
                    138:                fprintf( stdout , "PCCF_FEOF\n" );
                    139:            }
                    140: #      endif
                    141:     }
                    142: 
                    143:     /*
                    144:      * emit a dot operator,
                    145:      * with a source file line number and name
                    146:      * if line is negative, there was an error on that line, but who cares?
                    147:      */
                    148: putdot( filename , line )
                    149:     char       *filename;
                    150:     int                line;
                    151:     {
                    152:        int     length = str4len( filename );
                    153: 
                    154:        if ( line < 0 ) {
                    155:            line = -line;
                    156:        }
                    157:        p2word( PCCM_TRIPLE( PCCF_FEXPR , length , line ) );
                    158: #      ifdef DEBUG
                    159:            if ( opt( 'k' ) ) {
                    160:                fprintf( stdout , "PCCF_FEXPR | %3d | %d        " , length , line );
                    161:            }
                    162: #      endif
                    163:        p2string( filename );
                    164:     }
                    165: 
                    166:     /*
                    167:      * put out a leaf node
                    168:      */
                    169: putleaf( op , lval , rval , type , name )
                    170:     int                op;
                    171:     int                lval;
                    172:     int                rval;
                    173:     int                type;
                    174:     char       *name;
                    175:     {
                    176:        if ( !CGENNING )
                    177:            return;
                    178:        switch ( op ) {
                    179:            default:
                    180:                panic( "[putleaf]" );
                    181:            case PCC_ICON:
                    182:                p2word( PCCM_TRIPLE( PCC_ICON , name != NIL , type ) );
                    183:                p2word( lval );
                    184: #              ifdef DEBUG
                    185:                    if ( opt( 'k' ) ) {
                    186:                        fprintf( stdout , "PCC_ICON | %3d | 0x%x        " 
                    187:                               , name != NIL , type );
                    188:                        fprintf( stdout , "%d\n" , lval );
                    189:                    }
                    190: #              endif
                    191:                if ( name )
                    192:                    p2name( name );
                    193:                break;
                    194:            case PCC_NAME:
                    195:                p2word( PCCM_TRIPLE( PCC_NAME , lval != 0 , type ) );
                    196:                if ( lval ) 
                    197:                    p2word( lval );
                    198: #              ifdef DEBUG
                    199:                    if ( opt( 'k' ) ) {
                    200:                        fprintf( stdout , "PCC_NAME | %3d | 0x%x        " 
                    201:                               , lval != 0 , type );
                    202:                        if ( lval )
                    203:                            fprintf( stdout , "%d       " , lval );
                    204:                    }
                    205: #              endif
                    206:                p2name( name );
                    207:                break;
                    208:            case PCC_REG:
                    209:                p2word( PCCM_TRIPLE( PCC_REG , rval , type ) );
                    210: #              ifdef DEBUG
                    211:                    if ( opt( 'k' ) ) {
                    212:                        fprintf( stdout , "PCC_REG | %3d | 0x%x\n" ,
                    213:                                rval , type );
                    214:                    }
                    215: #              endif
                    216:                break;
                    217:        }
                    218:     }
                    219: 
                    220:     /*
                    221:      * rvalues are just lvalues with indirection, except
                    222:      * special cases for registers and for named globals,
                    223:      * whose names are their rvalues.
                    224:      */
                    225: putRV( name , level , offset , other_flags , type )
                    226:     char       *name;
                    227:     int                level;
                    228:     int                offset;
                    229:     char       other_flags;
                    230:     int                type;
                    231:     {
                    232:        char    extname[ BUFSIZ ];
                    233:        char    *printname;
                    234: 
                    235:        if ( !CGENNING )
                    236:            return;
                    237:        if ( other_flags & NREGVAR ) {
                    238:            if ( ( offset < 0 ) || ( offset > P2FP ) ) {
                    239:                panic( "putRV regvar" );
                    240:            }
                    241:            putleaf( PCC_REG , 0 , offset , type , (char *) 0 );
                    242:            return;
                    243:        }
                    244:        if ( whereis( offset , other_flags ) == GLOBALVAR ) {
                    245:            if ( name != 0 ) {
                    246:                if ( name[0] != '_' ) {
                    247:                        sprintf( extname , EXTFORMAT , name );
                    248:                        printname = extname;
                    249:                } else {
                    250:                        printname = name;
                    251:                }
                    252:                putleaf( PCC_NAME , offset , 0 , type , printname );
                    253:                return;
                    254:            } else {
                    255:                panic( "putRV no name" );
                    256:            }
                    257:        }
                    258:        putLV( name , level , offset , other_flags , type );
                    259:        putop( PCCOM_UNARY PCC_MUL , type );
                    260:     }
                    261: 
                    262:     /*
                    263:      * put out an lvalue 
                    264:      * given a level and offset
                    265:      * special case for
                    266:      *     named globals, whose lvalues are just their names as constants.
                    267:      */
                    268: putLV( name , level , offset , other_flags , type )
                    269:     char       *name;
                    270:     int                level;
                    271:     int                offset;
                    272:     char       other_flags;
                    273:     int                type;
                    274: {
                    275:     char               extname[ BUFSIZ ];
                    276:     char               *printname;
                    277: 
                    278:     if ( !CGENNING )
                    279:        return;
                    280:     if ( other_flags & NREGVAR ) {
                    281:        panic( "putLV regvar" );
                    282:     }
                    283:     switch ( whereis( offset , other_flags ) ) {
                    284:        case GLOBALVAR:
                    285:            if ( ( name != 0 ) ) {
                    286:                if ( name[0] != '_' ) {
                    287:                        sprintf( extname , EXTFORMAT , name );
                    288:                        printname = extname;
                    289:                } else {
                    290:                        printname = name;
                    291:                }
                    292:                putleaf( PCC_ICON , offset , 0 , PCCM_ADDTYPE( type , PCCTM_PTR )
                    293:                        , printname );
                    294:                return;
                    295:            } else {
                    296:                panic( "putLV no name" );
                    297:            }
                    298:        case PARAMVAR:
                    299:            if ( level == cbn ) {
                    300:                putleaf( PCC_REG, 0, P2AP, PCCM_ADDTYPE( type , PCCTM_PTR ), (char *) 0 );
                    301:            } else {
                    302:                putleaf( PCC_NAME , (level * sizeof(struct dispsave)) + AP_OFFSET
                    303:                    , 0 , PCCTM_PTR | PCCT_CHAR , DISPLAYNAME );
                    304:                parts[ level ] |= NONLOCALVAR;
                    305:            }
                    306:            putleaf( PCC_ICON , offset , 0 , PCCT_INT , (char *) 0 );
                    307:            putop( PCC_PLUS , PCCTM_PTR | PCCT_CHAR );
                    308:            break;
                    309:        case LOCALVAR:
                    310:            if ( level == cbn ) {
                    311:                putleaf( PCC_REG, 0, P2FP, PCCM_ADDTYPE( type , PCCTM_PTR ), (char *) 0 );
                    312:            } else {
                    313:                putleaf( PCC_NAME , (level * sizeof(struct dispsave)) + FP_OFFSET
                    314:                    , 0 , PCCTM_PTR | PCCT_CHAR , DISPLAYNAME );
                    315:                parts[ level ] |= NONLOCALVAR;
                    316:            }
                    317:            putleaf( PCC_ICON , -offset , 0 , PCCT_INT , (char *) 0 );
                    318:            putop( PCC_MINUS , PCCTM_PTR | PCCT_CHAR );
                    319:            break;
                    320:        case NAMEDLOCALVAR:
                    321:            if ( level == cbn ) {
                    322:                putleaf( PCC_REG, 0, P2FP, PCCM_ADDTYPE( type , PCCTM_PTR ), (char *) 0 );
                    323:            } else {
                    324:                putleaf( PCC_NAME , (level * sizeof(struct dispsave)) + FP_OFFSET
                    325:                    , 0 , PCCTM_PTR | PCCT_CHAR , DISPLAYNAME );
                    326:                parts[ level ] |= NONLOCALVAR;
                    327:            }
                    328:            putleaf( PCC_ICON , 0 , 0 , PCCT_INT , name );
                    329:            putop( PCC_MINUS , PCCTM_PTR | PCCT_CHAR );
                    330:            break;
                    331:     }
                    332:     return;
                    333: }
                    334: 
                    335:     /*
                    336:      * put out a floating point constant leaf node
                    337:      * the constant is declared in aligned data space
                    338:      * and a PCC_NAME leaf put out for it
                    339:      */
                    340: putCON8( val )
                    341:     double     val;
                    342:     {
                    343:        char    *label;
                    344:        char    name[ BUFSIZ ];
                    345: 
                    346:        if ( !CGENNING )
                    347:            return;
                    348:        label = getlab();
                    349:        putprintf( "    .data" , 0 );
                    350:        aligndot(A_DOUBLE);
                    351:        (void) putlab( label );
                    352: #      if defined(vax) || defined(tahoe)
                    353:            putprintf( "        .double 0d%.20e" , 0 , val );
                    354: #      endif vax || tahoe
                    355: #      ifdef mc68000
                    356:            putprintf( "        .long   0x%x,0x%x", 0, val);
                    357: #      endif mc68000
                    358:        putprintf( "    .text" , 0 );
                    359:        sprintf( name , PREFIXFORMAT , LABELPREFIX , label );
                    360:        putleaf( PCC_NAME , 0 , 0 , PCCT_DOUBLE , name );
                    361:     }
                    362: 
                    363:        /*
                    364:         * put out either an lvalue or an rvalue for a constant string.
                    365:         * an lvalue (for assignment rhs's) is the name as a constant, 
                    366:         * an rvalue (for parameters) is just the name.
                    367:         */
                    368: putCONG( string , length , required )
                    369:     char       *string;
                    370:     int                length;
                    371:     int                required;
                    372:     {
                    373:        char    name[ BUFSIZ ];
                    374:        char    *label;
                    375:        char    *cp;
                    376:        int     pad;
                    377:        int     others;
                    378: 
                    379:        if ( !CGENNING )
                    380:            return;
                    381:        putprintf( "    .data" , 0 );
                    382:        aligndot(A_STRUCT);
                    383:        label = getlab();
                    384:        (void) putlab( label );
                    385:        cp = string;
                    386:        while ( *cp ) {
                    387:            putprintf( "        .byte   0%o" , 1 , *cp ++ );
                    388:            for ( others = 2 ; ( others <= 8 ) && *cp ; others ++ ) {
                    389:                putprintf( ",0%o" , 1 , *cp++ );
                    390:            }
                    391:            putprintf( "" , 0 );
                    392:        }
                    393:        pad = length - strlen( string );
                    394:        while ( pad-- > 0 ) {
                    395:            putprintf( "        .byte   0%o" , 1 , ' ' );
                    396:            for ( others = 2 ; ( others <= 8 ) && ( pad-- > 0 ) ; others++ ) {
                    397:                putprintf( ",0%o" , 1 , ' ' );
                    398:            }
                    399:            putprintf( "" , 0 );
                    400:        }
                    401:        putprintf( "    .byte   0" , 0 );
                    402:        putprintf( "    .text"  , 0 );
                    403:        sprintf( name , PREFIXFORMAT , LABELPREFIX , label );
                    404:        if ( required == RREQ ) {
                    405:            putleaf( PCC_NAME , 0 , 0 , PCCTM_ARY | PCCT_CHAR , name );
                    406:        } else {
                    407:            putleaf( PCC_ICON , 0 , 0 , PCCTM_PTR | PCCT_CHAR , name );
                    408:        }
                    409:     }
                    410: 
                    411:     /*
                    412:      * map a pascal type to a c type
                    413:      * this would be tail recursive, but i unfolded it into a for (;;).
                    414:      * this is sort of like isa and lwidth
                    415:      * a note on the types used by the portable c compiler:
                    416:      *     they are divided into a basic type (char, short, int, long, etc.)
                    417:      *     and qualifications on those basic types (pointer, function, array).
                    418:      *     the basic type is kept in the low 4 bits of the type descriptor,
                    419:      *     and the qualifications are arranged in two bit chunks, with the
                    420:      *     most significant on the right,
                    421:      *     and the least significant on the left
                    422:      *         e.g. int *foo();
                    423:      *                 (a function returning a pointer to an integer)
                    424:      *         is stored as
                    425:      *             <ptr><ftn><int>
                    426:      * so, we build types recursively
                    427:      * also, we know that /lib/f1 can only deal with 6 qualifications
                    428:      * so we stop the recursion there.  this stops infinite type recursion
                    429:      * through mutually recursive pointer types.
                    430:      */
                    431: #define        MAXQUALS        6
                    432: int
                    433: p2type( np )
                    434:     struct nl  *np;
                    435: {
                    436: 
                    437:     return typerecur( np , 0 );
                    438: }
                    439: typerecur( np , quals )
                    440:     struct nl  *np;
                    441:     int                quals;
                    442:     {
                    443:        
                    444:        if ( np == NIL || quals > MAXQUALS ) {
                    445:            return PCCT_UNDEF;
                    446:        }
                    447:        switch ( np -> class ) {
                    448:            case SCAL :
                    449:            case RANGE :
                    450:            case CRANGE :
                    451:                if ( np -> type == ( nl + TDOUBLE ) ) {
                    452:                    return PCCT_DOUBLE;
                    453:                }
                    454:                switch ( bytes( np -> range[0] , np -> range[1] ) ) {
                    455:                    case 1:
                    456:                        return PCCT_CHAR;
                    457:                    case 2:
                    458:                        return PCCT_SHORT;
                    459:                    case 4:
                    460:                        return PCCT_INT;
                    461:                    default:
                    462:                        panic( "p2type int" );
                    463:                        /* NOTREACHED */
                    464:                }
                    465:            case STR :
                    466:                return ( PCCTM_ARY | PCCT_CHAR );
                    467:            case RECORD :
                    468:            case SET :
                    469:                return PCCT_STRTY;
                    470:            case FILET :
                    471:                return ( PCCTM_PTR | PCCT_STRTY );
                    472:            case CONST :
                    473:            case VAR :
                    474:            case FIELD :
                    475:                return p2type( np -> type );
                    476:            case TYPE :
                    477:                switch ( nloff( np ) ) {
                    478:                    case TNIL :
                    479:                        return ( PCCTM_PTR | PCCT_UNDEF );
                    480:                    case TSTR :
                    481:                        return ( PCCTM_ARY | PCCT_CHAR );
                    482:                    case TSET :
                    483:                        return PCCT_STRTY;
                    484:                    default :
                    485:                        return ( p2type( np -> type ) );
                    486:                }
                    487:            case REF:
                    488:            case WITHPTR:
                    489:            case PTR :
                    490:                return PCCM_ADDTYPE( typerecur( np -> type , quals + 1 ) , PCCTM_PTR );
                    491:            case ARRAY :
                    492:                return PCCM_ADDTYPE( typerecur( np -> type , quals + 1 ) , PCCTM_ARY );
                    493:            case FUNC :
                    494:                    /*
                    495:                     * functions are really pointers to functions
                    496:                     * which return their underlying type.
                    497:                     */
                    498:                return PCCM_ADDTYPE( PCCM_ADDTYPE( typerecur( np -> type , quals + 2 ) ,
                    499:                                        PCCTM_FTN ) , PCCTM_PTR );
                    500:            case PROC :
                    501:                    /*
                    502:                     * procedures are pointers to functions 
                    503:                     * which return integers (whether you look at them or not)
                    504:                     */
                    505:                return PCCM_ADDTYPE( PCCM_ADDTYPE( PCCT_INT , PCCTM_FTN ) , PCCTM_PTR );
                    506:            case FFUNC :
                    507:            case FPROC :
                    508:                    /*
                    509:                     *  formal procedures and functions are pointers
                    510:                     *  to structures which describe their environment.
                    511:                     */
                    512:                return ( PCCTM_PTR | PCCT_STRTY );
                    513:            default :
                    514:                panic( "p2type" );
                    515:                /* NOTREACHED */
                    516:        }
                    517:     }
                    518: 
                    519:     /*
                    520:      * put a typed operator to the pcstream
                    521:      */
                    522: putop( op , type )
                    523:     int                op;
                    524:     int                type;
                    525:     {
                    526:        extern char     *p2opname();
                    527:        
                    528:        if ( !CGENNING )
                    529:            return;
                    530:        p2word( PCCM_TRIPLE( op , 0 , type ) );
                    531: #      ifdef DEBUG
                    532:            if ( opt( 'k' ) ) {
                    533:                fprintf( stdout , "%s (%d) |   0 | 0x%x\n"
                    534:                        , p2opname( op ) , op , type );
                    535:            }
                    536: #      endif
                    537:     }
                    538: 
                    539:     /*
                    540:      * put out a structure operator (STASG, STARG, STCALL, UNARY STCALL )
                    541:      * which looks just like a regular operator, only the size and
                    542:      * alignment go in the next consecutive words
                    543:      */
                    544: putstrop( op , type , size , alignment )
                    545:     int        op;
                    546:     int        type;
                    547:     int        size;
                    548:     int        alignment;
                    549:     {
                    550:        extern char     *p2opname();
                    551:        
                    552:        if ( !CGENNING )
                    553:            return;
                    554:        p2word( PCCM_TRIPLE( op , 0 , type ) );
                    555:        p2word( size );
                    556:        p2word( alignment );
                    557: #      ifdef DEBUG
                    558:            if ( opt( 'k' ) ) {
                    559:                fprintf( stdout , "%s (%d) |   0 | 0x%x %d %d\n"
                    560:                        , p2opname( op ) , op , type , size , alignment );
                    561:            }
                    562: #      endif
                    563:     }
                    564: 
                    565:     /*
                    566:      * the string names of p2ops
                    567:      */
                    568: 
                    569: struct p2op {
                    570:     int op;
                    571:     char *name;
                    572: };
                    573: 
                    574: static struct p2op     p2opnames[] = {
                    575:        PCC_ERROR, "PCC_ERROR",
                    576:        PCC_NAME, "PCC_NAME",
                    577:        PCC_STRING, "PCC_STRING",
                    578:        PCC_ICON, "PCC_ICON",
                    579:        PCC_FCON, "PCC_FCON",
                    580:        PCC_PLUS, "PCC_PLUS",
                    581:        PCC_MINUS, "PCC_MINUS",
                    582:        PCC_UMINUS, "PCC_UMINUS",
                    583:        PCC_MUL, "PCC_MUL",
                    584:        PCC_DEREF, "PCC_DEREF",
                    585:        PCC_AND, "PCC_AND",
                    586:        PCC_ADDROF, "PCC_ADDROF",
                    587:        PCC_OR, "PCC_OR",
                    588:        PCC_ER, "PCC_ER",
                    589:        PCC_QUEST, "PCC_QUEST",
                    590:        PCC_COLON, "PCC_COLON",
                    591:        PCC_ANDAND, "PCC_ANDAND",
                    592:        PCC_OROR, "PCC_OROR",
                    593:        PCC_CM, "PCC_CM",
                    594:        PCC_ASSIGN, "PCC_ASSIGN",
                    595:        PCC_COMOP, "PCC_COMOP",
                    596:        PCC_DIV, "PCC_DIV",
                    597:        PCC_MOD, "PCC_MOD",
                    598:        PCC_LS, "PCC_LS",
                    599:        PCC_RS, "PCC_RS",
                    600:        PCC_DOT, "PCC_DOT",
                    601:        PCC_STREF, "PCC_STREF",
                    602:        PCC_CALL, "PCC_CALL",
                    603:        PCC_UCALL, "PCC_UCALL",
                    604:        PCC_FORTCALL, "PCC_FORTCALL",
                    605:        PCC_UFORTCALL, "PCC_UFORTCALL",
                    606:        PCC_NOT, "PCC_NOT",
                    607:        PCC_COMPL, "PCC_COMPL",
                    608:        PCC_INCR, "PCC_INCR",
                    609:        PCC_DECR, "PCC_DECR",
                    610:        PCC_EQ, "PCC_EQ",
                    611:        PCC_NE, "PCC_NE",
                    612:        PCC_LE, "PCC_LE",
                    613:        PCC_LT, "PCC_LT",
                    614:        PCC_GE, "PCC_GE",
                    615:        PCC_GT, "PCC_GT",
                    616:        PCC_ULE, "PCC_ULE",
                    617:        PCC_ULT, "PCC_ULT",
                    618:        PCC_UGE, "PCC_UGE",
                    619:        PCC_UGT, "PCC_UGT",
                    620:        PCC_REG, "PCC_REG",
                    621:        PCC_OREG, "PCC_OREG",
                    622:        PCC_CCODES, "PCC_CCODES",
                    623:        PCC_FREE, "PCC_FREE",
                    624:        PCC_STASG, "PCC_STASG",
                    625:        PCC_STARG, "PCC_STARG",
                    626:        PCC_STCALL, "PCC_STCALL",
                    627:        PCC_USTCALL, "PCC_USTCALL",
                    628:        PCC_FLD, "PCC_FLD",
                    629:        PCC_SCONV, "PCC_SCONV",
                    630:        PCC_PCONV, "PCC_PCONV",
                    631:        PCC_PMCONV, "PCC_PMCONV",
                    632:        PCC_PVCONV, "PCC_PVCONV",
                    633:        PCC_FORCE, "PCC_FORCE",
                    634:        PCC_CBRANCH, "PCC_CBRANCH",
                    635:        PCC_INIT, "PCC_INIT",
                    636:        PCC_CAST, "PCC_CAST",
                    637:        -1, ""
                    638:     };
                    639: 
                    640: char *
                    641: p2opname( op )
                    642:     register int       op;
                    643:     {
                    644:        static char             *p2map[PCC_MAXOP+1];
                    645:        static bool             mapready = FALSE;
                    646:        register struct p2op    *pp;
                    647: 
                    648:        if ( mapready == FALSE ) {
                    649:            for ( pp = p2opnames; pp->op >= 0; pp++ )
                    650:                p2map[ pp->op ] = pp->name;
                    651:            mapready = TRUE;
                    652:        }
                    653:        return ( p2map[ op ] ? p2map[ op ] : "unknown" );
                    654:     }
                    655: 
                    656:     /*
                    657:      * low level routines
                    658:      */
                    659: 
                    660:     /*
                    661:      * puts a long word on the pcstream
                    662:      */
                    663: p2word( word )
                    664:     int                word;
                    665:     {
                    666: 
                    667:        putw( word , pcstream );
                    668:     }
                    669: 
                    670:     /*
                    671:      * put a length 0 mod 4 null padded string onto the pcstream
                    672:      */
                    673: p2string( string )
                    674:     char       *string;
                    675:     {
                    676:        int     slen = strlen( string );
                    677:        int     wlen = ( slen + 3 ) / 4;
                    678:        int     plen = ( wlen * 4 ) - slen;
                    679:        char    *cp;
                    680:        int     p;
                    681: 
                    682:        for ( cp = string ; *cp ; cp++ )
                    683:            putc( *cp , pcstream );
                    684:        for ( p = 1 ; p <= plen ; p++ )
                    685:            putc( '\0' , pcstream );
                    686: #      ifdef DEBUG
                    687:            if ( opt( 'k' ) ) {
                    688:                fprintf( stdout , "\"%s" , string );
                    689:                for ( p = 1 ; p <= plen ; p++ )
                    690:                    fprintf( stdout , "\\0" );
                    691:                fprintf( stdout , "\"\n" );
                    692:            }
                    693: #      endif
                    694:     }
                    695: 
                    696:     /*
                    697:      * puts a name on the pcstream
                    698:      */
                    699: p2name( name )
                    700:     char       *name;
                    701:     {
                    702:        int     pad;
                    703: 
                    704:        fprintf( pcstream , NAMEFORMAT , name );
                    705:        pad = strlen( name ) % sizeof (long);
                    706:        for ( ; pad < sizeof (long) ; pad++ ) {
                    707:            putc( '\0' , pcstream );
                    708:        }
                    709: #      ifdef DEBUG
                    710:            if ( opt( 'k' ) ) {
                    711:                fprintf( stdout , NAMEFORMAT , name );
                    712:                pad = strlen( name ) % sizeof (long);
                    713:                for ( ; pad < sizeof (long) ; pad++ ) {
                    714:                    fprintf( stdout , "\\0" );
                    715:                }
                    716:                fprintf( stdout , "\n" );
                    717:            }
                    718: #      endif
                    719:     }
                    720:     
                    721:     /*
                    722:      * put out a jump to a label
                    723:      */
                    724: putjbr( label )
                    725:     long       label;
                    726:     {
                    727: 
                    728:        printjbr( LABELPREFIX , label );
                    729:     }
                    730: 
                    731:     /*
                    732:      * put out a jump to any kind of label
                    733:      */
                    734: printjbr( prefix , label )
                    735:     char       *prefix;
                    736:     long       label;
                    737:     {
                    738: 
                    739: #      if defined(vax) || defined(tahoe)
                    740:            putprintf( "        jbr     " , 1 );
                    741:            putprintf( PREFIXFORMAT , 0 , prefix , label );
                    742: #      endif vax || tahoe
                    743: #      ifdef mc68000
                    744:            putprintf( "        jra     " , 1 );
                    745:            putprintf( PREFIXFORMAT , 0 , prefix , label );
                    746: #      endif mc68000
                    747:     }
                    748: 
                    749:     /*
                    750:      * another version of put to catch calls to put
                    751:      */
                    752: /* VARARGS */
                    753: put()
                    754:     {
                    755: 
                    756:        panic("put()");
                    757:     }
                    758: 
                    759: #endif PC

unix.superglobalmegacorp.com

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