tccgen.c: fix multi-register structure return when not on stack

We need to preserve the type of the pointer to the structure, f.ex.
when a global structure is returned.

This is not a perfect solution. Registers loaded in the first iteration
might be overwritten in a following iteration as the register is no
longer on vtop. This is not a problem for ARM32 as gfunc_sret returns
a maximum of 1 in the integer case.
This commit is contained in:
Daniel Glöckner 2016-10-08 18:54:42 +02:00
parent c09b6ce975
commit 6775c7cb3a

View file

@ -5111,8 +5111,13 @@ static void block(int *bsym, int *csym, int is_expr)
else else
r = RC_IRET; r = RC_IRET;
for (;;) { if (ret_nregs == 1)
gv(r); gv(r);
else {
for (;;) {
vdup();
gv(r);
vpop();
if (--ret_nregs == 0) if (--ret_nregs == 0)
break; break;
/* We assume that when a structure is returned in multiple /* We assume that when a structure is returned in multiple
@ -5120,7 +5125,7 @@ static void block(int *bsym, int *csym, int is_expr)
suite s(n) = 2^n */ suite s(n) = 2^n */
r <<= 1; r <<= 1;
vtop->c.i += regsize; vtop->c.i += regsize;
vtop->r = VT_LOCAL | VT_LVAL; }
} }
} }
} else if (is_float(func_vt.t)) { } else if (is_float(func_vt.t)) {