xref: /netbsd-src/external/gpl3/gdb.old/dist/gdb/testsuite/gdb.trace/mi-tsv-changed.exp (revision 479d8f7d843cc1b22d497efdf1f27a50ee8418d4)
1# Copyright 2012-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
16load_lib trace-support.exp
17load_lib mi-support.exp
18
19standard_testfile actions.c
20if { [gdb_compile "$srcdir/$subdir/$srcfile" $binfile \
21	  executable {debug nowarnings}] != "" } {
22    untested mi-tsv-changed.exp
23    return -1
24}
25
26# Test notifications on creating, deleting and modifying TSV.
27
28proc test_create_delete_modify_tsv { } {
29    with_test_prefix "create delete modify" {
30	global binfile
31	global decimal
32	global testfile
33	global srcdir subdir
34	global mi_gdb_prompt
35
36	if [mi_gdb_start] {
37	    return
38	}
39	mi_gdb_load ${binfile}
40
41	mi_gdb_test "tvariable \$tvar1" \
42	    ".*=tsv-created,name=\"tvar1\",initial=\"0\"\\\\n.*\\^done" \
43	    "tvariable \$tvar1"
44	mi_gdb_test "tvariable \$tvar1 = 1" \
45	    ".*=tsv-modified,name=\"tvar1\",initial=\"1\".*\\^done" \
46	    "tvariable \$tvar1 modified"
47	# No "=tsv-modified" notification is emitted, because the initial
48	# value is not changed.
49	mi_gdb_test "tvariable \$tvar1 = 1" \
50	    ".*\\\$tvar1 = 1\\\\n\"\r\n~\"Trace state .*\\\\n.*\\^done" \
51	    "tvariable \$tvar1 modified without notification"
52	mi_gdb_test "tvariable \$tvar2 = 45" \
53	    ".*=tsv-created,name=\"tvar2\",initial=\"45\"\\\\n.*\\^done" \
54	    "tvariable \$tvar2"
55
56	mi_gdb_test "delete tvariable \$tvar2" \
57	    ".*=tsv-deleted,name=\"tvar2\"\\\\n.*\\^done" \
58	    "delete tvariable \$tvar2"
59
60	mi_gdb_test "delete tvariable" \
61	    ".*=tsv-deleted\\\\n.*\\^done" \
62	    "delete all tvariables"
63
64	# Test target supports tracepoints or not.
65	clean_restart $testfile
66
67	if ![runto_main] {
68	    fail "Can't run to main to check for trace support"
69	    return -1
70	}
71
72	if ![gdb_target_supports_trace] {
73	    unsupported "Current target does not support trace"
74	    return -1
75	}
76	gdb_exit
77	if [mi_gdb_start] {
78	    continue
79	}
80
81	mi_gdb_reinitialize_dir $srcdir/$subdir
82	mi_gdb_load ${binfile}
83
84	mi_gdb_test "tvariable \$tvar3 = 3" \
85	    ".*=tsv-created,name=\"tvar3\",initial=\"3\".*\\^done" \
86	    "tvariable \$tvar3 modified"
87	mi_gdb_test "-break-insert -a gdb_c_test" \
88	    {.*\^done,bkpt=.*} \
89	    "insert tracepoint on gdb_c_test"
90	# Define an action that increases $tvar3
91	send_gdb "actions\n"
92	gdb_expect {
93	    -re "End with" {
94	    }
95	}
96	send_gdb "collect \$tvar3 += 3\nend\n"
97	set test "define actions"
98	gdb_expect {
99	    -re ".*${mi_gdb_prompt}$" {
100		pass $test
101	    }
102	    timeout {
103		fail "$test (timeout)"
104	    }
105	}
106
107	mi_gdb_test "-break-insert begin" \
108	    {.*\^done,bkpt=.*} \
109	    "insert tracepoint on begin"
110	mi_gdb_test "-break-insert end" \
111	    {.*\^done,bkpt=.*} \
112	    "insert tracepoint on end"
113	mi_run_cmd
114
115	mi_expect_stop "breakpoint-hit" "begin" ""\
116	    ".*" ".*" {"" "disp=\"keep\""} \
117	    "continue to begin breakpoint"
118	mi_gdb_test "-trace-start" {.*\^done} "trace start"
119	mi_send_resuming_command "exec-continue" "continuing to end"
120	mi_gdb_test "-trace-stop" {.*} "trace stop"
121	# Force GDB to get the current value of trace state variable.
122	mi_gdb_test "-trace-list-variables" ".*" "list trace variables"
123	mi_gdb_test "tvariable \$tvar3 = 2" \
124	    ".*=tsv-modified,name=\"tvar3\",initial=\"2\",current=\"6\".*\\^done" \
125	    "tvariable \$tvar3 modified"
126
127    }
128}
129
130
131# Test when GDB connects to a disconnected stub, existing TSVs in
132# remote stub can be uploaded to GDB, and GDB emits MI notification
133# for new uploaded TSVs.
134
135proc test_upload_tsv { } {
136    with_test_prefix "upload" {
137
138	global gdbserver_reconnect_p
139	global gdb_prompt
140	global testfile
141	global decimal
142
143	set gdbserver_reconnect_p 1
144	if { [info proc gdb_reconnect] == "" } {
145	    return 0
146	}
147
148	clean_restart $testfile
149	if ![runto_main] then {
150	    fail "Can't run to main"
151	    return 0
152	}
153
154	gdb_test "tvariable \$tvar1" \
155	    "Trace state variable \\\$tvar1 created, with initial value 0." \
156	    "Create a trace state variable"
157
158	gdb_test "tvariable \$tvar2 = 45" \
159	    "Trace state variable \\\$tvar2 created, with initial value 45." \
160	    "Create a trace state variable with initial value"
161	# Define a tracepoint otherwise tracing cannot be started.
162	gdb_test "trace main" "Tracepoint $decimal at .*"
163	gdb_test_no_output "tstart" "start trace experiment"
164
165	set test "disconnect"
166	gdb_test_multiple "disconnect" $test {
167	    -re "Trace is running but will stop on detach; detach anyway\\? \\(y or n\\) $" {
168		pass $test
169
170		set test "disconnected"
171		gdb_test_multiple "y" $test {
172		    -re "$gdb_prompt $" {
173			pass "$test"
174		    }
175		}
176	    }
177	}
178
179	gdb_exit
180
181	if [mi_gdb_start] {
182	    return
183	}
184
185	global srcdir
186	global subdir
187	global binfile
188
189	mi_gdb_reinitialize_dir $srcdir/$subdir
190	mi_gdb_load ${binfile}
191
192	global gdbserver_protocol
193	global gdbserver_gdbport
194
195	send_gdb "47-target-select $gdbserver_protocol $gdbserver_gdbport\n"
196
197	global mi_gdb_prompt
198	set tsv1_created 0
199	set tsv2_created 0
200	gdb_expect {
201	    -re "=tsv-created,name=\"tvar1\",initial=\"0\"" {
202		set tsv1_created 1
203		exp_continue
204	    }
205	    -re "=tsv-created,name=\"tvar2\",initial=\"45\"" {
206		set tsv2_created 1
207		exp_continue
208	    }
209	    -re ".*${mi_gdb_prompt}" {
210
211	    }
212	}
213
214	if $tsv1_created {
215	    pass "tsv1 created"
216	} else {
217	    fail "tsv1 created"
218	}
219	if $tsv2_created {
220	    pass "tsv2 created"
221	} else {
222	    fail "tsv2 created"
223	}
224
225	set gdbserver_reconnect_p 0
226    }
227}
228
229 test_create_delete_modify_tsv
230
231# Test target supports tracepoints or not.
232
233clean_restart $testfile
234
235if ![runto_main] {
236    fail "Can't run to main to check for trace support"
237    return -1
238}
239
240if ![gdb_target_supports_trace] {
241    unsupported "Current target does not support trace"
242    return -1
243}
244
245gdb_exit
246
247test_upload_tsv
248
249return 0
250