diff options
| -rw-r--r-- | qbe.c | 11 | ||||
| -rw-r--r-- | tests/compatible-function-types.qbe | 2 | ||||
| -rw-r--r-- | tests/for-loop.qbe | 1 | ||||
| -rw-r--r-- | tests/local-align.qbe | 7 | ||||
| -rw-r--r-- | tests/subtract-pointer.qbe | 2 | ||||
| -rw-r--r-- | tests/typedef-name.qbe | 1 | ||||
| -rw-r--r-- | tests/varargs.qbe | 22 | 
7 files changed, 35 insertions, 11 deletions
@@ -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 index 27d9b32..4111baa 100644 --- 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 index 56b38b1..ea6f9af 100644 --- 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 index bc3b85c..c789d88 100644 --- 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 index 0e7e9a3..b075ce4 100644 --- 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 index 5ce995e..0520aae 100644 --- 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 index 16db877..42543a1 100644 --- 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  | 
