aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoe Soroka <gits@joesoroka.com>2011-04-11 23:39:27 -0700
committerJoe Soroka <gits@joesoroka.com>2011-04-11 23:39:27 -0700
commit812781cd1130059f4ac74608fbd6b8f1cff1d8b1 (patch)
tree6482d02cc18679cf3174111c2841e90960aa6361
parent1b0f42f8ad542efd9ddc4568822a6ad97a1a0da6 (diff)
downloadtinycc-812781cd1130059f4ac74608fbd6b8f1cff1d8b1.tar.gz
tinycc-812781cd1130059f4ac74608fbd6b8f1cff1d8b1.tar.bz2
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.
-rw-r--r--tccgen.c13
1 files changed, 3 insertions, 10 deletions
diff --git a/tccgen.c b/tccgen.c
index a1137c3..beb88af 100644
--- a/tccgen.c
+++ b/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 '-'. */