On Thu, Nov 02, 2023 at 12:52:50PM +0100, Richard Biener wrote: > > What I meant is to emit > > tmp_4 = .ACCESS_WITH_SIZE (&s.b[0], &s.a, (typeof (&s.a)) 0); > > p_5 = &tmp_4[2]; > > i.e. don't associate the pointer with a value of the size, but with > > an address where to find the size (plus how large it is), basically escape > > pointer to the size at that point. And __builtin_dynamic_object_size is > > pure, > > so supposedly it can depend on what the escaped pointer points to. > > Well, yeah - that would work but depend on .ACCESS_WITH_SIZE being an > escape point (quite bad IMHO)
That is why I've said we need to decide what cost we want to suffer because of that. > and __builtin_dynamic_object_size being > non-const (that's probably not too bad). It is already pure,leaf,nothrow (unlike __builtin_object_size which is obviously const,leaf,nothrow). Because under the hood, it can read memory when expanded. > > We'd see that a particular pointer is size associated with &s.a address > > and would use that address cast to the type of the third argument (to > > preserve the exact pointer type on INTEGER_CST, though not sure, wouldn't > > VN CSE it anyway if one has say > > union U { struct S { int a; char b __attribute__((counted_by (a))) []; } s; > > struct T { char c, d, e, f; char g __attribute__((counted_by > > (c))) []; } t; }; > > and > > .ACCESS_WITH_SIZE (&v.s.b[0], &v.s.a, (int *) 0); > > ... > > .ACCESS_WITH_SIZE (&v.t.g[0], &v.t.c, (int *) 0); > > ? > > We'd probably CSE that - the usual issue of address-with-same-value. > > > It would mean though that counted_by wouldn't be allowed to be a > > bit-field... > > Yup. We could also pass a pointer to the container though, that's good enough > for the escape, and pass the size by value in addition to that. I was wondering about stuff like _BitInt. But sure, counted_by is just an extension, we can just refuse counting by _BitInt in addition to counting by floating point, pointers, aggregates, bit-fields, or we could somehow encode all the needed type's properties numerically into an integral constant. Similarly for alias set (unless it uses 0 for reads). Jakub