xref: /openbsd-src/gnu/usr.bin/binutils/gdb/testsuite/gdb.threads/step2.exp (revision b725ae7711052a2233e31a66fefb8a752c388d7a)
1# step2.exp -- Expect script to test gdb step.c
2# Copyright (C) 1992, 1997 Free Software Foundation, Inc.
3
4# This program is free software; you can redistribute it and/or modify
5# it under the terms of the GNU General Public License as published by
6# the Free Software Foundation; either version 2 of the License, or
7# (at your option) any later version.
8#
9# This program is distributed in the hope that it will be useful,
10# but WITHOUT ANY WARRANTY; without even the implied warranty of
11# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12# GNU General Public License for more details.
13#
14# You should have received a copy of the GNU General Public License
15# along with this program; if not, write to the Free Software
16# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
17
18# Please email any bugs, comments, and/or additions to this file to:
19# bug-gdb@prep.ai.mit.edu
20
21# This file was written by Jeff Law. (law@cygnus.com)
22#
23
24
25if $tracelevel then {
26	strace $tracelevel
27}
28
29set program_exited 0
30
31# A simple and crude test to see that we can step two threads independently
32proc test_multi_threaded_stepping {} {
33    global gdb_prompt
34    global hex
35    global srcfile
36    global decimal
37
38    # Set breakpoints in code that we know is executed in only
39    # thread of control.
40    gdb_test "break thread1" \
41	     "Break.* at $hex: file .*$srcfile, line $decimal\\."
42    gdb_test "break thread2" \
43	     "Break.* at $hex: file .*$srcfile, line $decimal\\."
44
45    # the order in which things happen is indeterminate.  So we basically
46    # look for a set of events and note that each one happens and that
47    # all of the required events have happened when we're done.
48    #
49    # Right now we only verify that both threads start and that they
50    # both call pthread_cond_wait twice.
51    set thread1started 0
52    set thread1condwait 0
53    set thread2started 0
54    set thread2condwait 0
55
56    send_gdb "run\n"
57    gdb_expect {
58	-re "The program .* has been started already.*y or n. $" {
59	    send_gdb "y\n"
60	    exp_continue
61	}
62	-re ".*Breakpoint \[0-9\]+,.*thread1.* at .*$srcfile:.*\[\t \].*$gdb_prompt $" {
63	    if { $thread1started != 0 } then {
64		fail "thread1 started"
65		return
66	    } else {
67		set thread1started 1
68		pass "thread1 started"
69	    }
70	    send_gdb "step\n"
71	    exp_continue
72	}
73	-re ".*Breakpoint \[0-9\]+,.*thread2.* at .*$srcfile:.*\[\t \].*$gdb_prompt $" {
74	    if { $thread2started != 0 } then {
75		fail "thread2 started"
76		return
77	    } else {
78		set thread2started 1
79		pass "thread2 started"
80	    }
81	    send_gdb "step\n"
82	    exp_continue
83	}
84	-re ".*pthread_cond_wait.*cv_a.*$gdb_prompt" {
85	    if { $thread1started == 0 } then {
86		fail "thread1 condwait"
87		return
88	    }
89	    if { $thread1condwait < 2 } then {
90		pass "thread1 condwait"
91		incr thread1condwait
92	    }
93	    if { $thread2condwait == 2 } then {
94		pass "multi threaded stepping"
95		return
96	    }
97	    send_gdb "step\n"
98	    exp_continue
99	}
100
101	-re ".*pthread_cond_wait.*cv_b.*$gdb_prompt" {
102	    if { $thread2started == 0 } then {
103		fail "thread2 condwait"
104		return
105	    }
106	    if { $thread2condwait < 2 } then {
107		pass "thread2 condwait"
108		incr thread2condwait
109	    }
110	    if { $thread1condwait == 2 } then {
111		pass "multi threaded stepping"
112		return
113	    }
114	    send_gdb "step\n"
115	    exp_continue
116	}
117
118	-re "$gdb_prompt" {
119	    send_gdb "step\n"
120	    exp_continue
121	}
122	default { fail "multi threaded stepping" }
123    }
124}
125
126# Check to see if we have an executable to test.  If not, then either we
127# haven't tried to compile one, or the compilation failed for some reason.
128# In either case, just notify the user and skip the tests in this file.
129
130set binfile "step"
131set srcfile "step.c"
132
133if ![file exists $objdir/$subdir/$binfile] then {
134    if $all_flag then {
135	warning "$binfile does not exist; tests suppressed."
136    }
137    return
138}
139
140set prms_id 0
141set bug_id 0
142
143# Start with a fresh gdb.
144
145gdb_exit
146gdb_start
147gdb_reinitialize_dir $srcdir/$subdir
148gdb_load $objdir/$subdir/$binfile
149
150test_multi_threaded_stepping
151