On Mon, Aug 24, 2026 at 11:47 PM Stefan Schulze Frielinghaus
<[email protected]> wrote:
>
> From: Stefan Schulze Frielinghaus <[email protected]>
>
> On s390 bit-fields are layed out from left-to-right.  Therefore, struct
> member c starts 7+2+6+3 bits from the left aka the most significant bit.
> The assignment to f.e only writes a single byte but the struct member c
> crosses two bytes.  Using index 3 and assigning 7 to f.e results in only
> writing a single bit of f.bf.c which is set to 0 which means the whole
> member stays 0.  A probably more interesting index is 2 which renders
> f.bf.c equal to 14 in the end.
>
> gcc/testsuite/ChangeLog:
>
>         * gcc.dg/torture/pr126650.c: Fix index and expected value for
>         s390 where bit fields are layed out from left-to-right.
> ---
>  Tested on s390x-linux and x86_64-linux.
>
>  gcc/testsuite/gcc.dg/torture/pr126650.c | 12 ++++++++++--
>  1 file changed, 10 insertions(+), 2 deletions(-)
>
> diff --git a/gcc/testsuite/gcc.dg/torture/pr126650.c 
> b/gcc/testsuite/gcc.dg/torture/pr126650.c
> index 166705d9cfe..f9997b16f2b 100644
> --- a/gcc/testsuite/gcc.dg/torture/pr126650.c
> +++ b/gcc/testsuite/gcc.dg/torture/pr126650.c
> @@ -1,5 +1,13 @@
>  /* { dg-do run } */
>
> +#if __s390__

I think this should be `__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__` instead.

> +# define IDX 2
> +# define VAL 14
> +#else
> +# define IDX 3
> +# define VAL -64
> +#endif
> +
>  #include <stdarg.h>
>  #include <stdlib.h>
>
> @@ -10,7 +18,7 @@ void __attribute__((noipa)) foo (int n, ...)
>    va_list list;
>    va_start (list, n);
>    int val = va_arg (list, int);
> -  if (val != -64)
> +  if (val != VAL)
>      abort ();
>    va_end (list);
>  }
> @@ -30,6 +38,6 @@ int main()
>      char e[4];
>    } f;
>    f.d = a;
> -  f.e[3] = 7;
> +  f.e[IDX] = 7;
>    foo (1, f.bf.c);
>  }
> --
> 2.54.0
>

Reply via email to