xref: /netbsd-src/external/gpl3/gdb.old/dist/gdb/testsuite/gdb.base/condbreak.exp (revision c34236556bea94afcaca1782d7d228301edc3ea0)
1# Copyright 1997-2015 Free Software Foundation, Inc.
2
3# This program is free software; you can redistribute it and/or modify
4# it under the terms of the GNU General Public License as published by
5# the Free Software Foundation; either version 3 of the License, or
6# (at your option) any later version.
7#
8# This program is distributed in the hope that it will be useful,
9# but WITHOUT ANY WARRANTY; without even the implied warranty of
10# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11# GNU General Public License for more details.
12#
13# You should have received a copy of the GNU General Public License
14# along with this program.  If not, see <http://www.gnu.org/licenses/>.
15
16# This test was written by Rich Title.
17# Purpose is to test conditional breakpoints.
18# Modeled after "break.exp".
19
20#
21# test running programs
22#
23
24standard_testfile break.c break1.c
25
26if {[prepare_for_testing ${testfile}.exp $testfile [list $srcfile $srcfile2] \
27	 {debug nowarnings}]} {
28    return -1
29}
30
31if [get_compiler_info] {
32    return -1
33}
34
35clean_restart ${binfile}
36
37
38set bp_location1  [gdb_get_line_number "set breakpoint 1 here"]
39set bp_location6  [gdb_get_line_number "set breakpoint 6 here"]
40set bp_location8  [gdb_get_line_number "set breakpoint 8 here" $srcfile2]
41set bp_location14 [gdb_get_line_number "set breakpoint 14 here" $srcfile2]
42set bp_location15 [gdb_get_line_number "set breakpoint 15 here" $srcfile2]
43set bp_location17 [gdb_get_line_number "set breakpoint 17 here" $srcfile2]
44
45#
46# test break at function
47#
48gdb_test "break main" \
49    "Breakpoint.*at.* file .*$srcfile, line.*" \
50    "breakpoint function"
51
52#
53# test conditional break at function
54#
55gdb_test "break marker1 if 1==1" \
56    "Breakpoint.*at.* file .*$srcfile2, line.*"
57
58gdb_test_no_output "delete 2"
59
60#
61# test conditional break at line number
62#
63gdb_test "break $srcfile:$bp_location1 if 1==1" \
64    "Breakpoint.*at.* file .*$srcfile, line $bp_location1\\."
65
66gdb_test_no_output "delete 3"
67
68#
69# test conditional break at function
70#
71gdb_test "break marker1 if (1==1)" \
72    "Breakpoint.*at.* file .*$srcfile2, line.*"
73
74#
75# test conditional break at line number
76#
77gdb_test "break $srcfile:$bp_location1 if (1==1)" \
78    "Breakpoint.*at.* file .*$srcfile, line $bp_location1\\."
79
80gdb_test "break marker2 if (a==43)" \
81    "Breakpoint.*at.* file .*$srcfile2, line.*"
82
83#
84# Check break involving inferior function call.
85# Ensure there is at least one additional breakpoint with higher VMA.
86#
87gdb_test "break marker3 if (multi_line_if_conditional(1,1,1)==0)" \
88    "Breakpoint.*at.* file .*$srcfile2, line.*"
89gdb_test "break marker4" \
90    "Breakpoint.*at.* file .*$srcfile2, line.*"
91
92#
93# check to see what breakpoints are set
94#
95
96if {$hp_aCC_compiler} {
97    set marker1_proto "\\(void\\)"
98    set marker2_proto "\\(int\\)"
99    # Not checked.
100    set marker3_proto "\\(char \\*, char \\*\\)"
101    set marker4_proto "\\(long\\)"
102} else {
103    set marker1_proto ""
104    set marker2_proto ""
105    set marker3_proto ""
106    set marker4_proto ""
107}
108
109gdb_test "info break" \
110    "Num     Type\[ \]+Disp Enb Address\[ \]+What.*
111\[0-9\]+\[\t \]+breakpoint     keep y.* in main at .*$srcfile:$bp_location6.*
112\[0-9\]+\[\t \]+breakpoint     keep y.* in marker1$marker1_proto at .*$srcfile2:$bp_location15.*
113\[\t \]+stop only if \\(1==1\\).*
114\[0-9\]+\[\t \]+breakpoint     keep y.* in main at .*$srcfile:$bp_location1.*
115\[\t \]+stop only if \\(1==1\\).*
116\[0-9\]+\[\t \]+breakpoint     keep y.* in marker2$marker2_proto at .*$srcfile2:$bp_location8.*
117\[\t \]+stop only if \\(a==43\\).*
118\[0-9\]+\[\t \]+breakpoint     keep y.* in marker3$marker3_proto at .*$srcfile2:$bp_location17.*
119\[\t \]+stop only if \\(multi_line_if_conditional\\(1,1,1\\)==0\\).*
120\[0-9\]+\[\t \]+breakpoint     keep y.* in marker4$marker4_proto at .*$srcfile2:$bp_location14.*" \
121    "breakpoint info"
122
123
124#
125# run until the breakpoint at main is hit.
126#
127
128
129rerun_to_main
130
131#
132# run until the breakpoint at a line number
133#
134gdb_test "continue" "Continuing\\..*Breakpoint \[0-9\]+, main \\(argc=.*, argv=.*, envp=.*\\) at .*$srcfile:$bp_location1.*$bp_location1\[\t \]+printf.*factorial.*" \
135			"run until breakpoint set at a line number"
136
137#
138# run until the breakpoint at marker1
139#
140# If the inferior stops at the first instruction of a source line, GDB
141# won't print the actual PC value; the source line is enough to
142# exactly specify the PC.  But if the inferior is instead stopped in
143# the midst of a source line, GDB will include the PC in the
144# breakpoint hit message.  This way, GDB always provides the exact
145# stop location, but avoids clutter when possible.
146#
147# Suppose you have a function written completely on one source line, like:
148#    int foo (int x) { return 0; }
149# Setting a breakpoint at `foo' actually places the breakpoint after
150# foo's prologue.
151#
152# GCC's STABS writer always emits a line entry attributing the
153# prologue instructions to the line containing the function's open
154# brace, even if the first user instruction is also on that line.
155# This means that, in the case of a one-line function, you will get
156# two line entries in the debug info for the same line: one at the
157# function's entry point, and another at the first user instruction.
158# GDB preserves these duplicated line entries, and prefers the later
159# one; thus, when the program stops after the prologue, at the first
160# user instruction, GDB's search finds the second line entry, decides
161# that the PC is indeed at the beginning of a source line, and doesn't
162# print an address in the breakpoint hit message.
163#
164# GCC's Dwarf2 writer, on the other hand, squeezes out duplicate line
165# entries, so GDB considers the source line to begin at the start of
166# the function's prologue.  Thus, if the program stops at the
167# breakpoint, GDB will decide that the PC is not at the beginning of a
168# source line, and will print an address.
169#
170# I think the Dwarf2 writer's behavior is arguably correct, but not
171# helpful.  If the user sets a breakpoint at that source line, they
172# want that breakpoint to fall after the prologue.  Identifying the
173# prologue's code with the opening brace is nice, but it shouldn't
174# take precedence over real code.
175#
176# Until the Dwarf2 writer gets fixed, I'm going to XFAIL its behavior.
177gdb_test_multiple "continue" "run until breakpoint at marker1" {
178    -re  "Continuing\\..*Breakpoint \[0-9\]+, marker1 \\(\\) at .*$srcfile2:$bp_location15.*$bp_location15\[\t \]+.*$gdb_prompt $" {
179	pass "run until breakpoint at marker1"
180    }
181    -re  "Continuing\\..*Breakpoint \[0-9\]+, $hex in marker1 \\(\\) at .*$srcfile2:$bp_location15.*$bp_location15\[\t \]+.*$gdb_prompt $" {
182	xfail "run until breakpoint at marker1"
183    }
184}
185
186# run until the breakpoint at marker2
187# Same issues here as above.
188setup_xfail hppa2.0w-*-* 11512CLLbs
189gdb_test_multiple "continue" "run until breakpoint at marker2" {
190    -re "Continuing\\..*Breakpoint \[0-9\]+, marker2 \\(a=43\\) at .*$srcfile2:$bp_location8.*$bp_location8\[\t \]+.*$gdb_prompt $" {
191	pass "run until breakpoint at marker2"
192    }
193    -re "Continuing\\..*Breakpoint \[0-9\]+, $hex in marker2 \\(a=43\\) at .*$srcfile2:$bp_location8.*$bp_location8\[\t \]+.*$gdb_prompt $" {
194	xfail "run until breakpoint at marker2"
195    }
196}
197
198# Test combinations of conditional and thread-specific breakpoints.
199gdb_test "break main if (1==1) thread 999" \
200    "Unknown thread 999\\."
201gdb_test "break main thread 999 if (1==1)" \
202    "Unknown thread 999\\."
203
204# Verify that both if and thread can be distinguished from a breakpoint
205# address expression.
206gdb_test "break *main if (1==1) thread 999" \
207    "Unknown thread 999\\."
208gdb_test "break *main thread 999 if (1==1)" \
209    "Unknown thread 999\\."
210
211# Similarly for task.
212gdb_test "break *main if (1==1) task 999" \
213    "Unknown task 999\\."
214gdb_test "break *main task 999 if (1==1)" \
215    "Unknown task 999\\."
216
217# GDB accepts abbreviations for "thread" and "task".
218gdb_test "break *main if (1==1) t 999" \
219    "Unknown thread 999\\."
220gdb_test "break *main if (1==1) th 999" \
221    "Unknown thread 999\\."
222gdb_test "break *main if (1==1) ta 999" \
223    "Unknown task 999\\."
224
225set test "run until breakpoint at marker3"
226gdb_test_multiple "continue" $test {
227    -re "Continuing\\..*Breakpoint \[0-9\]+, marker3 \\(a=$hex \"stack\", b=$hex \"trace\"\\) at .*$srcfile2:$bp_location17.*$bp_location17\[\t \]+.*$gdb_prompt $" {
228	pass $test
229    }
230    -re "Continuing\\..*Breakpoint \[0-9\]+, $hex in marker3 \\(a=$hex \"stack\", b=$hex \"trace\"\\) at .*$srcfile2:$bp_location17.*$bp_location17\[\t \]+.*$gdb_prompt $" {
231	xfail $test
232    }
233}
234
235set test "run until breakpoint at marker4"
236gdb_test_multiple "continue" $test {
237    -re "Continuing\\..*Breakpoint \[0-9\]+, marker4 \\(d=177601976\\) at .*$srcfile2:$bp_location14.*$bp_location14\[\t \]+.*$gdb_prompt $" {
238	pass $test
239    }
240    -re "Continuing\\..*Breakpoint \[0-9\]+, $hex in marker4 \\(d=177601976\\) at .*$srcfile2:$bp_location14.*$bp_location14\[\t \]+.*$gdb_prompt $" {
241	xfail $test
242    }
243}
244
245gdb_test "complete cond 1" "cond 1"
246gdb_test "set variable \$var = 1"
247gdb_test "complete cond \$v" "cond \\\$var"
248gdb_test "complete cond 1 values\[0\].a" "cond 1 values.0..a_field"
249