kees wrote:

> > For `counted_by` to be usable in Linux, it needs `sized_by` behavior for 
> > `void *` members. Putting this behind the GNU extension which also covers 
> > `void *` arithmetic should be a reasonable compromise.
> 
> I didn't quite get the context for why this is the case - maybe I missed 
> something. If a user can write:
> 
> ```
> struct with_counted_by_void {
>   int count;
>   void* buf __counted_by(count);
> };
> ```
> 
> why would they not be able to instead write this?
> 
> ```
> struct with_sized_by_void {
>   int size;
>   void* buf __sized_by(size);
> };
> ```

Please know that I'm not trying to be difficult with this reply; I'm just 
trying to state the reality of the situation: because they(we) just will not. 
The Linux developer community is extraordinarily 
[opinionated](https://lore.kernel.org/lkml/[email protected]/)
 about these kinds of things and from their(our) perspective, `void *` points 
to an incomplete type whose allocation size is measured in bytes and always 
has. And `counted_by` is seen as counting elements which makes `sized_by` 
redundant. They(we) do not want 2 different spellings for doing conceptually 
the same thing. (In the same linked thread you'll see I am even getting push 
back for a versioned macro for flexible arrays vs pointer members, which is 
needed to handle the compiler version skew between `counted_by` coverage of 
those two cases.)

Since I have no preprocessor way to interrogate the type of the member when 
applying an attribute, I have no way to make Linux's `__counted_by` macro hide 
the implementation details. So, to make this work for Linux and retain the 
intended strict behavior, we can control it with a toggle. And since `void *ptr 
= foo + 1` is valid under the GNU extensions, that seems the clear toggle for 
it.

Alternatively, if there were some other attribute name (strawman: 
`alloc_elements`) that internally used `counted_by` for non-`void *` and used 
`sized_by` for `void *` members, I could trivially hide that behind the 
`__counted_by` macro. What is critically needed for Linux to adopt this is 
having a single spelling for "the number of elements of this pointer is counted 
by this other member". Or just convert `counted_by` into `sized_by` with no 
need for another spelling (i.e. I could nudge this patch slightly so that 
`CountAttributedType::SizedBy` gets set earlier in Sema and then ` 
CodeGenFunction::emitCountedByPointerSize` would need no changes, etc.)

I just need to find a way to keep both camps happy: both have legitimate 
reasons for why they want things the way they do, so I just need a knob to 
select between them (without compromising either side's implementation details).

https://github.com/llvm/llvm-project/pull/164737
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to