Re-add compiler changes and extra tracing
authorNick Downing <nick@ndcode.org>
Thu, 11 Aug 2022 01:17:14 +0000 (11:17 +1000)
committerNick Downing <nick@ndcode.org>
Thu, 11 Aug 2022 01:18:00 +0000 (11:18 +1000)
usr/src/cmd/c/c10.c
usr/src/cmd/c/c11.c
usr/src/cmd/c/c13.c
usr/src/cmd/c/c2.h
usr/src/cmd/c/c20.c
usr/src/cmd/c/c21.c
usr/src/cmd/c/table.s

index 229391b..97752d4 100644 (file)
@@ -59,7 +59,7 @@ char *argv[];
        /*
         * tack on the string file.
         */
-       printf(".globl\n.data\n");
+       printf(".area   data\n");
        if (*argv[2] != '-') {
                if (freopen(argv[2], "r", stdin)==NULL) {
                        error("Missing temp file");
@@ -289,8 +289,10 @@ again:
                }
                tree = atree;
                tree->op = CALL2;
+#if 0 /* seems to generate "jsr pc,*#label" instead of "jsr pc,label" */
                if (modf && tree->tr1->op==NAME && tree->tr1->class==EXTERN)
                        tree->op = CALL1;
+#endif
                if (cexpr(tree, regtab, reg)<0)
                        error("compiler botch: call");
                popstk(r);
@@ -495,14 +497,14 @@ struct table *table;
        string = opt->tabstring;
        p1 = tree->tr1;
        if (p1->op==FCON && p1->value>0) {
-               printf(".data\nL%d:%o;%o;%o;%o\n.text\n", p1->value, p1->fvalue);
+               printf(".area   data\nL%d:.dw %d,%d,%d,%d\n.area        text\n", p1->value, p1->fvalue);
                p1->value = -p1->value;
        }
        p2 = 0;
        if (opdope[tree->op]&BINARY) {
                p2 = tree->tr2;
                if (p2->op==FCON && p2->value>0) {
-                       printf(".data\nL%d:%o;%o;%o;%o\n.text\n", p2->value, p2->fvalue);
+                       printf(".area   data\nL%d:.dw %d,%d,%d,%d\n.area        text\n", p2->value, p2->fvalue);
                        p2->value = -p2->value;
                }
        }
@@ -780,7 +782,7 @@ loop:
         * Mask used in field assignments
         */
        case 'Z':
-               printf("$%o", tree->mask);
+               printf("#%d", tree->mask);
                goto loop;
 
        /*
@@ -1056,7 +1058,7 @@ int *flagp;
                } else {
                        if (retval!=0)
                                printf("mov     r%d,r0\n", retval);
-                       printf("mov     $%o,r1\n", size);
+                       printf("mov     #%d,r1\n", size);
                        printf("L%d:mov -(r0),-(sp)\ndec\tr1\njne\tL%d\n", isn, isn);
                        isn++;
                }
@@ -1103,11 +1105,13 @@ struct tnode *atree;
        tree = atree;
        type = atype;
        if (type==CHAR) {
-               printf(".byte ");
+               printf(".db ");
                if (tree->type&XTYPE)
                        goto illinit;
                type = INT;
        }
+       else
+               printf(".dw ");
        if (type&XTYPE)
                type = INT;
        switch (type) {
@@ -1128,7 +1132,7 @@ struct tnode *atree;
                        tree->value = lval;
                }
                if (tree->op == CON)
-                       printf("%o\n", tree->value);
+                       printf("%d\n", tree->value);
                else if (tree->op==AMPER) {
                        pname(tree->tr1, 0);
                        putchar('\n');
@@ -1153,9 +1157,9 @@ struct tnode *atree;
                        goto illinit;
                if (type==FLOAT) {
                        sfval = fval;
-                       printf("%o; %o\n", sfval);
+                       printf("%d,%d\n", sfval);
                } else
-                       printf("%o; %o; %o; %o\n", fval);
+                       printf("%d,%d,%d,%d\n", fval);
                return;
 
        case LONG:
@@ -1174,7 +1178,7 @@ struct tnode *atree;
                        lval = tree->lvalue;
                else
                        goto illinit;
-               printf("%o; %o\n", lval);
+               printf("%d,%d\n", lval);
                return;
        }
 illinit:
index 1ed1b22..a6ce1f9 100644 (file)
@@ -49,12 +49,12 @@ loop:
        switch(p->op) {
 
        case LCON:
-               printf("$%o", flag>10? p->lvalue.intx[1]:p->lvalue.intx[0]);
+               printf("#%d", flag>10? p->lvalue.intx[1]:p->lvalue.intx[0]);
                return;
 
        case SFCON:
        case CON:
-               printf("$");
+               printf("#");
                psoct(p->value);
                return;
 
@@ -97,7 +97,7 @@ loop:
                return;
 
        case AMPER:
-               putchar('$');
+               putchar('#');
                p = p->tr1;
                if (p->op==NAME && p->class==REG)
                        regerr();
@@ -335,21 +335,21 @@ arlength(t)
  */
 
 char   dirsw[] {"\
-cmp    r0,$%o\n\
+cmp    r0,#%d\n\
 jhi    L%d\n\
 asl    r0\n\
 jmp    *L%d(r0)\n\
-.data\n\
+.area  data\n\
 L%d:\
 " };
 
 char   hashsw[] {"\
 mov    r0,r1\n\
 clr    r0\n\
-div    $%o,r0\n\
+div    #%d,r0\n\
 asl    r1\n\
 jmp    *L%d(r1)\n\
-.data\n\
+.area  data\n\
 L%d:\
 "};
 
@@ -380,19 +380,19 @@ struct swtab *afp, *alp;
        /* direct switch */
        if (range>0 && range <= 3*ncase) {
                if (fp->swval)
-                       printf("sub     $%o,r0\n", fp->swval);
+                       printf("sub     #%d,r0\n", fp->swval);
                printf(dirsw, range, deflab, isn, isn);
                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(".text\n");
+               printf(".area   text\n");
                return;
        }
        /* simple switch */
@@ -424,8 +424,8 @@ struct swtab *afp, *alp;
        printf(hashsw, tabs, i, i);
        isn++;
        for (i=0; i<tabs; i++)
-               printf("L%d\n", isn+i);
-       printf(".text\n");
+               printf(".dw     L%d\n", isn+i);
+       printf(".area   text\n");
        for (i=0; i<tabs; i++) {
                printf("L%d:", isn++);
                for (swp=fp; swp<=lp; swp++) {
@@ -444,7 +444,7 @@ breq(v, l)
        if (v==0)
                printf("tst     r0\n");
        else
-               printf("cmp     r0,$%o\n", v);
+               printf("cmp     r0,#%d\n", v);
        printf("jeq     L%d\n", l);
 }
 
@@ -665,7 +665,7 @@ struct tnode *atree;
        }
        if (cexpr(tree, cctab, reg) < 0) {
                reg = rcexpr(tree, regtab, reg);
-               printf("ashc    $0,r%d\n", reg);
+               printf("ashc    #0,r%d\n", reg);
                branch(xlab1, op, 0);
        }
        xlab1 = xl1;
@@ -738,7 +738,7 @@ popstk(a)
                printf("cmp     (sp)+,(sp)+\n");
                return;
        }
