Hi! On Tue, Dec 04, 2012 at 10:00:35AM -0800, Wei Mi wrote: > I updated the patch according to the comments. Please take a look. Thanks.
I've been testing your patch plus all the patches from me posted yesterday just with asan.exp testing. While doing full pair of bootstraps/regtests, I've discovered dg-set-target-env-var changes don't really work, gcc-dg-runtest is just one of the many ways to start testing, so there were tons of errors like ERROR: tcl error sourcing /usr/src/gcc/gcc/testsuite/gcc.c-torture/execute/ieee/ieee.exp. ERROR: can't read "set_target_env_var": no such variable ERROR: tcl error sourcing /usr/src/gcc/gcc/testsuite/gcc.dg/compat/struct-layout-1.exp. ERROR: can't read "set_target_env_var": no such variable ERROR: tcl error sourcing /usr/src/gcc/gcc/testsuite/gcc.dg/dg.exp. ERROR: can't read "set_target_env_var": no such variable ERROR: tcl error sourcing /usr/src/gcc/gcc/testsuite/gcc.dg/guality/guality.exp. ERROR: can't read "set_target_env_var": no such variable (and many more). Here is an attempt to fix that up. gcc-dg.exp overrides dg-test which is the actual routine that parses dg-* directives from the testcases, performs all the testing and then this overridden routine at the end does some cleanup, so I'm unsetting set_target_env_var there, and not relying on it being set. Furthermore, I don't think unsetenv takes two arguments, and the whole restore-target-env-var looked weird. IMHO we want to record which env vars were set to what values and which were unset, and restore that at the end of ${tool}_load. The error message change is because if there are no args (which means only line will be there), I'm afraid it would show up traceback. So far successfully regtested on i686-linux, x86_64-linux regtest is almost done. Ok for trunk? 2012-12-05 Jakub Jelinek <ja...@redhat.com> * lib/gcc-dg.exp (${tool}_load): Handle non-existing set_target_env_var the same as if it is empty list. (dg-set-target-env-var): Fix up error message. (set-target-env-var): Record both preexisting env var values as well as info that env wasn't set. (restore-target-env-var): Iterate on reversed list, if second sublist element is 1, setenv the env var to the third sublist element, otherwise unsetenv it. (gcc-dg-runtest): Don't initialize set_target_env_var. (dg-test): Unset set_target_env_var if it was set. --- gcc/testsuite/lib/gcc-dg.exp.jj 2012-12-05 20:02:20.000000000 +0100 +++ gcc/testsuite/lib/gcc-dg.exp 2012-12-05 23:23:05.766914151 +0100 @@ -257,14 +257,16 @@ if { [info procs ${tool}_load] != [list] global set_target_env_var set saved_target_env_var [list] - if { [llength $set_target_env_var] != 0 } { + if { [info exists set_target_env_var] \ + && [llength $set_target_env_var] != 0 } { if { [is_remote target] } { return [list "unsupported" ""] } set-target-env-var } set result [eval [list saved_${tool}_load $program] $args] - if { [llength $set_target_env_var] != 0 } { + if { [info exists set_target_env_var] \ + && [llength $set_target_env_var] != 0 } { restore-target-env-var } if { $shouldfail != 0 } { @@ -281,7 +283,7 @@ if { [info procs ${tool}_load] != [list] proc dg-set-target-env-var { args } { global set_target_env_var if { [llength $args] != 3 } { - error "[lindex $args 1]: need two arguments" + error "dg-set-target-env-var: need two arguments" return } lappend set_target_env_var [list [lindex $args 1] [lindex $args 2]] @@ -294,7 +296,9 @@ proc set-target-env-var { } { set var [lindex $env_var 0] set value [lindex $env_var 1] if [info exists env($var)] { - lappend saved_target_env_var [list $var $env($var)] + lappend saved_target_env_var [list $var 1 $env($var)] + } else { + lappend saved_target_env_var [list $var 0] } setenv $var $value } @@ -302,10 +306,13 @@ proc set-target-env-var { } { proc restore-target-env-var { } { upvar 1 saved_target_env_var saved_target_env_var - foreach env_var $saved_target_env_var { + foreach env_var [lreverse $saved_target_env_var] { set var [lindex $env_var 0] - set value [lindex $env_var 1] - unsetenv $var $value + if [lindex $env_var 1] { + setenv $var [lindex $env_var 2] + } else { + unsetenv $var + } } } @@ -330,10 +337,6 @@ proc search_for { file pattern } { # as c-torture does. proc gcc-dg-runtest { testcases default-extra-flags } { global runtests - global set_target_env_var - - # Init set_target_env_var - set set_target_env_var [list] # Some callers set torture options themselves; don't override those. set existing_torture_options [torture-options-exist] @@ -724,6 +727,7 @@ if { [info procs saved-dg-test] == [list global compiler_conditional_xfail_data global shouldfail global testname_with_flags + global set_target_env_var if { [ catch { eval saved-dg-test $args } errmsg ] } { set saved_info $errorInfo @@ -744,6 +748,9 @@ if { [info procs saved-dg-test] == [list set additional_sources "" set additional_prunes "" set shouldfail 0 + if [info exists set_target_env_var] { + unset set_target_env_var + } unset_timeout_vars if [info exists compiler_conditional_xfail_data] { unset compiler_conditional_xfail_data Jakub