xref: /netbsd-src/external/gpl3/gdb.old/dist/gdb/testsuite/gdb.threads/watchpoint-fork.exp (revision 796c32c94f6e154afc9de0f63da35c91bb739b45)
1# Copyright 2012-2016 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# Test case for forgotten hw-watchpoints after fork()-off of a process.
17
18set testfile watchpoint-fork
19
20proc test {type symbol} {
21    with_test_prefix "$type" {
22	global testfile subdir srcdir gdb_prompt
23
24	set srcfile_type ${srcdir}/${subdir}/${testfile}-${type}.c
25
26	# no threads
27
28	with_test_prefix "singlethreaded" {
29	    set executable ${testfile}-${type}-st
30	    set srcfile_main ${testfile}-st.c
31	    if {[build_executable $testfile.exp $executable \
32		     [list $srcfile_main ${testfile}-${type}.c] \
33		     [list debug additional_flags=-D$symbol]] == -1} {
34		return -1
35	    }
36
37	    clean_restart $executable
38
39	    if [target_info exists gdb,no_hardware_watchpoints] {
40		# The software watchpoint functionality is in GDB an unrelated test.
41		gdb_test_no_output "set can-use-hw-watchpoints 0"
42	    }
43
44	    gdb_test "show detach-on-fork" "Whether gdb will detach the child of a fork is on\\."
45	    gdb_test_no_output "set follow-fork-mode $type"
46	    gdb_test "show follow-fork-mode" "Debugger response to a program call of fork or vfork is \"$type\"\\."
47	    # Testcase uses it for the `follow-fork-mode child' type.
48	    gdb_test "handle SIGUSR1 nostop noprint pass" "No\[ \t\]+No\[ \t\]+Yes.*"
49
50	    if ![runto_main] {
51		return
52	    }
53
54	    gdb_test "watch var" "atchpoint \[0-9\]+: var" "Set the watchpoint"
55
56	    # It is never hit but it should not be left over in the fork()ed-off child.
57	    if [skip_hw_breakpoint_tests] {
58		set hbreak "break"
59	    } else {
60		set hbreak "hbreak"
61	    }
62	    gdb_test "$hbreak marker"
63
64	    gdb_breakpoint "mark_exit"
65
66	    gdb_test "continue" \
67		"reakpoint \[0-9\]+, marker.*" "hardware breakpoints work"
68	    gdb_test "continue" \
69		"atchpoint \[0-9\]+: var.*Old value = 0.*New value = 1.*forkoff *\\(1\\).*" "watchpoints work"
70	    gdb_test "continue" \
71		"reakpoint \[0-9\]+, marker.*" "breakpoint after the first fork"
72	    gdb_test "continue" \
73		"atchpoint \[0-9\]+: var.*Old value = 1.*New value = 2.*forkoff *\\(2\\).*" "watchpoint after the first fork"
74	    gdb_test "continue" \
75		"reakpoint \[0-9\]+, marker.*" "breakpoint after the second fork"
76	    gdb_test "continue" \
77		"atchpoint \[0-9\]+: var.*Old value = 2.*New value = 3.*mark_exit \\(\\);" "watchpoint after the second fork"
78	    gdb_test "continue" "Continuing\\..*\r\n(Thread .* hit )?Breakpoint \[0-9\]+, mark_exit .*" "finish"
79	}
80
81	# threads
82
83	if [target_info exists gdb,no_hardware_watchpoints] {
84	    # Watchpoint hits would get detected in unexpected threads.
85	    return
86	}
87
88	with_test_prefix "multithreaded" {
89	    set executable ${testfile}-${type}-mt
90	    set srcfile_main ${srcdir}/${subdir}/${testfile}-mt.c
91	    if { [gdb_compile_pthreads "${srcfile_main} ${srcfile_type}" [standard_output_file ${executable}] executable [list debug "additional_flags=-D$symbol -DTHREAD"]] != "" } {
92		untested ${testfile}.exp
93		return
94	    }
95	    clean_restart $executable
96
97	    gdb_test_no_output "set follow-fork-mode $type"
98	    # Testcase uses it for the `follow-fork-mode child' type.
99	    gdb_test "handle SIGUSR1 nostop noprint pass" "No\[ \t\]+No\[ \t\]+Yes.*"
100
101	    if ![runto_main] {
102		return
103	    }
104
105	    gdb_test "watch var" "atchpoint \[0-9\]+: var" "Set the watchpoint"
106
107	    # It should not be left over in the fork()ed-off child.
108	    gdb_test "$hbreak marker" {reakpoint [0-9]+.*}
109
110	    gdb_breakpoint "mark_exit"
111
112	    gdb_test "continue" \
113		"reakpoint \[0-9\]+, marker.*" "hardware breakpoints work"
114	    gdb_test "continue" \
115		"atchpoint \[0-9\]+: var.*Old value = 0.*New value = 1.*validity-first.*" "singlethread watchpoints work"
116	    gdb_test "continue" \
117		"atchpoint \[0-9\]+: var.*Old value = 1.*New value = 2.*validity-thread-A.*" "multithreaded watchpoints work at A"
118	    gdb_test "continue" \
119		"atchpoint \[0-9\]+: var.*Old value = 2.*New value = 3.*validity-thread-B.*" "multithreaded watchpoints work at B"
120	    gdb_test "continue" \
121		"reakpoint \[0-9\]+, marker.*" "breakpoint (A) after the first fork"
122	    gdb_test "continue" \
123		"atchpoint \[0-9\]+: var.*Old value = 3.*New value = 4.*after-fork1-A.*" "watchpoint A after the first fork"
124	    gdb_test "continue" \
125		"atchpoint \[0-9\]+: var.*Old value = 4.*New value = 5.*after-fork1-B.*" "watchpoint B after the first fork"
126	    gdb_test "continue" \
127		"reakpoint \[0-9\]+, marker.*" "breakpoint (A) after the second fork"
128	    gdb_test "continue" \
129		"atchpoint \[0-9\]+: var.*Old value = 5.*New value = 6.*after-fork2-A.*" "watchpoint A after the second fork"
130	    gdb_test "continue" \
131		"atchpoint \[0-9\]+: var.*Old value = 6.*New value = 7.*after-fork2-B.*" "watchpoint B after the second fork"
132	    gdb_test "continue" "Continuing\\..*\r\nThread .* hit Breakpoint \[0-9\]+, mark_exit .*" "finish"
133	}
134    }
135}
136
137test parent FOLLOW_PARENT
138
139# Only GNU/Linux is known to support `set follow-fork-mode child'.
140if [istarget "*-*-linux*"] {
141    test child FOLLOW_CHILD
142} else {
143    untested "${testfile}: child"
144}
145