-       printf("add     $%o,sp\n", a);
+       printf("add     #%d,sp\n", a);
 }
 
 error(s, p1, p2, p3, p4, p5, p6)
@@ -759,7 +759,7 @@ psoct(an)
                n = -n;
                sign = '-';
        }
-       printf("%c%o", sign, n);
+       printf("%c%d", sign, n);
 }
 
 /*
@@ -797,7 +797,7 @@ getree()
 
        case SINIT:
  fprintf(stderr, "SINIT\n");
-               printf("%o\n", geti());
+               printf("%d\n", geti());
                break;
 
        case EOFC:
@@ -807,9 +807,9 @@ getree()
        case BDATA:
  fprintf(stderr, "BDATA\n");
                if (geti() == 1) {
-                       printf(".byte ");
+                       printf(".db ");
                        for (;;)  {
-                               printf("%o", geti());
+                               printf("%d", geti());
                                if (geti() != 1)
                                        break;
                                printf(",");
@@ -820,40 +820,41 @@ getree()
 
        case PROG:
  fprintf(stderr, "PROG\n");
-               printf(".text\n");
+               printf(".area   text\n");
                break;
 
        case DATA:
  fprintf(stderr, "DATA\n");
-               printf(".data\n");
+               printf(".area   data\n");
                break;
 
        case BSS:
  fprintf(stderr, "BSS\n");
-               printf(".bss\n");
+               printf(".area   bss\n");
                break;
 
        case SYMDEF:
  fprintf(stderr, "SYMDEF\n");
                outname(s);
-               printf(".globl%s%.8s\n", s[0]?" ":"", s);
+               if (s[0])
+                       printf(".globl %.8s\n", s);
                sfuncr.nloc = 0;
                break;
 
        case RETRN:
  fprintf(stderr, "RETRN\n");
-               printf("jmp     cret\n");
+               printf(".globl  cret\njmp       cret\n");
                break;
 
        case CSPACE:
  fprintf(stderr, "CSPACE\n");
                t = outname(s);
-               printf(".comm   %.8s,%o\n", t, geti());
+               printf(".comm   %.8s,%d\n", t, geti());
                break;
 
        case SSPACE:
  fprintf(stderr, "SSPACE\n");
-               printf(".=.+%o\n", (t=geti()));
+               printf(".=.+%d\n", (t=geti()));
                totspace += (unsigned)t;
                break;
 
@@ -864,7 +865,7 @@ getree()
 
        case SAVE:
  fprintf(stderr, "SAVE\n");
-               printf("jsr     r5,csv\n");
+               printf(".globl  csv\njsr        r5,csv\n");
                break;
 
        case SETSTK:
@@ -873,32 +874,32 @@ getree()
                if (t==2)
                        printf("tst     -(sp)\n");
                else if (t != 0)
-                       printf("sub     $%o,sp\n", t);
+                       printf("sub     #%d,sp\n", t);
                break;
 
        case PROFIL:
  fprintf(stderr, "PROFIL\n");
                t = geti();
-               printf("mov     $L%d,r0\njsr    pc,mcount\n", t);
-               printf(".bss\nL%d:.=.+2\n.text\n", t);
+               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());
+               printf(";~%s=L%d\n", t+1, geti());
                break;
 
        case ANAME:
  fprintf(stderr, "ANAME\n");
                t = outname(s);
-               printf("~%s=%o\n", t+1, geti());
+               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());
+               printf(";~%s=r%d\n", t+1, geti());
                break;
 
        case SWIT:
@@ -940,7 +941,7 @@ getree()
                else {
                        if ((*sp)->type==LONG) {
                                rcexpr(tnode(RFORCE, (*sp)->type, *sp), efftab, 0);
-                               printf("ashc    $0,r0\n");
+                               printf("ashc    #0,r0\n");
                        } else {
                                rcexpr(*sp, cctab, 0);
                                if (isfloat(*sp))
@@ -959,6 +960,7 @@ getree()
                        np = getblk(sizeof(*xnp));
                        np->type = geti();
                        outname(np->name);
+                       printf(".globl %.8s\n", np->name);
                } else {
                        np = getblk(sizeof(*np));
                        np->type = geti();
@@ -1042,7 +1044,7 @@ getree()
        case RLABEL:
  fprintf(stderr, "RLABEL\n");
                t = outname(s);
-               printf("%.8s:\n~~%s:\n", t, t+1);
+               printf("%.8s:\n;~~%s:\n", t, t+1);
                break;
 
        case BRANCH:
@@ -1114,11 +1116,11 @@ struct fasgn *atp;
                if (tp->op==RFORCE) {   /* function return */
                        if (sfuncr.nloc==0) {
                                sfuncr.nloc = isn++;
-                               printf(".bss\nL%d:.=.+%o\n.text\n", sfuncr.nloc, nwords*sizeof(int));
+                               printf(".area   bss\nL%d:.=.+%d\n.area  text\n", sfuncr.nloc, nwords*sizeof(int));
                        }
                        atp->tr1 = tnode(ASSIGN, STRUCT, &sfuncr, tp->tr1);
                        strasg(atp);
