aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--qbe.c11
-rw-r--r--tests/compatible-function-types.qbe2
-rw-r--r--tests/for-loop.qbe1
-rw-r--r--tests/local-align.qbe7
-rw-r--r--tests/subtract-pointer.qbe2
-rw-r--r--tests/typedef-name.qbe1
-rw-r--r--tests/varargs.qbe22
7 files changed, 11 insertions, 35 deletions
diff --git a/qbe.c b/qbe.c
index 8daf023..a20851d 100644
--- a/qbe.c
+++ b/qbe.c
@@ -422,13 +422,6 @@ funcjnz(struct function *f, struct value *v, struct value *l1, struct value *l2)
void
funcret(struct function *f, struct value *v)
{
- struct declaration *d;
-
- if (!v && f->type->base->kind != TYPEVOID) {
- d = mkdecl(DECLOBJECT, f->type->base, LINKNONE);
- funcinit(f, d, NULL);
- v = funcload(f, d->type, d->value);
- }
funcinst(f, IRET, NULL, v);
f->end->terminated = true;
}
@@ -891,6 +884,8 @@ funcinit(struct function *func, struct declaration *d, struct initializer *init)
size_t i;
funcalloc(func, d);
+ if (!init)
+ return;
for (; init; init = init->next) {
zero(func, d->value, d->type->align, offset, init->start);
if (init->expr->kind == EXPRSTRING) {
@@ -1101,7 +1096,7 @@ emitfunc(struct function *f, bool global)
size_t n;
if (!f->end->terminated)
- funcret(f, NULL);
+ funcret(f, strcmp(f->name, "main") == 0 ? mkintconst(&i32, 0) : NULL);
if (global)
puts("export");
fputs("function ", stdout);
diff --git a/tests/compatible-function-types.qbe b/tests/compatible-function-types.qbe
index 4111baa..27d9b32 100644
--- a/tests/compatible-function-types.qbe
+++ b/tests/compatible-function-types.qbe
@@ -8,10 +8,8 @@ export
function $f5(w %.1, d %.3) {
@start.3
%.2 =l alloc4 4
- storew 0, %.2
storew %.1, %.2
%.4 =l alloc8 8
- storel 0, %.4
stored %.3, %.4
@body.4
ret
diff --git a/tests/for-loop.qbe b/tests/for-loop.qbe
index ea6f9af..56b38b1 100644
--- a/tests/for-loop.qbe
+++ b/tests/for-loop.qbe
@@ -4,7 +4,6 @@ function $f() {
%.1 =l alloc4 4
@body.2
storew 0, %.1
- storew 0, %.1
@for_cond.3
%.2 =w loadsw %.1
%.3 =w csltw %.2, 10
diff --git a/tests/local-align.qbe b/tests/local-align.qbe
index c789d88..bc3b85c 100644
--- a/tests/local-align.qbe
+++ b/tests/local-align.qbe
@@ -3,12 +3,5 @@ function $f() {
@start.1
%.1 =l alloc16 4
@body.2
- storeb 0, %.1
- %.2 =l add %.1, 1
- storeb 0, %.2
- %.3 =l add %.1, 2
- storeb 0, %.3
- %.4 =l add %.1, 3
- storeb 0, %.4
ret
}
diff --git a/tests/subtract-pointer.qbe b/tests/subtract-pointer.qbe
index b075ce4..0e7e9a3 100644
--- a/tests/subtract-pointer.qbe
+++ b/tests/subtract-pointer.qbe
@@ -2,10 +2,8 @@ export
function $f(l %.1, l %.3) {
@start.1
%.2 =l alloc8 8
- storel 0, %.2
storel %.1, %.2
%.4 =l alloc8 8
- storel 0, %.4
storel %.3, %.4
@body.2
%.5 =l loadl %.2
diff --git a/tests/typedef-name.qbe b/tests/typedef-name.qbe
index 0520aae..5ce995e 100644
--- a/tests/typedef-name.qbe
+++ b/tests/typedef-name.qbe
@@ -3,6 +3,5 @@ function $f() {
@start.1
%.1 =l alloc8 8
@body.2
- storel 0, %.1
ret
}
diff --git a/tests/varargs.qbe b/tests/varargs.qbe
index 42543a1..16db877 100644
--- a/tests/varargs.qbe
+++ b/tests/varargs.qbe
@@ -2,26 +2,20 @@ export
function $f(w %.1, ...) {
@start.1
%.2 =l alloc4 4
- storew 0, %.2
storew %.1, %.2
%.3 =l alloc8 24
@body.2
- storel 0, %.3
- %.4 =l add %.3, 8
- storel 0, %.4
- %.5 =l add %.3, 16
- storel 0, %.5
vastart %.3
@while_cond.3
- %.6 =w loadsw %.2
- jnz %.6, @while_body.4, @while_join.5
+ %.4 =w loadsw %.2
+ jnz %.4, @while_body.4, @while_join.5
@while_body.4
- %.7 =w vaarg %.3
- %.8 =s vaarg %.3
- %.9 =l vaarg %.3
- %.10 =w loadsw %.2
- %.11 =w sub %.10, 1
- storew %.11, %.2
+ %.5 =w vaarg %.3
+ %.6 =s vaarg %.3
+ %.7 =l vaarg %.3
+ %.8 =w loadsw %.2
+ %.9 =w sub %.8, 1
+ storew %.9, %.2
jmp @while_cond.3
@while_join.5
ret