Annotation of coherent/b/bin/c/n1/cc1.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * n1/cc1.c
                      3:  * This is the mainline of the new, direct to bits code generator.
                      4:  * It is mainly just a driving routine.
                      5:  * The tree reader and the diagnostic routines are also in this file.
                      6:  * Everything in here is machine independent.
                      7:  */
                      8: 
                      9: #ifdef vax
                     10: #include "INC$LIB:cc1.h"
                     11: #else
                     12: #include "cc1.h"
                     13: #endif
                     14: 
                     15: #if    !OVERLAID
                     16: FILE   *ifp;                   /* Input file */
                     17: FILE   *ofp;                   /* Output file */
                     18: char   file[NFNAME];           /* File name */
                     19: char   module[NMNAME];         /* Module name */
                     20: int    line;                   /* Line number */
                     21: char   id[NCSYMB];             /* Temp. id buffer */
                     22: VARIANT        variant;                /* Variant template */
                     23: #if !TINY
                     24: int    mflag;                  /* Debug modify routines */
                     25: int    sflag;                  /* Debug select routines */
                     26: int    oflag;                  /* Debug output routines */
                     27: #endif
                     28: #endif
                     29: 
                     30: int    qccmp();                /* Quicksort compare */
                     31: SYM    *hash1[NSHASH];         /* Hash table */
                     32: int    nnsw;                   /* Switch nesting level */
                     33: int    nsw[NNSW];              /* Switch label */
                     34: CASES  *cases;                 /* Case buffer */
                     35: 
                     36: #if !OVERLAID
                     37: /*
                     38:  * Mainline.
                     39:  * Interpret options and
                     40:  * open files.
                     41:  */
                     42: main(argc, argv)
                     43: char *argv[];
                     44: {
                     45:        passname = "cc1";
                     46:        if (argc < 4)
                     47:                usage();
                     48:        getvariant(argv[1]);
                     49: #if GEMDOS
                     50:        {
                     51:                extern long gemdos();
                     52:                extern char *lmalloc();
                     53:                free(lmalloc((gemdos(0x48,-1L)-4096) & ~1023L));
                     54:        }
                     55: #endif
                     56:        if ((ifp=fopen(argv[2], SRMODE)) == NULL) {
                     57:                fprintf(stderr, "%s: cannot open.\n", argv[2]);
                     58:                exit(BAD);
                     59:        }
                     60:        if ((ofp=fopen(argv[3], SWMODE)) == NULL) {
                     61:                fprintf(stderr, "%s: cannot create.\n", argv[3]);
                     62:                exit(BAD);
                     63:        }
                     64: #if !TINY
                     65:        if (argc > 4)
                     66:                mflag = atoi(argv[4]);
                     67:        if (argc > 5)
                     68:                sflag = atoi(argv[5]);
                     69:        if (argc > 6)
                     70:                oflag = atoi(argv[6]);
                     71: #endif
                     72:        labgen = 10000;
                     73:        oldseg = -1;
                     74:        work1();
                     75:        if (nerr != 0)
                     76:                exit(BAD);
                     77:        exit(OK);
                     78: }
                     79: 
                     80: /*
                     81:  * Print usage message.
                     82:  */
                     83: usage()
                     84: {
                     85: #if !TINY
                     86:        fprintf(stderr,
                     87:                "Usage: cc1 variant in out [mlevel [slevel [olevel]]]\n");
                     88: #else
                     89:        fprintf(stderr, "Usage: cc1 variant in out\n");
                     90: #endif
                     91:        exit(BAD);
                     92: }
                     93: #else
                     94: /*
                     95:  * Mainline for the overlaid version
                     96:  * of the coder. The files are already open.
                     97:  * Set up for fatal errors. Process the file
                     98:  * and return status.
                     99:  */
                    100: cc1()
                    101: {
                    102:        passname = "cc1";
                    103:        if (setjmp(death) != 0) {
                    104:                freetree();
                    105:                freepool();
                    106:                freegsym();
                    107:                return (ABORT);
                    108:        }
                    109:        labgen = 10000;
                    110:        oldseg = -1;
                    111: #if MONOLITHIC
                    112:        nnsw = 0;
                    113: #endif
                    114:        work1();
                    115:        freetree();
                    116:        freepool();
                    117:        freegsym();
                    118:        if (nerr != 0)
                    119:                return (BAD);
                    120:        return (OK);
                    121: }
                    122: #endif
                    123: 
                    124: /*
                    125:  * Read temp. file.
                    126:  * Do simple things right here.
                    127:  * Read in trees and pass them over
                    128:  * to the tree compilation code.
                    129:  */
                    130: work1()
                    131: {
                    132:        register int    i;
                    133:        register int    op;
                    134:        register TREE   *tp;
                    135:        register int    d;
                    136:        register int    n;
                    137:        register int    tt;
                    138:        register int    ln;
                    139: 
                    140:        coderinit();
                    141:        for (;;) {
                    142:                op = bget();
                    143:                switch (op) {
                    144: 
                    145:                case LINE:
                    146:                        line = iget();
                    147:                        /* bput(op); */
                    148:                        /* iput(line); */
                    149:                        break;
                    150: 
                    151:                case DLABEL:
                    152:                        bput(DLABEL);
                    153:                        tcpy(bget());
                    154:                        break;
                    155: 
                    156:                case MNAME:
                    157:                        sget(module, NMNAME);
                    158:                        bput(op);
                    159:                        sput(module);
                    160:                        break;
                    161: 
                    162:                case FNAME:
                    163:                        sget(file, NFNAME);
                    164:                        /* bput(op); */
                    165:                        /* sput(file); */
                    166:                        break;
                    167: 
                    168:                case GLABEL:
                    169:                case SLABEL:
                    170:                        sget(id, NCSYMB);
                    171:                        bput(op);
                    172:                        sput(id);
                    173:                        break;
                    174: 
                    175:                case COMM:
                    176:                        bput(op);
                    177:                        sget(id, NCSYMB);
                    178:                        sput(id);
                    179:                        zput(zget());
                    180:                        break;
                    181: 
                    182:                case LLABEL:
                    183:                        bput(op);
                    184:                        iput(iget());
                    185:                        break;
                    186: 
                    187:                case BLOCK:
                    188:                        bput(op);
                    189:                        zput(zget());
                    190:                        break;
                    191: 
                    192:                case JUMP:
                    193:                        genubr(iget());
                    194:                        break;
                    195: 
                    196:                case ENTER:
                    197:                        newseg(bget());
                    198:                        break;
                    199: 
                    200:                case AUTOS:
                    201:                        doautos();
                    202:                        break;
                    203: 
                    204:                case PROLOG:
                    205:                        bput(PROLOG);
                    206:                        doprolog();
                    207:                        break;
                    208: 
                    209:                case ALIGN:
                    210:                        bput(ALIGN);
                    211:                        bput(bget());
                    212:                        break;
                    213: 
                    214:                case EPILOG:
                    215:                        doepilog();
                    216:                        bput(EPILOG);
                    217:                        break;
                    218: 
                    219:                case EEXPR:
                    220:                        tp = modify(treeget(), MEFFECT);
                    221:                        code(tp, MEFFECT, 0, 0);
                    222:                        break;
                    223: 
                    224:                case IBLOCK:
                    225:                        iblock(bget());
                    226:                        break;
                    227: 
                    228:                case IEXPR:
                    229:                        tp = treeget();
                    230:                        tt = tp->t_type;
                    231:                        tp = modify(tp->t_lp, MINIT);
                    232:                        iexpr(tp, tt);
                    233:                        break;
                    234: 
                    235:                case FEXPR:
                    236:                case TEXPR:
                    237:                        ln = iget();
                    238:                        tp = modify(treeget(), MFLOW);
                    239:                        code(tp, MFLOW, op==TEXPR, ln);
                    240:                        break;
                    241: 
                    242:                case REXPR:
                    243:                        tp = modify(treeget(), MRETURN);
                    244:                        code(tp, MRETURN, 0, 0);
                    245:                        break;
                    246: 
                    247:                case SEXPR:
                    248:                        if (nnsw >= NNSW)
                    249:                                cfatal("switch overflow");
                    250:                        nsw[nnsw++] = n = newlab();
                    251:                        tp = modify(treeget(), MSWITCH);
                    252:                        code(tp, MSWITCH, 0, 0);
                    253:                        genubr(n);
                    254:                        break;
                    255: 
                    256:                case SBODY:
                    257:                        if (nnsw <= 0)
                    258:                                cbotch("switch underflow");
                    259:                        genlab(nsw[--nnsw]);
                    260:                        d = iget();
                    261:                        n = iget();
                    262:                        if (n != 0) {
                    263:                                cases = (CASES *)malloc(n*sizeof(CASES));
                    264:                                if (cases == NULL)
                    265:                                        cfatal("too many cases");
                    266:                                for (i=0; i<n; ++i) {
                    267:                                        cases[i].c_val = iget();
                    268:                                        cases[i].c_lab = iget();
                    269:                                }
                    270:                                shellsort((char *)cases, n, sizeof(cases[0]), &qccmp);
                    271:                        }
                    272:                        genswitch(d, n);
                    273:                        if (n != 0)
                    274:                                free((char *)cases);
                    275:                        break;
                    276: 
                    277:                case FINISH:
                    278:                        bput(op);
                    279:                        return;
                    280: 
                    281:                case EOF:
                    282:                        cfatal("unexpected EOF");
                    283: 
                    284:                default:
                    285:                        cbotch("bad temporary file opcode %d", op);
                    286:                }
                    287:        }
                    288: }
                    289: 
                    290: /*
                    291:  * This routine is used by the library
                    292:  * quicksort routine to compare two elements
                    293:  * in the case constant buffer.
                    294:  */
                    295: qccmp(a, b)
                    296: struct cases *a, *b;
                    297: {
                    298:        return (a->c_val - b->c_val);
                    299: }
                    300: 
                    301: /*
                    302:  * Generate a local label.
                    303:  */
                    304: genlab(n)
                    305: {
                    306:        bput(LLABEL);
                    307:        iput((ival_t)n);
                    308: }
                    309: 
                    310: /* end of n1/cc1.c */

unix.superglobalmegacorp.com

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