-                       printf("mov     $L%d,r0\n", sfuncr.nloc);
+                       printf("mov     #L%d,r0\n", sfuncr.nloc);
                        return;
                }
                if (tp->op==CALL) {
@@ -1152,7 +1154,7 @@ struct fasgn *atp;
                }
                if (nreg<=1)
                        printf("mov     r2,-(sp)\n");
-               printf("mov     $%o,r2\n", nwords);
+               printf("mov     #%d,r2\n", nwords);
                printf("L%d:mov (r1)+,(r0)+\ndec\tr2\njne\tL%d\n", isn, isn);
                isn++;
                if (nreg<=1)
index 0af8ae7..944afb1 100644 (file)
@@ -262,15 +262,15 @@ char      asr[]   "asr";
 char   ash[]   "ash";
 char   asl[]   "asl";
 char   bic[]   "bic";
-char   bic1[]  "bic $1,";
+char   bic1[]  "bic #1,";
 char   bit[]   "bit";
-char   bit1[]  "bit $1,";
+char   bit1[]  "bit #1,";
 char   bis[]   "bis";
-char   bis1[]  "bis $1,";
+char   bis1[]  "bis #1,";
 char   xor[]   "xor";
 char   neg[]   "neg";
 char   com[]   "com";
-char   stdol[] "*$";
+char   stdol[] "*#";
 char   ashc[]  "ashc";
 char   slmul[] "lmul";
 char   sldiv[] "ldiv";
