On Thu, 26 Nov 2020, Jakub Jelinek wrote:

> Hi!
> 
> When playing with __builtin_bit_cast, I have noticed __builtin_clear_padding
> ICE on the G class below.  The artificial field with D type has offset 0
> and size 8 bytes, but the following artificial field with E type has offset
> 0 and size 0, so it triggers the asserts that we don't move current position
> backwards.  Fixed by ignoring is_empty_type (TREE_TYPE (field)) fields, all
> of their bits are padding which is what is added when skipping over to next
> field anyway.
> 
> Ok for trunk if it passes bootstrap/regtest?  So far passed all
> builtin-clear-padding* tests, so everything that uses these functions ATM
> in the GCC tree.

OK.

Richard.

> 2020-11-26  Jakub Jelinek  <ja...@redhat.com>
> 
>       PR libstdc++/88101
>       * gimple-fold.c (clear_padding_type): Ignore fields with is_empty_type
>       types.
> 
>       * g++.dg/torture/builtin-clear-padding-3.C: New test.
> 
> --- gcc/gimple-fold.c.jj      2020-11-26 14:05:07.393268700 +0100
> +++ gcc/gimple-fold.c 2020-11-26 14:18:10.826532574 +0100
> @@ -4533,6 +4533,8 @@ clear_padding_type (clear_padding_struct
>                                   "well defined padding bits for %qs",
>                         field, "__builtin_clear_padding");
>             }
> +         else if (is_empty_type (TREE_TYPE (field)))
> +           continue;
>           else
>             {
>               HOST_WIDE_INT pos = int_byte_position (field);
> --- gcc/testsuite/g++.dg/torture/builtin-clear-padding-3.C.jj 2020-11-26 
> 14:26:40.532848182 +0100
> +++ gcc/testsuite/g++.dg/torture/builtin-clear-padding-3.C    2020-11-26 
> 14:27:51.995051122 +0100
> @@ -0,0 +1,24 @@
> +/* PR libstdc++/88101 */
> +
> +struct D { int a; int : 24; int b : 8; };
> +struct E {};
> +struct F { char c, d, e; };
> +struct G : public D, E, F { int f; } g1, g2;
> +
> +__attribute__((noipa)) void
> +foo (G *g)
> +{
> +  g->a = -1; g->b = -1; g->c = -1; g->d = -1; g->e = -1; g->f = -1;
> +}
> +
> +int
> +main ()
> +{
> +  __builtin_memset (&g2, -1, sizeof (g2));
> +  foo (&g1);
> +  foo (&g2);
> +  __builtin_clear_padding (&g2);
> +  if (__builtin_memcmp (&g1, &g2, sizeof (g1)))
> +    __builtin_abort ();
> +  return 0;
> +}
> 
>       Jakub
> 
> 

-- 
Richard Biener <rguent...@suse.de>
SUSE Software Solutions Germany GmbH, Maxfeldstrasse 5, 90409 Nuernberg,
Germany; GF: Felix Imend

Reply via email to