Fix c2 to allow .dw before switch label
authorNick Downing <nick@ndcode.org>
Thu, 11 Aug 2022 02:20:26 +0000 (12:20 +1000)
committerNick Downing <nick@ndcode.org>
Thu, 11 Aug 2022 02:20:47 +0000 (12:20 +1000)
usr/src/cmd/c/c11.c
usr/src/cmd/c/c20.c

index a6ce1f9..ef34883 100644 (file)
@@ -1,4 +1,4 @@
-#
+#define TRACE_IR 0
 /*
  *  C compiler
  */
@@ -796,16 +796,22 @@ getree()
                switch(op =& 0377) {
 
        case SINIT:
+#if TRACE_IR
  fprintf(stderr, "SINIT\n");
+#endif
                printf("%d\n", geti());
                break;
 
        case EOFC:
+#if TRACE_IR
  fprintf(stderr, "EOFC\n");
+#endif
                return;
 
        case BDATA:
+#if TRACE_IR
  fprintf(stderr, "BDATA\n");
+#endif
                if (geti() == 1) {
                        printf(".db ");
                        for (;;)  {
@@ -819,22 +825,30 @@ getree()
                break;
 
        case PROG:
+#if TRACE_IR
  fprintf(stderr, "PROG\n");
+#endif
                printf(".area   text\n");
                break;
 
        case DATA:
+#if TRACE_IR
  fprintf(stderr, "DATA\n");
+#endif
                printf(".area   data\n");
                break;
 
        case BSS:
+#if TRACE_IR
  fprintf(stderr, "BSS\n");
+#endif
                printf(".area   bss\n");
                break;
 
        case SYMDEF:
+#if TRACE_IR
  fprintf(stderr, "SYMDEF\n");
+#endif
                outname(s);
                if (s[0])
                        printf(".globl %.8s\n", s);
@@ -842,34 +856,46 @@ getree()
                break;
 
        case RETRN:
+#if TRACE_IR
  fprintf(stderr, "RETRN\n");
+#endif
                printf(".globl  cret\njmp       cret\n");
                break;
 
        case CSPACE:
+#if TRACE_IR
  fprintf(stderr, "CSPACE\n");
+#endif
                t = outname(s);
                printf(".comm   %.8s,%d\n", t, geti());
                break;
 
        case SSPACE:
+#if TRACE_IR
  fprintf(stderr, "SSPACE\n");
+#endif
                printf(".=.+%d\n", (t=geti()));
                totspace += (unsigned)t;
                break;
 
        case EVEN:
+#if TRACE_IR
  fprintf(stderr, "EVEN\n");
+#endif
                printf(".even\n");
                break;
 
        case SAVE:
+#if TRACE_IR
  fprintf(stderr, "SAVE\n");
+#endif
                printf(".globl  csv\njsr        r5,csv\n");
                break;
 
        case SETSTK:
+#if TRACE_IR
  fprintf(stderr, "SETSTK\n");
+#endif
                t = geti()-6;
                if (t==2)
                        printf("tst     -(sp)\n");
@@ -878,32 +904,42 @@ getree()
                break;
 
        case PROFIL:
+#if TRACE_IR
  fprintf(stderr, "PROFIL\n");
+#endif
                t = geti();
                printf("mov     #L%d,r0\n.globl mcount\njsr     pc,mcount\n", t);
                printf(".area   bss\nL%d:.=.+2\n.area   text\n", t);
                break;
 
        case SNAME:
+#if TRACE_IR
  fprintf(stderr, "SNAME\n");
+#endif
                t = outname(s);
                printf(";~%s=L%d\n", t+1, geti());
                break;
 
        case ANAME:
+#if TRACE_IR
  fprintf(stderr, "ANAME\n");
+#endif
                t = outname(s);
                printf(";~%s=%d\n", t+1, geti());
                break;
 
        case RNAME:
+#if TRACE_IR
  fprintf(stderr, "RNAME\n");
+#endif
                t = outname(s);
                printf(";~%s=r%d\n", t+1, geti());
                break;
 
        case SWIT:
+#if TRACE_IR
  fprintf(stderr, "SWIT\n");
+#endif
                t = geti();
                line = geti();
                curbase = funcbase;
@@ -913,19 +949,25 @@ getree()
                break;
 
        case C3BRANCH:          /* for fortran [sic] */
+#if TRACE_IR
  fprintf(stderr, "C3BRANCH\n");
+#endif
                lbl = geti();
                lbl2 = geti();
                lbl3 = geti();
                goto xpr;
 
        case CBRANCH:
+#if TRACE_IR
  fprintf(stderr, "CBRANCH\n");
+#endif
                lbl = geti();
                cond = geti();
 
        case EXPR:
+#if TRACE_IR
  fprintf(stderr, "EXPR\n");
+#endif
        xpr:
                line = geti();
                if (sp != &expstack[1]) {
@@ -954,7 +996,9 @@ getree()
                break;
 
        case NAME:
+#if TRACE_IR
  fprintf(stderr, "NAME\n");
+#endif
                t = geti();
                if (t==EXTERN) {
                        np = getblk(sizeof(*xnp));
@@ -974,13 +1018,17 @@ getree()
                break;
 
        case CON:
+#if TRACE_IR
  fprintf(stderr, "CON\n");
+#endif
                t = geti();
                *sp++ = tconst(geti(), t);
                break;
 
        case LCON:
+#if TRACE_IR
  fprintf(stderr, "LCON\n");
+#endif
                geti(); /* ignore type, assume long */
                t = geti();
                op = geti();
@@ -996,7 +1044,9 @@ getree()
                break;
 
        case FCON:
+#if TRACE_IR
  fprintf(stderr, "FCON\n");
+#endif
                t = geti();
                outname(numbuf);
                fp = getblk(sizeof(*fp));
@@ -1008,14 +1058,18 @@ getree()
                break;
 
        case FSEL:
+#if TRACE_IR
  fprintf(stderr, "FSEL\n");
+#endif
                *sp = tnode(FSEL, geti(), *--sp, NULL);
                t = geti();
                (*sp++)->tr2 = tnode(COMMA, INT, tconst(geti(), INT), tconst(t, INT));
                break;
 
        case STRASG:
+#if TRACE_IR
  fprintf(stderr, "STRASG\n");
+#endif
                sap = getblk(sizeof(*sap));
                sap->op = STRASG;
                sap->type = geti();
@@ -1026,40 +1080,54 @@ getree()
                break;
 
        case NULLOP:
+#if TRACE_IR
  fprintf(stderr, "NULLOP\n");
+#endif
                *sp++ = tnode(0, 0, NULL, NULL);
                break;
 
        case LABEL:
+#if TRACE_IR
  fprintf(stderr, "LABEL\n");
+#endif
                label(geti());
                break;
 
        case NLABEL:
+#if TRACE_IR
  fprintf(stderr, "NLABEL\n");
+#endif
                t = outname(s);
                printf("%.8s:\n", t, t);
                break;
 
        case RLABEL:
+#if TRACE_IR
  fprintf(stderr, "RLABEL\n");
+#endif
                t = outname(s);
                printf("%.8s:\n;~~%s:\n", t, t+1);
                break;
 
        case BRANCH:
+#if TRACE_IR
  fprintf(stderr, "BRANCH\n");
+#endif
                branch(geti(), 0);
                break;
 
        case SETREG:
+#if TRACE_IR
  fprintf(stderr, "SETREG\n");
+#endif
                nreg = geti()-1;
                break;
 
        default:
                if (opdope[op]&BINARY) {
+#if TRACE_IR
  fprintf(stderr, "binary\n");
+#endif
                        if (sp < &expstack[1]) {
                                error("Binary expression botch");
                                exit(1);
@@ -1068,7 +1136,9 @@ getree()
                        *sp++ = tnode(op, geti(), *--sp, t);
                } else
  {
+#if TRACE_IR
   fprintf(stderr, "unary\n");
+#endif
                        sp[-1] = tnode(op, geti(), sp[-1]);
  }
                break;
@@ -1082,7 +1152,9 @@ geti()
 
        i = getchar();
        i += getchar()<<8;
+#if TRACE_IR
  fprintf(stderr, "i %d\n", i);
+#endif
        return(i);
 }
 
@@ -1100,7 +1172,9 @@ outname(s)
        do {
                *p++ = 0;
        } while (n++ < 8);
+#if TRACE_IR
  fprintf(stderr, "outname %.8s\n", s);
+#endif
        return(s);
 }
 
index 63627c8..817dc70 100644 (file)
@@ -292,7 +292,7 @@ output()
                continue;
 
        case JSW:
-               printf("L%d\n", t->labno);
+               printf(".dw     L%d\n", t->labno);
                continue;
 
        case SOB:
@@ -427,6 +427,16 @@ oplook()
                if (ophp >= &ophash[OPHS])
                        ophp = ophash;
        }
+#if 1 /* hack: accept .dw before switch label */
+       if (line[0]=='.' && line[1] == 'd' && line[2] == 'w' && line[3] == '\t' && line[4] == 'L') {
+               lp = &line[5];
+               while (*lp)
+                       if (*lp<'0' || *lp++>'9')
+                               return(0);
+               curlp = line+4;
+               return(JSW);
+       }
+#else
        if (line[0]=='L') {
                lp = &line[1];
                while (*lp)
@@ -435,6 +445,7 @@ oplook()
                curlp = line;
                return(JSW);
        }
+#endif
        curlp = line;
        return(0);
 }