index 5a8c587..84e89ea 100644 (file)
@@ -9,6 +9,9 @@
 #define        JMP     3
 #define        LABEL   4
 #define        DLABEL  5
+#if 1 /* .globl is now accepted within code (occurs before jsr) */
+#define GLOBL  6
+#endif
 #define        EROU    7
 #define        JSW     9
 #define        MOV     10
index 8bee9fe..63627c8 100644 (file)
@@ -18,7 +18,11 @@ struct optab optab[] {
        "jlos", CBR | JLOS<<8,
        "jhis", CBR | JHIS<<8,
        "jmp",  JMP,
+#if 1 /* .globl is now accepted within code (occurs before jsr) */
+       ".globl",GLOBL,
+#else
        ".globl",EROU,
+#endif
        "mov",  MOV,
        "clr",  CLR,
        "com",  COM,
@@ -38,9 +42,9 @@ struct optab optab[] {
        "mul",  MUL,
        "ash",  ASH,
        "xor",  XOR,
-       ".text",TEXT,
-       ".data",DATA,
-       ".bss", BSS,
+       ".area  text", TEXT,
+       ".area  data", DATA,
+       ".area  bss", BSS,
        ".even",EVEN,
        "movf", MOVF,
        "movof",MOVOF,
@@ -308,7 +312,7 @@ output()
 
 /*
  * Notice addresses of the form
- * $xx,xx(r)
+ * #xx,xx(r)
  * and replace them with (pc),xx(r)
  *     -- Thanx and a tip of the Hatlo hat to Bliss-11.
  */
@@ -320,7 +324,7 @@ struct node *at;
        register struct node *t;
 
        t = at;
-       if (*t->code != '$')
+       if (*t->code != '#')
                return;
        c1 = t->code;
        while (*c1 != ',')
@@ -399,6 +403,14 @@ oplook()
        for (lp = line; *lp && *lp!=' ' && *lp!='\t';)
                *np++ = *lp++;
        *np++ = 0;
+#if 1 /* hack: treat .area\tname as a single token */
+ if (strcmp(tmpop, ".area") == 0 && *lp) {
+  np[-1] = *lp++;
+  for (lp = line; *lp && *lp!=' ' && *lp!='\t';)
+   *np++ = *lp++;
+  *np++ = 0;
+ }
+#endif
        while (*lp=='\t' || *lp==' ')
                lp++;
        curlp = lp;
index 267c824..03a7e7b 100644 (file)
@@ -34,7 +34,7 @@ rmove()
                                continue;
                        }
                }
