On Fri, Nov 03, 2023 at 07:07:36AM +0100, Martin Uecker wrote: > Am Donnerstag, dem 02.11.2023 um 17:28 -0700 schrieb Bill Wendling: > > On Thu, Nov 2, 2023 at 1:36 PM Qing Zhao <qing.z...@oracle.com> wrote: > > > > > > Thanks a lot for raising these issues. > > > > > > If I understand correctly, the major question we need to answer is: > > > > > > For the following example: (Jakub mentioned this in an early message) > > > > > > 1 struct S { int a; char b __attribute__((counted_by (a))) []; }; > > > 2 struct S s; > > > 3 s.a = 5; > > > 4 char *p = &s.b[2]; > > > 5 int i1 = __builtin_dynamic_object_size (p, 0); > > > 6 s.a = 3; > > > 7 int i2 = __builtin_dynamic_object_size (p, 0); > > > > > > Should the 2nd __bdos call (line 7) get > > > A. the latest value of s.a (line 6) for it’s size? > > > Or B. the value when the s.b was referenced (line 3, line 4)? > > > > > I personally think it should be (A). The user is specifically > > indicating that the size has somehow changed, and the compiler should > > behave accordingly. > > > One potential problem for A apart from the potential impact on > optimization is that the information may get lost more > easily. Consider: > > char *p = &s.b[2]; > f(&s); > int i = __bdos(p, 0); > > If the compiler can not see into 'f', the information is lost > because f may have changed the size.
Why? It doesn't really matter. The options are A. p is at &s.b[2] associated with &s.a and int type (or size of int or whatever); .ACCESS_WITH_SIZE can't be pure, but sure, for aliasing POV we can describe it with more detail that it doesn't modify anything in the pointed structure, just escapes the pointer; __bdos can stay leaf I believe; and when expanding __bdos later on, it would just dereference the associated pointer at that point (note, __bdos is pure, so it has vuse but not vdef and can load from memory); if f changes s.a, no problem, __bdos will load the changed value in there B. if .ACCESS_WITH_SIZE associates the pointer with the s.a value from that point, .ACCESS_WITH_SIZE can be const, but obviously if f changes s.a, __bdos later will use s.a value from the &s.b[2] spot Jakub