target-supports-dg.exp (dg-require-cxa-atexit): New.
* lib/target-supports-dg.exp (dg-require-cxa-atexit): New. * lib/target-supports.dg (check_cxa_atexit_available): New. From-SVN: r113684
This commit is contained in:
parent
29e339b95a
commit
21f638b9b0
@ -1,3 +1,8 @@
|
||||
2006-05-09 Steve Ellcey <sje@cup.hp.com>
|
||||
|
||||
* lib/target-supports-dg.exp (dg-require-cxa-atexit): New.
|
||||
* lib/target-supports.dg (check_cxa_atexit_available): New.
|
||||
|
||||
2005-05-10 Thomas Koenig <Thomas.Koenig@online.de>
|
||||
|
||||
PR fortran/27470
|
||||
|
@ -140,6 +140,15 @@ proc dg-require-mkfifo { args } {
|
||||
}
|
||||
}
|
||||
|
||||
# If this target does not use __cxa_atexit, skip this test.
|
||||
|
||||
proc dg-require-cxa-atexit { args } {
|
||||
if { ![ check_cxa_atexit_available ] } {
|
||||
upvar dg-do-what dg-do-what
|
||||
set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
|
||||
}
|
||||
}
|
||||
|
||||
# Check the flags with which the test will be run against options in
|
||||
# a test directive that will skip or xfail that test. The DejaGnu proc
|
||||
# check_conditional_xfail will look at the options in compiler_flags, so
|
||||
|
@ -916,6 +916,93 @@ proc check_mkfifo_available {} {
|
||||
return [check_function_available "mkfifo"]
|
||||
}
|
||||
|
||||
# Returns true iff "__cxa_atexit" is used on the target system.
|
||||
|
||||
proc check_cxa_atexit_available { } {
|
||||
global et_cxa_atexit
|
||||
global et_cxa_atexit_target_name
|
||||
global tool
|
||||
|
||||
if { ![info exists et_cxa_atexit_target_name] } {
|
||||
set et_cxa_atexit_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_cxa_atexit_target_name } {
|
||||
verbose "check_cxa_atexit_available: `$et_cxa_atexit_target_name'" 2
|
||||
set et_cxa_atexit_target_name $current_target
|
||||
if [info exists et_cxa_atexit] {
|
||||
verbose "check_cxa_atexit_available: removing cached result" 2
|
||||
unset et_cxa_atexit
|
||||
}
|
||||
}
|
||||
|
||||
if [info exists et_cxa_atexit] {
|
||||
verbose "check_cxa_atexit_available: using cached result" 2
|
||||
} else {
|
||||
set et_cxa_atexit 0
|
||||
|
||||
# Set up, compile, and execute a C++ test program that depends
|
||||
# on correct ordering of static object destructors. This is
|
||||
# indicative of the presence and use of __cxa_atexit.
|
||||
set src cxaatexit[pid].cc
|
||||
set exe cxaatexit[pid].x
|
||||
|
||||
set f [open $src "w"]
|
||||
puts $f "#include <stdlib.h>"
|
||||
puts $f "static unsigned int count;"
|
||||
puts $f "struct X"
|
||||
puts $f "{"
|
||||
puts $f " X() { count = 1; }"
|
||||
puts $f " ~X()"
|
||||
puts $f " {"
|
||||
puts $f " if (count != 3)"
|
||||
puts $f " exit(1);"
|
||||
puts $f " count = 4;"
|
||||
puts $f " }"
|
||||
puts $f "};"
|
||||
puts $f "void f()"
|
||||
puts $f "{"
|
||||
puts $f " static X x;"
|
||||
puts $f "}"
|
||||
puts $f "struct Y"
|
||||
puts $f "{"
|
||||
puts $f " Y() { f(); count = 2; }"
|
||||
puts $f " ~Y()"
|
||||
puts $f " {"
|
||||
puts $f " if (count != 2)"
|
||||
puts $f " exit(1);"
|
||||
puts $f " count = 3;"
|
||||
puts $f " }"
|
||||
puts $f "};"
|
||||
puts $f "Y y;"
|
||||
puts $f "int main()"
|
||||
puts $f "{ return 0; }"
|
||||
close $f
|
||||
|
||||
set lines [v3_target_compile $src $exe executable ""]
|
||||
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_cxa_atexit_available: status is <$status>" 2
|
||||
|
||||
if { $status == "pass" } {
|
||||
set et_cxa_atexit 1
|
||||
}
|
||||
} else {
|
||||
verbose "check_cxa_atexit_available: compilation failed" 2
|
||||
}
|
||||
}
|
||||
return $et_cxa_atexit
|
||||
}
|
||||
|
||||
|
||||
# Return 1 if we're generating 32-bit code using default options, 0
|
||||
# otherwise.
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user