mirror of
https://github.com/mirror/tinycc.git
synced 2025-03-04 08:20:12 +08:00
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:
parent
c09b6ce975
commit
6775c7cb3a
23
tccgen.c
23
tccgen.c
@ -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)) {
|
||||
|
Loading…
Reference in New Issue
Block a user