Some AArch64 tests force -mbig-endian and indirectly include stdint.h. However, not all OSes support both endiannesses, leading to:
FAIL: gcc.target/aarch64/advsimd-intrinsics/bf16_get-be.c -O0 (test for excess errors) UNRESOLVED: gcc.target/aarch64/advsimd-intrinsics/bf16_get-be.c -O1 check-function-bodies test_vget_high_bf16 UNRESOLVED: gcc.target/aarch64/advsimd-intrinsics/bf16_get-be.c -O1 check-function-bodies test_vget_low_bf16 etc. This patch adds an (admittedly special-purpose) target selector for this. Tested on aarch64-linux-gnu. It doesn't really count as AArch64-specific so: OK to install? Richard gcc/ * doc/sourcebuild.texi (stdint_types_mbig_endian): Document. gcc/testsuite/ * lib/target-supports.exp (check_effective_target_stdint_types_mbig_endian): New proc. * gcc.target/aarch64/advsimd-intrinsics/bf16_get-be.c: Require stdint_types_mbig_endian. * gcc.target/aarch64/advsimd-intrinsics/bfdot-2.c: Likewise. * gcc.target/aarch64/advsimd-intrinsics/vdot-3-2.c: Likewise. --- gcc/doc/sourcebuild.texi | 4 ++++ .../aarch64/advsimd-intrinsics/bf16_get-be.c | 1 + .../gcc.target/aarch64/advsimd-intrinsics/bfdot-2.c | 1 + .../gcc.target/aarch64/advsimd-intrinsics/vdot-3-2.c | 1 + gcc/testsuite/lib/target-supports.exp | 12 ++++++++++++ 5 files changed, 19 insertions(+) diff --git a/gcc/doc/sourcebuild.texi b/gcc/doc/sourcebuild.texi index 0104916e660..b0001247795 100644 --- a/gcc/doc/sourcebuild.texi +++ b/gcc/doc/sourcebuild.texi @@ -2447,6 +2447,10 @@ Target has the basic signed and unsigned C types in @code{stdint.h}. This will be obsolete when GCC ensures a working @code{stdint.h} for all targets. +@item stdint_types_mbig_endian +Target accepts the option @option{-mbig-endian} and @code{stdint.h} +can be included without error when @option{-mbig-endian} is passed. + @item stpcpy Target provides @code{stpcpy} function. diff --git a/gcc/testsuite/gcc.target/aarch64/advsimd-intrinsics/bf16_get-be.c b/gcc/testsuite/gcc.target/aarch64/advsimd-intrinsics/bf16_get-be.c index bd9bb110974..cd27098e63e 100644 --- a/gcc/testsuite/gcc.target/aarch64/advsimd-intrinsics/bf16_get-be.c +++ b/gcc/testsuite/gcc.target/aarch64/advsimd-intrinsics/bf16_get-be.c @@ -1,4 +1,5 @@ /* { dg-do assemble { target { aarch64*-*-* } } } */ +/* { dg-require-effective-target stdint_types_mbig_endian } */ /* { dg-require-effective-target arm_v8_2a_bf16_neon_ok } */ /* { dg-add-options arm_v8_2a_bf16_neon } */ /* { dg-additional-options "-mbig-endian -save-temps" } */ diff --git a/gcc/testsuite/gcc.target/aarch64/advsimd-intrinsics/bfdot-2.c b/gcc/testsuite/gcc.target/aarch64/advsimd-intrinsics/bfdot-2.c index 58bdee5ac9d..ae0a953f7b4 100755 --- a/gcc/testsuite/gcc.target/aarch64/advsimd-intrinsics/bfdot-2.c +++ b/gcc/testsuite/gcc.target/aarch64/advsimd-intrinsics/bfdot-2.c @@ -1,4 +1,5 @@ /* { dg-do assemble { target { aarch64*-*-* } } } */ +/* { dg-require-effective-target stdint_types_mbig_endian } */ /* { dg-require-effective-target arm_v8_2a_bf16_neon_ok } */ /* { dg-add-options arm_v8_2a_bf16_neon } */ /* { dg-additional-options "-mbig-endian --save-temps" } */ diff --git a/gcc/testsuite/gcc.target/aarch64/advsimd-intrinsics/vdot-3-2.c b/gcc/testsuite/gcc.target/aarch64/advsimd-intrinsics/vdot-3-2.c index 96bca2356e4..61c7c51f5ec 100755 --- a/gcc/testsuite/gcc.target/aarch64/advsimd-intrinsics/vdot-3-2.c +++ b/gcc/testsuite/gcc.target/aarch64/advsimd-intrinsics/vdot-3-2.c @@ -1,4 +1,5 @@ /* { dg-do assemble { target { aarch64*-*-* } } } */ +/* { dg-require-effective-target stdint_types_mbig_endian } */ /* { dg-require-effective-target arm_v8_2a_i8mm_ok } */ /* { dg-add-options arm_v8_2a_i8mm } */ /* { dg-additional-options "-mbig-endian -save-temps" } */ diff --git a/gcc/testsuite/lib/target-supports.exp b/gcc/testsuite/lib/target-supports.exp index 1230d194215..ad323107f2e 100644 --- a/gcc/testsuite/lib/target-supports.exp +++ b/gcc/testsuite/lib/target-supports.exp @@ -8254,6 +8254,18 @@ proc check_effective_target_stdint_types { } { }] } +# Like check_effective_target_stdint_types, but test what happens when +# -mbig-endian is passed. This test only makes sense on targets that +# support -mbig-endian; it will fail elsewhere. + +proc check_effective_target_stdint_types_mbig_endian { } { + return [check_no_compiler_messages stdint_types_mbig_endian assembly { + #include <stdint.h> + int8_t a; int16_t b; int32_t c; int64_t d; + uint8_t e; uint16_t f; uint32_t g; uint64_t h; + } "-mbig-endian"] +} + # Return 1 if target has the basic signed and unsigned types in # <inttypes.h>, 0 otherwise. This is for tests that GCC's notions of # these types agree with those in the header, as some systems have