1#   Copyright 2003, 2004
2#   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 created by Jeff Johnston. (jjohnstn@redhat.com)
22# The shared library compilation portion was copied from shlib-call.exp which was
23# written by Elena Zannoni (ezannoni@redhat.com).
24
25if $tracelevel then {
26    strace $tracelevel
27}
28
29#
30# test running programs
31#
32set prms_id 0
33set bug_id 0
34
35# are we on a target board?
36if ![isnative] then {
37    return 0
38}
39
40set testfile "pending"
41set libfile "pendshr"
42set srcfile ${testfile}.c
43set binfile ${objdir}/${subdir}/${testfile}
44
45if [get_compiler_info ${binfile}] {
46    return -1
47}
48
49if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}.o" object {debug}] != "" } {
50     gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
51}
52
53# Build the shared libraries this test case needs.
54#
55
56if {$gcc_compiled == 0} {
57    if [istarget "hppa*-hp-hpux*"] then {
58	set additional_flags "additional_flags=+z"
59    } elseif { [istarget "mips-sgi-irix*"] } {
60	# Disable SGI compiler's implicit -Dsgi
61	set additional_flags "additional_flags=-Usgi"
62    } else {
63	# don't know what the compiler is...
64	set additional_flags ""
65    }
66} else {
67    if { ([istarget "powerpc*-*-aix*"]
68       || [istarget "rs6000*-*-aix*"]) } {
69	set additional_flags ""
70    } else {
71	set additional_flags "additional_flags=-fpic"
72    }
73}
74
75if {[gdb_compile "${srcdir}/${subdir}/${libfile}.c" "${objdir}/${subdir}/${libfile}.o" object [list debug $additional_flags]] != ""} {
76     gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
77}
78
79if [istarget "hppa*-*-hpux*"] {
80    remote_exec build "ld -b ${objdir}/${subdir}/${libfile}.o -o ${objdir}/${subdir}/${libfile}.sl"
81} else {
82    set additional_flags "additional_flags=-shared"
83    if {[gdb_compile "${objdir}/${subdir}/${libfile}.o" "${objdir}/${subdir}/${libfile}.sl" executable [list debug $additional_flags]] != ""} {
84	gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
85    }
86}
87
88if { ($gcc_compiled
89      &&  ([istarget "powerpc*-*-aix*"]
90	|| [istarget "rs6000*-*-aix*"] )) } {
91    set additional_flags "additional_flags=-L${objdir}/${subdir}"
92} elseif { [istarget "mips-sgi-irix*"] } {
93    set additional_flags "additional_flags=-rpath ${objdir}/${subdir}"
94} else {
95    set additional_flags ""
96}
97if {[gdb_compile "${objdir}/${subdir}/${testfile}.o ${objdir}/${subdir}/${libfile}.sl" "${binfile}" executable [list debug $additional_flags]] != ""} {
98     gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
99}
100
101gdb_exit
102gdb_start
103gdb_reinitialize_dir $srcdir/$subdir
104gdb_load ${binfile}
105
106if [target_info exists gdb_stub] {
107    gdb_step_for_stub;
108}
109#
110# Test setting, querying, and modifying pending breakpoints
111#
112
113gdb_test_multiple "break pendfunc1" "set pending breakpoint" {
114     -re ".*Make breakpoint pending.*y or \\\[n\\\]. $" {
115	    gdb_test "y" "Breakpoint.*pendfunc1.*pending." "set pending breakpoint"
116     }
117}
118
119gdb_test "info break" \
120    "Num Type\[ \]+Disp Enb Address\[ \]+What.*
121\[0-9\]+\[\t \]+breakpoint     keep y.*PENDING.*pendfunc1.*" \
122"single pending breakpoint info"
123
124#
125# Test breaking at existing function
126#
127
128set mainline [gdb_get_line_number "break main here"]
129
130gdb_test "break main" \
131    "Breakpoint.*at.* file .*$srcfile, line $mainline.*" \
132    "breakpoint function"
133
134gdb_test "info break" \
135    "Num Type\[ \]+Disp Enb Address\[ \]+What.*
136\[0-9\]+\[\t \]+breakpoint     keep y.*PENDING.*pendfunc1.*
137\[0-9\]+\[\t \]+breakpoint     keep y.* in main at .*$srcfile:$mainline" \
138"pending plus real breakpoint info"
139
140
141#
142# Test not setting a pending breakpoint
143#
144gdb_test_multiple "break pendfunc2" "Don't set pending breakpoint" {
145     -re ".*Make breakpoint pending.*y or \\\[n\\\]. $" {
146	    gdb_test "n" "" "Don't set pending breakpoint"
147     }
148}
149
150#
151# Add condition to pending breakpoint
152#
153
154gdb_test "condition 1 k == 1" ""
155
156gdb_test "info break" \
157    "Num Type\[ \]+Disp Enb Address\[ \]+What.*
158\[0-9\]+\[\t \]+breakpoint     keep y.*PENDING.*pendfunc1.*
159\[\t \]+stop only if k == 1.*
160\[0-9\]+\[\t \]+breakpoint     keep y.* in main at .*$srcfile:$mainline" \
161"pending plus condition"
162
163#
164# Disable pending breakpoint
165#
166
167gdb_test "disable 1" ""
168
169gdb_test "info break" \
170    "Num Type\[ \]+Disp Enb Address\[ \]+What.*
171\[0-9\]+\[\t \]+breakpoint     keep n.*PENDING.*pendfunc1.*
172\[\t \]+stop only if k == 1.*
173\[0-9\]+\[\t \]+breakpoint     keep y.* in main at .*$srcfile:$mainline" \
174"pending disabled"
175
176#
177# Add commands to pending breakpoint
178#
179gdb_test "commands 1\nprint k\nend" "" \
180        "Set commands for pending breakpoint"
181
182gdb_test "info break" \
183    "Num Type\[ \]+Disp Enb Address\[ \]+What.*
184\[0-9\]+\[\t \]+breakpoint     keep n.*PENDING.*pendfunc1.*
185\[\t \]+stop only if k == 1.*
186\[\t \]+print k.*
187\[0-9\]+\[\t \]+breakpoint     keep y.* in main at .*$srcfile:$mainline" \
188"pending disabled plus commands"
189
190#
191# Try a pending break for a line in a source file with a condition
192#
193
194gdb_test_multiple "break pendshr.c:26 if x > 3" "Set pending breakpoint 2" {
195     -re ".*Make breakpoint pending.*y or \\\[n\\\]. $" {
196	    gdb_test "y" "Breakpoint.*pendshr.c:26.*pending." \
197		"Set pending breakpoint 2"
198     }
199}
200
201gdb_test "info break" \
202    "Num Type\[ \]+Disp Enb Address\[ \]+What.*
203\[0-9\]+\[\t \]+breakpoint     keep n.*PENDING.*pendfunc1.*
204\[\t \]+stop only if k == 1.*
205\[\t \]+print k.*
206\[0-9\]+\[\t \]+breakpoint     keep y.* in main at .*$srcfile:$mainline.*
207\[0-9\]+\[\t \]+breakpoint     keep y.*PENDING.*pendshr.c:26 if x > 3.*" \
208"multiple pending breakpoints"
209
210
211#
212# Try a pending break for a line in a source file with ignore count:
213#
214
215gdb_test_multiple "break pendshr.c:27" "Set pending breakpoint 3" {
216     -re ".*Make breakpoint pending.*y or \\\[n\\\]. $" {
217	    gdb_test "y" "Breakpoint.*pendshr.c:27.*pending." \
218		"Set pending breakpoint 3"
219     }
220}
221
222gdb_test {ignore $bpnum 2} "Will ignore next 2 crossings of breakpoint .*" \
223    "set ignore count on pending breakpoint 3"
224
225gdb_test "info break" \
226    "Num Type\[ \]+Disp Enb Address\[ \]+What.*
227\[0-9\]+\[\t \]+breakpoint     keep n.*PENDING.*pendfunc1.*
228\[\t \]+stop only if k == 1.*
229\[\t \]+print k.*
230\[0-9\]+\[\t \]+breakpoint     keep y.* in main at .*$srcfile:$mainline.*
231\[0-9\]+\[\t \]+breakpoint     keep y.*PENDING.*pendshr.c:26 if x > 3.*
232\[0-9\]+\[\t \]+breakpoint     keep y.*PENDING.*pendshr.c:27.*ignore next 2 hits.*" \
233"multiple pending breakpoints 2"
234
235#
236# Run to main which should resolve a pending breakpoint
237#
238
239gdb_test "run" \
240"Breakpoint.*at.*
241Pending breakpoint \"pendshr.c:26 if x > 3\" resolved.*
242Breakpoint.*, main.*$mainline.*" \
243"running to main"
244
245#
246# Re-enable the first pending breakpoint which should resolve
247#
248
249gdb_test "enable 1" \
250"Breakpoint.*at.*
251Pending breakpoint \"pendfunc1.* resolved.*" \
252"re-enabling pending breakpoint that can resolve instantly"
253
254#
255# Continue to verify conditionals and commands for breakpoints are honored
256#
257
258gdb_test "continue" \
259".*Breakpoint.*pendfunc1.*at.*pendshr.c:26.*4;" \
260"continue to resolved breakpoint 2"
261
262gdb_test "continue" \
263".*Breakpoint.*pendfunc1.*at.*pendshr.c:26.*
264\[$\]1 = 1." \
265"continue to resolved breakpoint 1"
266
267#
268# Disable the other two breakpoints, and continue to the one with
269# the ignore count.  Make sure you hit it the third time, x should
270# be 3 then.
271#
272
273gdb_test "disable 7" "" "Disable other breakpoints"
274gdb_test "disable 5" "" "Disable other breakpoints"
275
276gdb_test "continue" \
277	{.*Breakpoint.*pendfunc1.*\(x=3\) at.*pendshr.c:27.*printf.*;} \
278"continue to resolved breakpoint 3"
279
280delete_breakpoints
281
282gdb_breakpoint "main"
283
284#
285# Set non-existent pending breakpoint
286#
287gdb_test_multiple "break imaginary" "set imaginary pending breakpoint" {
288     -re ".*Make breakpoint pending.*y or \\\[n\\\]. $" {
289	    gdb_test "y" "Breakpoint.*imaginary.*pending." \
290		"set imaginary pending breakpoint"
291     }
292}
293
294#
295# rerun program and make sure that any pending breakpoint remains and no
296# error messages are issued for the missing function
297#
298
299rerun_to_main
300
301gdb_test "info break" \
302    "Num Type\[ \]+Disp Enb Address\[ \]+What.*
303\[0-9\]+\[\t \]+breakpoint     keep y.* in main at .*$srcfile:$mainline.*
304\[0-9\]+\[\t \]+breakpoint     keep y.*PENDING.*imaginary.*" \
305"verify pending breakpoint after restart"
306