Annotation of coherent/b/bin/c/n2/cc2.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * n2/cc2.c
                      3:  * Main driving routine for the code assembly phase of the C compiler.
                      4:  * It reads the intermediate file and calls
                      5:  * off to the appropriate routines to get things done.
                      6:  */
                      7: 
                      8: #ifdef   vax
                      9: #include "INC$LIB:cc2.h"
                     10: #else
                     11: #include "cc2.h"
                     12: #endif
                     13: 
                     14: /* Verbosity.  Parallel to ccscan.c. */
                     15: #ifdef COHERENT
                     16: #define        ERRMSG  "cc:"
                     17: #else
                     18: #if INTEL
                     19: #define        ERRMSG  "***"
                     20: #else
                     21: #if OMF286
                     22: #define        ERRMSG  "MWC286:"
                     23: #else
                     24: #define        ERRMSG  "MWC86:"
                     25: #endif
                     26: #endif
                     27: #endif
                     28: 
                     29: #if    !OVERLAID
                     30: FILE   *ifp;                   /* Input file */
                     31: FILE   *ofp;                   /* Output file */
                     32: char   file[NFNAME];           /* File name */
                     33: char   module[NMNAME];         /* Module name */
                     34: int    line;                   /* Line number */
                     35: char   id[NCSYMB];             /* Name buffer */
                     36: VARIANT        variant;                /* Variant template */
                     37: int    dotseg;                 /* Current segment # */
                     38: #endif
                     39: 
                     40: int    changes;                /* Change flag */
                     41: ADDRESS        dot;                    /* Current location */
                     42: SYM    *hash2[NSHASH];         /* Symbol table */
                     43: INS    ins;                    /* Head of instruction list */
                     44: int    nlabdel;                /* # of labels deleted */
                     45: int    ndead;                  /* # of dead instructions deleted */
                     46: int    nbrbr;                  /* # of branches to branches */
                     47: int    nexbr;                  /* # of extra branches */
                     48: int    ncbrbr;                 /* # of conditional branches to branches */
                     49: int    nbrnext;                /* # of branches to next instruction */
                     50: int    nxjump;                 /* # of cross jumps */
                     51: int    ncomseq;                /* # of common sequences */
                     52: int    nsimplify;              /* # of instructions simplified */
                     53: int    nuseless;               /* # of instructions deleted */
                     54: 
                     55: #if !TINY
                     56: int    vflag;                  /* Verbosity */
                     57: int    xflag;                  /* More verbosity */
                     58: #endif
                     59: 
                     60: /*
                     61:  * Segment table.
                     62:  */
                     63: SEG     seg[NSEG];
                     64: 
                     65: #if !OVERLAID
                     66: /*
                     67:  * Mainline.
                     68:  * Interpret options and
                     69:  * open files.
                     70:  */
                     71: main(argc, argv)
                     72: char *argv[];
                     73: {
                     74: #ifdef vax
                     75:        int     ofd;
                     76: #endif
                     77: 
                     78:        passname = "cc2";
                     79:        if (argc < 4)
                     80:                usage();
                     81:        getvariant(argv[1]);
                     82: #if GEMDOS
                     83:        {
                     84:                extern long gemdos();
                     85:                extern char *lmalloc();
                     86:                free(lmalloc((gemdos(0x48,-1L)-4096) & ~1023L));
                     87:        }
                     88: #endif
                     89:        if ((ifp=fopen(argv[2], SRMODE)) == NULL) {
                     90:                fprintf(stderr, "%s: cannot open.\n", argv[2]);
                     91:                exit(BAD);
                     92:        }
                     93:        if (isvariant(VASM)) {
                     94:                if ((ofp=fopen(argv[3], SWMODE)) == NULL)
                     95:                        nocreate(argv[3]);
                     96:        } else {
                     97:                if (argc < 5)
                     98:                        usage();
                     99:                if ((ofp=fopen(argv[4], SWMODE)) == NULL)
                    100:                        nocreate(argv[4]);
                    101:        }
                    102: #if !TINY
                    103:        if (argc > 5)
                    104:                vflag = atoi(argv[5]);
                    105:        if (argc > 6)
                    106:                xflag = atoi(argv[6]);
                    107: #endif
                    108:        labgen = 20000;
                    109:        dotseg = -1;
                    110:        outinit();
                    111:        work2();
                    112:        outdone();
                    113:        if (notvariant(VASM)) {
                    114:                fclose(ifp);
                    115:                fclose(ofp);
                    116:                if ((ifp=fopen(argv[4], SRMODE)) == NULL)
                    117:                        cfatal("%s: cannot reopen", argv[4]);
                    118: #ifdef vax
                    119: #if VAXFMT
                    120:                if ((ofd=creat(argv[3], 0666, "rfm=var")) < 0
                    121:                ||  (ofp=fdopen(ofd, SWMODE)) == NULL)
                    122: #else
                    123:                if ((ofp=fopen(argv[3], SWMODE)) == NULL)
                    124: #endif
                    125: #else
                    126:                if ((ofp=fopen(argv[3], SWMODE)) == NULL)
                    127: #endif
                    128:                        nocreate(argv[3]);
                    129:                copycode();
                    130:        }
                    131:        if (isvariant(VSTAT))
                    132:                showstats();
                    133:        if (nerr != 0)
                    134:                exit(BAD);
                    135:        exit(OK);
                    136: }
                    137: 
                    138: /*
                    139:  * Print usage message.
                    140:  */
                    141: usage()
                    142: {
                    143:        fprintf(stderr, "Usage: cc2 variant in out [temp]\n");
                    144:        exit(BAD);
                    145: }
                    146: 
                    147: /*
                    148:  * Complain that a file cannot be
                    149:  * created.
                    150:  */
                    151: nocreate(fn)
                    152: char *fn;
                    153: {
                    154:        fprintf(stderr, "%s: cannot create.\n", fn);
                    155:        exit(BAD);
                    156: }
                    157: #else
                    158: /*
                    159:  * Driving routine for the
                    160:  * overlaid version of the optimizer and
                    161:  * code assembly phase. The files have all been
                    162:  * opened by the command line scanner in the
                    163:  * root segment. Set up a fatal error context and
                    164:  * do the work. Return exit status.
                    165:  */
                    166: cc2a()
                    167: {
                    168: #if MONOLITHIC
                    169:        register int    i;
                    170: #endif
                    171:        passname = "cc2a";
                    172:        if (setjmp(death) != 0) {
                    173:                freesym2();
                    174:                return (ABORT);
                    175:        }
                    176:        labgen = 20000;
                    177:        dotseg = -1;
                    178: #if MONOLITHIC
                    179:        dot = 0;
                    180:        nlabdel = 0;
                    181:        ndead = 0;
                    182:        nbrbr = 0;
                    183:        nexbr = 0;
                    184:        ncbrbr = 0;
                    185:        nbrnext = 0;
                    186:        nxjump = 0;
                    187:        ncomseq = 0;
                    188:        nsimplify = 0;
                    189:        nuseless = 0;
                    190:        for (i=0; i<NSEG; ++i)
                    191:                seg[i].s_dot = 0;
                    192:        gendbgt(-1);
                    193: #endif
                    194:        outinit();
                    195:        work2();
                    196:        outdone();
                    197:        if (isvariant(VSTAT))
                    198:                showstats();
                    199:        if (isvariant(VASM))
                    200:                freesym2();
                    201:        if (nerr != 0)
                    202:                return (BAD);
                    203:        return (OK);
                    204: }
                    205: 
                    206: /*                                                             
                    207:  * Second part. Copy the code back. This is                    
                    208:  * only done if aflag==0. The root segment will have moved     
                    209:  * all of the files around. The same fatal error game is       
                    210:  * played.                                                     
                    211:  */                                                            
                    212: cc2b()
                    213: {
                    214:        passname = "cc2b";
                    215:        if (setjmp(death) != 0) {
                    216:                freesym2();
                    217:                return (ABORT);
                    218:        }
                    219:        copycode();
                    220:        freesym2();
                    221:        if (nerr != 0)
                    222:                return (BAD);
                    223:        return (OK);
                    224: }
                    225: #endif
                    226: 
                    227: /*
                    228:  * Print statistics.
                    229:  */
                    230: showstats()
                    231: {
                    232:        printstat(nlabdel,  "label# deleted");
                    233:        printstat(ndead, "dead instruction# deleted");
                    234:        printstat(nbrbr, "jump# to a jump");
                    235:        printstat(ncbrbr, "conditional jump# over a jump");
                    236:        printstat(nbrnext, "jump# to next instruction");
                    237:        printstat(nexbr, "extra jump#");
                    238:        printstat(nxjump, "cross jump#");
                    239:        printstat(ncomseq, "common sequence#");
                    240:        printstat(nsimplify, "instruction# simplified");
                    241:        printstat(nuseless, "instruction# deleted");
                    242: }
                    243: 
                    244: /*
                    245:  * Print a statistic message.
                    246:  */
                    247: printstat(n, s)
                    248: register int   n;
                    249: register char   *s;
                    250: {
                    251:        register int    c;
                    252: 
                    253:        if (n != 0) {
                    254: #if OVERLAID
                    255:                printf ("%s ", ERRMSG);
                    256: #endif
                    257:                printf("%d ", n);
                    258:                while ((c = *s++) != 0) {
                    259:                        if (c == '#') {
                    260:                                if (n != 1)
                    261:                                        putchar('s');
                    262:                        } else
                    263:                                putchar(c);
                    264:                }
                    265:                putchar('\n');
                    266:        }
                    267: }
                    268: 
                    269: /*
                    270:  * Read through the temporary file,
                    271:  * processing things until you run into a
                    272:  * function prolog operation. Functions
                    273:  * get read in, optimized and written back
                    274:  * out.
                    275:  */
                    276: work2()
                    277: {
                    278:        register int    op;
                    279:        sizeof_t        size;
                    280:        register INS    *ip;
                    281:        register SYM    *sp;
                    282: 
                    283:        for (;;) {
                    284:                switch (op = bget()) {
                    285: 
                    286:                case LINE:
                    287:                        line = iget();
                    288:                        break;
                    289: 
                    290:                case DLABEL:
                    291:                        gendbgt(0);
                    292:                        break;
                    293: 
                    294:                case FNAME:
                    295:                        sget(file, NFNAME);
                    296:                        break;
                    297: 
                    298:                case MNAME:
                    299:                        sget(module, NMNAME);
                    300:                        if (isvariant(VASM)) {
                    301:                                bput(op);
                    302:                                sput(module);
                    303:                        }
                    304:                        break;
                    305: 
                    306:                case GLABEL:
                    307:                case SLABEL:
                    308:                        sget(id, NCSYMB);
                    309:                        sp = glookup(id, 1);
                    310:                        sp->s_seg = dotseg;
                    311:                        sp->s_value  = dot;
                    312:                        if (op == GLABEL) {
                    313:                                sp->s_flag |= S_GBL;
                    314:                        }
                    315:                        if (isvariant(VASM)) {
                    316:                                bput(op);
                    317:                                sput(id);
                    318:                        }
                    319:                        break;
                    320: 
                    321:                case COMM:
                    322:                        sget(id, NCSYMB);
                    323:                        size = zget();
                    324:                        sp = glookup(id, 0);
                    325:                        if ((sp->s_flag&S_DEF) == 0) {
                    326:                                sp->s_seg = SBSS;
                    327:                                sp->s_flag |= S_GBL;
                    328:                                if (size > sp->s_value)
                    329:                                        sp->s_value = size;
                    330:                        }
                    331:                        if (isvariant(VASM)) {
                    332:                                bput(op);
                    333:                                sput(id);
                    334:                                zput(size);
                    335:                        }
                    336:                        break;
                    337: 
                    338: #ifdef KLUDGE
                    339:                case SGUESS:
                    340:                {
                    341:                        int seg;
                    342:                        sget(id, NCSYMB);
                    343:                        seg = bget();
                    344:                        sp = glookup(id, 0);
                    345:                        if ((sp->s_flag&S_DEF) == 0)
                    346:                                sp->s_seg = seg;
                    347:                        break;
                    348:                }
                    349: 
                    350: #endif
                    351:                        
                    352:                case LLABEL:
                    353:                        sp = llookup(iget(), 1);
                    354:                        sp->s_seg = dotseg;
                    355:                        sp->s_value  = dot;
                    356:                        sp->s_flag |= S_NFL;
                    357:                        if (isvariant(VASM)) {
                    358:                                bput(op);
                    359:                                iput((ival_t)sp->s_labno);
                    360:                        }
                    361:                        break;
                    362: 
                    363:                case BLOCK:
                    364:                        genblock(zget());
                    365:                        break;
                    366: 
                    367:                case ENTER:
                    368:                        genseg(bget());
                    369:                        break;
                    370: 
                    371:                case PROLOG:
                    372: #if !TINY
                    373: #define vcheck(v,s)    if (vflag>v) check(s)
                    374: #else
                    375: #define vcheck(v,s)    /* if (vflag>v) check(s) */
                    376: #endif
                    377:                        getfunc();
                    378:                        fixdbgt();
                    379:                        shuffle();
                    380:                        vcheck(0, "Befor optim");
                    381:                        do {
                    382:                                changes = 0;
                    383:                                labels();
                    384:                                vcheck(8, "After labels");
                    385:                                fixbr();
                    386:                                vcheck(8, "After fixbr()");
                    387:                                if (isvariant(VPEEP)) {
                    388:                                        peephole();
                    389:                                        vcheck(8, "After peephole");
                    390:                                }
                    391:                                if (notvariant(VNOOPT)) {
                    392:                                        xjumps();
                    393:                                        vcheck(8, "After xjumps");
                    394:                                        comseq();
                    395:                                        vcheck(8, "After comseq");
                    396:                                }
                    397:                                deadcode();
                    398:                                vcheck(2, "Before while (changes)");
                    399:                        } while (changes);
                    400:                        genprolog();
                    401:                        genfunc();
                    402:                        genepilog();
                    403:                        break;
                    404: 
                    405:                case ALIGN:
                    406:                        genalign(bget());
                    407:                        break;
                    408: 
                    409:                case CODE:
                    410:                        unbget(CODE);
                    411:                        ip = getins();
                    412:                        genins(ip);
                    413:                        free((char *) ip);
                    414:                        break;
                    415: 
                    416:                case FINISH:
                    417:                        genseg(-1);
                    418:                        if (isvariant(VASM))
                    419:                                bput(op);
                    420:                        return;
                    421: 
                    422:                case EOF:
                    423:                        cfatal("unexpected EOF");
                    424: 
                    425:                default:
                    426:                        cbotch("bad temporary file opcode %d", op);
                    427:                }
                    428:        }
                    429: }
                    430: 
                    431: #if !TINY
                    432: /*
                    433:  * Compiler debugging printout.
                    434:  */
                    435: check(where)
                    436: char *where;
                    437: {
                    438:        register INS *ip;
                    439: 
                    440:        printf("Check %s:\n", where);
                    441:        for (ip = ins.i_fp; ip != &ins; ip = ip->i_fp) {
                    442:                iprint(ip);
                    443:        }
                    444:        printf("\n");
                    445: }
                    446: 
                    447: iprint(ip)
                    448: register INS *ip;
                    449: {
                    450:        dprint(ip);
                    451: #if RUNNING_LARGE
                    452:        printf("\t%08lx: %08lx %08lx: ", ip, ip->i_bp, ip->i_fp);
                    453: #else
                    454:        printf("\t%04x: %04x %04x: ", ip, ip->i_bp, ip->i_fp);
                    455: #endif
                    456:        switch (ip->i_type) {
                    457:        case ENTER:
                    458:                printf("enter %d", ip->i_seg);
                    459:                break;
                    460:        case EPILOG:
                    461:                printf("epilog");
                    462:                break;
                    463:        case PROLOG:
                    464:                printf("prolog");
                    465:                break;
                    466:        case BLOCK:
                    467:                printf("block %ld", (long)ip->i_len);
                    468:                break;
                    469:        case ALIGN:
                    470:                printf("align %d", ip->i_align);
                    471:                break;
                    472:        case LLABEL:
                    473:                printf("label L%d", ip->i_labno);
                    474:                break;
                    475:        case JUMP:
                    476:                printf("jump %d L%d", ip->i_rel, ip->i_labno);
                    477:                break;
                    478:        case LLLINK:
                    479:                printf("llink L%d", ip->i_labno);
                    480:                break;
                    481:        case CODE:
                    482:                printf("code %d(%d)", ip->i_op, ip->i_naddr);
                    483:                break;
                    484:        default:
                    485:                printf("?? %d", ip->i_type);
                    486:                break;
                    487:        }
                    488:        printf("\n");
                    489: }
                    490: #endif
                    491: 
                    492: /* end of n2/cc2.c */

unix.superglobalmegacorp.com

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