Re: [PATCH v9 3/5] Use the .ACCESS_WITH_SIZE in builtin object size.
> On May 28, 2024, at 03:39, Richard Biener wrote: > > On Fri, Apr 12, 2024 at 3:54 PM Qing Zhao wrote: >> > > I have no comments here, if Siddesh is OK with this I approve. thanks. Qing > >> gcc/ChangeLog: >> >>* tree-object-size.cc (access_with_size_object_size): New function. >>(call_object_size): Call the new function. >> >> gcc/testsuite/ChangeLog: >> >>* gcc.dg/builtin-object-size-common.h: Add a new macro EXPECT. >>* gcc.dg/flex-array-counted-by-3.c: New test. >>* gcc.dg/flex-array-counted-by-4.c: New test. >>* gcc.dg/flex-array-counted-by-5.c: New test. >> --- >> .../gcc.dg/builtin-object-size-common.h | 11 ++ >> .../gcc.dg/flex-array-counted-by-3.c | 63 +++ >> .../gcc.dg/flex-array-counted-by-4.c | 178 ++ >> .../gcc.dg/flex-array-counted-by-5.c | 48 + >> gcc/tree-object-size.cc | 60 ++ >> 5 files changed, 360 insertions(+) >> create mode 100644 gcc/testsuite/gcc.dg/flex-array-counted-by-3.c >> create mode 100644 gcc/testsuite/gcc.dg/flex-array-counted-by-4.c >> create mode 100644 gcc/testsuite/gcc.dg/flex-array-counted-by-5.c >> >> diff --git a/gcc/testsuite/gcc.dg/builtin-object-size-common.h >> b/gcc/testsuite/gcc.dg/builtin-object-size-common.h >> index 66ff7cdd953a..b677067c6e6b 100644 >> --- a/gcc/testsuite/gcc.dg/builtin-object-size-common.h >> +++ b/gcc/testsuite/gcc.dg/builtin-object-size-common.h >> @@ -30,3 +30,14 @@ unsigned nfails = 0; >> __builtin_abort (); >> \ >> return 0; >> \ >> } while (0) >> + >> +#define EXPECT(p, _v) do { >> \ >> + size_t v = _v; >> \ >> + if (p == v) >> \ >> +__builtin_printf ("ok: %s == %zd\n", #p, p); >> \ >> + else >> \ >> +{ >> \ >> + __builtin_printf ("WAT: %s == %zd (expected %zd)\n", #p, p, v); >> \ >> + FAIL (); >> \ >> +} >> \ >> +} while (0); >> diff --git a/gcc/testsuite/gcc.dg/flex-array-counted-by-3.c >> b/gcc/testsuite/gcc.dg/flex-array-counted-by-3.c >> new file mode 100644 >> index ..78f50230e891 >> --- /dev/null >> +++ b/gcc/testsuite/gcc.dg/flex-array-counted-by-3.c >> @@ -0,0 +1,63 @@ >> +/* Test the attribute counted_by and its usage in >> + * __builtin_dynamic_object_size. */ >> +/* { dg-do run } */ >> +/* { dg-options "-O2" } */ >> + >> +#include "builtin-object-size-common.h" >> + >> +struct flex { >> + int b; >> + int c[]; >> +} *array_flex; >> + >> +struct annotated { >> + int b; >> + int c[] __attribute__ ((counted_by (b))); >> +} *array_annotated; >> + >> +struct nested_annotated { >> + struct { >> +union { >> + int b; >> + float f; >> +}; >> +int n; >> + }; >> + int c[] __attribute__ ((counted_by (b))); >> +} *array_nested_annotated; >> + >> +void __attribute__((__noinline__)) setup (int normal_count, int attr_count) >> +{ >> + array_flex >> += (struct flex *)malloc (sizeof (struct flex) >> ++ normal_count * sizeof (int)); >> + array_flex->b = normal_count; >> + >> + array_annotated >> += (struct annotated *)malloc (sizeof (struct annotated) >> + + attr_count * sizeof (int)); >> + array_annotated->b = attr_count; >> + >> + array_nested_annotated >> += (struct nested_annotated *)malloc (sizeof (struct nested_annotated) >> ++ attr_count * sizeof (int)); >> + array_nested_annotated->b = attr_count; >> + >> + return; >> +} >> + >> +void __attribute__((__noinline__)) test () >> +{ >> +EXPECT(__builtin_dynamic_object_size(array_flex->c, 1), -1); >> +EXPECT(__builtin_dynamic_object_size(array_annotated->c, 1), >> + array_annotated->b * sizeof (int)); >> +EXPECT(__builtin_dynamic_object_size(array_nested_annotated->c, 1), >> + array_nested_annotated->b * sizeof (int)); >> +} >> + >> +int main(int argc, char *argv[]) >> +{ >> + setup (10,10); >> + test (); >> + DONE (); >> +} >> diff --git a/gcc/testsuite/gcc.dg/flex-array-counted-by-4.c >> b/gcc/testsuite/gcc.dg/flex-array-counted-by-4.c >> new file mode 100644 >> index ..20103d58ef51 >> --- /dev/null >> +++ b/gcc/testsuite/gcc.dg/flex-array-counted-by-4.c >> @@ -0,0 +1,178 @@ >> +/* Test the attribute counted_by and its usage in >> +__builtin_dynamic_object_size: what's the correct behavior when the >>
Re: [PATCH v9 3/5] Use the .ACCESS_WITH_SIZE in builtin object size.
On Fri, Apr 12, 2024 at 3:54 PM Qing Zhao wrote: > I have no comments here, if Siddesh is OK with this I approve. > gcc/ChangeLog: > > * tree-object-size.cc (access_with_size_object_size): New function. > (call_object_size): Call the new function. > > gcc/testsuite/ChangeLog: > > * gcc.dg/builtin-object-size-common.h: Add a new macro EXPECT. > * gcc.dg/flex-array-counted-by-3.c: New test. > * gcc.dg/flex-array-counted-by-4.c: New test. > * gcc.dg/flex-array-counted-by-5.c: New test. > --- > .../gcc.dg/builtin-object-size-common.h | 11 ++ > .../gcc.dg/flex-array-counted-by-3.c | 63 +++ > .../gcc.dg/flex-array-counted-by-4.c | 178 ++ > .../gcc.dg/flex-array-counted-by-5.c | 48 + > gcc/tree-object-size.cc | 60 ++ > 5 files changed, 360 insertions(+) > create mode 100644 gcc/testsuite/gcc.dg/flex-array-counted-by-3.c > create mode 100644 gcc/testsuite/gcc.dg/flex-array-counted-by-4.c > create mode 100644 gcc/testsuite/gcc.dg/flex-array-counted-by-5.c > > diff --git a/gcc/testsuite/gcc.dg/builtin-object-size-common.h > b/gcc/testsuite/gcc.dg/builtin-object-size-common.h > index 66ff7cdd953a..b677067c6e6b 100644 > --- a/gcc/testsuite/gcc.dg/builtin-object-size-common.h > +++ b/gcc/testsuite/gcc.dg/builtin-object-size-common.h > @@ -30,3 +30,14 @@ unsigned nfails = 0; >__builtin_abort (); > \ > return 0; > \ >} while (0) > + > +#define EXPECT(p, _v) do { > \ > + size_t v = _v; > \ > + if (p == v) > \ > +__builtin_printf ("ok: %s == %zd\n", #p, p); > \ > + else > \ > +{ > \ > + __builtin_printf ("WAT: %s == %zd (expected %zd)\n", #p, p, v); > \ > + FAIL (); > \ > +} > \ > +} while (0); > diff --git a/gcc/testsuite/gcc.dg/flex-array-counted-by-3.c > b/gcc/testsuite/gcc.dg/flex-array-counted-by-3.c > new file mode 100644 > index ..78f50230e891 > --- /dev/null > +++ b/gcc/testsuite/gcc.dg/flex-array-counted-by-3.c > @@ -0,0 +1,63 @@ > +/* Test the attribute counted_by and its usage in > + * __builtin_dynamic_object_size. */ > +/* { dg-do run } */ > +/* { dg-options "-O2" } */ > + > +#include "builtin-object-size-common.h" > + > +struct flex { > + int b; > + int c[]; > +} *array_flex; > + > +struct annotated { > + int b; > + int c[] __attribute__ ((counted_by (b))); > +} *array_annotated; > + > +struct nested_annotated { > + struct { > +union { > + int b; > + float f; > +}; > +int n; > + }; > + int c[] __attribute__ ((counted_by (b))); > +} *array_nested_annotated; > + > +void __attribute__((__noinline__)) setup (int normal_count, int attr_count) > +{ > + array_flex > += (struct flex *)malloc (sizeof (struct flex) > ++ normal_count * sizeof (int)); > + array_flex->b = normal_count; > + > + array_annotated > += (struct annotated *)malloc (sizeof (struct annotated) > + + attr_count * sizeof (int)); > + array_annotated->b = attr_count; > + > + array_nested_annotated > += (struct nested_annotated *)malloc (sizeof (struct nested_annotated) > ++ attr_count * sizeof (int)); > + array_nested_annotated->b = attr_count; > + > + return; > +} > + > +void __attribute__((__noinline__)) test () > +{ > +EXPECT(__builtin_dynamic_object_size(array_flex->c, 1), -1); > +EXPECT(__builtin_dynamic_object_size(array_annotated->c, 1), > + array_annotated->b * sizeof (int)); > +EXPECT(__builtin_dynamic_object_size(array_nested_annotated->c, 1), > + array_nested_annotated->b * sizeof (int)); > +} > + > +int main(int argc, char *argv[]) > +{ > + setup (10,10); > + test (); > + DONE (); > +} > diff --git a/gcc/testsuite/gcc.dg/flex-array-counted-by-4.c > b/gcc/testsuite/gcc.dg/flex-array-counted-by-4.c > new file mode 100644 > index ..20103d58ef51 > --- /dev/null > +++ b/gcc/testsuite/gcc.dg/flex-array-counted-by-4.c > @@ -0,0 +1,178 @@ > +/* Test the attribute counted_by and its usage in > +__builtin_dynamic_object_size: what's the correct behavior when the > +allocation size mismatched with the value of counted_by attribute? > +We should always use the latest value that is hold by the counted_by > +field. */ > +/* { dg-do run } */ > +/* { dg-options "-O
[PATCH v9 3/5] Use the .ACCESS_WITH_SIZE in builtin object size.
gcc/ChangeLog: * tree-object-size.cc (access_with_size_object_size): New function. (call_object_size): Call the new function. gcc/testsuite/ChangeLog: * gcc.dg/builtin-object-size-common.h: Add a new macro EXPECT. * gcc.dg/flex-array-counted-by-3.c: New test. * gcc.dg/flex-array-counted-by-4.c: New test. * gcc.dg/flex-array-counted-by-5.c: New test. --- .../gcc.dg/builtin-object-size-common.h | 11 ++ .../gcc.dg/flex-array-counted-by-3.c | 63 +++ .../gcc.dg/flex-array-counted-by-4.c | 178 ++ .../gcc.dg/flex-array-counted-by-5.c | 48 + gcc/tree-object-size.cc | 60 ++ 5 files changed, 360 insertions(+) create mode 100644 gcc/testsuite/gcc.dg/flex-array-counted-by-3.c create mode 100644 gcc/testsuite/gcc.dg/flex-array-counted-by-4.c create mode 100644 gcc/testsuite/gcc.dg/flex-array-counted-by-5.c diff --git a/gcc/testsuite/gcc.dg/builtin-object-size-common.h b/gcc/testsuite/gcc.dg/builtin-object-size-common.h index 66ff7cdd953a..b677067c6e6b 100644 --- a/gcc/testsuite/gcc.dg/builtin-object-size-common.h +++ b/gcc/testsuite/gcc.dg/builtin-object-size-common.h @@ -30,3 +30,14 @@ unsigned nfails = 0; __builtin_abort ();\ return 0;\ } while (0) + +#define EXPECT(p, _v) do { \ + size_t v = _v; \ + if (p == v)\ +__builtin_printf ("ok: %s == %zd\n", #p, p);\ + else \ +{\ + __builtin_printf ("WAT: %s == %zd (expected %zd)\n", #p, p, v);\ + FAIL (); \ +}\ +} while (0); diff --git a/gcc/testsuite/gcc.dg/flex-array-counted-by-3.c b/gcc/testsuite/gcc.dg/flex-array-counted-by-3.c new file mode 100644 index ..78f50230e891 --- /dev/null +++ b/gcc/testsuite/gcc.dg/flex-array-counted-by-3.c @@ -0,0 +1,63 @@ +/* Test the attribute counted_by and its usage in + * __builtin_dynamic_object_size. */ +/* { dg-do run } */ +/* { dg-options "-O2" } */ + +#include "builtin-object-size-common.h" + +struct flex { + int b; + int c[]; +} *array_flex; + +struct annotated { + int b; + int c[] __attribute__ ((counted_by (b))); +} *array_annotated; + +struct nested_annotated { + struct { +union { + int b; + float f; +}; +int n; + }; + int c[] __attribute__ ((counted_by (b))); +} *array_nested_annotated; + +void __attribute__((__noinline__)) setup (int normal_count, int attr_count) +{ + array_flex += (struct flex *)malloc (sizeof (struct flex) ++ normal_count * sizeof (int)); + array_flex->b = normal_count; + + array_annotated += (struct annotated *)malloc (sizeof (struct annotated) + + attr_count * sizeof (int)); + array_annotated->b = attr_count; + + array_nested_annotated += (struct nested_annotated *)malloc (sizeof (struct nested_annotated) ++ attr_count * sizeof (int)); + array_nested_annotated->b = attr_count; + + return; +} + +void __attribute__((__noinline__)) test () +{ +EXPECT(__builtin_dynamic_object_size(array_flex->c, 1), -1); +EXPECT(__builtin_dynamic_object_size(array_annotated->c, 1), + array_annotated->b * sizeof (int)); +EXPECT(__builtin_dynamic_object_size(array_nested_annotated->c, 1), + array_nested_annotated->b * sizeof (int)); +} + +int main(int argc, char *argv[]) +{ + setup (10,10); + test (); + DONE (); +} diff --git a/gcc/testsuite/gcc.dg/flex-array-counted-by-4.c b/gcc/testsuite/gcc.dg/flex-array-counted-by-4.c new file mode 100644 index ..20103d58ef51 --- /dev/null +++ b/gcc/testsuite/gcc.dg/flex-array-counted-by-4.c @@ -0,0 +1,178 @@ +/* Test the attribute counted_by and its usage in +__builtin_dynamic_object_size: what's the correct behavior when the +allocation size mismatched with the value of counted_by attribute? +We should always use the latest value that is hold by the counted_by +field. */ +/* { dg-do run } */ +/* { dg-options "-O -fstrict-flex-arrays=3" } */ + +#include "builtin-object-size-common.h" + +struct annotated { + size_t foo; + char others; + char array[] __attribute__((counted_by (foo))); +}; + +#define noinline __attribute__((__noinline__)) +#define SIZE_BUMP 10 +#define MAX(a, b) ((a) > (b) ? (a) : (b)) + +/* In general, Due to type casting, the type for the pointee of a pointer + does not say