Fix switch generation, add tracing in getree()
authorNick Downing <nick@ndcode.org>
Thu, 11 Aug 2022 00:58:59 +0000 (10:58 +1000)
committerNick Downing <nick@ndcode.org>
Thu, 11 Aug 2022 01:00:14 +0000 (11:00 +1000)
usr/src/cmd/c/c11.c
usr/src/libc/a.sh

index eb67821..0fe77de 100644 (file)
@@ -385,12 +385,12 @@ struct swtab *afp, *alp;
                isn++;
                for (i=fp->swval; ; i++) {
                        if (i==fp->swval) {
-                               printf("L%d\n", fp->swlab);
+                               printf(".dw     L%d\n", fp->swlab);
                                if (fp==lp)
                                        break;
                                fp++;
                        } else
-                               printf("L%d\n", deflab);
+                               printf(".dw     L%d\n", deflab);
                }
                printf(".area   text\n");
                return;
@@ -424,7 +424,7 @@ struct swtab *afp, *alp;
        printf(hashsw, tabs, i, i);
        isn++;
        for (i=0; i<tabs; i++)
-               printf("L%d\n", isn+i);
+               printf(".dw     L%d\n", isn+i);
        printf(".area   text\n");
        for (i=0; i<tabs; i++) {
                printf("L%d:", isn++);
@@ -796,13 +796,16 @@ getree()
                switch(op =& 0377) {
 
        case SINIT:
+ fprintf(stderr, "SINIT\n");
                printf("%d\n", geti());
                break;
 
        case EOFC:
+ fprintf(stderr, "EOFC\n");
                return;
 
        case BDATA:
+ fprintf(stderr, "BDATA\n");
                if (geti() == 1) {
                        printf(".db ");
                        for (;;)  {
@@ -816,18 +819,22 @@ getree()
                break;
 
        case PROG:
+ fprintf(stderr, "PROG\n");
                printf(".area   text\n");
                break;
 
        case DATA:
+ fprintf(stderr, "DATA\n");
                printf(".area   data\n");
                break;
 
        case BSS:
+ fprintf(stderr, "BSS\n");
                printf(".area   bss\n");
                break;
 
        case SYMDEF:
+ fprintf(stderr, "SYMDEF\n");
                outname(s);
                if (s[0])
                        printf(".globl %.8s\n", s);
@@ -835,28 +842,34 @@ getree()
                break;
 
        case RETRN:
+ fprintf(stderr, "RETRN\n");
                printf(".globl  cret\njmp       cret\n");
                break;
 
        case CSPACE:
+ fprintf(stderr, "CSPACE\n");
                t = outname(s);
                printf(".comm   %.8s,%d\n", t, geti());
                break;
 
        case SSPACE:
+ fprintf(stderr, "SSPACE\n");
                printf(".=.+%d\n", (t=geti()));
                totspace += (unsigned)t;
                break;
 
        case EVEN:
+ fprintf(stderr, "EVEN\n");
                printf(".even\n");
                break;
 
        case SAVE:
+ fprintf(stderr, "SAVE\n");
                printf(".globl  csv\njsr        r5,csv\n");
                break;
 
        case SETSTK:
+ fprintf(stderr, "SETSTK\n");
                t = geti()-6;
                if (t==2)
                        printf("tst     -(sp)\n");
@@ -865,27 +878,32 @@ getree()
                break;
 
        case PROFIL:
+ fprintf(stderr, "PROFIL\n");
                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:
+ fprintf(stderr, "SNAME\n");
                t = outname(s);
                printf(";~%s=L%d\n", t+1, geti());
                break;
 
        case ANAME:
+ fprintf(stderr, "ANAME\n");
                t = outname(s);
                printf(";~%s=%d\n", t+1, geti());
                break;
 
        case RNAME:
+ fprintf(stderr, "RNAME\n");
                t = outname(s);
                printf(";~%s=r%d\n", t+1, geti());
                break;
 
        case SWIT:
+ fprintf(stderr, "SWIT\n");
                t = geti();
                line = geti();
                curbase = funcbase;
@@ -895,16 +913,19 @@ getree()
                break;
 
        case C3BRANCH:          /* for fortran [sic] */
+ fprintf(stderr, "C3BRANCH\n");
                lbl = geti();
                lbl2 = geti();
                lbl3 = geti();
                goto xpr;
 
        case CBRANCH:
+ fprintf(stderr, "CBRANCH\n");
                lbl = geti();
                cond = geti();
 
        case EXPR:
+ fprintf(stderr, "EXPR\n");
        xpr:
                line = geti();
                if (sp != &expstack[1]) {
@@ -933,6 +954,7 @@ getree()
                break;
 
        case NAME:
+ fprintf(stderr, "NAME\n");
                t = geti();
                if (t==EXTERN) {
                        np = getblk(sizeof(*xnp));
@@ -952,11 +974,13 @@ getree()
                break;
 
        case CON:
+ fprintf(stderr, "CON\n");
                t = geti();
                *sp++ = tconst(geti(), t);
                break;
 
        case LCON:
+ fprintf(stderr, "LCON\n");
                geti(); /* ignore type, assume long */
                t = geti();
                op = geti();
@@ -972,6 +996,7 @@ getree()
                break;
 
        case FCON:
+ fprintf(stderr, "FCON\n");
                t = geti();
                outname(numbuf);
                fp = getblk(sizeof(*fp));
@@ -983,12 +1008,14 @@ getree()
                break;
 
        case FSEL:
+ fprintf(stderr, "FSEL\n");
                *sp = tnode(FSEL, geti(), *--sp, NULL);
                t = geti();
                (*sp++)->tr2 = tnode(COMMA, INT, tconst(geti(), INT), tconst(t, INT));
                break;
 
        case STRASG:
+ fprintf(stderr, "STRASG\n");
                sap = getblk(sizeof(*sap));
                sap->op = STRASG;
                sap->type = geti();
@@ -999,33 +1026,40 @@ getree()
                break;
 
        case NULLOP:
+ fprintf(stderr, "NULLOP\n");
                *sp++ = tnode(0, 0, NULL, NULL);
                break;
 
        case LABEL:
+ fprintf(stderr, "LABEL\n");
                label(geti());
                break;
 
        case NLABEL:
+ fprintf(stderr, "NLABEL\n");
                t = outname(s);
                printf("%.8s:\n", t, t);
                break;
 
        case RLABEL:
+ fprintf(stderr, "RLABEL\n");
                t = outname(s);
                printf("%.8s:\n;~~%s:\n", t, t+1);
                break;
 
        case BRANCH:
+ fprintf(stderr, "BRANCH\n");
                branch(geti(), 0);
                break;
 
        case SETREG:
+ fprintf(stderr, "SETREG\n");
                nreg = geti()-1;
                break;
 
        default:
                if (opdope[op]&BINARY) {
+ fprintf(stderr, "binary\n");
                        if (sp < &expstack[1]) {
                                error("Binary expression botch");
                                exit(1);
@@ -1033,7 +1067,10 @@ getree()
                        t = *--sp;
                        *sp++ = tnode(op, geti(), *--sp, t);
                } else
+ {
+  fprintf(stderr, "unary\n");
                        sp[-1] = tnode(op, geti(), sp[-1]);
+ }
                break;
        }
        }
index 1b5dc98..724b2af 100755 (executable)
@@ -2,4 +2,4 @@
 mkdir --parents ../../../tmp
 export APOUT_ROOT=`pwd`/../../..
 export PATH=`pwd`/../../../bin:`pwd`
-cc -c -O /usr/src/libc/stdio/getgrent.c
+cc -S -O /usr/src/libc/stdio/doscan.c