Crudely hack the ARM pcc code generator to produce code that the ACK's
authorDavid Given <dg@cowlark.com>
Sat, 19 Mar 2016 13:51:26 +0000 (14:51 +0100)
committerDavid Given <dg@cowlark.com>
Sat, 19 Mar 2016 13:51:26 +0000 (14:51 +0100)
elderly assembler can handle.

--HG--
branch : default-branch

lang/pcc/build.mk
lang/pcc/pcc/arch/arm/code.c
lang/pcc/pcc/arch/arm/local.c
lang/pcc/pcc/arch/arm/local2.c
lang/pcc/pcc/arch/arm/macdefs.h
lang/pcc/pcc/arch/arm/table.c

index cc932ad..6d56718 100644 (file)
@@ -2,15 +2,17 @@ D := lang/pcc
 
 define pcc-cfile-impl
        $(call cfile, $1)
-       $(call dependson, $(OBJDIR)/$D/external.h)
+       $(call dependson, $(OBJDIR)/$D/pcc/external.h)
 endef
 pcc-cfile = $(eval $(pcc-cfile-impl))
 
 define build-pcc-impl
 
+$(eval E := $(OBJDIR)/$D/pcc)
+
 $(eval pcc-cflags = \
        -Ilang/pcc \
-       -I$(OBJDIR)/$D \
+       -I$E \
        -Ilang/pcc/pcc/common \
        -Ilang/pcc/pcc/mip \
        -Ilang/pcc/pcc/cc/ccom \
@@ -27,7 +29,7 @@ $(eval pcc-cflags = \
 $(call reset)
 $(eval cflags += $(pcc-cflags))
 
-$(call pcc-cfile, $(OBJDIR)/$D/external.c)
+$(call pcc-cfile, $E/external.c)
 $(call pcc-cfile, lang/pcc/pcc/arch/$(PCCARCH)/code.c)
 $(call pcc-cfile, lang/pcc/pcc/arch/$(PCCARCH)/local.c)
 $(call pcc-cfile, lang/pcc/pcc/arch/$(PCCARCH)/local2.c)
@@ -51,27 +53,24 @@ $(call pcc-cfile, lang/pcc/pcc/mip/reader.c)
 $(call pcc-cfile, lang/pcc/pcc/mip/regs.c)
 
 $(call pcc-cfile, lang/pcc/pcc/cc/ccom/gcc_compat.c)
-$(call dependson, $(OBJDIR)/$D/cgram.h)
+$(call dependson, $E/cgram.h)
 
 $(call pcc-cfile, lang/pcc/pcc/cc/ccom/pftn.c)
-$(call dependson, $(OBJDIR)/$D/cgram.h)
+$(call dependson, $E/cgram.h)
 
-$(call yacc, $(OBJDIR)/$D, lang/pcc/pcc/cc/ccom/cgram.y)
+$(call yacc, $E, lang/pcc/pcc/cc/ccom/cgram.y)
 
-$(call flex, $(OBJDIR)/$D, lang/pcc/pcc/cc/ccom/scan.l)
-$(call dependson, $(OBJDIR)/$D/cgram.h)
+$(call flex, $E, lang/pcc/pcc/cc/ccom/scan.l)
+$(call dependson, $E/cgram.h)
 
 $(call cprogram, $(BINDIR)/$(PLATFORM)/pcc_ccom)
 $(call installto, $(PLATDEP)/$(PLATFORM)/pcc_ccom)
 
 
 $(call reset)
-$(call rawfile, $(OBJDIR)/$D/y.tab.h)
-$(call installto, $(OBJDIR)/$D/cgram.h)
-
-
-$(call reset)
-$(eval cflags += $(pcc-cflags))
+$(call rawfile, $E/y.tab.h)
+$(call dependson, $E/y.tab.c)
+$(call installto, $E/cgram.h)
 
 
 $(call reset)
@@ -80,11 +79,11 @@ $(eval cflags += $(pcc-cflags) -DMKEXT)
 $(call cfile, lang/pcc/pcc/mip/mkext.c)
 $(call cfile, lang/pcc/pcc/mip/common.c)
 $(call cfile, lang/pcc/pcc/arch/$(PCCARCH)/table.c)
-$(call cprogram, $(OBJDIR)/$D/mkext)
+$(call cprogram, $E/mkext)
 $(eval pcc_mkext := $o)
 
-$(OBJDIR)/$D/external.h: $(OBJDIR)/$D/external.c
-$(OBJDIR)/$D/external.c: $(pcc_mkext)
+$E/external.h: $E/external.c
+$E/external.c: $(pcc_mkext)
        @echo MKEXT
        @mkdir -p $$(dir $$@)
        $(hide) (cd $$(dir $$@) && $(pcc_mkext))
index cdd41fd..7c80879 100644 (file)
@@ -55,15 +55,15 @@ void
 setseg(int seg, char *name)
 {
        switch (seg) {
-       case PROG: name = ".text"; break;
+       case PROG: name = ".sect .text"; break;
        case DATA:
-       case LDATA: name = ".data"; break;
+       case LDATA: name = ".sect .data"; break;
        case UDATA: break;
        case PICLDATA: name = ".section .data.rel.local,\"aw\",@progbits";break;
        case PICDATA: name = ".section .data.rel.rw,\"aw\",@progbits"; break;
        case PICRDATA: name = ".section .data.rel.ro,\"aw\",@progbits"; break;
        case STRNG:
-       case RDATA: name = ".section .rodata"; break;
+       case RDATA: name = ".sect .rom"; break;
        case TLSDATA: name = ".section .tdata,\"awT\",@progbits"; break;
        case TLSUDATA: name = ".section .tbss,\"awT\",@nobits"; break;
        case CTORS: name = ".section\t.ctors,\"aw\",@progbits"; break;
@@ -91,9 +91,11 @@ defloc(struct symtab *sp)
                printf("\t.type %s,%%function\n", n);
 #endif
        if (sp->sclass == EXTDEF)
-               printf("\t.global %s\n", n);
+               printf("\t.extern %s\n", n);
+#if 0 // dg
        if (sp->slevel == 0)
                printf("%s:\n", n);
+#endif
        else
                printf(LABFMT ":\n", sp->soffset);
 }
@@ -440,7 +442,6 @@ efcode(void)
 void
 ejobcode(int flag)
 {
-       printf("\t.ident \"PCC: %s\"\n", VERSSTR);
 }
 
 /*
@@ -451,6 +452,7 @@ ejobcode(int flag)
 void
 bjobcode(void)
 {
+       printf(".sect .text; .sect .rom; .sect .data; .sect .bss\n");
 }
 
 /*
index 18c4564..fd5dbdc 100644 (file)
@@ -428,7 +428,7 @@ ninval(CONSZ off, int fsz, NODE *p)
                break;
        case INT:
        case UNSIGNED:
-               printf("\t.word 0x%x", (int)glval(p));
+               printf("\t.data4 0x%x", (int)glval(p));
                if ((q = p->n_sp) != NULL) {
                        if ((q->sclass == STATIC && q->slevel > 0)) {
                                printf("+" LABFMT, q->soffset);
@@ -445,15 +445,15 @@ ninval(CONSZ off, int fsz, NODE *p)
 #else
                if (!features(FEATURE_BIGENDIAN))
 #endif
-                       printf("\t.word\t0x%x\n\t.word\t0x%x\n",
+                       printf("\t.data4\t0x%x\n\t.data4\t0x%x\n",
                            u.i[0], u.i[1]);
                else
-                       printf("\t.word\t0x%x\n\t.word\t0x%x\n",
+                       printf("\t.data4\t0x%x\n\t.data4\t0x%x\n",
                            u.i[1], u.i[0]);
                break;
        case FLOAT:
                u.f = (float)((FLT *)p->n_dcon)->fp;
-               printf("\t.word\t0x%x\n", u.i[0]);
+               printf("\t.data4\t0x%x\n", u.i[0]);
                break;
        default:
                return 0;
index 1ada054..6f3832f 100644 (file)
@@ -193,7 +193,7 @@ prologue(struct interpass_prolog *ipp)
 
        printf("\tsub %s,%s,#%d\n", rnames[SP], rnames[SP], 16);
        printf("\tmov %s,%s\n", rnames[IP], rnames[SP]);
-       printf("\tstmfd %s!,{%s,%s,%s,%s}\n", rnames[SP], rnames[FP],
+       printf("\tstmfd %s<,{%s,%s,%s,%s}\n", rnames[SP], rnames[FP],
            rnames[IP], rnames[LR], rnames[PC]);
        printf("\tsub %s,%s,#4\n", rnames[FP], rnames[IP]);
 
@@ -224,8 +224,6 @@ eoftn(struct interpass_prolog *ipp)
                    rnames[SP], rnames[PC]);
                printf("\tadd %s,%s,#%d\n", rnames[SP], rnames[SP], 16);
        }
-       printf("\t.size %s,.-%s\n", exname(ipp->ipp_name),
-           exname(ipp->ipp_name));
 }
 
 
@@ -1054,10 +1052,10 @@ flshlab(void)
                int l = 32+strlen(el->name);
                c = tmpalloc(l);
                if (el->num)
-                       snprintf(c, l, "%s:\n\t.word %s+%d\n",
+                       snprintf(c, l, "%s:\n\t.data4 %s+%d\n",
                            el->str, el->name, el->num);
                else
-                       snprintf(c, l, "%s:\n\t.word %s\n", el->str, el->name);
+                       snprintf(c, l, "%s:\n\t.data4 %s\n", el->str, el->name);
                ip = anode(c);
                DLIST_INSERT_BEFORE(ipbase, ip, qelem);
        }
@@ -1116,10 +1114,10 @@ prtaddr(NODE *p, void *arg)
                lab = prtnumber++;
                if (nodcnt <= 1000 && notfirst == 0) {
                        if (getlval(l))
-                               printf(PRTLAB ":\n\t.word %s+%lld\n",
+                               printf(PRTLAB ":\n\t.data4 %s+%lld\n",
                                    lab, l->n_name, getlval(l));
                        else
-                               printf(PRTLAB ":\n\t.word %s\n",
+                               printf(PRTLAB ":\n\t.data4 %s\n",
                                    lab, l->n_name);
                }
                el = tmpalloc(sizeof(struct addrsymb));
index fbf8e64..7ede20b 100644 (file)
@@ -265,5 +265,5 @@ NODE *arm_builtin_va_end(const struct bitable *bt, NODE *a);
 NODE *arm_builtin_va_copy(const struct bitable *bt, NODE *a);
 #undef NODE
 
-#define COM     "\t@ "
+#define COM     "\t! "
 #define NARGREGS       4
index b98745e..872415c 100644 (file)
@@ -1803,25 +1803,25 @@ struct optab table[] = {
         SAREG,  TWORD|TPOINT|TSHORT|TUSHORT|TCHAR|TUCHAR,
         SANY,   TWORD|TPOINT|TSHORT|TUSHORT|TCHAR|TUCHAR,
                 0,      0,
-               "       stmfd sp!,{AL}" COM "save function arg to stack\n", },
+               "       stmfd sp<,{AL}" COM "save function arg to stack\n", },
 
 { FUNARG,       FOREFF,
         SBREG,  TLONGLONG|TULONGLONG,
         SANY,  TLONGLONG|TULONGLONG,
                 0,      0,
-               "       stmfd sp!,{AL,UL}" COM "save function arg to stack (endianness problem here?)\n", },
+               "       stmfd sp<,{AL,UL}" COM "save function arg to stack (endianness problem here?)\n", },
 
 { FUNARG,      FOREFF,
        SCREG,  TFLOAT,
        SANY,   TFLOAT,
                0,      0,
-               "       stmfd sp!,{AL}" COM "save function arg to stack\n", },
+               "       stmfd sp<,{AL}" COM "save function arg to stack\n", },
 
 { FUNARG,       FOREFF,
         SCREG,  TDOUBLE|TLDOUBLE,
         SANY,  TDOUBLE|TLDOUBLE,
                 0,      0,
-               "       stmfd sp!,{AL,UL}" COM "save function arg to stack (endianness problem here?)\n", },
+               "       stmfd sp<,{AL,UL}" COM "save function arg to stack (endianness problem here?)\n", },
 
 # define DF(x) FORREW,SANY,TANY,SANY,TANY,REWRITE,x,""