X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Ftestsuite%2Fgdb.threads%2Fforking-threads-plus-breakpoint.exp;h=c4c9596be3129ebd8a3482029f29328bf9c3acf3;hb=121b3efd49f98e4049281b3ba7a258e650e40b38;hp=448b734fd534f66f68c59ab143316f2ab83564d8;hpb=863d01bde2725d009c45ab7e9ba1dbf3f5b923f8;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/testsuite/gdb.threads/forking-threads-plus-breakpoint.exp b/gdb/testsuite/gdb.threads/forking-threads-plus-breakpoint.exp index 448b734fd5..c4c9596be3 100644 --- a/gdb/testsuite/gdb.threads/forking-threads-plus-breakpoint.exp +++ b/gdb/testsuite/gdb.threads/forking-threads-plus-breakpoint.exp @@ -1,4 +1,4 @@ -# Copyright (C) 2015 Free Software Foundation, Inc. +# Copyright (C) 2015-2020 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -24,13 +24,49 @@ if {[build_executable "failed to prepare" $testfile $srcfile {debug pthreads}] = return -1 } +# Assume yes. +set displaced_stepping_supported 1 + +# "set displaced on" only tells gdb to use displaced stepping if +# possible. Probe for actual support. + +proc probe_displaced_stepping_support {} { + global displaced_stepping_supported + global binfile gdb_prompt + + with_test_prefix "probe displaced-stepping support" { + clean_restart $binfile + + gdb_test_no_output "set displaced on" + if ![runto_main] then { + fail "can't run to main" + return 0 + } + + # We're stopped at the main breakpoint. If displaced stepping is + # supported, we'll see related debug output while we step past + # that breakpoint. + gdb_test_no_output "set debug displaced 1" + gdb_test_multiple "next" "probe" { + -re "displaced pc to.*$gdb_prompt $" { + pass "supported" + } + -re ".*$gdb_prompt $" { + set displaced_stepping_supported 0 + pass "not supported" + } + } + } +} + # The test proper. If COND_BP_TARGET is true, then test with # conditional breakpoints evaluated on the target side, if possible. # DETACH_ON_FORK is used as value for the "set detach-on-fork" # setting. If "on", this exercises GDB explicitly continuing the fork # child until exit. If "off", this exercises GDB detaching the fork -# child. -proc do_test { cond_bp_target detach_on_fork } { +# child. DISPLACED indicates whether to use displaced stepping or +# not. +proc do_test { cond_bp_target detach_on_fork displaced } { global GDBFLAGS global srcfile testfile binfile global decimal gdb_prompt @@ -43,11 +79,27 @@ proc do_test { cond_bp_target detach_on_fork } { set GDBFLAGS $saved_gdbflags if ![runto_main] then { - fail "Can't run to main" + fail "can't run to main" return 0 } + if {$cond_bp_target} { + set test "set breakpoint condition-evaluation target" + gdb_test_multiple $test $test { + -re "warning: Target does not support breakpoint condition evaluation.\r\nUsing host evaluation mode instead.\r\n$gdb_prompt $" { + # Target doesn't support breakpoint condition + # evaluation on its side. Skip the test. + return 0 + } + -re "^$test\r\n$gdb_prompt $" { + } + } + } else { + gdb_test_no_output "set breakpoint condition-evaluation host" + } + gdb_test_no_output "set detach-on-fork $detach_on_fork" + gdb_test_no_output "set displaced $displaced" gdb_test "break $linenum if zero == 1" \ "Breakpoint .*" \ @@ -63,18 +115,20 @@ proc do_test { cond_bp_target detach_on_fork } { set fork_count 0 set ok 0 - set test "inferior 1 exited" - gdb_test_multiple "" $test { - -re "Inferior 1 \(\[^\r\n\]+\) exited normally" { - set ok 1 - pass $test - } - -re "Inferior $decimal \(\[^\r\n\]+\) exited normally" { - incr fork_count - if {$fork_count <= 100} { - exp_continue - } else { - fail "$test (too many forks)" + with_timeout_factor 10 { + set test "inferior 1 exited" + gdb_test_multiple "" $test { + -re "Inferior 1 \(\[^\r\n\]+\) exited normally" { + set ok 1 + pass $test + } + -re "Inferior $decimal \(\[^\r\n\]+\) exited normally" { + incr fork_count + if {$fork_count <= 100} { + exp_continue + } else { + fail "$test (too many forks)" + } } } } @@ -88,30 +142,28 @@ proc do_test { cond_bp_target detach_on_fork } { "no threads left" gdb_test "info inferiors" \ - "Num\[ \t\]+Description\[ \t\]+Executable\[ \t\]+\r\n\\* 1 \[^\r\n\]+" \ + "Num\[ \t\]+Description\[ \t\]+Connection\[ \t\]+Executable\[ \t\]+\r\n\\* 1 \[^\r\n\]+" \ "only inferior 1 left" } -# Wrapper for foreach that calls with_test_prefix on each iteration, -# including the iterator's current value in the prefix. - -proc foreach_with_prefix {var list body} { - upvar 1 $var myvar - foreach myvar $list { - with_test_prefix "$var=$myvar" { - uplevel 1 $body - } - } -} +probe_displaced_stepping_support foreach_with_prefix cond_bp_target {1 0} { foreach_with_prefix detach_on_fork {"on" "off"} { - do_test $cond_bp_target $detach_on_fork - # Disable "off" for now. The test does pass with # detach-on-fork off (at the time of writing), but gdb seems # to slow down quadratically as inferiors are created, and # then the test takes annoyingly long to complete... - break + if {$detach_on_fork == "off"} { + continue + } + + foreach_with_prefix displaced {"on" "off"} { + if {$displaced == "on" && !$displaced_stepping_supported} { + continue + } + + do_test $cond_bp_target $detach_on_fork $displaced + } } }