> On Nov 3, 2023, at 2:22 AM, Jakub Jelinek <ja...@redhat.com> wrote: > > 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,
.ACCESS_WITH_SIZE will only load the size from its address, no any write to memory. It still can be PURE, right? (It will not be CONST anymore). > 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; If we need to do this, where in the gcc code we need to add these details? > __bdos can stay > leaf I believe; That’s good! (I thought now _bdos will call .ACCESS_WITH_SIZE?) Qing > 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 >