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:
Joe Soroka 2011-04-11 23:39:27 -07:00
parent 1b0f42f8ad
commit 812781cd11

View File

@ -1566,20 +1566,16 @@ ST_FUNC void gen_op(int op)
} }
/* if both pointers, then it must be the '-' op */ /* if both pointers, then it must be the '-' op */
if (bt1 == VT_PTR && bt2 == VT_PTR) { if (bt1 == VT_PTR && bt2 == VT_PTR) {
int ptr1_is_vla;
ptr1_is_vla = 0;
if (op != '-') if (op != '-')
error("cannot use pointers here"); error("cannot use pointers here");
check_comparison_pointer_types(vtop - 1, vtop, op); check_comparison_pointer_types(vtop - 1, vtop, op);
/* XXX: check that types are compatible */ /* XXX: check that types are compatible */
if (vtop[-1].type.t & VT_VLA) { if (vtop[-1].type.t & VT_VLA) {
vla_runtime_pointed_size(&vtop[-1].type); vla_runtime_pointed_size(&vtop[-1].type);
vrott(3);
ptr1_is_vla = 1;
} else { } else {
u = pointed_size(&vtop[-1].type); vpushi(pointed_size(&vtop[-1].type));
} }
vrott(3);
gen_opic(op); gen_opic(op);
/* set to integer type */ /* set to integer type */
#ifdef TCC_TARGET_X86_64 #ifdef TCC_TARGET_X86_64
@ -1587,10 +1583,7 @@ ST_FUNC void gen_op(int op)
#else #else
vtop->type.t = VT_INT; vtop->type.t = VT_INT;
#endif #endif
if (ptr1_is_vla)
vswap(); vswap();
else
vpushi(u);
gen_op(TOK_PDIV); gen_op(TOK_PDIV);
} else { } else {
/* exactly one pointer : must be '+' or '-'. */ /* exactly one pointer : must be '+' or '-'. */