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,16 +5111,21 @@ static void block(int *bsym, int *csym, int is_expr)
else
r = RC_IRET;
for (;;) {
if (ret_nregs == 1)
gv(r);
if (--ret_nregs == 0)
break;
/* We assume that when a structure is returned in multiple
registers, their classes are consecutive values of the
suite s(n) = 2^n */
r <<= 1;
vtop->c.i += regsize;
vtop->r = VT_LOCAL | VT_LVAL;
else {
for (;;) {
vdup();
gv(r);
vpop();
if (--ret_nregs == 0)
break;
/* We assume that when a structure is returned in multiple
registers, their classes are consecutive values of the
suite s(n) = 2^n */
r <<= 1;
vtop->c.i += regsize;
}
}
}
} else if (is_float(func_vt.t)) {