# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-# Copied from GCC.
-proc dg-require-iconv { args } {
- if { ![ check_iconv_available ${args} ] } {
- upvar dg-do-what dg-do-what
- set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
- return
- }
- return
-}
-
proc dg-require-namedlocale { args } {
if { ![ check_v3_target_namedlocale ] } {
upvar dg-do-what dg-do-what
return
}
-proc dg-require-cxa-atexit { args } {
- if { ![ check_v3_target_cxa_atexit ] } {
- upvar dg-do-what dg-do-what
- set dg-do-what [list [lindex ${dg-do-what} 0] "N" "P"]
- return
- }
- return
-}
-
proc dg-require-sharedlib { args } {
if { ![ check_v3_target_sharedlib ] } {
upvar dg-do-what dg-do-what
return $et_namedlocale_saved
}
-proc check_v3_target_cxa_atexit { } {
- 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_v3_target_cxa_atexit: `$et_cxa_atexit_target_name'" 2
- set et_cxa_atexit_target_name $current_target
- if [info exists et_cxa_atexit] {
- verbose "check_v3_target_cxa_atexit: removing cached result" 2
- unset et_cxa_atexit
- }
- }
-
- if [info exists et_cxa_atexit] {
- verbose "check_v3_target_cxa_atexit: 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_v3_target_cxa_atexit: status is <$status>" 2
-
- if { $status == "pass" } {
- set et_cxa_atexit 1
- }
- } else {
- verbose "check_v3_target_cxa_atexit: compilation failed" 2
- }
- }
- return $et_cxa_atexit
-}
-
proc check_v3_target_debug_mode { } {
global cxxflags
global et_debug_mode