-               if (equstr(regs[RT1], "$0")) {
+               if (equstr(regs[RT1], "#0")) {
                        p->op = CLR;
                        strcpy(regs[RT1], regs[RT2]);
                        regs[RT2][0] = 0;
@@ -75,14 +75,14 @@ rmove()
        case ASH:
        dble:
                dualop(p);
-               if (p->op==BIC && (equstr(regs[RT1], "$-1") || equstr(regs[RT1], "$177777"))) {
+               if (p->op==BIC && (equstr(regs[RT1], "#-1") || equstr(regs[RT1], "#177777"))) {
                        p->op = CLR;
                        strcpy(regs[RT1], regs[RT2]);
                        regs[RT2][0] = 0;
                        p->code = copy(1, regs[RT1]);
                        goto sngl;
                }
-               if ((p->op==BIC || p->op==BIS) && equstr(regs[RT1], "$0")) {
+               if ((p->op==BIC || p->op==BIS) && equstr(regs[RT1], "#0")) {
                        if (p->forw->op!=CBR) {
                                p->back->forw = p->forw;
                                p->forw->back = p->back;
@@ -114,9 +114,9 @@ rmove()
                dest(regs[RT1], flt);
                if (p->op==CLR && flt==0)
                        if ((r = isreg(regs[RT1])) >= 0)
-                               savereg(r, "$0");
+                               savereg(r, "#0");
                        else
-                               setcon("$0", regs[RT1]);
+                               setcon("#0", regs[RT1]);
                ccloc[0] = 0;
                continue;
 
@@ -145,27 +145,27 @@ rmove()
                source(regs[RT1]);
                source(regs[RT2]);
                if(p->op==BIT) {
-                       if (equstr(regs[RT1], "$-1") || equstr(regs[RT1], "$177777")) {
+                       if (equstr(regs[RT1], "#-1") || equstr(regs[RT1], "#177777")) {
                                p->op = TST;
                                strcpy(regs[RT1], regs[RT2]);
                                regs[RT2][0] = 0;
                                p->code = copy(1, regs[RT1]);
                                nchange++;
                                nsaddr++;
-                       } else if (equstr(regs[RT2], "$-1") || equstr(regs[RT2], "$177777")) {
+                       } else if (equstr(regs[RT2], "#-1") || equstr(regs[RT2], "#177777")) {
                                p->op = TST;
                                regs[RT2][0] = 0;
                                p->code = copy(1, regs[RT1]);
                                nchange++;
                                nsaddr++;
                        }
-                       if (equstr(regs[RT1], "$0")) {
+                       if (equstr(regs[RT1], "#0")) {
                                p->op = TST;
                                regs[RT2][0] = 0;
                                p->code = copy(1, regs[RT1]);
                                nchange++;
                                nsaddr++;
-                       } else if (equstr(regs[RT2], "$0")) {
+                       } else if (equstr(regs[RT2], "#0")) {
                                p->op = TST;
                                strcpy(regs[RT1], regs[RT2]);
                                regs[RT2][0] = 0;
@@ -182,7 +182,7 @@ rmove()
                if (p->back->op==TST || p->back->op==CMP) {
                        if (p->back->op==TST) {
                                singop(p->back);
-                               savereg(RT2, "$0");
+                               savereg(RT2, "#0");
                        } else
                                dualop(p->back);
                        r = compare(p->subop, findcon(RT1), findcon(RT2));
@@ -431,7 +431,7 @@ char *as;
        while (*s) {
                if ((*s=='(' && (*(s+1)!='r' || *(s+2)!='5')) || *s++=='*') {
                        for (i=0; i<NREG+NREG; i++) {
-                               if (regs[i][0] != '$')
+                               if (regs[i][0] != '#')
                                        regs[i][0] = 0;
                                conloc[0] = 0;
                        }
@@ -642,7 +642,7 @@ register struct node *p;
        p1 = nonlab(p1);
        if (p1->op==TST) {
                singop(p1);
-               savereg(RT2, "$0");
+               savereg(RT2, "#0");
        } else if (p1->op==CMP)
                dualop(p1);
        else
@@ -669,7 +669,7 @@ findcon(i)
        register r;
 
        p = regs[i];
-       if (*p=='$')
+       if (*p=='#')
                return(p);
        if ((r = isreg(p)) >= 0)
                return(regs[r]);
@@ -683,7 +683,7 @@ register char *cp1, *cp2;
 {
        register unsigned n1, n2;
 
-       if (*cp1++ != '$' || *cp2++ != '$')
+       if (*cp1++ != '#' || *cp2++ != '#')
                return(-1);
        n1 = 0;
        while (*cp2 >= '0' && *cp2 <= '7') {
@@ -737,7 +737,7 @@ char *ar1, *ar2;
 
        cl = ar2;
        cv = ar1;
-       if (*cv != '$')
+       if (*cv != '#')
                return;
        if (!natural(cl))
                return;
index f8ead47..a49dac3 100644 (file)
@@ -151,21 +151,21 @@ cr32:
 
 %al,1
        F
-       I       $1,A1+
+       I       #1,A1+
        V       A1
 
 %el*,1
        F1*
        mov     #1+2(R1),R+
        mov     #1(R1),R
-       I       $1,#1+2(R1)
+       I       #1,#1+2(R1)
        V       #1(R1)
 
 %nl*,1
        F*
        mov     #1+2(R),-(sp)
        mov     #1(R),-(sp)
-       I       $1,#1+2(R)
+       I       #1,#1+2(R)
        V       #1(R)
        mov     (sp)+,R
        mov     (sp)+,R+
@@ -251,7 +251,7 @@ cr80:
        FS*
        S
        mov     R,*(sp)
-       add     $2,(sp)
+       add     #2,(sp)
        mov     R+,*(sp)+
 
 / field assign, value in reg.
@@ -802,8 +802,9 @@ cr82:
 %nl,nl
        SS
        FS
+       .globl  I
        jsr     pc,I
-       add     $10,sp
+       add     #10,sp
 
 / =*, =/, =rem for longs
 / Operands of the form &x op y, so stack space is known.
@@ -811,8 +812,9 @@ cr86:
 %n,nl
        SS
        FS
+       .globl  I
        jsr     pc,I
-       add     $6,sp
+       add     #6,sp
 
 / convert integer to character (sign extend)
 cr109:
@@ -1221,7 +1223,7 @@ cr92:
        mov     (R),R
        ashc    (sp)+,R
        mov     R,*(sp)
-       add     $2,(sp)
+       add     #2,(sp)
        mov     R+,*(sp)+
 
 / field = ...
@@ -1470,7 +1472,7 @@ cc81:
 
 %al,c
 %al,au
-       /bit    $0,A1
+       /bit    #0,A1
        /X0
        bit     A2,A1+
        X1
@@ -1478,7 +1480,7 @@ cc81:
 %nl*,c
 %nl*,au
        F*
-       /bit    $0,#2(R)
+       /bit    #0,#2(R)
        /X0
        bit     A2,#2+2(R)
        X1
@@ -1504,7 +1506,7 @@ cc81:
 %nl,c
 %nl,au
        F
-       /bit    $0,R
+       /bit    #0,R
        /X0
        bit     A2,R+
        X1