On 9/20/19 2:18 AM, Kyrill Tkachov wrote:
Yeah, an add_options_for_arm_vfp is what we ideally need here.
How about this version of the patch? The two test cases I also tweaked to use it are the only ones that use the corresponding arm_vfp_ok effective target.
-Sandra
2019-09-22 Sandra Loosemore <san...@codesourcery.com> gcc/testsuite/ * lib/target-supports.exp (check_effective_target_arm_vfp_ok_nocache): New. (check_effective_target_arm_vfp_ok): Rewrite. (add_options_for_arm_vfp): New. (add_options_for_sqrt_insn): Add options for arm. * gcc.target/arm/attr-neon-builtin-fail2.c: Use dg-add-options. * gcc.target/arm/short-vfp-1.c: Likewise.
Index: gcc/testsuite/gcc.target/arm/attr-neon-builtin-fail2.c =================================================================== --- gcc/testsuite/gcc.target/arm/attr-neon-builtin-fail2.c (revision 276004) +++ gcc/testsuite/gcc.target/arm/attr-neon-builtin-fail2.c (working copy) @@ -1,7 +1,8 @@ /* Check that calling a neon builtin from a function compiled with vfp fails. */ /* { dg-do compile } */ /* { dg-require-effective-target arm_vfp_ok } */ -/* { dg-options "-O2 -mfloat-abi=softfp" } */ +/* { dg-options "-O2" } */ +/* { dg-add-options arm_vfp } */ extern __simd64_int8_t a, b; Index: gcc/testsuite/gcc.target/arm/short-vfp-1.c =================================================================== --- gcc/testsuite/gcc.target/arm/short-vfp-1.c (revision 276004) +++ gcc/testsuite/gcc.target/arm/short-vfp-1.c (working copy) @@ -1,6 +1,6 @@ /* { dg-do compile } */ /* { dg-require-effective-target arm_vfp_ok } -/* { dg-options "-mfpu=vfp" } */ +/* { dg-add-options arm_vfp } */ int test_sisf (float x) Index: gcc/testsuite/lib/target-supports.exp =================================================================== --- gcc/testsuite/lib/target-supports.exp (revision 276004) +++ gcc/testsuite/lib/target-supports.exp (working copy) @@ -3489,18 +3489,43 @@ proc check_effective_target_arm_soft_ok } } -# Return 1 if this is an ARM target supporting -mfpu=vfp -# -mfloat-abi=softfp. Some multilibs may be incompatible with these -# options. +# Return 1 if this is an ARM target supporting -mfpu=vfp with an +# appropriate abi. -proc check_effective_target_arm_vfp_ok { } { +proc check_effective_target_arm_vfp_ok_nocache { } { + global et_arm_vfp_flags + set et_arm_vfp_flags "" if { [check_effective_target_arm32] } { - return [check_no_compiler_messages arm_vfp_ok object { - int dummy; - } "-mfpu=vfp -mfloat-abi=softfp"] - } else { - return 0 + foreach flags {"-mfpu=vfp" "-mfpu=vfp -mfloat-abi=softfp" "-mpu=vfp -mfloat-abi=hard"} { + if { [check_no_compiler_messages_nocache arm_fp_ok object { + #ifndef __ARM_FP + #error __ARM_FP not defined + #endif + } "$flags"] } { + set et_arm_vfp_flags $flags + return 1 + } + } } + + return 0 +} + +proc check_effective_target_arm_vfp_ok { } { + return [check_cached_effective_target arm_vfp_ok \ + check_effective_target_arm_vfp_ok_nocache] +} + +# Add the options needed to compile code with -mfpu=vfp. We need either +# -mfloat-abi=softfp or -mfloat-abi=hard, but if one is already +# specified by the multilib, use it. + +proc add_options_for_arm_vfp { flags } { + if { ! [check_effective_target_arm_vfp_ok] } { + return "$flags" + } + global et_arm_vfp_flags + return "$flags $et_arm_vfp_flags" } # Return 1 if this is an ARM target supporting -mfpu=vfp3 @@ -6678,6 +6703,9 @@ proc add_options_for_sqrt_insn { flags } if { [istarget amdgcn*-*-*] } { return "$flags -ffast-math" } + if { [istarget arm*-*-*] } { + return [add_options_for_arm_vfp "$flags"] + } return $flags }