Re: [PATCH v8 3/5] Use the .ACCESS_WITH_SIZE in builtin object size.
Sid, Thanks a lot for your review! > On Apr 10, 2024, at 17:45, Siddhesh Poyarekar wrote: > > On 2024-03-29 12:07, Qing Zhao wrote: >> 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. > > This version looks fine to me for stage 1, but I'm not a maintainer so you'll > need an ack from one to commit. Richard, Could you please comment on this patch? Is this one okay for stage 1? Thanks Qing > > Thanks, > Sid > >> --- >> .../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 >> +++
Re: [PATCH v8 3/5] Use the .ACCESS_WITH_SIZE in builtin object size.
On 2024-03-29 12:07, Qing Zhao wrote: 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. This version looks fine to me for stage 1, but I'm not a maintainer so you'll need an ack from one to commit. Thanks, Sid --- .../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
[PATCH v8 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