aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJanis Johnson <janis187@us.ibm.com>2005-02-11 22:34:57 +0000
committerJanis Johnson <janis@gcc.gnu.org>2005-02-11 22:34:57 +0000
commit56afd7aae3b441be06695812bc4614e2ad2dbf36 (patch)
tree7f4366499c32a699510ea6394cef44cd4f188082 /gcc
parent6027770b6e14079e637d8628b4e98ed00e7a9ddb (diff)
downloadgcc-56afd7aae3b441be06695812bc4614e2ad2dbf36.zip
gcc-56afd7aae3b441be06695812bc4614e2ad2dbf36.tar.gz
gcc-56afd7aae3b441be06695812bc4614e2ad2dbf36.tar.bz2
target-supports.exp (check_effective_target_broken_cplxf_arg): New.
* lib/target-supports.exp (check_effective_target_broken_cplxf_arg): New. From-SVN: r94900
Diffstat (limited to 'gcc')
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/lib/target-supports.exp86
2 files changed, 91 insertions, 0 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 1ab0ec2..40c87e2 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2005-02-11 Janis Johnson <janis187@us.ibm.com>
+
+ * lib/target-supports.exp (check_effective_target_broken_cplxf_arg):
+ New.
+
2005-02-11 Jakub Jelinek <jakub@redhat.com>
PR c++/19666
diff --git a/gcc/testsuite/lib/target-supports.exp b/gcc/testsuite/lib/target-supports.exp
index 4a91b94..f2577c1 100644
--- a/gcc/testsuite/lib/target-supports.exp
+++ b/gcc/testsuite/lib/target-supports.exp
@@ -386,6 +386,92 @@ proc check_vmx_hw_available { } {
return $vmx_hw_available_saved
}
+# GCC 3.4.0 for powerpc64-*-linux* included an ABI fix for passing
+# complex float arguments. This affects gfortran tests that call cabsf
+# in libm built by an earlier compiler. Return 1 if libm uses the same
+# argument passing as the compiler under test, 0 otherwise.
+#
+# When the target name changes, replace the cached result.
+
+proc check_effective_target_broken_cplxf_arg { } {
+ global et_broken_cplxf_arg_saved
+ global et_broken_cplxf_arg_target_name
+ global tool
+
+ # Skip the work for targets known not to be affected.
+ if { ![istarget powerpc64-*-linux*] } {
+ return 0
+ } elseif { [is-effective-target ilp32] } {
+ return 0
+ }
+
+ if { ![info exists et_broken_cplxf_arg_target_name] } {
+ set et_broken_cplxf_arg_target_name ""
+ }
+
+ # If the target has changed since we set the cached value, clear it.
+ set current_target [current_target_name]
+ if { $current_target != $et_broken_cplxf_arg_target_name } {
+ verbose "check_effective_target_broken_cplxf_arg: `$et_broken_cplxf_arg_target_name'" 2
+ set et_broken_cplxf_arg_target_name $current_target
+ if [info exists et_broken_cplxf_arg_saved] {
+ verbose "check_effective_target_broken_cplxf_arg: removing cached result" 2
+ unset et_broken_cplxf_arg_saved
+ }
+ }
+
+ if [info exists et_broken_cplxf_arg_saved] {
+ verbose "check_effective_target_broken_cplxf_arg: using cached result" 2
+ } else {
+ set et_broken_cplxf_arg_saved 0
+ # This is only known to affect one target.
+ if { ![istarget powerpc64-*-linux*] || ![is-effective-target lp64] } {
+ set et_broken_cplxf_arg_saved 0
+ verbose "check_effective_target_broken_cplxf_arg: caching 0" 2
+ return $et_broken_cplxf_arg_saved
+ }
+
+ # Set up, compile, and execute a C test program that calls cabsf.
+ set src cabsf[pid].c
+ set exe cabsf[pid].x
+
+ set f [open $src "w"]
+ puts $f "#include <complex.h>"
+ puts $f "extern void abort (void);"
+ puts $f "float fabsf (float);"
+ puts $f "float cabsf (_Complex float);"
+ puts $f "int main ()"
+ puts $f "{"
+ puts $f " _Complex float cf;"
+ puts $f " float f;"
+ puts $f " cf = 3 + 4.0fi;"
+ puts $f " f = cabsf (cf);"
+ puts $f " if (fabsf (f - 5.0) > 0.0001) abort ();"
+ puts $f " return 0;"
+ puts $f "}"
+ close $f
+
+ set lines [${tool}_target_compile $src $exe executable "-lm"]
+ file delete $src
+
+ if [string match "" $lines] {
+ # No error message, compilation succeeded.
+ set result [${tool}_load "./$exe" "" ""]
+ set status [lindex $result 0]
+ remote_file build delete $exe
+
+ verbose "check_effective_target_broken_cplxf_arg: status is <$status>" 2
+
+ if { $status != "pass" } {
+ set et_broken_cplxf_arg_saved 1
+ }
+ } else {
+ verbose "check_effective_target_broken_cplxf_arg: compilation failed" 2
+ }
+ }
+ return $et_broken_cplxf_arg_saved
+}
+
proc check_alpha_max_hw_available { } {
global alpha_max_hw_available_saved
global tool