aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/lib/target-supports.exp
diff options
context:
space:
mode:
authorDaniel Berlin <dberlin@dberlin.org>2005-02-28 03:48:13 +0000
committerDaniel Berlin <dberlin@dberlin.org>2005-02-28 03:48:13 +0000
commitff5f58a960ef5ebef296b78380ac21ec73eb60d3 (patch)
tree6b416e8523c502a82d386c98de1a39da6527b040 /gcc/testsuite/lib/target-supports.exp
parentf9f5c9e8498b005d223e54abc259d8edc19f22f3 (diff)
Merge from the pain trainstructure-aliasing-branch
git-svn-id: https://gcc.gnu.org/svn/gcc/branches/structure-aliasing-branch@95649 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/testsuite/lib/target-supports.exp')
-rw-r--r--gcc/testsuite/lib/target-supports.exp86
1 files changed, 86 insertions, 0 deletions
diff --git a/gcc/testsuite/lib/target-supports.exp b/gcc/testsuite/lib/target-supports.exp
index 4a91b943d6d..f2577c18106 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