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