From: David Given Date: Sat, 19 Mar 2016 13:51:26 +0000 (+0100) Subject: Crudely hack the ARM pcc code generator to produce code that the ACK's X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=82e28ce7c1cf5f2768e925cc17f979e70a088033;p=ack.git Crudely hack the ARM pcc code generator to produce code that the ACK's elderly assembler can handle. --HG-- branch : default-branch --- diff --git a/lang/pcc/build.mk b/lang/pcc/build.mk index cc932addf..6d5671879 100644 --- a/lang/pcc/build.mk +++ b/lang/pcc/build.mk @@ -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)) diff --git a/lang/pcc/pcc/arch/arm/code.c b/lang/pcc/pcc/arch/arm/code.c index cdd41fde4..7c808798c 100644 --- a/lang/pcc/pcc/arch/arm/code.c +++ b/lang/pcc/pcc/arch/arm/code.c @@ -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"); } /* diff --git a/lang/pcc/pcc/arch/arm/local.c b/lang/pcc/pcc/arch/arm/local.c index 18c456423..fd5dbdcc3 100644 --- a/lang/pcc/pcc/arch/arm/local.c +++ b/lang/pcc/pcc/arch/arm/local.c @@ -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; diff --git a/lang/pcc/pcc/arch/arm/local2.c b/lang/pcc/pcc/arch/arm/local2.c index 1ada05421..6f3832f7e 100644 --- a/lang/pcc/pcc/arch/arm/local2.c +++ b/lang/pcc/pcc/arch/arm/local2.c @@ -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)); diff --git a/lang/pcc/pcc/arch/arm/macdefs.h b/lang/pcc/pcc/arch/arm/macdefs.h index fbf8e6405..7ede20bfa 100644 --- a/lang/pcc/pcc/arch/arm/macdefs.h +++ b/lang/pcc/pcc/arch/arm/macdefs.h @@ -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 diff --git a/lang/pcc/pcc/arch/arm/table.c b/lang/pcc/pcc/arch/arm/table.c index b98745e00..872415ca2 100644 --- a/lang/pcc/pcc/arch/arm/table.c +++ b/lang/pcc/pcc/arch/arm/table.c @@ -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,""