[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Tinycc-devel] Fwd: TCC VLA bug?
From: |
grischka |
Subject: |
Re: [Tinycc-devel] Fwd: TCC VLA bug? |
Date: |
Tue, 07 Dec 2021 20:52:00 +0100 |
User-agent: |
Thunderbird 2.0.0.23 (Windows/20090812) |
Michael Matz wrote:
So, the problematic type was:
int (*)[a][b]
That's pointer to an vla-array of an vla-array of int. All three (inner
array, outer array and pointer, but not the int) should be marked
VT_VLA.
Hm...,
IMO one (very) invariant convention is that VT_ARRAY rsp. VT_VLA
always also have VT_PTR.
Therefor if the outer pointer would have VT_VLA as you say above,
then it would be not a pointer to a VLA, but it would be a VLA,
as in
int arr[z][a][b];
Anyway, now that I already did look into it (which initially I was
trying to avoid ;) I would maybe just replace all this:
if (type1.ref->type.t & VT_VLA)
vla_runtime_pointed_size(&type1);
else {
u = pointed_size(&type1);
if (u < 0)
tcc_error("unknown array element size");
#if PTR_SIZE == 8
vpushll(u);
#else
/* XXX: cast to int ? (long long case) */
vpushi(u);
#endif
by that single line:
vla_runtime_type_size(pointed_type(&vtop[-1].type), &align):
which looks as it would do the right thing automatically also for the
normal array (non-vla) case (but except the "unknown array size" check).
Of course one could rename "vla_runtime_type_size" to something better, then.
Btw, now that I already did look into it (which initially ... ;) I think
I found 2 related problems as can be seen with this (added to the original
test case):
// int (*arr)[h][w];
printf("diff = %d, size = %d/%d\n",
arr + 1 - arr, sizeof *arr, sizeof (*arr + 1));
-- gr
In TCC we collapse the outer array+pointer into one type (a
pointer that also has VT_ARRAY/VT_VLA set), so there actually should be
two levels: the inner level a VT_VLA pointing to the VT_INT (with its
VLA runtime length being evaluated to sizeof(int) * b) and the outer
level a VT_VLA pointing to the inner VT_VLA (and its VLA runtime length
being evaluated to inner length * a).
I'm surprised that your patch didn't cause other problems, it seems
either the testsuite isn't testing VLAs very much, or that the VT_VLA
flag is set on types where it shouldn't have been (e.g. on the VT_INT
type that is in the type->ref of the 'int [n]' array type).
Ciao,
Michael.
------------------------------------------------------------------------
_______________________________________________
Tinycc-devel mailing list
Tinycc-devel@nongnu.org
https://lists.nongnu.org/mailman/listinfo/tinycc-devel