ref: f8fef90345e4cc025190732f94646facb2456241
parent: 3998b345a115b0d3a59ac550f4416010666eb822
author: Roberto E. Vargas Caballero <k0ga@shike2.com>
date: Sat Jan 21 05:51:56 EST 2017
[cc2-qbe] Don't use b or h in function related things Qbe expects w instead of b or h because X86_64 ABI don't deal them in a different way to w.
--- a/cc2/arch/qbe/arch.h
+++ b/cc2/arch/qbe/arch.h
@@ -133,13 +133,8 @@
ASJMP,
ASBRANCH,
ASRET,
- ASCALLB,
- ASCALLH,
- ASCALLW,
- ASCALLS,
- ASCALLL,
- ASCALLD,
ASCALL,
+ ASCALLE,
ASPAR,
ASPARE,
ASALLOC,
--- a/cc2/arch/qbe/cgen.c
+++ b/cc2/arch/qbe/cgen.c
@@ -242,26 +242,7 @@
pars[n++] = rhs(p->left, newnode(OTMP));
tp = &np->type;
- switch (tp->size) {- case 0:
- op = ASCALLW;
- break;
- case 1:
- op = ASCALLB;
- break;
- case 2:
- op = ASCALLH;
- break;
- case 4:
- op = (tp->flags & INTF) ? ASCALLW : ASCALLS;
- break;
- case 8:
- op = (tp->flags & INTF) ? ASCALLL : ASCALLD;
- break;
- default:
- abort();
- }
- code(op, tmpnode(ret, tp), fun, NULL);
+ code(ASCALL, tmpnode(ret, tp), fun, NULL);
for (q = pars; q < &pars[n]; ++q) {op = (q == &pars[n-1]) ? ASPARE : ASPAR;
@@ -268,7 +249,7 @@
tmpnode(&aux, &(*q)->type);
code(op, NULL, *q, &aux);
}
- code(ASCALL, NULL, NULL, NULL);
+ code(ASCALLE, NULL, NULL, NULL);
return ret;
}
--- a/cc2/arch/qbe/code.c
+++ b/cc2/arch/qbe/code.c
@@ -136,13 +136,8 @@
[ASBRANCH] = {.fun = branch}, [ASJMP] = {.fun = jmp}, [ASRET] = {.fun = ret},- [ASCALLB] = {.fun = call, .letter = 'b'},- [ASCALLH] = {.fun = call, .letter = 'h'},- [ASCALLW] = {.fun = call, .letter = 'w'},- [ASCALLS] = {.fun = call, .letter = 's'},- [ASCALLL] = {.fun = call, .letter = 'l'},- [ASCALLD] = {.fun = call, .letter = 'd'},- [ASCALL] = {.fun = ecall},+ [ASCALL] = {.fun = call},+ [ASCALLE] = {.fun = ecall}, [ASPAR] = {.fun = param, .txt = "%s %s, "}, [ASPARE] = {.fun = param, .txt = "%s %s"}, [ASALLOC] = {.fun = alloc},@@ -308,6 +303,25 @@
putchar('\n');}
+static char *
+size2stack(Type *tp)
+{+ switch (tp->size) {+ case 0:
+ return "w";
+ case 1:
+ return "w";
+ case 2:
+ return "w";
+ case 4:
+ return "w";
+ case 8:
+ return "l";
+ default:
+ abort();
+ }
+}
+
void
writeout(void)
{@@ -318,13 +332,13 @@
if (curfun->kind == SGLOB)
fputs("export ", stdout);- printf("function %s %s(", size2asm(&curfun->rtype), symname(curfun));+ printf("function %s %s(", size2stack(&curfun->rtype), symname(curfun));/* declare formal parameters */
for (sep = "", p = locals; p; p = p->next, sep = ",") {if ((p->type.flags & PARF) == 0)
break;
- printf("%s%s %s.val", sep, size2asm(&p->type), symname(p));+ printf("%s%s %s.val", sep, size2stack(&p->type), symname(p));}
puts(")\n{");@@ -415,10 +429,12 @@
{struct opdata *p = &optbl[pc->op];
char to[ADDR_LEN], from[ADDR_LEN];
+ Symbol *sym = pc->to.u.sym;
strcpy(to, addr2txt(&pc->to));
strcpy(from, addr2txt(&pc->from1));
- printf("\t%s =%c\tcall\t%s(", to, p->letter, from);+ printf("\t%s =%s\tcall\t%s(",+ to, size2stack(&sym->type), from);
}
static void
@@ -427,7 +443,7 @@
Symbol *sym = pc->from2.u.sym;
printf(optbl[pc->op].txt,
- size2asm(&sym->type), addr2txt(&pc->from1));
+ size2stack(&sym->type), addr2txt(&pc->from1));
}
static void
--
⑨