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