mirror of
https://github.com/frida/tinycc
synced 2024-11-28 02:29:38 +03:00
simplify/rollback VLA pointer subtraction
I don't know if it makes a difference to gen_op(TOK_PDIV) or not, but logically the ptr1_is_vla test in TP's VLA patch seems out of order, where the patch to fix it would be: ------------------------------------------------------------------ @@ -1581,15 +1581,15 @@ ST_FUNC void gen_op(int op) u = pointed_size(&vtop[-1].type); } gen_opic(op); + if (ptr1_is_vla) + vswap(); /* set to integer type */ #ifdef TCC_TARGET_X86_64 vtop->type.t = VT_LLONG; #else vtop->type.t = VT_INT; #endif - if (ptr1_is_vla) - vswap(); - else + if (!ptr1_is_vla) vpushi(u); gen_op(TOK_PDIV); } else { ------------------------------------------------------------------ Instead of that patch, which increases the complexity of the code, this one fixes the problem by just rolling back and retrying with a simpler approach.
This commit is contained in:
parent
1b0f42f8ad
commit
812781cd11
13
tccgen.c
13
tccgen.c
@ -1566,20 +1566,16 @@ ST_FUNC void gen_op(int op)
|
||||
}
|
||||
/* if both pointers, then it must be the '-' op */
|
||||
if (bt1 == VT_PTR && bt2 == VT_PTR) {
|
||||
int ptr1_is_vla;
|
||||
|
||||
ptr1_is_vla = 0;
|
||||
if (op != '-')
|
||||
error("cannot use pointers here");
|
||||
check_comparison_pointer_types(vtop - 1, vtop, op);
|
||||
/* XXX: check that types are compatible */
|
||||
if (vtop[-1].type.t & VT_VLA) {
|
||||
vla_runtime_pointed_size(&vtop[-1].type);
|
||||
vrott(3);
|
||||
ptr1_is_vla = 1;
|
||||
} else {
|
||||
u = pointed_size(&vtop[-1].type);
|
||||
vpushi(pointed_size(&vtop[-1].type));
|
||||
}
|
||||
vrott(3);
|
||||
gen_opic(op);
|
||||
/* set to integer type */
|
||||
#ifdef TCC_TARGET_X86_64
|
||||
@ -1587,10 +1583,7 @@ ST_FUNC void gen_op(int op)
|
||||
#else
|
||||
vtop->type.t = VT_INT;
|
||||
#endif
|
||||
if (ptr1_is_vla)
|
||||
vswap();
|
||||
else
|
||||
vpushi(u);
|
||||
vswap();
|
||||
gen_op(TOK_PDIV);
|
||||
} else {
|
||||
/* exactly one pointer : must be '+' or '-'. */
|
||||
|
Loading…
Reference in New Issue
Block a user