URL
https://opencores.org/ocsvn/openrisc_me/openrisc_me/trunk
Subversion Repositories openrisc_me
[/] [openrisc/] [trunk/] [gnu-src/] [gdb-7.1/] [gdb/] [testsuite/] [gdb.threads/] [hand-call-in-threads.exp] - Rev 227
Compare with Previous | Blame | View Log
# Copyright (C) 2004, 2007, 2008, 2010 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# the Free Software Foundation; either version 3 of the License, or# (at your option) any later version.## This program is distributed in the hope that it will be useful,# but WITHOUT ANY WARRANTY; without even the implied warranty of# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the# GNU General Public License for more details.## You should have received a copy of the GNU General Public License# along with this program. If not, see <http://www.gnu.org/licenses/>.# Test making hand function calls in multiple threads.set NR_THREADS 4if $tracelevel then {strace $tracelevel}set testfile "hand-call-in-threads"set srcfile ${testfile}.cset binfile ${objdir}/${subdir}/${testfile}if {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable [list debug "incdir=${objdir}" "additional_flags=-DNR_THREADS=$NR_THREADS"]] != "" } {return -1}# Some targets can't do function calls, so don't even bother with this# test.if [target_info exists gdb,cannot_call_functions] {setup_xfail "*-*-*" 2416fail "This target can not call functions"continue}proc get_dummy_frame_number { } {global gdb_promptsend_gdb "bt\n"gdb_expect {-re "#(\[0-9\]*) *<function called from gdb>.*$gdb_prompt $"{return $expect_out(1,string)}-re "$gdb_prompt $"{return ""}timeout{return ""}}return ""}gdb_exitgdb_startgdb_reinitialize_dir $srcdir/$subdirgdb_load ${binfile}if { ![runto_main] } {fail "Can't run to main"return 0}gdb_test "break all_threads_running" \"Breakpoint 2 at .*: file .*${srcfile}, line .*" \"breakpoint on all_threads_running"gdb_test "break hand_call" \"Breakpoint 3 at .*: file .*${srcfile}, line .*" \"breakpoint on hand_call"# Run the program and make sure GDB reports that we stopped after# hitting breakpoint 2 in all_threads_running().gdb_test "continue" \".*Breakpoint 2, all_threads_running ().*" \"run to all_threads_running"# Before we start making hand function calls, turn on scheduler locking.gdb_test "set scheduler-locking on" "" "enable scheduler locking"gdb_test "show scheduler-locking" ".* locking scheduler .* is \"on\"." "show scheduler locking on"# Now hand-call a function in each thread, having the function# stop without returning.# Add one for the main thread.set total_nr_threads [expr $NR_THREADS + 1]# Thread numbering in gdb is origin-1, so begin numbering at 1.for { set i 1 } { $i <= $total_nr_threads } { incr i } {set thread_nr $igdb_test "thread $thread_nr" "" "prepare to make hand call, thread $thread_nr"gdb_test "call hand_call()" "Breakpoint 3, .*" "hand call, thread $thread_nr"}# Now have each hand-called function return.# Turn confirmation off for the "return" command.gdb_test "set confirm off" ""clear_xfail "*-*-*"for { set i 1 } { $i <= $total_nr_threads } { incr i } {set thread_nr $igdb_test "thread $thread_nr" "" "prepare to discard hand call, thread $thread_nr"set frame_number [get_dummy_frame_number]if { "$frame_number" == "" } {fail "dummy stack frame number, thread $thread_nr"# Need something.set frame_number 0} else {pass "dummy stack frame number, thread $thread_nr"}# Pop the dummy frame.gdb_test "frame $frame_number" "" "setting frame, thread $thread_nr"gdb_test "return" "" "discard hand call, thread $thread_nr"# In case getting the dummy frame number failed, re-enable for next iter.clear_xfail "*-*-*"}# Make sure all dummy frames got popped.gdb_test_multiple "maint print dummy-frames" "all dummies popped" {-re ".*stack=.*$gdb_prompt $" {fail "all dummies popped"}-re ".*$gdb_prompt $" {pass "all dummies popped"}}# Before we resume the full program, turn of scheduler locking.gdb_test "set scheduler-locking off" "" "disable scheduler locking"gdb_test "show scheduler-locking" ".* locking scheduler .* is \"off\"." "show scheduler locking off"# Continue one last time, the program should exit normally.## ??? This currently doesn't work because gdb doesn't know how to singlestep# over reported breakpoints that weren't in the last thread to run.# Commented out until then.## For reference sake ...# An alternative is to manually work around the issue by manually setting# the thread back to the first thread: the program is still at the# all_threads_running breakpoint, which wasn't the last thread to run,# and gdb doesn't know how to singlestep over reported breakpoints that# weren't in the last thread to run.#gdb_test "thread 1" "" "set thread to 1, prepare to resume"##gdb_continue_to_end "hand-call-in-threads"return 0
