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:
Steve Ellcey 2006-05-10 21:55:34 +00:00 committed by Steve Ellcey
parent 29e339b95a
commit 21f638b9b0
3 changed files with 101 additions and 0 deletions

View File

@ -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

View File

@ -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

View File

@ -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.