cproc

Unnamed repository; edit this file 'description' to name the repository.
git clone git://git.nihaljere.xyz/cproc
Log | Files | Refs | Submodules | README | LICENSE

commit 7722c7593a1a249e1a6d98d84afdff3cb086ca81
parent 083bd95ef10c480fd234ec25933da27b2fa3fda9
Author: Andrew Chambers <andrewchambers@fastmail.com>
Date:   Wed, 27 Feb 2019 12:09:40 +1300

Zero uninitialized decls/returns.

Resolves #12 and #15.

Diffstat:
Mqbe.c | 11++++++++---
Mtests/compatible-function-types.qbe | 2++
Mtests/for-loop.qbe | 1+
Mtests/local-align.qbe | 7+++++++
Mtests/subtract-pointer.qbe | 2++
Mtests/typedef-name.qbe | 1+
Mtests/varargs.qbe | 22++++++++++++++--------
7 files changed, 35 insertions(+), 11 deletions(-)

diff --git a/qbe.c b/qbe.c @@ -420,6 +420,13 @@ 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, (struct value *[]){v}); f->end->terminated = true; } @@ -882,8 +889,6 @@ 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) { @@ -1094,7 +1099,7 @@ emitfunc(struct function *f, bool global) size_t n; if (!f->end->terminated) - funcret(f, strcmp(f->name, "main") == 0 ? mkintconst(&i32, 0) : NULL); + funcret(f, NULL); if (global) puts("export"); fputs("function ", stdout); diff --git a/tests/compatible-function-types.qbe b/tests/compatible-function-types.qbe @@ -8,8 +8,10 @@ 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 @@ -4,6 +4,7 @@ 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 @@ -3,5 +3,12 @@ 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 @@ -2,8 +2,10 @@ 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 @@ -3,5 +3,6 @@ function $f() { @start.1 %.1 =l alloc8 8 @body.2 + storel 0, %.1 ret } diff --git a/tests/varargs.qbe b/tests/varargs.qbe @@ -2,20 +2,26 @@ 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 - %.4 =w loadsw %.2 - jnz %.4, @while_body.4, @while_join.5 + %.6 =w loadsw %.2 + jnz %.6, @while_body.4, @while_join.5 @while_body.4 - %.5 =w vaarg %.3 - %.6 =s vaarg %.3 - %.7 =l vaarg %.3 - %.8 =w loadsw %.2 - %.9 =w sub %.8, 1 - storew %.9, %.2 + %.7 =w vaarg %.3 + %.8 =s vaarg %.3 + %.9 =l vaarg %.3 + %.10 =w loadsw %.2 + %.11 =w sub %.10, 1 + storew %.11, %.2 jmp @while_cond.3 @while_join.5 ret