On Mon, Jun 20, 2022 at 6:50 AM Vit Kabele <vit.kab...@sysgo.com> wrote: > > I fixed the formatting and added the test. > > The test has first element 32bit so that it should work on both 32 and > 64bit architectures, even without the aligned attribute. > > If there is some better way how to write the test properly formatted > (i.e. not on a single line), please let me know. > > -- >8 -- > Subject: [PATCH] c: Extend the -Wpadded message with actual padding size > > When the compiler warns about padding struct to alignment boundary, it > now also informs the user about the size of the alignment that needs to > be added to get rid of the warning. > > This removes the need of using pahole or similar tools, or manually > determining the padding size. > > Tested on x86_64-pc-linux-gnu. > > gcc/ChangeLog: > > * stor-layout.cc (finalize_record_size): Extend warning message. > > gcc/testsuite/ChangeLog: > > * c-c++-common/Wpadded.c: New test. > > Signed-off-by: Vit Kabele <vit.kab...@sysgo.com> > --- > gcc/stor-layout.cc | 7 ++++++- > gcc/testsuite/c-c++-common/Wpadded.c | 10 ++++++++++ > 2 files changed, 16 insertions(+), 1 deletion(-) > create mode 100644 gcc/testsuite/c-c++-common/Wpadded.c > > diff --git a/gcc/stor-layout.cc b/gcc/stor-layout.cc > index 765f22f68b9..88923c4136b 100644 > --- a/gcc/stor-layout.cc > +++ b/gcc/stor-layout.cc > @@ -1781,7 +1781,12 @@ finalize_record_size (record_layout_info rli) > && simple_cst_equal (unpadded_size, TYPE_SIZE (rli->t)) == 0 > && input_location != BUILTINS_LOCATION > && !TYPE_ARTIFICIAL (rli->t)) > - warning (OPT_Wpadded, "padding struct size to alignment boundary"); > + { > + tree pad_size > + = size_binop (MINUS_EXPR, TYPE_SIZE_UNIT (rli->t), > unpadded_size_unit); > + warning (OPT_Wpadded, > + "padding struct size to alignment boundary with %E bytes", > pad_size); > + } > > if (warn_packed && TREE_CODE (rli->t) == RECORD_TYPE > && TYPE_PACKED (rli->t) && ! rli->packed_maybe_necessary > diff --git a/gcc/testsuite/c-c++-common/Wpadded.c > b/gcc/testsuite/c-c++-common/Wpadded.c > new file mode 100644 > index 00000000000..e8f1044a36b > --- /dev/null > +++ b/gcc/testsuite/c-c++-common/Wpadded.c > @@ -0,0 +1,10 @@ > +/* { dg-do compile } */ > +/* { dg-options "-Wpadded" } */ > + > +/* > + * The struct is on single line, because C++ compiler emits the -Wpadded > + * warning at the first line of the struct, while the C compiler at the last > + * line of the struct definition. This way the test passes on both > + */ > +struct S { __UINT32_TYPE__ i; char c; }; /* { dg-warning "padding struct > size to alignment boundary with 3 bytes" } */ > + Note the testcase will fail on some targets where alignment is 1 for everything. You most likely want the dg-warning to be like it is in gcc.dg/Wpadded.c: /* { dg-warning "padding struct size to alignment boundary with 3 bytes" "" { target { ! default_packed } } } */
You might want the following from the same file too: /* -fpack-struct is necessary because the warning expected requires the initial packing to be larger than 1, which cannot be guaranteed for all targets. We won't get a warning anyway if the target has "packed" structure layout. */ /* { dg-options "-Wpadded -fpack-struct=8" } */ /* { dg-additional-options "-mno-ms-bitfields" { target *-*-mingw* } } */ Thanks, Andrew Pinski > -- > 2.30.2