Annotation of coherent/b/bin/c/n1/cc1.c, revision 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.