Hello! The problem was, that dejagnu didn't kill gdb in case of timeout (i.e. broken LL/SC sequences for alpha). The cause for this was in the way remote_expect was called. The script found "simulate_thread_main" to assume that gdb works OK, but unfortunately, this overrode the "timeout" default case... so, the timeout never triggered.
The solution for this problem is to search for "simulate_thread_done" in gdb log. If there is something wrong with gdb or atomics, we won't reach to this breakpoint, so either atomics were wrong, or gdb fails. In each case, this is FAIL. The patch also sets timeout to 10 seconds, due to huge amount of produced log and improves fail messages a bit. 2011-10-17 Uros Bizjak <ubiz...@gmail.com> * lib/gcc-simulate-thread.exp (simulate-thread): Run on all targets. Look for simulate_thread_done to determine working gdb. Reduce timeout to 10 seconds and fail when timeout occurs. Improve error messages. Patch was tested on alphaev68-pc-linux-gnu, where correctly finds problematic tests with old gdb: Running /home/uros/gcc-svn/trunk/gcc/testsuite/gcc.dg/simulate-thread/simulate-thread.exp ... FAIL: gcc.dg/simulate-thread/atomic-other-int.c -O0 -g (thread simulation test) FAIL: gcc.dg/simulate-thread/atomic-other-int.c -O1 -g (thread simulation test) FAIL: gcc.dg/simulate-thread/atomic-other-int.c -O2 -g (thread simulation test) FAIL: gcc.dg/simulate-thread/atomic-other-int.c -O3 -g (thread simulation test) FAIL: gcc.dg/simulate-thread/atomic-other-int.c -Os -g (thread simulation test) FAIL: gcc.dg/simulate-thread/atomic-other-short.c -O0 -g (thread simulation test) FAIL: gcc.dg/simulate-thread/atomic-other-short.c -O1 -g (thread simulation test) FAIL: gcc.dg/simulate-thread/atomic-other-short.c -O2 -g (thread simulation test) FAIL: gcc.dg/simulate-thread/atomic-other-short.c -O3 -g (thread simulation test) FAIL: gcc.dg/simulate-thread/atomic-other-short.c -Os -g (thread simulation test) With fixed gdb, all tests pass OK. OK for mainline? Uros.
Index: gcc-simulate-thread.exp =================================================================== --- gcc-simulate-thread.exp (revision 181436) +++ gcc-simulate-thread.exp (working copy) @@ -22,15 +22,6 @@ # Call 'fail' if a given test printed "FAIL:", otherwise call 'pass'. proc simulate-thread { args } { - - # ??? Exit immediately if this is alpha*-*-linux* target, single-stepping - # executable between ldl_l and stl_c insns in gdb breaks LL/SC chaining. - if { [istarget alpha*-*-linux*] } { return } - - # GNU gdb 6.3 on powerpc-darwin also on these (and expect does not appear - # to be able to terminate them). - if { [istarget powerpc*-*-darwin*] } { return } - if { ![isnative] || [is_remote target] } { return } if { [llength $args] == 1 } { @@ -54,35 +45,39 @@ return } + set message "(thread simulation test)" + send_log "Spawning: $gdb_name -nx -nw -quiet -x $cmd_file ./$exec_file\n" set res [remote_spawn target "$gdb_name -nx -nw -x $cmd_file ./$exec_file"] if { $res < 0 || $res == "" } { - unsupported "$testcase" + unsupported "$testcase $message" return } set gdb_worked 0 - remote_expect target [timeout_value] { + + # Set timeout to 10 seconds due to huge amount of generated log. + remote_expect target 10 { # Too old GDB -re "Unhandled dwarf expression|Error in sourced command file" { - unsupported "$testcase" + unsupported "$testcase $message" remote_close target return } -re "FAIL:" { - fail "$testcase" + fail "$testcase $message" remote_close target return } - # If the gdb output contained simulate_thread_main, assume + # If the gdb output contained simulate_thread_done, assume # that at the very least, we had a working gdb that was able - # to break in simulate_thread_main. - -re "simulate_thread_main" { + # to break in simulate_thread_done. + -re "simulate_thread_done" { set gdb_worked 1 exp_continue } timeout { - unsupported "$testcase" + fail "$testcase $message" remote_close target return } @@ -90,10 +85,10 @@ remote_close target if {$gdb_worked} { - pass "$testcase" + pass "$testcase $message" } else { - # Fail in the absence of a sane GDB. - fail "$testcase" + # Unsupported in the absence of a sane GDB. + unsupported "$testcase $message" } return }