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

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

unix.superglobalmegacorp.com

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