On Aug 5, 2024, at 06:33, Martin Uecker <uec...@tugraz.at> wrote:
> 
> Am Montag, dem 05.08.2024 um 11:50 +0200 schrieb Jakub Jelinek:
>> On Mon, Aug 05, 2024 at 11:45:56AM +0200, Alejandro Colomar wrote:
>>> [CC += Kees, Qing]
>>> 
>>> Hi Joseph,
>>> 
>>> On Sun, Aug 04, 2024 at 08:34:24PM GMT, Alejandro Colomar wrote:
>>>> On Sun, Aug 04, 2024 at 08:02:25PM GMT, Martin Uecker wrote:
>>>> D'oh!  I screwed it.  I wanted to have written this:
>>>> 
>>>> $ cat star.c 
>>>> void foo(char (*a)[3][*], int (*x)[__lengthof__(*a)]);
>>> 
>>> I think this answers your question of if we want __lengthof__ to
>>> evaluate its operand if the top-level array is non-VLA but an inner
>>> array is VLA.
>>> 
>>> We clearly want it to not evaluate, because we want this __lengthof__
>>> to be a constant expression, ...
>> 
>> But if you don't evaluate the argument, you can't handle counted_by.
>> Because for counted_by you need the expression (the object on which it is
>> used).
> 
> You would not evaluate only when the size is an integer constant
> expression, which would not apply to counted_by.

I still don’t feel very comfortable on the idea of  applying “__lengthof__()” 
operator on flexible array members with “counted_by”  attributes. My major 
concerns are:

1. I thought that the new operator “__lengthof__(expr)" might need to stick to 
the TYPE of the expr  just as  the operator sizeof (expr).  Sizeof will just 
error when the TYPE of the expr does not include the size information (for 
Incomplete types including flexible array members), I expect the same behavior 
for the new operator “__lenghof__(expr)”. 

The “counted-by” attribute currently is not in the TYPE system, and we plan to 
add it into the TYPE system later through language standard (or an GCC 
extension).  If that happens, then both the “sizeof” and the “__lengthof__” 
operators should be automatically evaluate the “size" or the “length” for the 
expr through its TYPE.  (Just as the current VLA, its size and length already 
in the TYPE, therefore both “sizeof” and “__lengthof__” should evaluate VLA. 

however, at this time, it’s not a good idea to mess up the operator “sizeof” or 
the new operator “__lengthof__”  with the information outside of the TYPE 
system. (Even though the information outside of TYPE can provide the size or 
length info).

2. For the purpose of PR116016 
(https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116016): add 
__builtin_set_counted_by(P->FAM, COUNT) or equivalent 

The most important functionality the kernel needs from compilers is a way to 
SET the counted_by field. Unless the new operator “__lengthof__” returns a 
LVALUE that can be assigned to, it cannot meet the requirement from kernel. 

However, from my understanding of the new “__lengthof__”, it will be similar as 
“sizeof”, will not be a Lvalue. 

Therefore, for PR116016, we still need a new builtin, specific for the 
counted_by attribute. 

Just my 2 cents. 

Qing



> Martin
> 
> 

Reply via email to